Watch new and canceled Stripe subscriptions by plan, every weekday

Every weekday morning: which Stripe subscriptions started and which ended since the last run, grouped by plan, with the MRR each one adds or removes.

Runs
Weekdays at 8:00
Uses
Stripe
Posts
Report card

What lands on your board

AcmeStripe new and canceled subscriptions · Claude Code

9 new subscriptions, 3 canceled

Net +6 subscriptions and +$364 MRR since yesterday at 8:00. 4 trials started.

PlanNewCanceledNet MRR
Starter monthly52+$87
Team monthly31+$198
Team annual10+$79
Total93+$364

Canceled: Juniper Health (Team monthly, 14 months, no feedback) and two Starter accounts (unused, too_expensive).

Done
An example with made-up numbers. Your agent posts your real ones.

What it does

The Stripe email for each new subscription is fun for the first month and noise after that. What a founder or a sales lead wants in the morning is the tally: how many people signed up for which plan, who left, and whether the day came out ahead.

The agent reads subscription events since its last run, so Monday's card covers the weekend, and it names the customers who canceled while there is still time to ask them why.

How it works

  1. 1Read the events since the last run

    Call GET /v1/events with types[]=customer.subscription.created, types[]=customer.subscription.updated and types[]=customer.subscription.deleted, and created[gte] set to the previous run (Friday 8:00 when it is Monday).

  2. 2

    2Sort them

    A created event with status active is a new subscription, and with status trialing it is a trial start. An updated event whose previous_attributes.status was trialing and is now active is a converted trial, which also counts as new. A deleted event is a cancellation.

  3. 3Group by plan

    Use the first item's price.product (name from GET /v1/products/{id}) together with price.recurring.interval, so Team monthly and Team annual stay apart. Add each subscription's monthly amount as MRR gained or lost.

  4. 4

    4Write the report

    New, canceled and net MRR per plan, the canceled customers by name with how long they paid and any feedback, and trials started on a separate line.

  5. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

What you get

  • Net subscriptions and net MRR since the last run.
  • A row per plan: new, canceled, net MRR.
  • Canceled customers by name, with their tenure and any cancellation feedback.
  • Trials started, kept apart from paying subscriptions.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/stripe-new-and-canceled-subscriptions/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the stripe-new-and-canceled-subscriptions skill

    Or paste the prompt instead of installing:

    promptFrom my Stripe account (read only), list subscription events since yesterday at 8:00 (on Mondays, since Friday at 8:00): customer.subscription.created, customer.subscription.deleted, and customer.subscription.updated where the status went from trialing to active. Count new subscriptions (created active, plus converted trials), cancellations, and trials started. Group by product and billing interval, with the monthly MRR each change adds or removes. Give me net subscriptions and net MRR, a table per plan, and the canceled customers by name with how long they paid and any cancellation feedback.
  3. Put it on a schedule

    Weekdays at 8:00, from cron on any machine where Claude Code is signed in:

    crontab0 8 * * 1-5 claude -p "Run the stripe-new-and-canceled-subscriptions skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a report card. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: stripe-new-and-canceled-subscriptions
description: "Every weekday morning: which Stripe subscriptions started and which ended since the last run, grouped by plan, with the MRR each one adds or removes. Use when the user asks for this, or when it runs on a schedule."
---

# Stripe new and canceled subscriptions

Every weekday morning: which Stripe subscriptions started and which ended since the last run, grouped by plan, with the MRR each one adds or removes.

The Stripe email for each new subscription is fun for the first month and noise after that. What a founder or a sales lead wants in the morning is the tally: how many people signed up for which plan, who left, and whether the day came out ahead.

The agent reads subscription events since its last run, so Monday's card covers the weekend, and it names the customers who canceled while there is still time to ask them why.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- Read access to Events, Subscriptions, Products and Customers through a restricted key in `STRIPE_API_KEY`, or through the Stripe MCP server.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Read the events since the last run** (Stripe): Call `GET /v1/events` with `types[]=customer.subscription.created`, `types[]=customer.subscription.updated` and `types[]=customer.subscription.deleted`, and `created[gte]` set to the previous run (Friday 8:00 when it is Monday).
2. **Sort them**: A `created` event with status `active` is a new subscription, and with status `trialing` it is a trial start. An `updated` event whose `previous_attributes.status` was `trialing` and is now `active` is a converted trial, which also counts as new. A `deleted` event is a cancellation.
3. **Group by plan** (Stripe): Use the first item's `price.product` (name from `GET /v1/products/{id}`) together with `price.recurring.interval`, so Team monthly and Team annual stay apart. Add each subscription's monthly amount as MRR gained or lost.
4. **Write the report**: New, canceled and net MRR per plan, the canceled customers by name with how long they paid and any feedback, and trials started on a separate line.

