Skip to main content
MCP Recipe Book/MRR Movement Reconciliation
Recipe
MRR Movement Reconciliation
Version
1.0
Published
November 2026
Tools used
Subscriptions · Events · Invoices · Export Data · Exchange Rates
Query type
Multi-capability
Finance Operations

Reconcile your MRR: what changed, why, subscription by subscription.

One prompt reads your MRR history from Chargebee, lines up every subscription’s opening against its closing, labels the difference, then tells you whether the month is safe to close.

RECONCILIATION DASHBOARD ARTIFACT

Choose your options on the left. The preview and the prompt update as you go.

Overview, MRR Movement, and optional Contract Reconciliation tabs are built from the same anonymized sample so you can explore before you run it on your book.

* Anonymized sample shown. Meridian SaaS Inc. is a fictional company. Company names, IDs and figures are illustrative.

01 What this changes

Explain every dollar of MRR movement before the books close.

Month-end close asks one question about recurring revenue: why is closing MRR different from last month’s? Most teams answer it by exporting active subscriptions, exporting cancelled ones, cross-referencing the two in a spreadsheet, then scrolling the event log for anything that changed in between. Now you ask once. Each subscription’s opening and closing MRR are read from Chargebee’s history at the two month ends. The difference gets a label: new, upgrade, downgrade, pause, reactivation or cancellation.

It cannot balance by accident. Opening is rebuilt independently of closing, every value shows where it came from, the month is rolled forward to today’s live MRR to prove nothing was missed. Attach your contract file to check each row against what was signed: a renewal billed at the old price, an uplift never applied, they show up with the gap in dollars.

02 What the prompt does

Here’s what happens when you hit send.

Step 1

Check inputs

Works out the month, then asks once for last month’s reported closing MRR. If contract matching is on, it asks for your file too.

No tools

Step 2

Pull

Exports your live, paused, non-renewing subscriptions plus anything cancelled this month. Reads MRR change events from the first of the month, going further back only for the ones that moved.

Export Subscriptions · List Events by Event Type · Retrieve Event

Step 3

Rebuild each month end

Reads each subscription’s MRR at both month ends from its change history. No history? Uses the last invoice, marked as estimated.

List Invoices by Subscription

Step 4

Label the movement

Classifies each row: new activation, reactivation, upgrade, downgrade, pause, cancellation or no change.

Computed by your AI client

Step 5

Match contracts (optional)

Only if you turned it on. Lines up each contract against billing: add-ons versus this month’s change, everything else versus closing MRR. No file? Reply skip.

Your contract file

Step 6

Check before you close

Proves every row closes, rolls forward to live MRR, compares opening with last month’s reported close, flags estimates. Verdict comes back in the chat.

Fetch Historical Exchange Rates

03Why this works

Every change to MRR leaves a dated record in Chargebee.

Every time a subscription’s MRR changes — plan swap, scheduled downgrade, price uplift at renewal, pause, cancellation — Chargebee stamps the new amount with a date. That stamp answers “what was MRR here?” for any subscription on any day. No guessing from today’s value. The prompt reads only what it needs: this month’s changes, plus each changed subscription’s prior value.

A reconciliation is only useful if it can fail. The month is rolled forward to today to prove no change slipped through, the source column flags estimated values, you get a verdict in the chat. The report you share stays clean.

04 The exact prompt

Paste this into any MCP-connected AI client and it runs on your own data. We’ve built it from the default choices in the builder above, so it’s ready to go as is. Toggle options in the artifact to copy a customized prompt from there.

Chargebee MCP tools this prompt calls
Export SubscriptionsRetrieve Export Job DetailsList Events by Event TypeRetrieve EventList Invoices by SubscriptionFetch Historical Exchange Rates
Show the full promptHide the full prompt
You are the revenue operations analyst for [COMPANY]. You have read-only access to Chargebee billing data through the Chargebee MCP Data Lookup Agent. Build a subscription-level MRR movement reconciliation for the month to close (see INPUTS). Follow the steps in order. Never present an estimate as a measured number: every Opening and Closing value carries its source.

