See MRR, traffic and active users from Stripe, GA4 and PostHog on one weekly card

Every Monday: MRR from Stripe, sessions from Google Analytics and weekly active users from PostHog, each with its change since the week before.

Runs
Mondays at 7:30
Posts
Stat tile

What lands on your board

AcmeMRR$62,480+2% vs previous period, bettervs last report
Net new MRR$1,250
Sessions18,420+7.0% vs previous period, better
Weekly active users2,915+4.0% vs previous period, better
An example with made-up numbers. Your agent posts your real ones.

What it does

The three numbers most early-stage founders watch live in three tools that don't agree on what a week is. Stripe has MRR, Google Analytics has traffic, PostHog has the people actually using the product, and the Monday update needs all three side by side.

This skill fixes the week as Monday to Sunday, pulls each number from its source, and posts them on one card with the change against the week before. When traffic climbs and active users don't, you see it at a glance instead of across three tabs.

How it works

  1. 1Take MRR from Stripe

    Sum the monthly value of every active and past_due subscription item from GET /v1/subscriptions, with prices normalized to a month, discounts applied and trials left out. Net new MRR is this figure minus last Monday's.

  2. 2Count sessions in GA4

    Call runReport on the property with the metric sessions and two dateRanges, last Monday to Sunday and the seven days before, so both weeks come back in one response.

  3. 3Count weekly active users in PostHog

    Send a HogQL query to POST /api/projects/{project_id}/query: SELECT count(DISTINCT person_id) FROM events WHERE event = 'app_opened' AND timestamp >= toStartOfWeek(now(), 1) - INTERVAL 7 DAY AND timestamp < toStartOfWeek(now(), 1), then the same for the week before.

  4. 4

    4Put them side by side

    Each number with its change in percent, plus one line on what stands out, for example traffic and active users moving in different directions.

  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

  • MRR and net new MRR for the week.
  • Sessions last week and the change.
  • Weekly active users and the change.
  • One line on what stands out across the three.

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/founder-weekly-metrics/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the founder-weekly-metrics skill

    Or paste the prompt instead of installing:

    promptGive me my weekly founder metrics for last week, Monday to Sunday. MRR from Stripe: the monthly value of active and past_due subscriptions after discounts, without trials, and the change from the week before. Sessions from Google Analytics 4: runReport with the sessions metric for last week and the week before. Weekly active users from PostHog: a HogQL query counting distinct person_id with the app_opened event (or the event I name) in each of the two weeks. Show each number with its change in percent, then one line on what stands out across the three.
  3. Put it on a schedule

    Mondays at 7:30, from cron on any machine where Claude Code is signed in:

    crontab30 7 * * 1 claude -p "Run the founder-weekly-metrics 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: founder-weekly-metrics
description: "Every Monday: MRR from Stripe, sessions from Google Analytics and weekly active users from PostHog, each with its change since the week before. Use when the user asks for this, or when it runs on a schedule."
---

# Weekly founder metrics: MRR, traffic and active users

Every Monday: MRR from Stripe, sessions from Google Analytics and weekly active users from PostHog, each with its change since the week before.

The three numbers most early-stage founders watch live in three tools that don't agree on what a week is. Stripe has MRR, Google Analytics has traffic, PostHog has the people actually using the product, and the Monday update needs all three side by side.

This skill fixes the week as Monday to Sunday, pulls each number from its source, and posts them on one card with the change against the week before. When traffic climbs and active users don't, you see it at a glance instead of across three tabs.

## 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 Stripe (a restricted key in `STRIPE_API_KEY` or the Stripe MCP server), the GA4 property (Viewer, through a Google Analytics MCP server or a service account) and PostHog (a personal API key with `query:read`, or the PostHog MCP server).
- The event that means someone used your product, if it isn't called `app_opened`.

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

### Steps

1. **Take MRR from Stripe** (Stripe): Sum the monthly value of every `active` and `past_due` subscription item from `GET /v1/subscriptions`, with prices normalized to a month, discounts applied and trials left out. Net new MRR is this figure minus last Monday's.
2. **Count sessions in GA4** (Google Analytics): Call `runReport` on the property with the metric `sessions` and two `dateRanges`, last Monday to Sunday and the seven days before, so both weeks come back in one response.
3. **Count weekly active users in PostHog** (PostHog): Send a HogQL query to `POST /api/projects/{project_id}/query`: `SELECT count(DISTINCT person_id) FROM events WHERE event = 'app_opened' AND timestamp >= toStartOfWeek(now(), 1) - INTERVAL 7 DAY AND timestamp < toStartOfWeek(now(), 1)`, then the same for the week before.
4. **Put them side by side**: Each number with its change in percent, plus one line on what stands out, for example traffic and active users moving in different directions.

## Route B: the browser

### What you need

- Signed in to Stripe (Administrator, Analyst or View only role), to Google with at least Viewer on the GA4 property, and to PostHog with read access to the project; each account picked before the agent starts.

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

### Steps

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

1. **Read MRR in Stripe**: The **Billing overview** page shows **MRR** at the top. Set the date range to last week (Monday to Sunday) and read MRR at the end of the week and the **MRR growth** chart's net change; click **Explore** on MRR growth for new, expansion, contraction and churned MRR.
2. **Count sessions in GA4**: Open https://analytics.google.com/, pick the property, then **Reports > Acquisition > Traffic acquisition**. In the date picker at the top right choose last Monday to Sunday and turn on **Compare** with **Preceding period**. Read the **Sessions** total and its change in the totals row.
3. **Count weekly active users in PostHog**: Open https://us.posthog.com/ (or `eu.posthog.com`), pick the project, then **Product analytics > New insight > Trends**. Choose the event `app_opened` (or yours), aggregation **Unique users**, interval **Week**, date range **Last 14 days**. Read the last two full weeks; PostHog weeks start on Sunday unless the project setting says Monday.
4. **Put them side by side**: MRR, sessions and weekly active users with their change in percent, plus one line on what stands out, such as traffic and usage moving in different directions.

