See yesterday's Stripe revenue, refunds and new customers every morning

Each morning: yesterday's gross revenue, refunds and net from Stripe, how many customers paid you for the first time, and any dispute that came in.

Runs
Every day at 7:00
Uses
Stripe
Posts
Stat tile

What lands on your board

AcmeGross revenue$3,486+6% vs previous period, bettervs last report
Refunds$129
Net$3,357
New paying customers7
An example with made-up numbers. Your agent posts your real ones.

What it does

Checking the Stripe app first thing to see whether yesterday was a good day is a habit most founders have and few enjoy. The home screen shows today's partial numbers, mixes currencies and leaves refunds for another page.

This skill settles it at 7:00 with one closed day, midnight to midnight in your timezone, counted from Stripe's balance ledger so fees, refunds and foreign currencies are already accounted for. The line people end up watching is the count of new paying customers.

How it works

  1. 1

    1Fix the day

    Take yesterday from 00:00 to 24:00 in the timezone the business reports in (the Stripe account's timezone unless you say otherwise) and turn both ends into Unix timestamps.

  2. 2Read the balance ledger

    Page through GET /v1/balance_transactions with created[gte] and created[lt] for that day. Sum amount for types charge and payment as gross, refund and payment_refund as refunds, and add up the fee field across all of them; amounts are already in your settlement currency.

  3. 3Find first-time payers

    For each customer with a successful charge that day, run a Charges search such as customer:'cus_123' AND status:'succeeded' AND created<1760500800 with the day's start. No earlier result means yesterday was their first payment; an earlier one long ago is a reactivation.

  4. 4Check for disputes

    List GET /v1/disputes with created[gte] for the same day. A new dispute goes at the top of the card with its amount, reason and evidence_details.due_by.

  5. 5

    5Write the report

    Gross, refunds, net, fees, the number of successful charges, new paying customers with their plans, the largest single payment, and the change against the day before and the same weekday last week.

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

  • Gross revenue yesterday, against the day before and the same weekday last week.
  • Refunds and net after refunds, plus Stripe fees.
  • New paying customers: how many, and on which plans.
  • The largest payment of the day, and any dispute opened, with its reason and response deadline.

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-daily-revenue/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the stripe-daily-revenue skill

    Or paste the prompt instead of installing:

    promptFrom my Stripe account (read only), report on yesterday, midnight to midnight in my timezone. Use balance transactions: sum the charge and payment types as gross revenue, refund and payment_refund as refunds, and the fees, all in my settlement currency. Count new paying customers: customers whose first ever successful charge happened yesterday (check with a charges search for earlier succeeded charges), and say which plans they bought. List any dispute opened yesterday with its reason. Give me gross, refunds, net, fees, the number of successful charges, new paying customers, the largest payment, and the change against the day before and the same weekday last week.
  3. Put it on a schedule

    Every day at 7:00, from cron on any machine where Claude Code is signed in:

    crontab0 7 * * * claude -p "Run the stripe-daily-revenue 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 stat tile. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: stripe-daily-revenue
description: "Each morning: yesterday's gross revenue, refunds and net from Stripe, how many customers paid you for the first time, and any dispute that came in. Use when the user asks for this, or when it runs on a schedule."
---

# Stripe daily revenue report

Each morning: yesterday's gross revenue, refunds and net from Stripe, how many customers paid you for the first time, and any dispute that came in.

Checking the Stripe app first thing to see whether yesterday was a good day is a habit most founders have and few enjoy. The home screen shows today's partial numbers, mixes currencies and leaves refunds for another page.

This skill settles it at 7:00 with one closed day, midnight to midnight in your timezone, counted from Stripe's balance ledger so fees, refunds and foreign currencies are already accounted for. The line people end up watching is the count of new paying customers.

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

- A restricted Stripe key that can read Balance, Charges, Customers and Disputes, in `STRIPE_API_KEY`, or the Stripe MCP server.
- The timezone your day starts in, if it differs from the Stripe account's.

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

### Steps

1. **Fix the day**: Take yesterday from 00:00 to 24:00 in the timezone the business reports in (the Stripe account's timezone unless you say otherwise) and turn both ends into Unix timestamps.
2. **Read the balance ledger** (Stripe): Page through `GET /v1/balance_transactions` with `created[gte]` and `created[lt]` for that day. Sum `amount` for types `charge` and `payment` as gross, `refund` and `payment_refund` as refunds, and add up the `fee` field across all of them; amounts are already in your settlement currency.
3. **Find first-time payers** (Stripe): For each customer with a successful charge that day, run a Charges search such as `customer:'cus_123' AND status:'succeeded' AND created<1760500800` with the day's start. No earlier result means yesterday was their first payment; an earlier one long ago is a reactivation.
4. **Check for disputes** (Stripe): List `GET /v1/disputes` with `created[gte]` for the same day. A new dispute goes at the top of the card with its amount, `reason` and `evidence_details.due_by`.
5. **Write the report**: Gross, refunds, net, fees, the number of successful charges, new paying customers with their plans, the largest single payment, and the change against the day before and the same weekday last week.

## Route B: the browser

### What you need

- Signed in to the Stripe Dashboard with a role that can view payments, customers and reports (Analyst or higher), live mode on.

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

### Steps

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

1. **Open the Balance summary report for yesterday**: Open `https://dashboard.stripe.com/reports/balance`, set the date range to yesterday only and the time zone to the one your day starts in. In **Balance change from activity** read the `charge` row for gross, fee and net, the `refund` row for refunds, and the count column for the number of payments. Amounts are already in your settlement currency.
2. **Fall back to Payments if the day is not complete**: The report fills in by 12:00 PM the next day. If yesterday is missing, open `https://dashboard.stripe.com/payments`, set the **Date** filter to yesterday, pick the **Succeeded** view and total the **Amount** column (click **Export** when the list runs past one page), then do the same with the **Refunded** view.
3. **Find first-time payers**: On the Payments page for yesterday, open each succeeded payment and click through to the customer. Under the customer's **Payments** section, nothing older than yesterday means a first payment; a much older payment means a reactivation. Note the plan from the invoice or description.
4. **Check for disputes**: Open `https://dashboard.stripe.com/disputes` and filter the date to yesterday. For any dispute note the amount, the reason and the **Respond by** date.
5. **Compare and write**: Run the Balance summary again for the day before and for the same weekday last week, then report gross, refunds, net, fees, the number of payments, new paying customers with their plans, the largest payment and any dispute.

Note: The Balance summary report only shows complete days and fills in by 12:00 PM the following day in the report's time zone, so a 7:00 run usually has to use the Payments page, where amounts are in the charge currency and refunds of older payments show under the original payment. Checking each customer's history by hand is slow past a few dozen payments a day.

## The report

- **Gross revenue** yesterday, against the day before and the same weekday last week.
- **Refunds** and **net** after refunds, plus Stripe fees.
- **New paying customers**: how many, and on which plans.
- The largest payment of the day, and any dispute opened, with its reason and response deadline.

## 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-daily-revenue/<date of this run, e.g. 2026-10-16>",
  "item_key": "stripe-daily-revenue",
  "project": "Acme",
  "source": "Stripe daily revenue report skill",
  "kind": "metric",
  "title": "Yesterday: $3,486 gross, 7 new paying customers",
  "metric": {
    "label": "Gross revenue",
    "value": 3486,
    "prefix": "$",
    "better": "higher",
    "period_start": "<start of the period, ISO 8601>",
    "period_end": "<end of the period, ISO 8601>"
  },
  "glance": [
    {
      "type": "Grid",
      "props": {
        "columns": 3
      },
      "children": [
        {
          "type": "Stat",
          "props": {
            "label": "Refunds",
            "value": 129,
            "prefix": "$",
            "better": "lower"
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "Net",
            "value": 3357,
            "prefix": "$"
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "New paying customers",
            "value": 7
          }
        }
      ]
    }
  ],
  "widget": [
    {
      "type": "KeyValue",
      "props": {
        "items": [
          {
            "key": "Successful charges",
            "value": "41"
          },
          {
            "key": "Refunds",
            "value": "2, $129.00"
          },
          {
            "key": "Net after refunds",
            "value": "$3,357.00"
          },
          {
            "key": "Stripe fees",
            "value": "$113.39"
          },
          {
            "key": "New paying customers",
            "value": "7 (5 Starter, 2 Team)"
          },
          {
            "key": "Largest payment",
            "value": "$948.00, Team annual"
          },
          {
            "key": "Disputes opened",
            "value": "None"
          }
        ]
      }
    }
  ],
  "size": "md"
}
JSON
```

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

Set `period_start` and `period_end` to the window the number covers: the tile names it from them ("Last 7 days", "Today", "This month"). For a count right now (open items, a balance), send `"period_label": ""` so no period shows; for another name, send it as `period_label` (at most 24 characters).

## Run it on a schedule

Suggested: Every day at 7:00 (`0 7 * * *`). From cron, with the agent signed in on that machine:

```bash
0 7 * * * claude -p "Run the stripe-daily-revenue 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-daily-revenue#schedule

Source: https://briefkin.dev/skills/stripe-daily-revenue

What your agent needs

  • A restricted Stripe key that can read Balance, Charges, Customers and Disputes, in STRIPE_API_KEY, or the Stripe MCP server.

  • The timezone your day starts in, if it differs from the Stripe account's.

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

Why balance transactions instead of the Charges list?

Balance transactions are Stripe's ledger: each one is already converted to your settlement currency and carries its fee, and a refund lands on the day it happens. Summing charges would mix currencies and miss refunds of older payments.

What counts as a new paying customer?

Someone whose first successful charge ever happened yesterday. A customer who paid two years ago and came back yesterday is a reactivation, not new, and the report lists those on their own line when there are any.

Do I need Briefkin to use the Stripe daily revenue report 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 stat tile, 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/reports/balance 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.

Watch gross revenue on your board, run after run

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.