AggregateDocs
Use it

Definitions: how Aggregate counts cash, burn, runway, MRR and the rest

Short answer: every number Aggregate gives you or your AI uses one fixed definition, written down here and in the code linked under each one. The AI doesn't do the arithmetic. It asks Aggregate, which computes the figure the same way every time from one double-entry ledger and says how. When Aggregate can't know a figure (a source hasn't synced, a month is missing), it says *unknown* and why. It never shows a zero it can't vouch for.

What Aggregate doesn't do yet, and what happens instead, is on Known limits.

Each answer also carries its own one-line formula, the accounts it counted and left out, and the rows behind it, so an AI can show its work.

Cash

The sum of the latest balance each bank reports for the accounts counted as cash: bank accounts, cash on hand and processor balances (Stripe, Square, Shopify…). It uses the *current* balance, not the *available* one, so a processor's pending funds count. Accounts in other currencies are converted at the rate on the as-of date.

Code: balanceMetric and computeCashFigures in packages/core/src/metrics.ts.

Burn

Gross burn is everything spent in the period, cash basis: every expense account (card purchases on the day of the swipe, as your bank or card reports the date, payroll, fees, taxes, software, rent…) plus refunds paid to customers.

Net burn is gross burn minus operating money in: revenue, interest and other income. Positive means the company is burning cash; zero or below means it isn't burning ("not burning").

Never in burn, either way: transfers between your own accounts, credit card payments (the purchases were already counted when you swiped), processor payouts, owner money, investor money, loan principal and sales tax paid over to the state.

The overview shows net burn as a monthly average over the last three complete months. If your records start part-way through a month, that month is left out of the average. If one account's records start later than the rest, the answer says so. The month you're in isn't counted, because a half month would understate it.

Code: burnMetric and flows in packages/core/src/metrics.ts.

Runway

Cash ÷ average monthly net burn over the last three complete months, cash basis. Shown in months, to one decimal, with the approximate date the cash would run out.

Code: runwayMetric in packages/core/src/metrics.ts.

Revenue

Cash basis: money in from customers in the period. Processor charges count at the gross amount the customer paid, minus refunds, and a charge with no invoice can include the sales tax in it, because the processor's row doesn't split it out. Bank deposits count when they're categorized as revenue. Processor fees are a separate expense ("Processor fees"), so revenue is *gross* of fees. That's why it adds up to more than the payouts you see at the bank.

Accrual basis: invoiced revenue recognized by issue date, minus credit notes and refunds, net of sales tax. It's only as complete as the invoicing tools you've connected.

Code: revenueMetric in packages/core/src/metrics.ts.

What never counts as revenue

Code: classifyTxn and roleForKind in packages/core/src/posting.ts.

MRR and its movements

MRR uses Stripe's definition: the monthly value of active and past-due subscriptions, after discounts, without tax, trials or metered usage. Yearly plans count as a twelfth per month. Other currencies are converted at the as-of rate. ARR is MRR × 12. For a past date, MRR counts what was live that day, from each subscription's own history.

Movements, month by month and per customer, the way ChartMogul and Baremetrics count them:

MovementWhen
NewA customer with no MRR at the start of the month has some at the end, and has never paid before
ReactivationThe same, but the customer had paid at some point before
ExpansionA customer's MRR went up
ContractionA customer's MRR went down, but not to zero
ChurnA customer's MRR went to zero

Counting per customer means a customer who swaps one plan for another is an expansion or contraction, not churn plus a new customer. Start + new + expansion + reactivation − contraction − churn = end, exactly.

Code: mrrMetric and mrrMovementMetric in packages/core/src/metrics.ts and mrrMovements in packages/core/src/mrr.ts.

Money owed to you and bills due (AR and AP)

Aging puts each open invoice or bill by days past its due date:

BucketDays past due
Currentnot due yet (or no due date)
1–301 to 30
31–6031 to 60
61–9061 to 90
90+over 90

Code: openItemsMetric in packages/core/src/metrics.ts and the aging in searchInvoices, packages/core/src/finance-reader.ts.

"All reconciled"

The Workspace shows All reconciled only when nothing below is outstanding. Otherwise it counts what is, for example "3 things need a look: 2 to review, 1 balance doesn't match". An account with one balance or none has nothing to compare yet, so the line says "Reconciled except 1 account not tied out yet" until a second balance or a statement arrives.

Code: dataHealth in packages/core/src/health.ts and the checks in packages/core/src/checks.ts.

How fresh a figure is

Every figure is *as of* the oldest successful sync among the sources behind it. A source that hasn't synced in over a day is named as stale next to the figure, never quietly mixed in. A figure asked for a past date is as of the end of that day.

Code: answerAsOf and staleSources in packages/core/src/metrics.ts.

© 2026 Aggregate Finance LLC