INPUTS
- Company: [COMPANY]. If this is still a placeholder, use the Chargebee site name and do not ask.
- Internal email domain: [INTERNAL_DOMAIN]. Optional. If it is still a placeholder, skip the domain part of the test-customer check and do not ask.
- Month to close: the most recent complete calendar month, worked out from today’s date. If I name a different month in my message, use that one instead.
- From the month to close, work out and print these before pulling any data: CURRENT_MONTH and PREVIOUS_MONTH (names), M_START (first day of the month, 00:00:00), M_END (last day, 23:59:59) and PREV_END (last day of the previous month, 23:59:59). Use UTC unless the site’s time zone is visible in the data, and say which you used. If M_END is still in the future, label every output "month to date".
- Reporting currency: USD.
- Contract reconciliation: off. Do not ask for a contract file and do not include STEP 3, contract columns or a contract tab.
- Last month’s reported closing MRR: [PRIOR_CLOSE_MRR] USD. This is the figure I reported for PREVIOUS_MONTH, from last month’s reconciliation or close pack. If it is still a placeholder, ask for it once, in the same message as any other question. If I reply that I do not have it or to skip it, carry on and say in the final reply that Opening was not tied to a reported figure.
- Do not use that figure as Opening MRR. Opening is always rebuilt from Chargebee for each subscription. The figure is only compared against the Opening total, so any difference is visible instead of hidden.
- Before pulling data, check once for: last month’s reported closing MRR. If anything is missing, ask for it all in one message, then start. Ask nothing else.

DEFINITIONS
- MRR is Chargebee’s subscription MRR. Opening MRR = MRR at the end of the previous month. Closing MRR = MRR at the end of the current month. Read each from its own date. Never copy Closing into Opening.
- In scope: every subscription with Opening or Closing above 0, plus subscriptions activated and cancelled inside the current month.
- Every row must satisfy: Opening + New Activations + MRR Updates − Cancellations = Closing.
- Movement, exactly one per row:
  New Activation: Opening 0 and first activated_at in the current month. Amount goes in New Activations.
  Reactivation: Opening 0, Closing above 0, activated before the current month (reactivated or resumed). Amount goes in MRR Updates as a positive number.
  Upgrade or Downgrade: Opening and Closing both above 0 and different. Net all changes in the month into one MRR Updates value.
  Pause: Opening above 0, Closing 0, status paused. Amount goes in MRR Updates as a negative number.
  Cancellation: Opening above 0, Closing 0, cancelled in the current month. Amount goes in Cancellations as a positive number. A subscription activated and cancelled in the same month shows the amount in both New Activations and Cancellations.
  No Change: Opening equals Closing.
- Units: exported subscription mrr is in currency units. MRR amounts inside events are in minor units: divide by 100, except zero-decimal currencies such as JPY and KRW. Before using either, compare one subscription’s latest event amount with its exported mrr and confirm the units agree.

STEP 1 - PULL
- Export Subscriptions twice and poll Retrieve Export Job Details until each is complete, then download and read the whole file, not a preview: (a) status active, non_renewing or paused; (b) status cancelled with cancelled_at on or after M_START. Read the column headers before mapping fields, because names can differ between sites. Do not rely on custom fields.
- List Events by Event Type for mrr_updated from M_START to now. Paginate with limit 100, raising the offset until a page returns fewer than 100. Call Retrieve Event on one result first to see which fields hold the subscription ID, the currency and the MRR amount.
- For every subscription with an event in that range, find the MRR it had just before its first event. If the event itself carries the previous MRR, use it. Otherwise list mrr_updated events for earlier months, starting with PREVIOUS_MONTH and going back up to 12 months, keep only those subscriptions, and stop once each has an earlier value.
- If no earlier event exists, use the last invoice issued for that subscription before M_START (List Invoices by Subscription): the recurring plan and add-on lines after discounts, excluding one-time charges and tax, divided by the months in its billing period (billing_period and billing_period_unit). Mark the value "Invoice-derived".
- Fetch Historical Exchange Rates for the date of M_END. Use that one rate per currency for every column, so the bridge ties in USD as well as in each native currency. If any currency has no rate, stop and ask for it. Never assume a rate of 1.

STEP 2 - BUILD ONE ROW PER SUBSCRIPTION
- MRR at a date D: if the subscription has an mrr_updated event after D, use the amount of its last event on or before D, found in STEP 1. If it has no event after D, use its exported mrr. If it was activated after D, use 0. A subscription cancelled after D was live at D, so never take its MRR at D as 0 from the export alone.
- Apply this at PREV_END for Opening and at M_END for Closing. Record each value’s source: Event, Export, Activated in month, Invoice-derived or Not found.
- Fill the movement columns from DEFINITIONS. Do not filter out events by source: scheduled changes applied by Chargebee (a downgrade at term end, a price uplift at renewal, a ramp) are real MRR movement.
- Columns: Subscription ID, Customer ID, Status, Currency, Opening MRR, New Activations, MRR Updates, Cancellations, Closing MRR, Movement, Opening source, Closing source.

