SaaS Metrics & Cohort Retention Report (MRR, Churn, NRR) avatar

SaaS Metrics & Cohort Retention Report (MRR, Churn, NRR)

Pricing

Pay per usage

Go to Apify Store
SaaS Metrics & Cohort Retention Report (MRR, Churn, NRR)

SaaS Metrics & Cohort Retention Report (MRR, Churn, NRR)

Turn a subscription export (CSV, JSON or dataset) into monthly MRR bridge, churn, NRR, ARPA and cohort retention, plus a formatted Excel report. Pure calculation: no scraping, no logins.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Clean Cell Co.

Clean Cell Co.

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Categories

Share

Turn a subscription export into standard SaaS metrics: a monthly MRR bridge (new, expansion, reactivation, contraction, churn), ARR, logo churn, gross MRR churn, net revenue retention (NRR), ARPA and cohort retention by signup month. You also get a formatted Excel report with charts and a heat-mapped cohort table.

Pure calculation. It doesn't scrape or log in to anything, and it doesn't call any third-party API, so a site change can't break a run.

What you can feed it

  • Use one data source per run. If you paste CSV text, link a CSV or pick a dataset, the SAMPLE demo rows in "Subscriptions (JSON)" are ignored automatically; you can also delete them.
  • JSON rows pasted into the input, or CSV text, or a CSV URL for your own export (public http(s) link, max 50 MB; private, local and internal addresses are blocked), or an Apify dataset ID.
  • One row per subscription period: customer_id, start_date, end_date (blank if still active), and either mrr or amount + interval (month, quarter, year, week). Annual plans are normalized to monthly.
  • Column names differ? Use fieldMapping, e.g. {"customer":"Customer ID","start":"Created","end":"Canceled At","amount":"Amount","interval":"Interval"}. Map the columns from your billing export with fieldMapping; exports from different billing tools vary, so check the first run. Amounts must be in currency units (49.00), not cents (4900). The currency input is a label only; no conversion is done.
  • Plan changes (upgrade or downgrade): end the old row and add a new row for the same customer, with the new row's start_date equal to the old row's end_date. The change is counted as expansion or contraction.

What you get

WhereContent
DatasetOne row per month with every monthly metric above (cohort retention is in COHORTS and the Excel report)
Key-value store REPORTExcel workbook: Summary (KPIs + 2 charts), Monthly, Cohorts (logos), Cohorts (revenue)
Key-value store COHORTSCohort retention as JSON
Key-value store OUTPUTHeadline numbers: current MRR, ARR, active customers

Example monthly row:

{"month":"2026-03","startingMrr":250,"newMrr":0,"expansionMrr":50,"reactivationMrr":0,"contractionMrr":0,"churnedMrr":50,"endingMrr":250,"arr":3000,"customers":2,"logoChurnRate":0.3333,"netRevenueRetention":1.0}

Definitions

  • A customer counts as active in a month if subscribed at month-end.
  • The MRR bridge is checked on every run: starting + new + expansion + reactivation − contraction − churn = ending. The run fails loudly if it doesn't balance.
  • NRR = (starting MRR − churn − contraction + expansion) / starting MRR. New and reactivated MRR are excluded.
  • Invalid input (bad dates, missing columns, negative MRR, end before start) stops the run with a clear message.

Use it from code or AI agents

Call it through the Apify API, MCP or integrations (Make, Zapier, n8n). Schedule it monthly against a fresh export to keep an up-to-date metrics workbook.

Pricing

Free during launch; pricing may be added later with notice.

Privacy

Only customer IDs, dates and amounts are needed. Don't include names or emails. Use pseudonymous customer IDs. The data stays in your own Apify run storage and follows your plan's retention. The Actor makes no outbound calls except fetching your csvUrl, and it runs with limited permissions: it can only use its own run storages and a dataset you explicitly pick as input.

Sample output

OUTPUT record:

{
"months": 9,
"subscriptionRows": 5,
"currentMrr": 280.0,
"currentArr": 3360.0,
"activeCustomers": 3,
"excelReportKey": "REPORT"
}

A sample Excel report is in samples/output/sample_report.xlsx.

Disclaimer

Calculated metrics for informational purposes only; not accounting, financial or investment advice. Verify the numbers before sharing them with investors or using them in financial statements.

Built with AI assistance.