Build a custom Insights dashboard
The Insights section ships one fixed hub page plus a set of purpose-built surfaces (retention, funnels, deliverability, LLM spend, and so on). Where those pages stop, the Dashboard Builder starts: it is the no-code composition surface at Insights → Dashboard Builder (/insights/dashboards) that lets you arrange the metrics that already
exist behind the per-pillar endpoints into a layout of your own, and share
that layout as a signed, embeddable link.
This guide covers the builder mechanics — the palette, the grid, widget
configuration, layout validation, and the share/embed flow. For how to
read the individual Insights surfaces (retention curves, journey paths,
topic intelligence, and the rest), see Read the Insights
dashboards.
What a widget is
Every widget in the palette maps to one read-only metric endpoint the API already serves — message volume, deliverability, voice quality, CDP health, agent QA, LLM spend, burn rate, carbon, and more. The builder never invents a new query: placing a widget means “render the output of that existing endpoint inside my layout.” When the layout is later rendered, each tile fetches its own backing endpoint with the normal authenticated, tenant-scoped request, so a dashboard can never widen the data access the widget’s source endpoint already enforces. Because widgets reference the live endpoint catalog, a widget only exists in the palette when its backing metric is live for your tenant — if a surface you expected is missing, check that pillar’s data is actually flowing.The widget palette
The palette groups widgets by category (Messaging, Deliverability, Voice, CDP, Agents, Quality, Spend, Sustainability) and each entry shows its visualization type — stat, line, bar, table, or gauge — so you know what shape the tile will take before you add it. The current catalog:Create a dashboard
- Open Insights → Dashboard Builder in the console (visible to the owner, admin, developer, and viewer roles).
- Set a Dashboard name and pick the grid column count — 6, 8, 12, 16, or 24 columns. 12 is the default; use more columns when you want finer placement control.
- From the Widget palette on the left, click a widget to drop it onto the canvas. A dashboard can hold up to 50 widgets.
- For each placed widget use the editor card on the right to:
- override the title (leave blank to keep the widget’s own name),
- adjust width (1 up to the column count) and height (1–24 row units) with the steppers,
- reorder tiles with the up/down controls, or remove them.
- When the layout reads right, click Validate layout. Validation is a dry-run against the API: it checks the layout shape, clamps coordinates, de-duplicates tile ids, and confirms every required parameter is set. On success the canvas adopts the normalized layout the server returned.
Configure a widget
Configuration happens per tile, in the editor card on the right. Every widget has a size (width and height in grid units, up to your column count and 24 row units) and an optional title override. Beyond that, each widget exposes the parameters its backing endpoint accepts:window— the look-back window for the metric, one of24h,7d,30d, or90d. Most widgets accept it.channel— an exact-match channel filter, one of sms, whatsapp, rcs, email, voice, or telegram. Accepted by the messaging, deliverability, and sentiment widgets.- Period or day-count parameters — the spend family takes a billing
month (
YYYY-MM) or a day count; the burn-rate, spend-series, and carbon widgets take a window in days (default 30). - Required object parameters — some widgets bind to a specific object: the Queue live state widget needs a queue id, and the Agent QA scorecard widget needs an agent id. Required parameters are marked with an asterisk in the widget editor; the canvas warns and the Validate layout button stays disabled until every required value is supplied.
window and channel) accept only their
listed values — validation rejects anything else.
Validate, don’t guess
Validation runs the same normalizer the API uses on a saved or shared layout, so a layout that validates is one the embed renderer will render unchanged. The builder also adopts normalized coordinates back onto the canvas, so what you see after validation is exactly what a recipient of the dashboard will see.Validate a layout over the API
Validate layout is a dry-runPOST /api/v1/analytics/dashboards/validate
— stateless, and it writes nothing. Send a name, the grid column count, and
the placed widgets with their parameters; the endpoint clamps coordinates,
de-duplicates instance ids, and allow-lists the params. A small two-widget
request:
Filters and drill-down
The builder itself is a composition surface, so its filter controls live on the widget’s parameters: thewindow and channel parameters above are
the per-tile filters you apply before sharing. For the wider, range-aware
filter experience — the explicit date range, channel and region filters,
and the row-level drill-down into carriers, countries, and error codes —
open the fixed Analytics surface (Insights → Analytics), which is the
canonical explorer the hub links to. The Messaging insights widget is
the drill-down you embed: it renders the same per-carrier, per-country,
and per-error-code histogram the Deliverability surface drills into, so a
shared dashboard can carry that breakdown without granting console access.
Share and embed
Minting a share link is a governance action on the API (the link anyone with the URL can open exposes tenant metrics), so Share & embed is restricted to the owner and admin roles; the button only renders for them, and the API rejects the request for other roles.- Fill in the dashboard name and every required widget parameter (the button stays disabled until those are set).
- Click Share & embed.
- Pick a lifetime — 1, 7, 30, 60, or 90 days (the default is 30, and the API clamps every request to 1–90 days) — optionally a title override, and Generate link.
- Copy either:
- the Embed URL, which opens a public, white-label page rendering the dashboard, or
- the Embed snippet, a ready-made
<iframe>pointing at that URL to drop into an intranet, portal, or backing-app page.
Mint a link over the API
Owners and admins can mint the link directly againstPOST /api/v1/analytics/dashboards/share — the same call Share & embed
runs. Pass the validated layout, an optional lifetime, and an optional
white-label title; the API clamps ttl_days to 1–90 days (default 30):
embed_url or paste iframe_html; api_url is the raw JSON resolver
the embed page consumes. The token rides inside the URL, and each link
carries its own expiry — revoke access by generating a new link and
retiring the old one (the published link stays valid only until its
expires_at).
Limits and failure modes
Where exports live
The builder itself composes and shares layouts — it is not a data-export surface. If you need a spreadsheet or an image of the numbers, use the export affordance on the individual Insights metric page (for example the Deliverability and Link-tracking surfaces ship CSV/workbook exports), or pull the same endpoints the widgets call through the Analytics API and export from your own tooling. A dashboard link answers “show someone the composition,” not “hand them a file of the data.”How this fits with the other Insights guides
- Read the Insights dashboards — what each fixed Insights surface answers and how to read it (cross-channel KPIs, retention curves, journey paths). This guide covers the complementary dashboard-building mechanics: the palette, layout, and share flow.
- Insights API reference — the endpoint shapes behind the fixed surfaces (the widget catalog reuses the same read-only family).
- Scheduled reports — recurring email digests, when you need the numbers pushed to you rather than composed on a page.