STEP 3 - CHECKS (run these and report them in your chat reply, each with its value and a status of Pass, Review or Fail)
1. Row bridge: every row closes within 0.01. Fail if any row does not.
2. Roll-forward to today: per currency, Closing total plus the net of all mrr_updated changes after M_END equals today’s exported MRR total. Fail if the gap is above 0.5% of Closing, Review if above 0.01.
3. Event coverage: every subscription with an mrr_updated event in the month has a movement, or changes that net to zero (list them), and every movement row has an event, an activation or a cancellation in the month. Review for each exception.
4. Independent Opening: count and list rows whose Opening is Invoice-derived or Not found. Review if any.
5. Exchange rates: a rate for every currency. Fail if any is missing.
6. Likely test data: rows on customers whose email or company contains "test", or whose email is on [INTERNAL_DOMAIN]. Show their MRR. Review if any. Do not remove them.
7. Prior close: Opening total in USD against [PRIOR_CLOSE_MRR]. Review if they differ by more than 0.5%, and say which currencies account for the difference. Skip this check if I did not give the figure.
- Verdict: Ready to close if every check passes; Review before close if any check is Review; Do not close yet if any check fails. Report the checks and the verdict in your chat reply only, never in the dashboard.

STEP 4 - BUILD THE DASHBOARD
- One self-contained HTML file named MRR_Reconciliation_<CurrentMonth><Year>.html (for example MRR_Reconciliation_May2026.html). Font: Inter. Colors: navy #012A38 for primary series; slate #0E4B60 and light blue #A2C1C4 for secondary; orange #FF3300 for losses and failures; #D5F4F7 for panel backgrounds; white page. Plain SVG only, no external libraries.
- Embed the rows as JSON and compute every view from them in JavaScript.
- Header: [COMPANY], CURRENT_MONTH and PREVIOUS_MONTH, and the data pull timestamp.
- Overview tab: five tiles in USD (Opening, New Activations, MRR Updates, Cancellations, Closing), each with its subscription count; a waterfall from Opening to Closing (New, Upgrades including reactivations, Downgrades including pauses, Cancellations); a table by Movement with subscriptions and USD impact; and a currency table in native amounts with the rate used. Never sum mixed currencies. One "So what" sentence: lead with net movement, then the biggest driver.
- MRR Movement tab: the row table with search by Subscription or Customer ID, a Status filter, a Movement filter listing each Movement type separately, a Native/USD toggle for the five MRR columns, sortable columns, a Movement badge on every row, and the source columns.
- This table must always show totals at the bottom, in both views, and they must follow the toggle, the search and the filters. In USD view, one total row across the visible rows. In Native view, a subtotal row per currency and no grand total, because amounts in different currencies cannot be added. Never render the table without totals.
- Under that table, list the USD rate used for each currency and the date it was taken, so the converted totals can be checked. This is the only place the rates need to appear.
- Do not add a Checks tab, a readiness badge or any pass/fail panel to the dashboard. The checks belong in your chat reply, not in the report the finance team shares.
- Last, a collapsed Methodology: definitions, rates used, time zone, value sources, and "Prepared from the billing system, unaudited".

STEP 5 - WORKBOOK
- If your client can create files, also save MRR_Reconciliation_<CurrentMonth><Year>.xlsx with sheets: Rows (all columns, with a totals row), Currency subtotals, USD view, Checks. Use formulas for totals. If it cannot create files, say so and skip this step.

FINISH
- Reply with: Closing MRR in USD, net movement against Opening, the verdict, each check with its status on one line, and the top 3 things to look at. Keep it short enough to read at a glance.

You can run this as it is. Nothing in the prompt needs editing first. If you would like your company name on the report, replace the first placeholder. Last month’s reported close is worth adding if you have it, because opening MRR gets checked against it.

05 Try it yourself

Requirements
A Chargebee account · an MCP-compatible AI client (Claude, ChatGPT, Cursor, or any MCP client) · the Chargebee Data Lookup Agent connected · last month’s reported closing MRR (optional) · contract file if reconciling contracts.
Setup
In Chargebee, head to Settings → Agentic AI → MCP Servers and connect the Data Lookup Agent. Sign in with a role that can read subscriptions, invoices and events, then paste the prompt as your first message.
What you’ll get back
A single-file HTML dashboard with Overview, MRR Movement and optional Contract Reconciliation, plus an Excel workbook when your client can create files. Verification checks land in the chat reply.
Supported clients
Claude (web or desktop), ChatGPT, Claude Code, Gemini, Cursor, VS Code, Windsurf, Zed, or any custom MCP-compatible client.
More recipes
Want the rest of the recipe book?
Browse all recipes →
Not running it yourself?
Talk to the team about what this reconciliation shows for your book.
Get a demo →