The problem
Senior accountants were capped at ~22 clients each — same 18-step close on every client every month. The firm wanted to grow toward 350 clients without a proportional hiring plan.
Our approach
What we built
- Per-client close as an AWS Step Functions graph, with an orchestrator agent dispatching to specialized sub-agents (reconciliation, coding review, accrual, narrative).
- MCP servers wrapping QuickBooks Online and Xero so the agents see a uniform tool surface across the entire client base.
- Coding-review agent that flags anomalous chart-of-accounts mappings versus that client’s history; queues for senior review with cited prior-period examples.
- Variance-narrative agent producing management-report commentary — never sent without partner sign-off.
- Three-layer eval suite covering each sub-agent independently; partner reviews 5 random close packets per week.
Caveats
The variance-narrative agent occasionally invented plausible-sounding explanations on clients with sparse history; narrative generation is now hard-gated on a minimum of six months of comparable data. Xero integration was harder than QBO — rate limits forced a queue-based ingestion design we hadn’t quoted for.
Stack. AWS Bedrock (Claude for reasoning, Haiku for routing) · Step Functions · QBO + Xero connectors via MCP · S3 · Langfuse self-hosted in the client VPC.
Outcome
Senior throughput moved from ~22 to 32–36 clients per FTE. Average human time per close fell from 6 hours to 2.5. Calendar time per close fell from 9 business days to 5.
32–36
clients per senior accountant (was 22)
60%
reduction in human time per close
$520K
deferred hiring cost in year 1