Case Study Skeleton: Invoice Follow-Up Agent for a Design Studio
Status: SKELETON. Sections marked [PILOT DATA] are populated only with measured results from an actual engagement — never estimated.
Dry-run evidence (simulated). Our deterministic pilot simulator already exercises this exact agent stack end-to-end: over a 14-day simulated dry run it reviewed 70 open invoices, drafted 34 dunning reminders across the gentle→reminder→final aging ladder (every draft passed a banned-phrase tone gate), paused 8 follow-ups on customer payment promises, and escalated 28 accounts to humans (disputed invoices under contact freeze plus 90-day-plus accounts handed to human collections). All figures are from a simulated dry-run against synthetic data (see the live demo scenario). No real customers were involved.
The client
Small design/creative studio (fictional persona used for this skeleton), one owner who splits her week between client work and chasing money. Overdue invoices live in the billing system; the follow-up process lives in her outbox and her memory — a sticky-note dunning cadence of gentle nudges, firmer reminders, and the occasional awkward final notice. [CLIENT NAME PENDING CONTRACT]
The problem
- The owner chases every overdue invoice by hand — hours each month spent composing, sending, and remembering follow-ups instead of doing billable design work
- Follow-ups are inconsistent: some invoices get three touches, others slip through the cracks for weeks, so average days-to-payment drifts upward
- The awkward cases are handled worst of all: when a client disputes an invoice or promises payment verbally, nothing systematic records it, and emotionally charged "final demand" drafts risk damaging relationships
What we deployed
An Invoice Follow-Up Agent running our standard loop on top of a deterministic collections policy (CollectionPlanner) whose guardrails live in code, not in the prompt:
- a deterministic aging ladder in code: 0–7 days overdue gets a gentle nudge, 8–30 days a reminder, 31–60 days a final notice — tier chosen by computed days-overdue, never by LLM judgment
- disputed invoices are NEVER messaged again: a dispute keyword or disputed status triggers an immediate contact freeze and routes the account straight to a human — arguing with a disputing customer is how you lose them
- payment-promise pause: if the customer's notes record a promised payment date, follow-ups pause until that date instead of hounding someone who already committed
- hard human handoff: accounts past 90 days overdue, or that have exhausted their touch cap, go to human collections — the agent escalates rather than escalate the language
- a banned-phrase tone gate on every draft: no litigation, lawsuit, credit-score, or collections-agency language can reach a customer — anything that would trip the gate is escalated to a human instead of sent
- an auditable
reminders.jsonllog: every drafted touch recorded with timestamp, invoice, tier, and message text
Results framework (fill during/after pilot)
| Metric | Before | After | Source |
|---|---|---|---|
| Owner hours spent chasing invoices per month | [PILOT DATA] | [PILOT DATA] | client timesheets |
| DSO / average days-to-payment | [PILOT DATA] | [PILOT DATA] | billing-system reports |
| % of overdue invoices touched on schedule | [PILOT DATA] | [PILOT DATA] | reminders.jsonl audit log |
| Disputes routed to humans same-day | — | [PILOT DATA] | escalation records |
| Cost per dunning touch | [PILOT DATA] | [PILOT DATA] | token ledger |
Pricing fit
Invoice follow-up runs on our platform-fee-plus-usage model: $550/mo platform fee + $8.00 per collected invoice (an invoice paid after an agent touch within the cycle). Because each touch is a small deterministic decision with a tiny token footprint, the internal simulated worked example clears our enforced 30%-margin floor easily — at ~90% contribution margin per collected invoice in the simulated dry-run estimate (see reports/pricing_model.md §6, and pricing). Disputed invoices are never billed or messaged, so revenue only accrues on clean, successful collections — the pricing aligns our incentive with the client's cash flow.
Why the deterministic dunning policy matters
In collections, one wrong message can cost the relationship the invoice was worth. The aging tier, the dispute freeze, the promise pause, and the handoff thresholds all live in deterministic code the language model cannot override — the LLM only drafts within a tier the planner has already chosen, and every draft must clear a banned-phrase tone gate before it exists as a candidate. A disputing customer never receives another automated message, and every touch is attributable to its invoice record, its aging rule, and a loop cycle.
Lessons learned section
[POST-PILOT: list top 3 lessons from data/loops/<project>/ — real ones, verbatim.]
SIMULATED DATA — every dry-run figure on this page is a simulated estimate against synthetic data; none comes from a real engagement yet.