How to share a Metabase dashboard

Metabase is unusually good at this compared to most BI tools — there are three real sharing mechanisms and they all work. The question is which one matches what you are actually trying to do, because they are built for different jobs and it is easy to reach for the wrong one.

The three built-in options

Public links. An admin enables public sharing, you click share, and Metabase gives you a URL with a long random token. Anyone who opens it sees the dashboard, with no login, indefinitely. This is genuinely convenient and genuinely a publishing action: the link cannot be un-forwarded, only revoked. Two failure modes worth naming — a public dashboard whose filters are editable in the query string can sometimes be widened by the reader beyond what you intended, and revocation is per-link, so an admin cleanup six months later is a manual audit of every link anyone ever created.

Static embedding. You sign a JWT server-side with your embedding secret, put it in the iframe src, and Metabase renders the dashboard with whatever filter values you locked into the token. This is the correct architecture for showing customers their own data inside your product. It is also an application to build and operate, which makes it wildly disproportionate if the goal is "send the weekly numbers to the leadership channel."

Dashboard subscriptions. A cron that emails or Slacks the dashboard, with optional CSV/XLSX attachments. Good for the standing weekly. The cost is that email is a terminal format: the reply-all thread discussing the churn number lives in a mailbox, not next to the churn number, and nobody who joins in March can find the January explanation.

The gap all three leave

None of them produce something a group can annotate. The number gets discussed somewhere else — Slack, email, a meeting — and the reasoning evaporates. Six weeks later someone asks why Q2 signups dipped and the answer exists only in the memory of whoever was on the call.

The pattern that closes it: render the questions into one self-contained HTML page, publish it to a stable URL, and put an anchored comment layer on it.

Rendering the page

Metabase's API returns a card's results as JSON or CSV without going near the UI:

curl -fsS -X POST "$METABASE_URL/api/card/$CARD_ID/query/json" \
  -H "x-api-key: $METABASE_API_KEY" > card.json

Loop over the card ids on the dashboard, turn each result into an HTML table or a chart, and write one file. Keep it self-contained — inline the CSS, and either inline the charting library or emit plain tables. A page that fetches nothing at view time is a page that renders identically for everyone, forever.

Then publish it, and keep publishing to the same id:

curl -fsS -X PATCH "https://commareports.com/api/v1/reports/$REPORT_ID" \
  -H "Authorization: Bearer $COMMA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --rawfile html digest.html \
        --arg title "Growth — week of $(date +%F)" '{title: $title, html: $html}')"

If you would rather not run the cron, a routine does the same thing on a schedule you set in the UI.

What changes

The weekly numbers land at one URL that never rotates. A reader highlights the retention cell and pins a thread: "cohort definition changed on the 14th, this is not a real drop." That thread survives every subsequent revision. When the same shape appears in October, the explanation is already attached.

Access is a setting on the report — private, team, domain-gated or link — so a board member reads the numbers without a Metabase account and without a public link that outlives the conversation.

When to use Metabase's own sharing instead

Use static embedding when the dashboard is part of a product you ship. Use a public link when the data genuinely is public — a status page, a community metrics board. Use subscriptions when the recipient will read the number and never respond. The digest pattern is for the case in between, which is most internal reporting: a specific audience, a durable record, and a conversation that has to stay attached to the figure it is about.

Try it

Comma is free — unlimited reports, unlimited commenters, unlimited revision history.

Create your first report →

Related