---
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
