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