Recurring revenue movement explorer for subscription billing
See how recurring revenue moved across any month or quarter, split by new, expansion, contraction, churn and reactivation, with the customers behind every bar.
Build me an app that explains how our recurring revenue moved over a period, using our Chargebee subscription billing data. Chargebee's own reporting will not break recurring revenue into movement types, so our finance lead rebuilds this in a spreadsheet every single month. The audience is finance and leadership, so every screen has to be readable by someone who did not build it.
The main view is the movement explorer. At the top I pick a period: a calendar month, a quarter, or a custom start and end date, plus a currency. Below that, show a waterfall that starts at opening recurring revenue for the period and ends at closing recurring revenue, with bars in between for new, expansion, contraction, churn and reactivation. Under the chart, repeat the same figures as a summary table with net new recurring revenue and the percentage change from opening to closing.
Handlers compute the movement from Chargebee's List Subscriptions, List Customers, List Invoices and List Item Prices. The buckets come from comparing subscription state and mrr across the period boundary: a subscription that activated inside the period is new; an existing subscription whose mrr went up is expansion, counting only the increase; an existing subscription whose mrr went down is contraction, counting only the decrease; a subscription cancelled inside the period is churn; and a previously cancelled subscription that is active again is reactivation. Use List Customers to resolve names and emails for display, and List Invoices to sanity check what was actually billed inside the period.
Every bar in the waterfall is clickable. Clicking opens a drill-down table of the exact customers and amounts sitting behind that bucket: customer name, subscription, item price, amount before, amount after, the difference, and the date the change happened. Sort by the size of the change descending so the largest movers are at the top, and let me search and re-sort the table. This is the whole point of the app. When contraction spikes I want to see which accounts downgraded and by how much rather than guessing.
A second view is a comparison: two periods side by side, for example this quarter against last quarter, showing each movement bucket for both plus the difference between them. In this view, segment the movement by plan using item prices from List Item Prices, so I can tell which plans are genuinely growing and which are quietly shrinking. Each plan row expands to the customer level the same way the waterfall bars do.
Any finished table, in either the drill-down or the comparison view, can be exported to Google Sheets using Append Values, appending to a spreadsheet and tab I choose so the board pack builds up over time. From the main view I can also post the headline movement summary, meaning opening, each movement bucket, closing and net change, to a leadership channel using Slack Bot's Send a Message, with a short preview before it sends.
Platform nuance to bake in. Chargebee money amounts are integers in the currency's smallest unit, so divide before display and never sum across currencies blindly: either filter to one currency or group by currency. Timestamps are Unix epoch seconds and support operator suffixes like updated_at[after], which is how the handlers should scope a period. This is a Product Catalog 2.0 site, so segment by item price rather than legacy plans. List endpoints page via next_offset with a limit of up to 100, and live sites cap around 150 calls per minute, so page deliberately and back off on rate limit errors.
Compute a period once on the server and cache the result, keyed by period and currency, so clicking through bars and drill-downs reads the cached computation instead of refetching Chargebee on every click. Show when the figures were last computed and give me a refresh button. Remember my last selected period, currency, export spreadsheet and Slack channel between visits.
What does this prompt do?
- Pick any month, quarter or custom date range and see a waterfall from opening recurring revenue to closing recurring revenue, broken into new, expansion, contraction, churn and reactivation.
- Click any bar to open the exact customers and amounts behind it, so when contraction spikes you can see which accounts downgraded and by how much instead of guessing.
- Compare two periods side by side and split the movement by plan, so you can tell which plans are genuinely growing and which are quietly shrinking.
- Send any finished table to Google Sheets for the board pack, and post the headline movement summary to a leadership channel in Slack.
What do I need to use this?
- A Chargebee account with your subscription billing data. Read access is enough, since the app only reads from Chargebee.
- Your Chargebee catalog set up with items and item prices, which is what the plan level breakdown uses.
- A Google account if you want to export tables into a spreadsheet.
- A Slack workspace and a channel to post the summary to, if you want the leadership update.
How can I customize it?
- Change the period you look at: a calendar month, a quarter, or any custom start and end date.
- Filter to a single currency, or group by currency if you bill customers in more than one.
- Choose where finished tables land in your spreadsheet and which Slack channel gets the headline summary.
FAQs
Does this change anything in my billing account?
What is the difference between new revenue and expansion?
Can I see which customers are behind each number?
What happens if we bill in more than one currency?
How is this different from a weekly revenue email?
Related templates
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
See how your brand's news coverage and sentiment stack up against four competitors, then let an assistant write the weekly report for you.
One screen showing every social post waiting on approval, sorted by deadline, so reviewers can approve or reject without leaving the page.
Every Monday, find the past champions and closed-won contacts who changed jobs, update Attio, and get the moves worth chasing in Slack.
Staff submit what happened, your social manager edits the copy, picks the accounts and puts it on the calendar without a single spreadsheet.
Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.
Stop rebuilding the revenue waterfall in a spreadsheet every month.
Open one place where every movement number is already calculated and every bar opens the accounts behind it.