Permanent-placement recruitment agencies have a simpler Acumatica story than staffing firms, and it's worth separating the two even though people use the words interchangeably. A recruitment/placement firm's revenue event is a one-time placement fee (often a percentage of the candidate's first-year salary); a staffing firm's revenue is ongoing pay-and-bill for temp/contract workers on assignment, which is a materially different — and harder — accounting problem covered in the staffing post.
Placement fees are a straightforward AR/Sales Order pattern
A completed placement is close to a one-time Sales Order or a simple non-project AR invoice: a fee percentage against the agreed salary, sometimes staged (a portion on start date, a portion at 90 days), sometimes with a guarantee/replacement clause. Staged billing maps onto Acumatica's standard recurring/installment invoicing or a light Sales Order with multiple ship-and-bill-style lines; it does not need the Projects module unless the firm also wants per-recruiter performance tracking (see below).
Placement Fee: 20% of $90,000 base = $18,000
Invoice 1: 50% ($9,000) on candidate start date
Invoice 2: 50% ($9,000) on 90-day anniversary,
contingent on candidate still employed
(replacement guarantee clause — track manually
or via a follow-up task, not a system-enforced hold)
The real integration problem: the ATS is the system of record for candidates, not Acumatica
Recruiters live in an applicant tracking system (Bullhorn, Greenhouse, JobAdder, etc.) — that is where candidates, requisitions, and pipeline stages actually get managed, and it should stay that way. Acumatica should not try to become a lightweight ATS; the integration boundary that works is: placement confirmed in the ATS triggers creation of the AR invoice/Sales Order in Acumatica via the REST API, one-directional, with the ATS placement ID stored on the Acumatica document for reconciliation. Trying to push the other direction — recruiters working pipeline stages inside Acumatica — is a recurring mistake that produces a system nobody wants to use.
Same lesson as the IT services PSA integration: a failed or duplicate webhook from the ATS either under-bills a client or double-invoices a placement, and a dollar-total reconciliation won't catch either reliably. Reconcile placement record count between the ATS and Acumatica on a schedule, and alert on mismatch before it reaches a client's inbox.
Recruiter commission and per-recruiter performance
If the firm wants per-recruiter placement performance (fees closed, pipeline value, commission owed), that's where modeling each open requisition as a lightweight Project earns its keep — not for cost tracking in the usual sense, but so the recruiter can be attached as the Project's owner/resource and a GI can roll up closed-fee totals per recruiter for commission calculation. For a small firm this is over-engineering; for one with a real commission plan and more than a handful of recruiters, it's the cleanest way to get the reporting without a bolt-on commission tool.
Wrapping up
Keep the ATS as the single source of truth for candidates and pipeline, and let Acumatica own only the billing event — a one-directional, reconciled sync from placement confirmation to AR invoice. Reach for the Projects module only if per-recruiter commission reporting is a real requirement, not by default.
Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.