# Share a Redash Dashboard With Someone Who Has No Redash Account

Canonical: https://commareports.com/share-redash-dashboard
Published: 2026-09-08

> Redash dashboards live behind a login and a data-source connection. Publish a snapshot to Comma so stakeholders get the numbers without a seat or a public share link.

# Share a Redash dashboard with someone who has no Redash account

Redash is where a lot of teams' operating numbers live, and it has the same
structural problem every internal BI tool has: the dashboard is behind a login
that is behind a data-source connection.

So sharing it with someone outside the analytics group means one of:

- **Provision a seat** — and grant them access to a data source that answers a
  great deal more than the one question they had.
- **Turn on the public share link** — an unauthenticated URL for anyone who
  gets it, still executing against live data.
- **Screenshot it** — which is what actually happens, weekly, forever.

## Publish a snapshot instead

Redash's API gives you the result set directly:

```bash
# last cached results for a query
curl -fsS "https://redash.internal/api/queries/412/results.json?api_key=$QUERY_API_KEY" \
  > results.json
```

Use a **query API key** rather than your personal one — Redash scopes it to
that single query, so the credential in your job cannot read anything else.

Render it and publish:

```bash
jq -r '
  .query_result.data as $d |
  "<h1>Weekly ops</h1><table><tr>" +
  ($d.columns | map("<th>\(.friendly_name)</th>") | join("")) + "</tr>" +
  ($d.rows | map("<tr>" + (to_entries | map("<td>\(.value)</td>") | join("")) + "</tr>") | join("")) +
  "</table><p>As of \(.query_result.retrieved_at)</p>"
' results.json > report.html

curl -fsS -X POST "https://commareports.com/api/v1/reports" \
  -H "Authorization: Bearer $COMMA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --rawfile html report.html \
        --arg t "Weekly ops — $(date +%F)" '{title: $t, html: $html}')"
```

Include the `retrieved_at` timestamp. A dashboard screenshot with no date on it
is the most common way a stale number gets into a decision.

## Several queries, one report

A Redash dashboard is a set of queries. Fetch each and concatenate the rendered
fragments into one page — the reader gets the dashboard's content as a single
document rather than a link tree they cannot follow without an account.

Charts render the same way: reuse the query result to drive a
[Chart.js](/share-chartjs-chart) or [Plotly](/share-plotly-html) figure in the
same page, and the snapshot keeps the visual shape people recognize.

## Keep it current

```bash
# in cron, or a scheduled CI job
curl -fsS "https://redash.internal/api/queries/412/results.json?api_key=$QUERY_API_KEY" > results.json
# …render report.html…

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 report.html \
        --arg t "Weekly ops — $(date +%F)" '{title: $t, html: $html}')"
```

This is the part that ends the weekly screenshot. The stakeholder's bookmark
resolves to current numbers, and the revision list is the history — which the
Redash dashboard itself does not keep, since it shows whatever the query returns
today.

See [scheduled HTML reports](/features/routines/scheduled-html-reports).

## Access

Reports are private by default. **Domain-gated** access (anyone at
`partner.com`) is usually right for an external stakeholder — no seat to
provision, no shared password, and it stops working when they leave. **Team**
for internal readers. See the [sharing model](/docs/sharing).

Compare that to a Redash public share link, which is a bearer URL: whoever it
is forwarded to has it, permanently.

## What review adds

- **Anchored threads** on a number, so the explanation lives with it — see
  [commenting on HTML](/comment-on-html).
- **Revisions**, so "was that number different last month?" is answerable.
- **No data-source exposure** — the reader gets results, not query access.

## Limits

- **Entry HTML: 5 MB.** A snapshot of aggregate numbers is kilobytes; publish
  aggregates, not raw exports.
- **60 requests/minute per token.**

## Try it

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

**[Publish a snapshot →](https://commareports.com/)**

### Related

- [Share a Metabase dashboard](/share-metabase-dashboard) · [Share a Superset dashboard](/share-superset-dashboard)
- [Share a Grafana dashboard](/share-grafana-dashboard) · [Share a Lightdash dashboard](/share-lightdash-dashboard)
- [Weekly analytics digest](/features/routines/weekly-analytics-digest) · [Share a Looker Studio report](/share-looker-studio-report)
