Expense Tracking App Starter · Industry version
Every expense coded to a client and engagement, billable or not — expense tracking built for firms, in code the firm owns.
In a services firm, an expense isn't fully recorded until it's coded — which client, which engagement, billable or absorbed. This starter makes that coding structural: line items carry client and engagement from entry, markup rules apply automatically, and month-end billing pulls from data instead of memory.
01 · The problem
A generic expense tool asks one question: what did the company spend? A firm needs three more: for whom, on what engagement, and can we bill it? When those answers live in a free-text memo field, month-end means a partner reading line descriptions and guessing — and every guess that lands wrong is either leaked margin or an awkward client credit.
Recoverability has rules that vary by engagement, not by category. One client's master agreement caps travel at economy fares; another allows a ten percent handling markup on pass-through costs; a fixed-fee project absorbs everything. Generic tools can't attach policy to an engagement, so the people entering expenses have to remember contract terms they've never read.
And unbilled expenses are working capital bleeding out quietly. A cost incurred in March and invoiced in June was an interest-free loan to the client for a quarter. Without a live view of billable-but-unbilled balances by engagement, firms discover the leak annually — in the realization report, when it's history.
02 · Data model
Everything in the base Expense Tracking starter —
employeesreportsexpensesreceiptscategoriesapprovals— plus the entities this industry actually runs on:
| table | what it holds |
|---|---|
engagements | Client engagements with billing terms, expense caps, markup rules, and recoverability defaults that line items inherit. |
billing_clients | The firm's clients with billing contacts and master-agreement expense terms — the parent recoverability rules hang from. |
expense_recoveries | The billing fate of each billable line: invoiced when and on which invoice, written off, or still awaiting billing. |
03 · Screens
Client and engagement are required fields at entry, with the billable flag defaulting from the engagement's terms. The expense arrives coded, so the classification work happens once, by the person who was actually there.
The manager step checks policy; a billing review checks recoverability — is this within the engagement's cap, does the markup apply, will the client recognize it? Two lenses, two explicit steps, both on the record.
The dashboard shows billable-but-unbilled balances by client and engagement, aging as they wait. When the number goes stale on an engagement, someone asks why in April instead of at year-end.
04 · In practice
Flights, hotel, and meals enter against the engagement; its terms flag them billable within the agreed cap. After approval, each line waits in the unbilled queue with its markup computed — visible to billing from the day it lands.
Billing pulls approved unbilled expenses per engagement, reviews the list, and marks lines to their invoice. Each recovery record stores the invoice reference, and realization on expenses becomes a number you can trust.
When a cost can't be billed — over cap, past the billing window, a relationship call — it's written off explicitly with a reason code. Write-off patterns per engagement then feed the next fee negotiation, instead of vanishing into 'overhead'.
That's the designed handoff: approved billable lines accumulate per engagement with markup applied, and billing marks them to invoices with the reference stored. Pair it with the invoicing starter and both sides work the same schema you own.
Engagements carry caps, markup rules, and recoverability defaults, and line items inherit them at entry. The consultant doesn't need to know the master agreement — the engagement record already does.
Yes — write-offs are explicit records with reason codes, reportable by client and engagement. Recurring write-off patterns are exactly the evidence you want when repricing an engagement or renegotiating expense terms.
Partner draws and firm expenses stay cleanly separated because categories and routing are yours to define — a partner-expense category can take its own approval path. It's your code, so the firm's particular governance is a rule, not a workaround.
Dual7 App Starters
Every expense coded to a client and engagement, billable or not — expense tracking built for firms, in code the firm owns. Describe your version to start — the output is a project you own.