Revenue Retention Bridge

Every month's revenue change, bridged exactly.

  • Sums to the last unit
  • GRR and NRR exact
  • Monthly waterfall
A small grey stone fountain bowl on a wooden desk between two tall rounded stone pillars, with two soft stone blocks stacked like steps at one pillar's foot.

The guide

Your monthly revenue total is a net figure, and a bridge shows the five movements it hides

Recurring revenue that barely moves can hide a month of heavy losses and strong gains. Splitting the change by customer, and checking the sum, is how you see which happened.

  • 230 to 235 opening to closing revenue in the worked example
  • 65.79% gross revenue retention over two months, worked example
  • 76.32% net revenue retention over the same two months
  • 69.57% the monthly gross form for the same month, a different measure
Read the full guide Fold the guide 8 min · 13 sources

A subscription business can look calm from the top. Last month the recurring revenue was 230, this month it is 235, and the line on the dashboard creeps upward. Nothing in that pair of numbers says whether five customers quietly grew, or whether one large customer left and was papered over by two small new ones. Both stories produce the same total, and they call for very different decisions.

Recurring revenue is revenue that is likely to keep arriving at regular intervals for a long time, typically from subscriptions or contracted services. It is usually tracked per month as monthly recurring revenue, or per year as annual recurring revenue, and it leaves out one-time items such as implementation fees, hardware and discounts. Software sold as a service is the familiar case: the subscription model gives the seller a continuing, renewable stream, and that stream stays exposed to cancellation.

What a monthly total hides

A total is a net figure. Every month some customers pay more, some pay less, some stop and some arrive or come back, and the total reports only the sum of all that motion. Churn writing has long separated gross losses from net ones. Gross attrition is the loss of existing customers together with the recurring revenue attached to them, and net attrition nets that loss against similar customers added in the same period. The second number can look healthy while the first is alarming.

There is a quieter loss as well. A customer who stays but buys less never shows up in a count of customers lost. Analysts of customer attrition have a name for it, partial churn, meaning customers who still use the service but not as much or as often as they used to. On a revenue line it is real money leaving, even though nobody cancelled anything.

Counting customers cannot see that, which is why this page works in revenue movements rather than in heads or cohorts. The measurement itself is a matter of records, not of surveys. Retention research draws a line between what customers say they intend and what they actually do, and it measures the behaviour from accounting data: the amount and value of what each customer bought, and how often. A file with one recurring amount per customer per month is exactly that kind of record.

Five movements and the customer who comes back

For any month, every customer either had revenue in the month before or did not, and either has revenue now or does not. That gives a short list of cases, and each one is a movement. A customer paying in both months who now pays more is expansion, by the difference. One who now pays less is contraction, by the difference. A customer who paid last month and pays nothing now has churned, and the revenue lost is last month’s amount, because that is what disappeared from the total.

The remaining case is the interesting one: nothing last month, something now. Here the rule needs memory. If the customer never paid anything earlier in the file, the revenue is new. If the customer paid at some earlier point and then lapsed, the revenue is reactivated. Lumping the two together flatters acquisition, and the churn literature has a name for the behaviour that makes it matter: rotational churn, where a customer leaves and quickly rejoins, sometimes to take an introductory offer again.

Put the movements together and they must account for the whole change. Opening revenue plus new, plus reactivated, plus expansion, minus contraction, minus churned, equals closing revenue. That is an identity, not an estimate, so it can be checked every month. If a classifier takes a churned customer’s revenue from the wrong month, or counts a returning customer twice, the two sides stop agreeing and the error shows at once.

Here is a small case to check by hand or to paste into the tool. Five customers, A to E, over three months, 2026-01 to 2026-03. A pays 100, 100, then 120. B pays 50, 50, then nothing. C pays only in March, 30. D pays 40 in January, nothing in February, and 25 in March. E starts in February at 80 and drops to 60 in March.

The February total is A, B and E: 230. In March, C is new at 30, D is reactivated at 25, A expands by 20, E contracts by 20 and B churns 50. So the month runs 230 to 235: 230 plus 30, plus 25, plus 20, minus 20, minus 50, gives 235, to the last unit.

Exactness is not automatic in software. A JavaScript number is a 64-bit binary floating-point value with roughly 15 to 17 significant decimal digits, and arithmetic beyond that precision is rounded. Most decimal fractions cannot be stored exactly: added as numbers, 0.1 and 0.2 give 0.30000000000000004, and long sums drift further. Whole numbers are safe up to 2 to the power 53 minus 1. The tool therefore turns each amount into a whole count of millionths and adds them as BigInt values, which hold integers of any size; they cannot hold fractions, and BigInt division truncates, which is why every ratio is formed from whole numbers and rounded only for display.

Gross, net, and why the definitions differ

