---
title: Dashboards
description: Embed Cube dashboards into your applications via iframe.
---

<Info>
  Iframe embedding is available on [Premium and Enterprise plans](https://cube.dev/pricing).
</Info>

Embed any [dashboard](/docs/explore-analyze/dashboards) into your application using an iframe. Dashboards can be embedded with either authentication mode:

- **[Private embedding](/embedding/iframe/auth/private)** — for internal users with Cube accounts (e.g., embedding in Notion, Salesforce, internal tools)
- **[Signed embedding](/embedding/iframe/auth/signed)** — for external/customer-facing applications using server-generated sessions

## Embed with private embedding

To embed a dashboard for internal users:

1. Open your dashboard in Cube
2. Click **Share** → **Embed**
3. Copy the generated iframe code

<img src="https://lgo0ecceic.ucarecd.net/24999bd4-1a7a-4c15-999a-848e6ec3fbe4/" alt="Share embed dialog" />

Then paste the iframe code into your application:

```html
<iframe
  title="Dashboard"
  src="https://your-account.cubecloud.dev/embed/dashboard/YOUR_DASHBOARD_PUBLIC_ID"
  width="100%"
  height="800"
></iframe>
```

Users will be prompted to sign in with their Cube credentials when accessing the embedded dashboard. See [Private embedding](/embedding/iframe/auth/private) for details on the auth model and integration examples (Notion, Salesforce).

## Embed with signed embedding

Signed embedding must be allowed on the dashboard first: open the dashboard,
click **Share** → **Embed**, and turn on **Allow signed embedding**. You can
also toggle it without opening the UI using the [Cube CLI](/reference/cli):

```bash
cube embed enable-dashboard YOUR_DASHBOARD_PUBLIC_ID
cube embed disable-dashboard YOUR_DASHBOARD_PUBLIC_ID
```

To embed a dashboard for external/customer-facing applications, generate a session on your backend and pass the session ID into the iframe:

```html
<iframe
  title="Dashboard"
  src="https://your-tenant.cubecloud.dev/embed/dashboard/YOUR_DASHBOARD_PUBLIC_ID?session=YOUR_SESSION_ID"
  width="100%"
  height="800"
></iframe>
```

See [Signed embedding](/embedding/iframe/auth/signed) for the full session generation flow, API key setup, and a complete working example.

## Pre-set dashboard filters and granularities via URL {#pre-set-dashboard-filters-via-url}

You can pre-set the values of a dashboard's [controls](/docs/explore-analyze/dashboards/widgets/controls) by adding
URL parameters:

| Control | Parameter | Example |
|---|---|---|
| Filter | `f_<semantic_view>.<dimension>=<JSON>` | `f_orders_transactions.users_country={"value":"USA"}` |
| Time granularity switcher | `tg_<semantic_view>.<dimension>=<granularity>` | `tg_orders_transactions.created_at=week` |
| Field switcher | `ms_<semantic_view>.<replaced_member>=<selected_member>` | `ms_orders_transactions.status=users_city` |

The semantic view and member must match the internal names (not display titles)
configured on the widget — as must the member on the right-hand side of `ms_`,
which is a measure rather than a dimension when the field switcher's **Field
Type** is **Measure**. For filters, an omitted filter type defaults to `equals`.
Granularities are lowercase and must be one of the switcher's [allowed
granularities](/docs/explore-analyze/dashboards/widgets/controls#allowed-granularities) —
`day`, `week`, `month`, `quarter`, `year`, plus `second`, `minute`, and `hour`
for time dimensions that expose them.

Example:

```text
https://your-tenant.cubecloud.dev/embed/dashboard/YOUR_DASHBOARD_PUBLIC_ID?session=YOUR_SESSION_ID&f_orders_transactions.users_country={"value":"USA"}&tg_orders_transactions.created_at=week
```

The filter's JSON value is shown unencoded for readability. Percent-encode it
before the URL goes anywhere real — pasted as-is into the `src="…"` of the iframe
snippet above, its raw `"` closes the attribute and truncates the URL.

This works on both regular and published (embedded) dashboards. A parameter is
applied only if a matching control for that member already exists on the
dashboard; a granularity outside the switcher's allowed list is ignored, as is a
member the field switcher doesn't offer — its
[**Alternatives**](/docs/explore-analyze/dashboards/widgets/controls#field-switcher),
plus the member it replaces.

The reverse direction works on published dashboards: when a viewer changes a
control there, the new value is written back into the dashboard's own URL, so the
state a link carries and the state a viewer reaches by clicking are the same
format. Reading the parameters works anywhere; it's the writing that is
published-only. See [Controls → Sharing the current
selection](/docs/explore-analyze/dashboards/widgets/controls#sharing-the-current-selection).

## Allow chart export {#allow-csv-export}

By default, embedded dashboards do not expose a download action on individual
widgets. To let viewers download a chart widget as a **CSV**, **PNG**, or
**PDF** file, add the `allowExport=true` query parameter to the embed URL:

```text
https://your-tenant.cubecloud.dev/embed/dashboard/YOUR_DASHBOARD_PUBLIC_ID?session=YOUR_SESSION_ID&allowExport=true
```

When enabled, each chart widget's ⋮ menu shows **Download as CSV**, **Download
as PNG**, and **Download as PDF** actions. `allowExport` is the single switch
for all three formats — there is no way to allow one format while blocking
another. Only the exact literal string `true` opts in: `allowExport=1`,
`allowExport=TRUE`, a bare `?allowExport`, and omitting the parameter (the
default) all leave every download action hidden.

The CSV is generated client-side from the data already loaded into the
widget, so no additional query is issued. Inside an embed, `allowExport` —
not the viewer's own Cube role — is the authority on whether the download
actions appear.

## Show or hide the AI chat

Embedded dashboards show an AI chat (the agent panel and its launcher bubble) by
default. You can control it in two ways:

- **Globally, in the UI.** Toggle **Show dashboard chat** under
  **Embed → Settings** in the Cube Cloud console. This switch is
  account-wide — it turns the AI chat on or off for the entire embedded surface,
  i.e. every embedded dashboard.
- **Per session, via the API.** Pass `settings.showDashboardChat` when you
  [generate the session](/reference/embed-apis/generate-session#session-settings). A per-session
  value takes precedence over the global toggle — `false` hides the chat for that
  session even when it is enabled account-wide, and `true` shows it even when it
  is disabled:

```javascript
body: JSON.stringify({
  deploymentId: DEPLOYMENT_ID,
  externalId: "user@example.com",
  settings: {
    // Hide the AI chat for this viewer only
    showDashboardChat: false,
  },
}),
```

This applies to embedded published dashboards; it does not affect the standalone
[Analytics Chat](/embedding/iframe/analytics-chat) surface, where embedding the
chat is itself the opt-in.

## Show or hide header controls

By default, an embedded dashboard's header shows its title, back button, and
— when the viewer has permission — the Edit and Duplicate actions. Hide any
of them individually with URL parameters on the embed iframe `src`:

| Parameter | Hides |
| --- | --- |
| `showDashboardHeader=false` | The entire header bar |
| `showDashboardBackButton=false` | The back button |
| `showDashboardTitle=false` | The dashboard title |
| `showDashboardEditButton=false` | The Edit action |
| `showDashboardDuplicateButton=false` | The Duplicate action |

```text
https://your-tenant.cubecloud.dev/embed/dashboard/YOUR_DASHBOARD_PUBLIC_ID?session=YOUR_SESSION_ID&showDashboardBackButton=false&showDashboardTitle=false
```

Every one of these defaults to shown. Only the exact literal string `false`
hides a control — `=0`, `=False`, `=FALSE`, and a bare `?showDashboardTitle`
(no value) all leave it visible. Note this is the inverse of `allowExport`
above, where only the literal string `true` opts in.

<Note>
These parameters are URL-only — they aren't accepted in the [Generate
Session](/reference/embed-apis/generate-session#session-settings) `settings`
object, unlike `showDashboardChat`, and they have no account-wide default
under **Embed → Settings**.
</Note>

These parameters apply to the dashboard header only — the workbook header
(which carries Publish and Share) is unaffected.

Setting `showDashboardHeader=false` overrides the other four: the whole bar
disappears regardless of their values. `showDashboardEditButton` can only
hide the Edit action; it can never show one to a viewer who lacks edit
permission.

These parameters are read from the URL the host loaded the iframe with and
stay pinned for the life of the embed, so they survive in-app navigation
(for example, from the home-page dashboard card, or after publishing a
draft).

## Set the language

Embedded dashboards render their UI in the account's default language, which you can
override per embed by adding the `?locale=` query parameter:

```text
https://your-tenant.cubecloud.dev/embed/dashboard/YOUR_DASHBOARD_PUBLIC_ID?session=YOUR_SESSION_ID&locale=es-MX
```

See [Localization](/embedding/iframe/localization) for the list of supported languages
and the other ways to set the language.

## Customize appearance

You can style an embedded dashboard — background, padding, widget borders, titles, and fonts — from the **Styling** panel in the Dashboard Builder. See [Dashboards → Styling](/docs/explore-analyze/dashboards/styling) for the full list of options.
