Reference design — not client work
Expense Reports and Reimbursement
How a receipt becomes an approved, posted expense without anyone retyping it — with the failure modes, a typical build cost, and what we leave out.
This is a reference design: a worked example of how we would structure this workflow. It is not a description of work done for a client. We are a new firm and have no client results to report.
Workflow overview
Receipt in, expense line out. Five stages, one trigger, and a person kept in the loop wherever a rule cannot decide.
- Receive — a receipt lands in a dedicated mailbox or upload form
- Extract — date, vendor, amount, currency, and category are read from it
- Check — the expense is compared with your written policy
- Approve — the approver accepts, rejects, or asks a question
- Post — the approved expense is created in your accounting tool and the submitter is told
The workflow stays inside our standard scope bound: one trigger, no more than ten steps, no more than three systems. The three systems here are (1) the mailbox or upload form, (2) the tool where approvers respond, and (3) the accounting tool. If approvers respond by email, systems (1) and (2) are the same.
The trigger
A receipt arrives: a consultant forwards it to a dedicated expenses address, or uploads a photo or PDF through a simple form. That is the only trigger. Nothing runs on a schedule and nothing depends on month-end.
The steps
Step 1: Capture the receipt
- The receipt file and the sender are saved to a storage folder
- A new expense record is created with status "received"
- The submitter is asked for anything the receipt cannot tell us: which client or project it belongs to, and whether it is billable
Failure mode: Receipts arrive as blurry photos, screenshots, or emails with no attachment
Fix: An automatic reply asking for a clearer copy; the record stays open until a readable file exists
Step 2: Extract the details
- Date, vendor, total, tax, and currency are read from the receipt
- A suggested category is proposed from the vendor and line items
- Every extracted field is stored beside the original file so a person can compare them
Failure mode: The extraction reads a field wrongly (a total picked from the wrong line, a date in the wrong format) and nobody notices
Fix: Extraction is treated as a draft. Fields that are missing or implausible send the expense to a person instead of onwards, and the approver always sees the original receipt next to the extracted values
Step 3: Check against policy
- Plain rules you already follow are written down and applied: per-category limits, receipts required above a threshold, expenses older than a cutoff date, categories that always need a note
- A duplicate check compares vendor, amount, and date against earlier expenses
- Each expense leaves this step as "clear", "needs a closer look", or "outside policy", with the reason in words
Failure mode: The written policy and the real policy differ, so the rules block things the owner would happily approve
Fix: The rules are few and live in one editable list, not buried in the automation. The first weeks of use show which ones to change
Step 4: Route for approval
- The approver gets a single message with the receipt, the extracted details, the policy result, and approve / reject / ask buttons or reply options
- Reminders go out if there is no response after a set number of days
- A rejection or question goes straight back to the submitter with the approver's note
Failure mode: The approver is away and expenses sit unanswered
Fix: A named backup approver and an escalation after the reminder period. The decision always stays with a person
Step 5: Post to the accounting tool
- An approved expense is created as a bill or expense entry in your accounting tool, with the category, client or project, receipt attached, and the submitter as payee
- The record is marked "posted" with a link to the entry
- The submitter is told it was approved and posted
Failure mode: The posting fails (a category that does not exist, a connection that expired) and the expense is stuck half-done
Fix: Failed postings go to an exceptions list with the error, and the submitter is not told "posted" until the entry exists
Step 6: Keep a log
- Every expense keeps a plain history: received, extracted, checked, approved or rejected, posted, with times and who acted
- A short weekly list shows anything still open
Failure mode: Expenses are lost between steps and nobody knows
Fix: The weekly open list is the check that nothing has silently stalled
The failure modes
| Failure | Impact | Detection | Prevention |
|---|---|---|---|
| Extraction misreads an amount or date | Wrong figure posted to the books | Approver compares the original receipt with the extracted values | Extraction is a draft; missing or implausible fields go to a person |
| The same receipt is submitted twice | Duplicate reimbursement | Duplicate check on vendor, amount, and date | Flag matches for the approver rather than silently discarding them |
| Policy rules out of date | Legitimate expenses blocked, or limits ignored | Approver overrides pile up on one rule | Short rule list in one place, reviewed after the first weeks |
| Approver does not respond | Staff wait for reimbursement; month-end gets messy | Weekly list of open approvals | Reminders, a named backup approver, escalation |
| Posting to accounting fails | Approved expense never reaches the books | Exceptions list; "posted" status requires a real entry link | Category list kept in sync; connection expiry alerts |
| Expense assigned to the wrong client or project | Billable cost missed or mis-billed | Submitter confirms the assignment in Step 1 | Required field; choices come from your live project list |
Rough build cost
| Component | Cost Range | Notes |
|---|---|---|
| Receipt capture | $400-$900 | Dedicated mailbox rules or upload form, file storage, expense record |
| Detail extraction | $600-$1,500 | Reading receipts, handling several formats, confidence rules |
| Policy check | $400-$1,000 | Rule list, duplicate detection, plain-language reasons |
| Approval routing | $500-$1,200 | Approver message, reminders, backup approver, replies to the submitter |
| Accounting posting | $700-$1,800 | Entry creation, category and project mapping, error handling |
| Testing + handover | $300-$800 | Test receipts, runbook, walkthrough |
| Total | $2,900-$7,200 | Depends on the accounting tool and how varied your receipts are |
These are typical market costs to build this reference design. If your version fits our scope bound (at most 3 systems, 10 steps, 1 trigger), our fixed price is $4,500 for a First Workflow Build.
Timeline: our fixed-price build commits to 5 weeks from a signed spec, including testing and handover.
What this excludes
- Corporate card programs — Card issuing, card feeds, and statement reconciliation are a different workflow
- Multi-entity accounting — One set of books only; expenses spread across several legal entities are out of scope
- Payroll — The workflow ends when the expense is posted. Paying the reimbursement through payroll, or running the payment itself, is not included
- Tax and VAT treatment — Tax is captured from the receipt, but deciding how it is treated stays with your accountant
- Mileage, per diems, and travel booking — Receipt-based expenses only
- Sensitive data — Not suitable where receipts contain regulated personal or health data
How we'd approach building this
- Collect real receipts — A batch of recent receipts, including the ugly ones, shows what the extraction has to handle
- Write the policy down — The few rules you actually apply, in plain words, with the owner confirming each
- Map the posting — Which accounting entries, categories, and projects an approved expense must create
- Build the path end to end — Receipt in, entry out, with every failure going to a person rather than disappearing
- Test against the collected receipts — Compare extracted values to the originals and tune the rules
- Run it live with the team — Real submissions, with the owner watching the exceptions list in the first weeks
- Hand over — Runbook, who owns the rule list, and what to do when a posting fails
Questions this raises (for the client)
- Who approves expenses today, and who covers when they are away?
- What is your written expense policy, and how much of it do you actually enforce?
- Which accounting tool holds the books, and which expense categories and projects exist in it?
- Are any expenses re-billed to clients? If so, how do you want that flagged?
- Do your receipts include anything sensitive that should never pass through an automation?
Related teardowns
- Overdue Invoice Chasing — The money-in side of the same books
- Weekly Status Reporting — Another recurring task that follows the same collect, check, send pattern
See where you stand
This reference design is one piece of our method. The assessment will tell you whether you're ready to build, or what's missing first.
Take the free assessment