This guide covers: Start a new payroll, Set period & pay date, Enter hours / earnings, Review the preview, Approve, Cancel before approval.
Start a new payroll
What it does: Opens the new-payroll form, pre-populated with the next pay period (computed from the pay schedule and the last completed run) and the active W-2 employees on that schedule. If the client runs more than one pay schedule, a picker at the top of the Pay Period card lets you choose which one this run is for.
Where: Client sidebar → Payroll → Run Payroll.
Steps:
- From the client sidebar, click Payroll.
- Click Run Payroll in the top right.
- The form opens with: Pay Period card · Employees table · Notes · Calculate Preview + Save as Draft + Create Payroll actions.
Who: Accountant or SMB admin. The endpoint HARD-blocks with HTTP 412 ONBOARDING_PACKET_NOT_SIGNED if the client doesn't have a fully signed onboarding packet — a modal appears with a deep link to client settings to send/remind the packet.
Notes: A blue Current Pay Period banner at the top of /clients/{clientId}/payroll shows the next scheduled period before you click Run Payroll. If the client's onboarding packet is signed but ra_on_file is true on the client record, the gate is bypassed.
Set period & pay date
What it does: Sets the pay-period start, end, and the check date (= pay date).
Where: Pay Period card.
Steps:
- Pay Schedule picker — appears only when the client has more than one pay schedule (see Client settings). Pick which schedule this run is for; the employee list filters to that schedule's employees and the dates below recompute to its cadence. A run always covers one schedule. Clients with a single schedule don't see this.
- Period Start and Period End prefill from the API based on the selected schedule's frequency. Adjust as needed.
- Pay Date (Check Date) also prefills — this is the date funds land in the employee's account.
- If any employee in the run is set to Direct Deposit, a Direct Deposit Timing card appears under the period inputs showing whether the pay date is achievable via standard ACH (4:15 PM ET cutoff) or requires Same-Day ACH (2:15 PM ET cutoff). See How ACH timing works.
Who: Accountant or SMB admin.
Notes: If a regular payroll already exists for the same period AND the same employees, the engine auto-detects the duplicate, excludes those employees from the table, and shows an amber banner: N employee(s) already have payroll for this period — these employees have been excluded. Use Off-Cycle or Bonus payroll for additional payments.
Enter hours / earnings
What it does: Fills in regular/overtime/holiday/PTO/sick hours, bonus, commission, and payment method per employee.
Where: Employees table on the new-payroll form.
Steps:
- The table shows: checkbox · Employee · Type · Rate/Period · Reg · OT · Hol · PTO · Sick · Bonus · Comm · Method.
- For hourly employees, Reg and OT are editable; for salary employees, they're shown as
-and pay is computed from the per-period salary derived from the client's pay frequency. - Holiday, PTO, Sick, Bonus, and Commission are editable for everyone.
- Method dropdown: Direct Deposit (disabled if no routable bank) or Paper Check. The default is Direct Deposit when the employee has a Moov-verified bank, paper check otherwise.
- Uncheck the row checkbox to exclude an employee from this run.
Enter hours by job (optional). When the client has active Jobs & Positions (see Client settings), each hourly row shows a Jobs button in the Adjust column, and the Employees header has a Show job hours toggle that expands job entry for every hourly employee at once. Expanding a row lists each active job with its own Reg and OT inputs (the rate is the employee's per-job override or the job default). The per-job hours roll up into the row's Reg/OT totals, and overtime is paid at the FLSA weighted average of the rates worked. PTO, Sick, Holiday, and Bonus stay single-rate. Leave the job rows blank to just use the plain Reg/OT columns.
Who: Accountant or SMB admin.
Notes: Rows where hours came from an approved timesheet are green-tinted with a ✓ next to the name (from_timesheet). Rows where the employee already has a payroll for this period are red-tinted with a Already paid chip and disabled (regular payroll only). The salary "Rate/Period" cell hovers to show the annual salary as a tooltip. Deductions — 401(k), health, union dues, advance/loan repayments — and garnishments aren't entered in this table; they apply automatically from the employee's assigned setup and show up in the preview's per-employee breakdown. Set them up in Deductions & custom earnings (note: an advance repayment must be post-tax).
Review the preview
What it does: Runs the tax engine on the current inputs without saving anything, and shows employer/employee totals + a per-employee breakdown.
Where: Calculate Preview button (bottom left).
Steps:
- Click Calculate Preview.
- A green preview panel appears showing Total Gross Pay, Total Net Pay, Employee Taxes, Employer Taxes, and an Employee Breakdown table: Employee · Gross · Fed Tax · State Tax · Local Tax · State Ins. (SDI/PFML) · SS · Medicare · Net.
- Hover the State Tax cell to see the work state in parentheses; hover State Ins. to see the component breakdown.
Who: Accountant or SMB admin.
Notes: Editing any field after preview clears the preview — you must recalculate to refresh totals. The preview reads YTD balances from the per-period YTD ledger so Social Security wage caps, additional Medicare, and SUI taxable wage caps are applied accurately. SUI rates resolve from the per-client client_sui_rates history (state-specific, effective-dated). Preview is read-only — no DB writes, no tax filings, no payments.
Save & approve
What it does: Persists the run, then locks it for processing.
Where: Save as Draft and Create Payroll buttons (bottom right), then Approve Payroll on the detail page.
Steps:
- Click Save as Draft to persist without finalizing — the run lands in
draftstatus and is editable. - Or click Create Payroll to save with the calculated taxes (requires Preview first).
- On success you land on the payroll detail page at
/clients/{clientId}/payroll/{payrollId}. - Click Approve Payroll to lock the run. Approval writes garnishment ledger entries and time-off accrual deltas — it's hard to reverse.
- On the approved run, click Process Payroll to fire the Moov debit, initiate direct deposits, and schedule tax payments. A pre-checked Same-Day ACH toggle appears if the client's
same_day_ach_enabledflag is on — uncheck to use standard 2-day ACH.
Who: Accountant or SMB admin.
Notes: Auto-run can do create/approve/process automatically — see Auto-pilot payroll. On the global accountant payroll listing (/payroll?client=...), each row's actions include inline Approve / Process with confirm dialogs spelling out what the action does.
Cancel before approval
What it does: Deletes a draft payroll. After approval, deleting becomes voiding — different workflow.
Where: /clients/{clientId}/payroll list page, draft rows show a Delete button.
Steps:
- From the payroll list, find the draft row.
- Click Delete (red, trash icon).
- Confirm in the modal — Delete in red, irreversible.
Who: Accountant or SMB admin.
Notes: Only draft payrolls have the Delete button. For approved or processing runs, use Void Payroll on the detail page — that cancels pending Moov debits, voids each item, and cancels scheduled tax payments. Voided runs are kept for audit. See Off-cycle, bonus & correction payrolls for the correction-run pattern when you can't void.
Related: Off-cycle, bonus & correction payrolls · Auto-pilot payroll · Payroll history & edits · Deductions & custom earnings · How ACH timing works.