Note: Stripe's dashboard MRR follows the settings under Configure (whether discounts are subtracted), so it can differ from the API route's figure by the discount amount. GA4 standard reports can be sampled on large properties, and PostHog's week boundary follows the project's week-start setting, not Monday by default. A GA4 report URL contains the property ID, which is why the route starts from the property picker.

## The report

- **MRR** and net new MRR for the week.
- **Sessions** last week and the change.
- **Weekly active users** and the change.
- One line on what stands out across the three.

## 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": "founder-weekly-metrics/<date of this run, e.g. 2026-10-16>",
  "item_key": "founder-weekly-metrics",
  "project": "Acme",
  "source": "Weekly founder metrics: MRR, traffic and active users skill",
  "kind": "metric",
  "title": "MRR $62,480, up 2% on the week",
  "metric": {
    "label": "MRR",
    "value": 62480,
    "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": "Net new MRR",
            "value": 1250,
            "prefix": "$"
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "Sessions",
            "value": 18420,
            "delta": 7
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "Weekly active users",
            "value": 2915,
            "delta": 4
          }
        }
      ]
    }
  ],
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Metric",
          "Last week",
          "Week before",
          "Change"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right"
        ],
        "rows": [
          [
            "MRR (Stripe)",
            "$62,480",
            "$61,230",
            "+2.0%"
          ],
          [
            "Sessions (GA4)",
            "18,420",
            "17,215",
            "+7.0%"
          ],
          [
            "Weekly active users (PostHog)",
            "2,915",
            "2,803",
            "+4.0%"
          ]
        ]
      }
    },
    {
      "type": "Grid",
      "props": {
        "columns": 2
      },
      "children": [
        {
          "type": "Sparkline",
          "props": {
            "values": [
              15240,
              15980,
              16410,
              15870,
              16920,
              17480,
              17215,
              18420
            ],
            "label": "Sessions"
          }
        },
        {
          "type": "Sparkline",
          "props": {
            "values": [
              2410,
              2480,
              2555,
              2610,
              2660,
              2742,
              2803,
              2915
            ],
            "label": "Weekly active users"
          }
        }
      ]
    },
    {
      "type": "Callout",
      "props": {
        "text": "Sessions grew 7% and active users 4%: the extra traffic isn't turning into product use yet.",
        "tone": "info"
      }
    }
  ],
  "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: Mondays at 7:30 (`30 7 * * 1`). From cron, with the agent signed in on that machine:

```bash
30 7 * * 1 claude -p "Run the founder-weekly-metrics 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/founder-weekly-metrics#schedule

Source: https://briefkin.dev/skills/founder-weekly-metrics

What your agent needs

  • Read access to Stripe (a restricted key in STRIPE_API_KEY or the Stripe MCP server), the GA4 property (Viewer, through a Google Analytics MCP server or a service account) and PostHog (a personal API key with query:read, or the PostHog MCP server).

  • The event that means someone used your product, if it isn't called app_opened.

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.

Connecting Google Analytics

  1. Google Analytics MCP server, Google's own open-source server (analytics-mcp on PyPI, source). It runs locally with pipx run analytics-mcp, offers run_report, run_realtime_report and get_account_summaries, and Google labels it experimental.
  2. Data API with a service account. Enable the Google Analytics Data API in a Google Cloud project, create a service account, add its email as a Viewer on the GA4 property, and point GOOGLE_APPLICATION_CREDENTIALS at its JSON key. The skill also reads GA4_PROPERTY_ID.
  3. Your own Google login. gcloud auth application-default login --scopes https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/cloud-platform --client-id-file=client.json gives the MCP server or a script your user's access without a key file.

Request only analytics.readonly and keep the service account at Viewer: none of these reports needs Editor.

Connecting PostHog

  1. PostHog MCP server, PostHog's official remote server at https://mcp.posthog.com/mcp. Sign in with OAuth, or let the PostHog Wizard install it in your client; it routes to the US or EU cloud based on your account. Clients without OAuth can send a personal API key made with the MCP Server preset as a Bearer token (docs).
  2. Query API with a personal API key. Create one in your PostHog account settings, store it in POSTHOG_API_KEY with POSTHOG_PROJECT_ID and POSTHOG_HOST (https://us.posthog.com or https://eu.posthog.com), and give it the query:read scope, plus insight:read or feature_flag:read if the report uses them.

Add ?readonly=true to the MCP URL (or send x-posthog-read-only: true) to drop every tool that creates, updates or deletes; on the API, read scopes alone do the same.

Questions

Why Monday to Sunday and not the last 7 days?

Fixed weeks make the numbers line up across the three tools and with the weekly update you send. A rolling 7 days would shift with the time of the run and differ from what someone sees when they open GA4 later.

Which event defines an active user?

Whichever one means someone used the product, not that they visited the marketing site. A custom event like app_opened or project_created works better than $pageview, which also counts people reading your docs. Name it in the prompt and the HogQL query uses it.

Do I need Briefkin to use the Weekly founder metrics: MRR, traffic and active users 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, Google Analytics and PostHog pages themselves: the agent opens dashboard.stripe.com/billing 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 mrr 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.