Retention ratios answer a narrower question than the bridge: of the revenue that existed at some earlier point, how much is still here? The tool fixes a starting set, the customers who had revenue a chosen number of months back, and follows only them.

Gross revenue retention adds up, for each member, the smaller of the old and the new amount, and divides by the set’s old revenue. It cannot exceed 100 percent, because growth is capped at what each customer paid before. Net revenue retention adds up what the same members pay now, growth included, and divides by the same base. New customers are left out of both. Members who left and came back count at whatever they pay now.

In the worked example with a lookback of two months, the starting set is the January payers: A at 100, B at 50 and D at 40, a base of 190. In March, A pays 120, B pays nothing and D pays 25. Gross retention counts 100 for A, 0 for B and 25 for D: 125 over 190, or 65.79%. Net retention counts 120, 0 and 25: 145 over 190, or 76.32%. Customer E contracted in March, but E was not paying in January, so E is outside this set entirely.

None of the sources behind this page sets out a standard for these ratios, and the definitions in circulation disagree on details that change the answer. Even the plain churn rate has variants: the common form divides customers lost by customers at the start of the period, while an alternative divides by customers acquired in the same period. Writers also warn that churn can be overstated when someone drops a service and restarts it within the year. Any revenue ratio quoted without its formula is therefore half a number, which is why the tool states its definitions as its own and prints each formula beside the result.

Lookbacks, compounding and the waterfall

There is a second family of ratios built from one month’s movements alone. The monthly gross form is one minus contraction and churn over the opening revenue; the net form adds expansion and reactivation back in. In the worked example, March gives 160 over 230, which is 69.57%, for the gross form, and 205 over 230, which is 89.13%, for the net form. These numbers differ from the lookback figures above because they cover different customers: E’s contraction counts here, and nobody is excluded for being new.

Multiplying monthly forms together to get a yearly rate is common, and it compounds. Twelve monthly rates multiplied give a figure that bakes in the movements of customers who were not around at the start of the year, and it will rarely match the twelve-month lookback measured directly. Neither is wrong. They answer different questions, and mixing them in one report is how two teams end up arguing over numbers that were never meant to agree. Aggregate figures have a related trap: for a fast-growing base, churn measured across the whole base understates what a group of customers followed over time would show.

A waterfall chart is the natural picture of a bridge. It shows how a starting value is changed by a sequence of positive and negative steps, with the intermediate bars floating in mid-air, and in finance it is often simply called a bridge. It is a standard way to show how revenue changed between two periods. Read it left to right: the opening pillar, each movement stepping up or down from where the last one ended, and the closing pillar landing exactly where the steps leave off.

What churned revenue costs to replace

Losses carry a second cost. A customer who leaves has to be replaced, and replacing customers is not free. Customer acquisition cost, in its simple form, is the marketing spend on winning new customers divided by the number won in the period; fuller versions add sales wages, software and services. Attrition analysis rests on the observation that keeping an existing customer usually costs far less than acquiring a new one, though not every departure is bad: some customers are unprofitable, and letting them go can be a sound choice.

The arithmetic the tool offers is deliberately plain. It multiplies the churned customers it counted by an acquisition cost you type, and sets any retention budget you name beside the month’s churned plus contraction revenue and twelve times that. In the worked example, one customer churned and 70 of revenue left through churn and contraction, 840 over twelve months if March repeated. It claims nothing about what a retention budget would save, because the file holds no evidence either way.

The method has hard edges. It classifies and sums what the file says, exactly, and nothing more. It does not forecast. It does not spread an annual invoice across twelve months, so a file of raw invoices will show a spike and eleven churns; the file must already hold the recurring amount for each month. It assumes no currency. And the CSV itself follows the common format described in RFC 4180, which notes that no formal specification of CSV existed and documents how quoted fields carry commas, quotes and line breaks.

Large files are read in slices, a megabyte at a time, so the whole file is never held at once, and the counting runs in a background thread, so the page stays responsive while it works. Nothing is uploaded. Amounts are grouped for reading by the browser’s language-sensitive number formatter, but they are kept and exported as plain digits.

What comes back is every month’s bridge, checked, and every customer’s movement, listed. The total on the dashboard still matters. It simply stops being the whole story.

Sources

Every source consulted for this guide. Links checked October 26, 2026.

  1. Revenue stream Wikipedia
  2. Churn rate Wikipedia
  3. Customer attrition Wikipedia
  4. Customer retention Wikipedia
  5. Software as a service Wikipedia
  6. Waterfall chart Wikipedia
  7. Customer acquisition cost Wikipedia
  8. Common Format and MIME Type for Comma-Separated Values (CSV) Files IETF, RFC 4180
  9. BigInt MDN Web Docs
  10. Number MDN Web Docs
  11. Intl.NumberFormat MDN Web Docs
  12. Using Web Workers MDN Web Docs
  13. Blob: slice() method MDN Web Docs