Home / Work / Case study 002
Automation Multi-Agent Systems Live in production

Three tools, eleven spreadsheets, one platform.

A 30-person managed IT services provider ran onboarding, billing, and support on three SaaS tools that didn't talk to each other — stitched together by people copy-pasting. We replaced the stitching with orchestrated agents and one system of record. Ten weeks, phased so nothing broke.

Client
Managed IT services provider, 30 people, ~140 client accounts (name withheld under NDA)
Engagement
10 weeks, hourly with a cap + support retainer
Team
2 senior engineers, 1 designer
Shipped
Q2 2026 — in production since
3
SaaS subscriptions retired (~$31K/yr)
62%
Faster client onboarding (13 days → 5)
0
Manual handoffs between systems
71%
Of support tickets auto-routed correctly on day one
/01

The problem

The company had grown from 8 people to 30 in three years, and its tooling grew the way tooling always grows: one subscription at a time. By the time they called us, the operational picture looked like this:

  • Onboarding lived in a project-management tool — a 40-step template cloned for each new client, with fields filled in by hand.
  • Billing lived in a subscription-management tool that didn't know what the PM tool knew, so every contract change was entered twice.
  • Support lived in a helpdesk where a dispatcher read every incoming ticket and decided who should handle it.

None of the three shared data. The glue was people: the operations lead spent roughly two days per new client shepherding the checklist, and the team maintained eleven spreadsheets to reconcile what the tools disagreed about. Billing errors — a provisioned service that never made it onto an invoice — were caught quarterly, if at all. An internal audit we ran in week one found ~$4,100/month in services being delivered but not billed.

Why not just buy a better all-in-one?

They tried. Twice. The all-in-one PSA platforms they evaluated would have required reshaping their service catalog around the tool's assumptions, and still needed the dispatcher. The honest math: a custom system cost about 14 months of the subscriptions it replaced — and then it's theirs.

/02

The approach

The core design move: one system of record, three agents working on top of it. Instead of syncing three databases that disagree, we built a single PostgreSQL schema for clients, contracts, services, and tickets — then gave each operational workflow an agent that acts on that shared state.

  1. Onboarding agent — takes a signed contract (PDF), extracts the service schedule, generates the provisioning plan from the firm's 40-step playbook, executes the automatable steps (accounts, licenses, monitoring, welcome sequences), and assigns the human steps with context attached. Nothing is marked done until verified — the agent checks that the license actually exists, not that a box was ticked.
  2. Billing agent — watches the same state. When a service is provisioned, changed, or cancelled, the invoice line follows automatically. Month-end, it drafts invoices, reconciles against delivered services, and flags anomalies for the bookkeeper instead of letting them ship.
  3. Support routing agent — reads each incoming ticket, pulls the client's environment and history from the shared record, classifies urgency and category, and routes to the right engineer with a briefing note. Ambiguous tickets go to a triage queue — the dispatcher role became an exception-handler role.

Agents act, an orchestrator supervises

Each agent runs on an event queue and writes back to the system of record — so every action is inspectable, replayable, and reversible. A thin orchestration layer enforces the rules the business actually cares about: no invoice goes out without a matching provisioned service; no onboarding step is skipped without a named human overriding it; every agent action above a spend threshold requires approval. Autonomy where it's cheap to be wrong, checkpoints where it isn't.

Stack notes

Next.js + TypeScript on Vercel for the dashboard and approval queues; PostgreSQL (Supabase) as the system of record; queue-backed workers for agent runs so long operations survive restarts. Ticket classification runs on a fast model with the client's service catalog in context; contract extraction and anomaly analysis on a frontier model. Stripe for payment execution — the billing agent drafts, Stripe charges, and the two are reconciled nightly.

/03

The rollout

You don't rip out a company's billing system in one weekend. Each workflow moved independently, ran in parallel with the old tool until trust was earned, and only then was the subscription cancelled.

Weeks 1–2

System of record + data migration

Unified schema; migrated 140 client accounts and three years of history out of the three tools. The eleven reconciliation spreadsheets were the Rosetta Stone — they encoded every disagreement between systems, and resolving them surfaced the unbilled services.

Weeks 3–5

Support routing first

Lowest stakes, fastest feedback: a misrouted ticket costs minutes, and there are dozens a day to learn from. The agent ran in suggest-mode for one week (dispatcher clicks to confirm), then took over routing with a triage queue for the ambiguous ~15%. Day-one auto-routing accuracy: 71%; by week 10: 89%.

Weeks 5–8

Onboarding agent

Two real client onboardings run side-by-side with the old checklist. The second one finished in 5 days against the old process's 13 — the difference was almost entirely wait-states removed: steps that used to sit in someone's inbox now fire the moment their dependency completes.

Weeks 8–10

Billing last — deliberately

One full billing cycle in shadow mode: the agent drafted every invoice, the bookkeeper compared against the old tool line by line. Two months of clean parallel runs (plus the recovered unbilled services) made the cutover decision easy. All three legacy subscriptions cancelled at week 12.

/04

The results

Measured at 90 days after full cutover, against the company's own records from the prior two quarters:

MeasureBeforeAfterDelta
Client onboarding, signed → fully provisioned13 days median5 days median−62%
Ops lead time per onboarding~16 h~3 h (human-judgment steps only)−81%
Ticket dispatch100% manual, ~22 min median wait85% automatic, <1 min−95% wait
Unbilled delivered services~$4,100 / month leaking$0 — structurally impossible+$49K / yr
SaaS spend (three tools)~$31K / year$0 (hosting + inference ≈ $6K / yr)−$25K / yr net
Reconciliation spreadsheets110−11

The recovered billing leakage alone — services delivered but never invoiced — pays for the entire build in under 18 months, before counting the retired subscriptions or the operations lead's reclaimed two days per client.

What we'd tell you if you're considering something similar

Replace workflows in order of feedback speed, not business importance. Support routing was the least valuable workflow and the right one to ship first — dozens of daily decisions to learn from at trivial cost-per-error. By the time we touched billing, the team trusted the platform's judgment because they'd watched it earn accuracy in public.

Built with
Next.jsTypeScriptClaudePostgreSQLSupabaseRedisStripeVercel
Your turn

How many tools is your team the glue between?

If the answer involves a spreadsheet, we should talk. We'll map your workflows and tell you honestly what's worth automating — and what isn't.