Skip to main content
โ† Back to all release notes
September 30, 2026

๐Ÿงฉ New unified embedding

new featureenhancement

Unified embedding is now available in Embedded Analytics. There is one way to embed: it's easy to start, you see value quickly, and you unlock more capabilities as your needs grow.

Why this mattersโ€‹

Previously, you had to choose between two embedding methods before trying any embedded features:

  • Single-dashboard embedding was quick to start but limited to viewing a dashboard. Adding data exploration, Ask AI, or email subscriptions meant migrating to Embed Portal.
  • Embed Portal had every feature but needed a complex setup (portal, user attributes, publishing code) before you saw any value.

With unified embedding:

  • Easy to set up: no need to create an Embed Portal, publish code, or set up user attributes.
  • Effortless to scale: everything is set in the embed payload. New features unlock by adding config, never by migrating.

How it worksโ€‹

  1. Embed your first dashboard: generate one shared embed credential, sign a payload listing the dashboard, then load it in an iframe. The Embed Builder lets you preview it and copy the payload.
  2. Add more features: unlock data exploration, Ask AI, user-built dashboards, email subscriptions, and more by updating the embed payload.
  3. Use Embed Portal and dataset permissions when you need them: when listing every dashboard and permission rule in your app gets hard to keep in sync with Holistics, move them into an Embed Portal and attribute-based permissions in datasets.

Here's how each feature maps to a key in the payload:

Each embed feature maps to a few keys in the same embed payload: dashboards, datasets, row-level permissions, user-built dashboards, email subscriptions, and Ask AI.
  • f-view โ†’ a-view
  • f-explore โ†’ a-explore
  • f-rlp โ†’ a-rlp
  • f-build โ†’ a-build
  • f-subscribe โ†’ a-subscribe
  • f-ai โ†’ a-ai

Migrate from legacy single-dashboard embeddingโ€‹

Your existing embed links keep working, so migrating is optional. To move to the new embed payload, follow the migration guide:

  1. Swap the credentials: replace the per-dashboard credentials with the new shared credentials.
  2. Name the dashboard in the payload: add the dashboard's name to objects.dashboards.
Migrating from a legacy per-dashboard embed link: swap in the shared Key ID and Secret, list dashboards in objects.dashboards, and sign and load the embed with the new credentials
  • Before: Legacy per-dashboard embed link
  • After: New embed payload
  • Your backend const jwt = require('jsonwebtoken'); const embedCode = '275XXXXXXXXX'; // per dashboard const secretKey = '382fXXXXXXXX'; // per dashboard const payload = { // dashboard implied by the embed code settings: { dashboard_autorun_on_changes: true }, permissions: { row_based: [ ... ] }, exp: Math.floor(Date.now() / 1000) + 24 * 60 * 60, }; const token = jwt.sign(payload, secretKey); const url = `${host}/embed/${embedCode}?_token=${token}`;
  • Your backend const jwt = require('jsonwebtoken'); const embedKeyId = 'abc123XXXXXX'; // one for all const embedSecret = '9f1dXXXXXXXX'; const payload = { objects: { dashboards: ['sales_overview'] }, settings: { dashboard_autorun_on_changes: true }, permissions: { row_based: [ ... ] }, exp: Math.floor(Date.now() / 1000) + 24 * 60 * 60, }; const token = jwt.sign(payload, embedSecret); const url = `${host}/embed/${embedKeyId}?_token=${token}`;

Learn more: Get started with unified embedding