# 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.

- Workflow type: app
- Services: Chargebee, Google Sheets, Slack Bot
- Categories: Finance, Operations
- Published: 2026-08-16

## What it does

- 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 you'll need

- 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.

## Prompt

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.

## How to customize

- 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.

## FAQ

### Does this change anything in my billing account?

No. The app only reads your customers, subscriptions, invoices and prices to calculate the movement. The only things it writes are the rows you choose to send to your spreadsheet and the summary you choose to post in Slack.

### What is the difference between new revenue and expansion?

New is revenue from subscriptions that started inside the period. Expansion is extra revenue from customers you already had, for example an upgrade or added seats, and only the increase is counted. Contraction is the mirror image, counting only the amount a customer's recurring revenue dropped by.

### Can I see which customers are behind each number?

Yes, that is the main point of the app. Every bar in the waterfall opens a table of the customers and amounts sitting behind it, showing what each account was paying before, what it pays now, and the difference, sorted with the biggest movers first.

### What happens if we bill in more than one currency?

You either pick one currency to look at or group the view by currency. Amounts in different currencies are never added together, so the totals stay honest.

### How is this different from a weekly revenue email?

An email gives you one written recap that you cannot ask questions of. This is a screen you open and work in: you choose the period, click into any number, and pull the customer list behind it whenever a figure looks odd.

Use this prompt in General Input: https://www.generalinput.com/prompts/recurring-revenue-movement-explorer-for-subscription-billing