---
name: metabase-dashboard-weekly-digest
description: "Every Monday: the numbers on one Metabase dashboard against last week, with the two that moved most called out in plain language. Use when the user asks for this, or when it runs on a schedule."
---

# Metabase dashboard weekly digest

Every Monday: the numbers on one Metabase dashboard against last week, with the two that moved most called out in plain language.

The weekly KPI dashboard gets built, shared in a channel, and then opened by two people. Everyone else wants the three sentences: what went up, what went down, and whether anyone should worry.

The agent runs each question on the dashboard through the Metabase API, for this week and last week when the dashboard has a date filter, and writes those sentences. It keeps the dashboard as the source of truth, so the numbers in the card are the numbers anyone gets when they click through.

## 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 Metabase API key (Admin > Settings > Authentication > API Keys > Manage, Metabase 49 or later) in `METABASE_API_KEY`, in a group that can view the dashboard's collection and query its databases.
- The Metabase URL and the dashboard ID (the number in the dashboard's URL).

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

### Steps

1. **Read the dashboard** (Metabase): `GET <metabase>/api/dashboard/:id` with the `x-api-key` header returns `dashcards` (each with its `id`, `card_id` and `card.display`) and the dashboard's `parameters`, including any date filter.
2. **Run each card for two weeks** (Metabase): For number, trend and progress cards, `POST /api/dashboard/:dashboard-id/dashcard/:dashcard-id/card/:card-id/query` with the date parameter set to last week, then to the week before. Without a date filter, `POST /api/card/:card-id/query` and use the first row of `data.rows`.
3. **Compare**: Change and percent change per number. Skip tables with many rows unless the card has a total. Rank by absolute percent change and pick the two that moved most, ignoring tiny bases (a count going from 2 to 4 is not news).
4. **Write the digest**: One line per number with this week, last week and change, then two plain sentences about the biggest moves, and the dashboard link for anyone who wants the charts.

## Route B: the browser

### What you need

- Signed in to Metabase with an account in a group that can view the dashboard's collection; the person signs in and passes SSO or 2FA first.

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

### Steps

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

1. **Open the dashboard**: Metabase Cloud instances are listed in the Metabase Store; a self-hosted Metabase has its own URL. Open the instance, then the dashboard from its collection or from the search bar (its ID is the number in the URL, `/dashboard/12`).
2. **Set the date filter to last week**: In the filter bar at the top of the dashboard, open the date filter and choose **Relative dates** > **Previous** > `1` **week**. Wait for every card to finish loading, then read each number, trend and progress card: the value shown, and on trend cards the comparison line under it.
3. **Set it to the week before**: Change the same filter to **Previous** `2` **weeks**, or **Specific dates** with the Monday to Sunday of the week before, and read the same cards again. A dashboard with no date filter shows one current value per card; keep it and compare with what you noted last Monday.
4. **Compare and write**: Change and percent change per number. Skip tables unless they have a total row, and ignore tiny bases. Write one line per number with this week, last week and change, then two plain sentences about the two numbers that moved most, and keep the dashboard URL for the card.

Note: A date filter that is not wired to a card leaves that card unchanged between the two reads; the agent should say so instead of reporting a 0% change. Cards that load slowly on a wide date range can show a stale value if read too early.

## The report

- **Headline**: the two numbers that moved most, in a sentence each.
- **Every number** on the dashboard: this week, last week, change.
- **Skipped cards**: tables and charts left out, so nobody wonders.
- A link to the dashboard.

## 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": "metabase-dashboard-weekly-digest/<date of this run, e.g. 2026-10-16>",
  "item_key": "metabase-dashboard-weekly-digest",
  "project": "Acme",
  "source": "Metabase dashboard weekly digest skill",
  "kind": "update",
  "title": "Support tickets up 31%, churned accounts down",
  "summary": "On **Weekly KPIs**, support tickets rose to **214** (+31%), mostly after the billing page change. Churned accounts fell from 12 to **9**.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Number",
          "This week",
          "Last week",
          "Change"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right"
        ],
        "rows": [
          [
            "New signups",
            "1,284",
            "1,146",
            "+12%"
          ],
          [
            "Activated accounts",
            "512",
            "497",
            "+3%"
          ],
          [
            "MRR",
            "$48,210",
            "$46,520",
            "+3.6%"
          ],
          [
            "Churned accounts",
            "9",
            "12",
            "-25%"
          ],
          [
            "Support tickets",
            "214",
            "163",
            "+31%"
          ],
          [
            "NPS",
            "41",
            "43",
            "-2 pts"
          ]
        ]
      }
    },
    {
      "type": "Links",
      "props": {
        "items": [
          {
            "label": "Open Weekly KPIs in Metabase",
            "url": "https://metabase.example.com/dashboard/12"
          }
        ]
      }
    }
  ]
}
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: Mondays at 8:30 (`30 8 * * 1`). From cron, with the agent signed in on that machine:

```bash
30 8 * * 1 claude -p "Run the metabase-dashboard-weekly-digest 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/metabase-dashboard-weekly-digest#schedule

Source: https://briefkin.dev/skills/metabase-dashboard-weekly-digest
