Stripe Revenue Report
Compute MRR movements from Stripe subscriptions via Composio.
Workflow
- Scope. Ask for: period (this month, last 30 days, Q2), grouping (plan, segment, geography), format (markdown, Slack, Sheet).
- Link Stripe:
composio link stripe - Pull subscriptions + invoices:
composio execute STRIPE_LIST_ALL_SUBSCRIPTIONS -d '{ "limit": 100, "status": "all" }' composio execute STRIPE_LIST_INVOICES -d '{ "created": { "gte": 1714521600 }, "limit": 100 }' - Classify each MRR delta in the period:
new— first paid invoice for the customer in the windowexpansion— plan/seat upgrade raising MRRcontraction— downgrade/seat reduction lowering MRRchurn— subscription canceled or failed-payment lapsereactivation— previously churned, now paying again
- Compute:
- Starting MRR, New, Expansion, Contraction, Churn, Ending MRR
- Net New MRR = New + Expansion − Contraction − Churn
- GRR = 1 − (Churn + Contraction) / Starting MRR
- NRR = (Starting + Expansion − Contraction − Churn) / Starting
- Report in the requested format. Always show the component table, not just the headline.
Report template
# Revenue Report — <period>
Starting MRR: $<x>
+ New: $<a> (<n> customers)
+ Expansion: $<b> (<n>)
- Contraction: $<c> (<n>)
- Churn: $<d> (<n>)
Ending MRR: $<y>
Net New: $<e>
GRR: <xx>% · NRR: <yy>%
Top expansion: <cust> +$<amt>
Top churn: <cust> -$<amt> — reason if known
Guardrails
- Clarify whether "MRR" means normalized monthly (annual / 12) or billed-this-month.
- Failed payments are not churn yet — flag as "at-risk" with dunning status.
- Never post customer-level revenue to public channels without confirming.