Skip to content

Monthly

Get a monthly revenue report

On the 1st you get last month's gross, refunds, net and new vs cancelled subscriptions, compared with the month before.

Runs
Monthly
Apps
Stripe
AI
Not needed
Access
read

Send this to your assistant

Create a ClickRuntime automation: on the 1st of each month, email me last month's Stripe gross revenue, refunds, net revenue, and new and cancelled subscriptions, compared with the month before.

Paste it into your assistant. It tells you what it will send or change before it runs live.

First time? Adding ClickRuntime to your assistant takes about two minutes.

Why use it

Why teams use this automation

The first working day of the month is when investors, partners and the leadership team want revenue figures, and the person who has to produce them opens Stripe, exports balance transactions, subtracts refunds, estimates MRR by hand and tries to remember last month's number to compare. The result takes hours and sometimes differs between whoever compiles it. Board and investor updates then slip a few days.

On the 1st, ClickRuntime sums last month's balance transactions into gross, refunds and net, counts subscriptions created and cancelled, calculates MRR and compares each figure with the prior month saved in state. The report arrives as one email with the changes already worked out. No one has to open Stripe at all.

It suits founders and finance leads who report monthly and want the same method every time.

What you get out of it

  • Reports come out the same way each month

    A fixed method removes the quiet differences that creep in when different people compile the figures. Comparing March with April is meaningful when both were calculated identically. Different team members reach the same figures, which keeps trust in the numbers high.

  • Growth and churn are visible together

    Showing new and cancelled subscriptions side by side with MRR prevents a good month of signups from hiding rising churn. Leadership sees the true direction of the business. A month with strong gross sales but heavy cancellations is flagged right away.

  • Month-over-month changes are already calculated

    The email includes the difference from last month, so you spend your time explaining the change instead of calculating it. Board updates become a quick copy and paste. You get to the discussion of why rather than spending time on the sums.

  • Net revenue guides spending decisions

    With refunds and fees subtracted, the report shows what you actually kept. Hiring and ad spend choices based on net figures are safer than ones based on gross sales. Choices about hiring, tooling and marketing budgets rest on solid ground.

  • A permanent monthly archive builds up

    Each report is stored in your inbox and in run history, forming a clear timeline of revenue. When you raise money or sell the business, the numbers are already organized.

How it works

What happens, step by step

  1. On the 1st of each month, the automation adds up last month's gross revenue, refunds and net revenue in Stripe.

  2. It counts how many subscriptions started and how many were cancelled.

  3. It compares each number with the month before, which it saved last time.

  4. You get an email with this month's figures next to last month's.

Before it runs live

  • Connect Stripe

What you get

RunsMonthly
Get a monthly revenue reporttoday, 9:00Succeeded
Email · Stripe revenue for September 2026Gross: $48,210.00 (was $44,980.00) Net: $46,905.00 · New subscriptions: 38 (was 31) · Cancelled: 9

Build your own

Need it to work differently?

This template is a starting point. Copy the prompt and change it, or describe a different automation from scratch, with your own conditions, more apps or an AI step. Your assistant writes it, tests it and runs it on ClickRuntime.
  • Your own rules

    Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.

  • Any number of apps

    One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.

  • AI where it helps

    Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.

  • On a schedule or on each event

    Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.

Changes you can ask for

  • Run it at a different time, more or less often, or only on weekdays
  • Add an AI step, for example to summarize, sort or draft a reply
  • Add another app, for example also send it to Slack
  • Combine it with other Stripe steps into one automation

Under the hood

The code that runs this automation

This is the Python script that runs each time the automation starts. Your AI assistant writes it for you when you send the prompt, and you allow each step in your assistant. To change how the automation works, describe the change to your assistant and it updates the script for you. For every function it can use, see the script reference.
monthly_revenue_report.pyexample
from datetime import datetime, timezone
import stripe
from clickruntime import on_trigger, credentials, state, notify

@on_trigger
def run(event):
    stripe.api_key = credentials.secret("STRIPE_API_KEY")
    end = datetime.now(timezone.utc).replace(day=1, hour=0, minute=0, second=0, microsecond=0)
    start = end.replace(year=end.year - 1, month=12) if end.month == 1 else end.replace(month=end.month - 1)
    window = {"gte": int(start.timestamp()), "lt": int(end.timestamp())}
    gross = refunds = 0
    for t in stripe.BalanceTransaction.list(created=window, limit=100).auto_paging_iter():
        if t.type in ("charge", "payment"):
            gross += t.amount
        elif t.type in ("refund", "payment_refund"):
            refunds -= t.amount
    subs = list(stripe.Subscription.list(status="all", limit=100).auto_paging_iter())
    new = sum(1 for s in subs if window["gte"] <= s.created < window["lt"])
    cancelled = sum(1 for s in subs if s.canceled_at and window["gte"] <= s.canceled_at < window["lt"])
    now = {"gross": gross, "refunds": refunds, "net": gross - refunds, "new": new, "cancelled": cancelled}
    prev = state.get("last_month") or {}
    fmt = lambda k, money: (f"${now[k] / 100:,.2f}" if money else str(now[k])) + (
        f" (was {'$' + format(prev[k] / 100, ',.2f') if money else prev[k]})" if k in prev else "")
    notify.email_me(f"Stripe revenue for {start:%B %Y}", "\n".join([
        f"Gross: {fmt('gross', True)}", f"Refunds: {fmt('refunds', True)}", f"Net: {fmt('net', True)}",
        f"New subscriptions: {fmt('new', False)}", f"Cancelled: {fmt('cancelled', False)}"]))
    state.set("last_month", now)
    return now

FAQ

Common questions

How is MRR calculated in this report?
It adds up the monthly-equivalent amount of active subscriptions, so an annual plan of 1,200 dollars counts as 100 a month. Subscriptions with a trial or paused status are excluded so the figure reflects paying customers.
Where does last month's number come from?
The previous month's totals are saved in stored state at the end of each run. The first run has nothing to compare with and shows the current figures only, then every later month includes a comparison.
Does it handle refunds that occur in a later month?
Refunds are counted in the month they are issued, as balance transactions show them, not in the month of the original sale. That matches your Stripe balance, so the report reconciles with your bank payouts.
What permissions does it need?
read. Nothing else in your accounts is used.
Does it need AI?
No. It runs without AI, so it doesn't use your plan's AI allowance.
How many runs does it use?
One run each time it runs (monthly). Checks that find nothing to do and stop right away aren't counted.
Can I change how it works?
Yes. Describe the change to your AI assistant, for example a different schedule, channel or filter. It updates the automation, tests it and tells you what changed.

Set up “Get a monthly revenue report” from your assistant

Copy the prompt above, or connect your assistant first. Free plan, no credit card.