# How to Share a Metabase Dashboard — Public Links, Embeds and Subscriptions

Canonical: https://commareports.com/share-metabase-dashboard
Published: 2026-09-04

> Metabase public links expose data to anyone with the URL, static embedding needs a signed token and an app to host it, and subscriptions land as flat email. The trade-offs compared, plus the digest pattern that keeps one link and a comment thread.

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

```bash
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:

```bash
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](/features/routines) 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](/docs/sharing) — 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 →](https://commareports.com/)**

### Related

- [Share a Superset dashboard](/share-superset-dashboard)
- [Comma vs Mode](/alternatives/mode-alternatives) — the same question for a BI notebook
- [Weekly analytics digest](/features/routines/weekly-analytics-digest)
