Skip to content

Payroll cycle status machine

The payroll cycle moves through 16 states from creation to archival. Transitions are enforced by canTransition() in packages/domain/src/payroll/rules/status-transitions.ts.

What each state means

Click to expand
StateMeaningWho moves it forward
PLANNEDCycle created by the platform but not yet sent to the clientWorker (cycle-initiate cron)
REQUESTEDCycle request email sentWorker
INTAKE_IN_PROGRESSClient opened the magic link; intake is editableClient submitter
SUBMITTEDClient submitted; validation runsWorker (validation-run)
ACTION_REQUIREDValidation produced blocking issues client must fixClient (after fix) → SUBMITTED
READY_FOR_INTERNAL_REVIEWValidation passed; ops review pendingPayroll Executive
READY_FOR_EXPORTInternal review passedPayroll Executive
EXPORTEDInfotech import workbook generatedWorker → Payroll Executive uploads output
OUTPUT_IMPORTEDOutput workbook uploaded and parsedPayroll Executive requests approval
CLIENT_REVIEWApproval request sent to client approverClient approver
CLIENT_QUERY_OPENClient opened a query on a line itemPayroll Executive resolves → CLIENT_REVIEW
APPROVEDClient approver signed offPayroll Executive finalizes
REVISION_REQUESTEDClient approver rejected; revision neededRe-enters INTAKE_IN_PROGRESS for round 2+
FINALIZEDAll artifacts lockedPayroll Executive (or scheduled) closes
CLOSEDCycle complete; available in historySystem (after retention window) archives
ARCHIVEDCycle moved to cold storage per retention policyTerminal

Where these transitions happen in the handbook

Each transition has a corresponding userflow page:

Internal use only — BreezyCorp