## Route B: the browser

### What you need

- Signed in to the Stripe Dashboard as an Administrator or Developer, since Workbench is a developer page, with live mode on.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://dashboard.stripe.com/workbench/events. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open the events log**: Open `https://dashboard.stripe.com/workbench/events` in live mode. Filter by event type `customer.subscription.created` and set the date to since yesterday at 8:00 (since Friday at 8:00 on a Monday). Open each event: the subscription payload shows the status (`active` is a new subscription, `trialing` a trial start), the customer, and the price with its product and interval.
2. **Read the cancellations**: Change the type filter to `customer.subscription.deleted` for the same window. For each, note the customer, the price, the start date (which gives the tenure) and `cancellation_details` with its reason, feedback and comment.
3. **Catch converted trials**: Filter `customer.subscription.updated` for the window and keep events whose previous attributes show `status: trialing` while the subscription is now `active`. Those count as new subscriptions.
4. **Group and write**: Group by product and interval so monthly and annual stay apart, add the monthly value of each subscription as MRR gained or lost, and write net subscriptions, net MRR, the per-plan table, the canceled customers by name with tenure and feedback, and trials started on their own line. Open `https://dashboard.stripe.com/subscriptions` with **Created** set to the same window if you want a quick cross-check of the count.

Note: Workbench shows raw event JSON, a page at a time, and only the last 30 days of events. The Subscriptions list with a Created filter is quicker for a head count but cannot show converted trials or cancellation feedback without opening each subscription.

## The report

- **Net subscriptions** and **net MRR** since the last run.
- A row per plan: new, canceled, net MRR.
- Canceled customers by name, with their tenure and any cancellation feedback.
- Trials started, kept apart from paying subscriptions.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "stripe-new-and-canceled-subscriptions/<date of this run, e.g. 2026-10-16>",
  "item_key": "stripe-new-and-canceled-subscriptions",
  "project": "Acme",
  "source": "Stripe new and canceled subscriptions skill",
  "kind": "update",
  "title": "9 new subscriptions, 3 canceled",
  "summary": "Net **+6** subscriptions and **+$364** MRR since yesterday at 8:00. **4** trials started.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Plan",
          "New",
          "Canceled",
          "Net MRR"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right"
        ],
        "rows": [
          [
            "Starter monthly",
            5,
            2,
            "+$87"
          ],
          [
            "Team monthly",
            3,
            1,
            "+$198"
          ],
          [
            "Team annual",
            1,
            0,
            "+$79"
          ],
          [
            "Total",
            9,
            3,
            "+$364"
          ]
        ]
      }
    },
    {
      "type": "Text",
      "props": {
        "text": "Canceled: Juniper Health (Team monthly, 14 months, no feedback) and two Starter accounts (unused, too_expensive).",
        "variant": "muted"
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Weekdays at 8:00 (`0 8 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
0 8 * * 1-5 claude -p "Run the stripe-new-and-canceled-subscriptions skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/stripe-new-and-canceled-subscriptions#schedule

Source: https://briefkin.dev/skills/stripe-new-and-canceled-subscriptions

What your agent needs

  • Read access to Events, Subscriptions, Products and Customers through a restricted key in STRIPE_API_KEY, or through the Stripe MCP server.

Connecting Stripe

  1. Stripe MCP server, Stripe's official remote server at https://mcp.stripe.com. Add Stripe from Claude's connector directory, or run claude mcp add --transport http stripe https://mcp.stripe.com/, and sign in with OAuth; clients without OAuth can send a restricted key as a Bearer token.
  2. The Stripe CLI. Run stripe login once, then stripe subscriptions list --status active --limit 100 or stripe invoices list --status open. The CLI defaults to test mode, so add --live for real data.
  3. API with a restricted key. Create a restricted key (rk_live_...) in the Dashboard under Developers > API keys, store it in STRIPE_API_KEY, and give it Read on the resources the report touches: Subscriptions, Invoices, Charges, Customers, PaymentIntents, Balance and Disputes.

Never hand an agent the secret key (sk_live_...); a restricted key with Read where needed and None everywhere else can't refund, cancel or charge anything.

Questions

Does an upgrade from Starter to Team show up here?

No. A plan change updates an existing subscription, so it belongs in the weekly MRR report as expansion. This card counts only subscriptions that started, converted from a trial or ended.

Why is a cancellation I saw in the dashboard missing?

A subscription set to cancel at period end fires customer.subscription.deleted only when the period ends. Until then it is active with cancel_at_period_end: true. Ask the agent to list those as "scheduled to cancel" if you want the early warning.

Do I need Briefkin to use the Stripe new and canceled subscriptions skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a report card, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Stripe pages themselves: the agent opens dashboard.stripe.com/workbench/events in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Read this report on your board, not in a chat log

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.