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โ
- 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.
- Add more features: unlock data exploration, Ask AI, user-built dashboards, email subscriptions, and more by updating the embed payload.
- 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:
- Embed payload
- โ View multiple dashboards โ Add objects.dashboards
- โก Self-serve exploration explore data, drill down, view underlying data โ Add objects.datasets
- โข See only their own data โ Add permissions.row_based, or user_attributes for dataset rules
- โฃ User-built dashboards (personal + shared) โ Add workspace permissions, embed_user_id and embed_org_id
- โค Email subscriptions โ Add embed_user_id, embed_user_email, allow_dashboard_export and allow_data_subscribe
- โฅ Ask AI โ Add settings.ai.enabled, plus at least one dataset
- 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:
- Swap the credentials: replace the per-dashboard credentials with the new shared credentials.
- Name the dashboard in the payload: add the dashboard's name to
objects.dashboards.
- 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}`;
- a-l-cred โ a-r-cred (Step 1: new credentials)
- a-l-dash โ a-r-dash (Step 2: list dashboards)
- a-l-url โ a-r-url (Step 1: sign with the new secret)
Learn more: Get started with unified embedding