Staffing agencies are the hardest of the professional-services verticals to get right on Acumatica, and the reason is specific: pay-and-bill spread margin, computed per contractor per timesheet, at volume, with the pay side and the bill side needing to reconcile constantly. Get the architecture wrong and you either can't see true margin until month-end close, or you're maintaining two parallel systems that drift apart.
The core pattern: bill rate and pay rate on the same timesheet line
Every hour a contractor works generates two numbers: what the client is billed, and what the contractor (or the staffing firm's payroll, if W-2, or the contractor's own invoice, if 1099/subcontracted) is paid. The spread between them is the agency's gross margin, and it needs to be visible per timesheet line, not reconstructed later. Model each active assignment as a Project (or lightweight Project-Task) with both a Customer billing rate and an Employee/Vendor cost rate configured — the same rate-resolution mechanism consulting firms use for T&M billing, just with cost rate populated deliberately rather than left at a default.
Assignment: Contractor #4471 -> Client "Acme Logistics", Warehouse Ops
Bill Rate (to client): $42.00/hr
Pay Rate (to contractor): $28.00/hr (W-2) or Vendor AP rate (1099)
Spread: $14.00/hr = 33% gross margin
Timesheet line generates BOTH:
- AR billable time activity at Bill Rate
- Payroll/AP cost entry at Pay Rate
Margin visible per line, not just at invoice/payroll run
W-2 payroll vs 1099/subcontracted — different Acumatica paths
If contractors are W-2 employees, pay flows through Acumatica Payroll (or an integrated payroll provider) against the Employee record, with time captured the same way as any Projects timesheet. If contractors are 1099/subcontracted through a vendor arrangement, cost flows through AP as a vendor bill against the same Project/Task, coded from the timesheet rather than manually re-keyed. Firms running a mix of both (common — W-2 for longer assignments, 1099 for short ones) need both paths live simultaneously, coded to the same Project structure so a single margin report works across the mix; building two separate reporting paths for W-2 vs 1099 margin is a maintenance trap I'd actively avoid.
Client timesheet approval is the workflow that actually needs building
Staffing firms typically need the client (not just the contractor's manager) to approve hours before billing — a VMS (vendor management system) portal in larger accounts, or a simple approval email/portal for smaller ones. This is Acumatica's Workflow engine territory: a time activity in "pending client approval" state that can't be included in a billing run until approved, with a defined escalation if the client doesn't respond in a set window. Skipping this and billing on submitted-but-unapproved time is the fastest way to generate billing disputes.
If cost rate isn't captured at time-entry (left to be reconciled during payroll run days later), the agency runs blind on margin for every open assignment in between — and by the time a bad-margin assignment shows up in a month-end report, it's too late to renegotiate or pull the contractor. Populate both rates at assignment setup, before the first timesheet is ever entered.
Wrapping up
The whole staffing-on-Acumatica problem collapses to one discipline: capture bill rate and pay rate together, at assignment setup, on the same Project/Task structure that generates both the AR billing and the payroll/AP cost side — so margin is visible per timesheet line instead of reconstructed at month end. Everything else (W-2 vs 1099 paths, client approval workflow) is real but secondary to getting that rate pairing right from day one.
Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.