Monthly SaaS cohort retention and MRR report in Slack

On the first business day of every month, build a real cohort retention matrix and MRR chart from your Stripe data and post it to Slack. No ChartMogul subscription needed.

Agentic Task
StripeDaytonaSlack BotFinanceAI ReportsDaily Digests
PromptCreate

On the first business day of every month at 9am ET, build a real SaaS cohort retention and MRR report from my Stripe account and post it to Slack so I do not have to pay for ChartMogul or Baremetrics.

Trigger: cron, first business day of each month at 9am America/New_York.

Step 1. Pull the last 24 months of data from Stripe. Use List Customers, List Subscriptions, and List Invoices, paginating through every page. Keep the raw records as JSON so the analysis script can pivot them however it needs.

Step 2. Spin up a fresh Daytona sandbox with Create Sandbox using a Python image that has pandas and matplotlib available. Write the Stripe JSON into a working directory inside the sandbox.

Step 3. Run the analysis with Run Code in Sandbox. The Python script should do the work an aggregate digest cannot:

  • A logo retention cohort matrix with acquisition month on the y-axis and months since signup on the x-axis, rendered as a heatmap PNG.

  • An MRR-by-month line chart with stacked layers for new MRR, expansion MRR, contraction MRR, and churned MRR, rendered as a PNG.

  • Computed current MRR, net revenue retention (NRR), and gross revenue retention (GRR), printed as structured output the agent can read back.

Normalize annual subscriptions into monthly MRR (annual amount divided by 12). Treat a customer as churned in the month their last active subscription cancels.

Step 4. Use Daytona Download File to pull the two generated PNG charts out of the sandbox.

Step 5. Post the report to Slack. Use Slack Bot Upload a File twice (once per chart) into the configured channel, then use Slack Bot Send a Message to post a short written summary in the same channel. The summary should call out current month MRR, NRR and GRR percentages, the largest cohort drop observed, and any new churn pattern worth investigating. The agent's judgement matters here: which cohorts to highlight, how to phrase the narrative, and what counts as a real anomaly versus normal noise.

Step 6. Clean up with Delete Sandbox so nothing keeps running between monthly reports.

Keep the Slack summary tight, three to six sentences plus a one-line headline. Use plain English, no jargon dump. If the script fails or Stripe returns no data for the period, post a single message explaining what went wrong instead of charts.

Additional information

What does this prompt do?
  • Pulls the last 24 months of customers, subscriptions, and invoices from your Stripe account on the first business day of every month.
  • Builds a logo retention cohort matrix that shows how many customers from each signup month are still around, plus an MRR chart split into new, expansion, contraction, and churned layers.
  • Calculates current MRR, net revenue retention, and gross revenue retention the same way Baremetrics and ChartMogul do.
  • Posts the charts as image attachments in Slack along with a short written summary that calls out the largest cohort drop and any churn pattern worth investigating.
What do I need to use this?
  • A Stripe account with read access to customers, subscriptions, and invoices.
  • A Daytona account, used to run the Python analysis in a clean sandbox.
  • A Slack workspace and the channel where the report should be posted.
How can I customize it?
  • Change the cadence. Monthly on the first business day is the default, but a weekly Monday run works the same way.
  • Pick the Slack channel and choose whether the agent posts to a finance channel, a founders DM, or both.
  • Adjust the lookback window if you want more or less than 24 months of cohort history.

Frequently asked questions

Why use this instead of paying for ChartMogul or Baremetrics?
Those tools start at around $50 a month and climb quickly. If all you actually look at is your cohort retention matrix and an MRR chart once a month, this prompt gives you the same numbers for free using your own Stripe data.
How accurate are the numbers compared to a dedicated SaaS analytics tool?
The math is the standard SaaS definitions. MRR is summed from active subscriptions, churn is counted when a subscription cancels, and NRR and GRR are computed cohort by cohort from the same invoice data the paid tools use. If you reconcile the totals against Stripe, they will match.
Can I get this weekly instead of monthly?
Yes. Change the schedule when you set the workflow up. Monthly is the default because cohort views are noisy at a weekly cadence, but the same logic runs fine on a weekly Monday cron.
What if I sell a mix of monthly and annual subscriptions?
The analysis normalizes annual plans into a monthly MRR figure, so a $1,200 annual plan counts as $100 of MRR, the same way Baremetrics and ChartMogul do it. Mixed pricing is handled automatically.
Where do the charts in Slack come from?
The agent spins up a fresh Daytona sandbox, runs a Python script with pandas and matplotlib that does the cohort and MRR math, downloads the generated PNG charts, and uploads them to Slack. The sandbox is deleted at the end so there is nothing to manage.

Stop paying for SaaS analytics tools you barely open.

Connect Stripe, Daytona, and Slack once. Geni runs your cohort retention and MRR report on the first business day of every month and posts it where your team already lives.