Skip to main content

Insights hub

The Insights hub is the landing grid at /insights that groups every analytics surface in the dashboard into one navigable tile set — the answer to “where do I go to look at the numbers?” when you open the sidebar’s Insights entry. Each row below is a hub tile, and every tile links its read guide in the Section map — the map is the whole story of the hub.

What the hub surfaces

Three families of reads share the grid, in the order an analysis usually walks them:
  1. Agent-comparison charts. Agent comparison ranks your AI agents side by side — containment, resolution, escalation, cost, attributed revenue, margin — with a percentile band against the org population per metric. Read it first: it answers “which variant won.”
  2. Cohort views. Retention and Funnels & Retention group contacts by their entry event (a campaign send, a first conversation) and count returns over weeks. Read it second: it answers “did the win hold after entry.”
  3. Funnel + attribution. Conversion Goals, Attribution, and the Marketing mix model allocate conversion credit across channels under five models — first-touch, last-touch, linear, time-decay, U-shaped. Read it third: it answers “where the credit belongs.”
After the third read, close the loop by pinning the number with a KPI Alert so it stays watched — the decision loop section below walks that sequence end to end.

The tile model

Every section card answers four questions before you click:
  • Name and one-line description — the surface’s headline metric and scope, with an icon.
  • Native vs Cross-link badge. Native tiles route under /insights/<name>; a Cross-link badge means the tile hands off to a surface that lives in a sibling tree (the omnichannel wallboard, the voice tree, the quality hub) — the badge’s hover hint reads “Lives in another section of the dashboard.”
  • Coming soon badge. Occasionally a tile ships pre-launch as a teaser: the route exists and is navigable, the underlying endpoint ships later. Read-intent tiles lose the badge when their endpoint goes live.
  • Role-gating. A handful of tiles only render for an allow-listed seat (see RBAC visibility). The filter is the same normalised org role the sidebar uses, and the destination page re-checks it server-side — the tile hide is presentation-only, never an authorisation boundary.

RBAC visibility

Three gating families live on the hub:
  • Finance cluster — Channel Costs, LLM spend, Sustainability, Agent ROI, and Agent comparison render only for owner/admin/developer/billing seats. A viewer or agent sees none of these tiles, and the destination page 403s them regardless — the grid simply avoids showing a surface a role can’t read.
  • CDP-family cluster — Retention, Funnels & Retention, Account Scores, and Auto-drafted knowledge render only for owner/admin/developer, mirroring the read gate over the PII-bearing customer-event stream.
  • Quality cluster — Quality Management renders to owner/admin, Performance Leaderboard to owner/admin/supervisor, and QA Evaluations also to agent (an agent sees only their own evaluations page).
Everything else on the hub — Analytics, Logs, KPI Alerts, Usage anomalies, Usage alert rules, Reports, SMS Click-Through, Link Tracking, Conversation Intelligence, Contact Reasons, Topic Intelligence, Sentiment, Journey Paths, High-friction sessions, Deliverability, Conversion Goals, Attribution, Marketing mix model, Surveys, AI Containment, Per-language AI quality, Search Analytics, the two wallboards, Voice Quality, and Scheduled Reports — renders for every member, including viewers, because its read route is genuinely member-readable. Writes on alerting rules stay owner/admin/developer-gated at the API, but the read views are open.

How to navigate

In the dashboard, open the sidebar’s Insights entry — the hub is its landing page. Direct URLs work the same: /insights renders the grid, and any tile href (/insights/<route> for native tiles, the absolute path for Cross-link tiles) is bookmarkable. The hub headers two live stat rows above the tiles — a 24-hour API-count / latency / messages / agents row and the flagged-transactions strip — and one cross-link row below. Use the sidebar only when you want the grid again; every tile name doubles as its direct route segment for scripting or sharing links.

Build a comparison view across two variants

The most common read on the hub is a two-variant comparison — two AI agents, two campaigns, two channels. Run it on the tile that owns the comparison class:
  1. Fix the window first. Percentiles and cohorts recompute per window, so pick before you read — 30 days for a deployment decision, 7 days when reacting to this week’s change.
  2. Pick the two agents or channels. On Agent comparison the picker filters by name or id and shows each agent’s conversation count; on Attribution the channel split comes back in one report (email, SMS, push, RCS).
  3. Read the metric columns, then the band badge. containment/resolution/escalation, then cost and margin on agents; credit and credit-share on channels. Each cell carries a percentile rank against the org population, direction-aware — “top quartile” on escalation means low escalation.
  4. Check volume before acting. A top-quartile badge on four conversations is provisional; the picker prints the count next to each agent name, and attribution prints conversion counts per channel.
  5. Sort to the decision. Sort agents by margin to see which variant pays; sort channels by credit-share to see which one carries the funnel.
For a channel-to-channel comparison, run the same Attribution window under two models — linear levels the field, last_touch finds the closer — by re-running the report with the model toggled. Detail steps per surface are in the linked guides: Agent comparison and Multi-touch attribution.

Export a snapshot

Three export shapes exist, one per purpose:
  • Ad hoc snapshot (CSV/PDF). The Reports tile generates a report in-page — Message Delivery, Channel Performance, Cost Analysis, Contact Growth, Campaign ROI — with CSV and PDF download buttons in the viewer toolbar. Use this when a stakeholder asks for “the numbers” once.
  • Scheduled snapshot. The Scheduled Reports tile emails the same reports on a cadence to a recipient list. Use this when the stakeholder asks every week; create on schedule, run Send now to preview.
  • API snapshot (JSON). Every surface’s compute endpoint returns the same view over the Insights API — e.g. GET /api/v1/insights/agent-comparison?agentIds=...&from=...&to=... for the comparison table. Script this when your analytics team pulls into a BI tool; the CDP BI-tool connectors guide covers Tableau, Power BI, Looker, Superset, and Metabase. Copyable curl + SDK escape-hatch blocks for each endpoint are in Worked API samples below.

Worked API samples

Everything on the hub is scriptable: the same reads the dashboard tiles render are returned over the public API, so a BI tool or scheduled job can drive the exact numbers a tile shows without opening the dashboard. Five calls cover the hub’s main reads end to end. The five below run through the generic SDK escape hatch — orbit.request in Node and client.request in Python — because the Insights read surface sits below the typed SDK resources. Auth, retries, and the standard { data, meta } envelope are identical to the typed helpers.
Every Insights and Analytics call shares one per-tenant budget of 60 requests / minute; your API key needs the analytics:read scope, and queries run against a read replica so reporting never contends with your live send path. On a 429, honour Retry-After and back off. Writes that create scheduled or ad hoc reports are owner/admin-gated — the scope alone does not author a new scheduled report.

Compare two agents

Ranks agents on containment / resolution / escalation / cost / attributed revenue / margin, and returns a percentile band against the org population per metric. Pass at least two agent ids; the window defaults to the last 30 days when from / to are omitted.
The 200 envelope returns one row per requested agent, ordered as sent, plus the org-wide average baseline and the canonical metric list:

Run a contact cohort funnel

Runs the ordered cohort funnel over your CDP event stream — pass 2–8 event names in steps and the response counts subjects who reached each step in sequence inside the per-step window_days. Owner / admin / developer with the contacts:read scope, same gate the Funnels & Retention tile in the dashboard carries.
The response is the cohort breakdown per step — how many subjects entered and how far each cohort walked. Field names come from the response schema (step, index, reached, dropOffFromPrevious, dropOffRateFromPrevious, cumulativeConversionRate), so every member survives JSON parsing untouched:

Drill into funnel drop reasons

When the funnel’s second step drops, the carrier reason codes tell you why. Here {step} is one of sent, delivered, read, or queued, and the response is the top carrier rejection codes enriched with human-readable names — the same shape the Channels → Analytics guide walks through on the drop-reasons drill-down.

Generate an ad hoc report

Creates the report behind one of the Reports tile’s cards — message delivery, channel performance, cost analysis, contact growth, or campaign ROI — as an ad hoc snapshot that survives sign-out. The PUT replaces the caller’s saved report history and returns it; each entry needs the generated report’s id, name, type, generatedAt, and column keys a caller reads back later.
Only report METADATA is persisted — the row-level data you exported to CSV is not stored on the server, so clearing browser storage never wipes the history but tenant customers’ phone numbers never sit in your blob either.

Loop with a scheduled report

The Scheduled Reports tile is the same call every cadence tick. Pick one of the five report types — messaging_volume, deliverability, top_contacts, spend, or custom (which runs the saved query in filters.saved_query) — choose a daily, weekly, or monthly cadence, and Orbit emails the report to 1–50 recipients at 09:00 in the schedule’s timezone. Requires owner/admin; the list endpoint authorises over analytics:read alone.
The create call returns 201 with the created row echo — including the per-cadence next_send_at — in the standard envelope:

Section map

Role-specific views

Two worked examples of the same hub, one per seat:
  • A viewer or agent opens the grid and never sees the finance cluster (Channel Costs, LLM spend, Sustainability, Agent ROI, Agent comparison) or the CDP-family cluster — every tile they do see is one their role’s read route is entitled to, so the grid is always the full set of what they can open. An agent additionally sees QA Evaluations (their own evaluation scores, acknowledge/appeal workflow) but not the org-wide Quality Management rollup.
  • An admin sees every tile on the grid including the finance and CDP families, because their seat passes the hub’s normalised-role filter and the destination page’s server-side guard in the same way.

Permissions — what a viewer can and cannot reach

Viewer (and agent) seats see every tile above except the finance cluster (Channel Costs, LLM spend, Sustainability, Agent ROI, Agent comparison) and the CDP-family cluster (Retention, Funnels, Account Scores, Auto-drafted knowledge) — those tiles simply do not render in the viewer’s grid. Even if a viewer pastes the route directly, the destination API returns 403; the hide and the guard are the same allow-list. On the Quality cluster, an agent additionally sees QA Evaluations (own scores only) but not the org-wide Quality Management rollup, and supervisors reach the Performance Leaderboard. Read access to KPI Alerts, Usage anomalies, and every other tile is open to all members; write access to alert rules stays with owner/admin/developer.

KPI alerts — pick a trigger, choose the channel

KPI alerts keep the decision-loop result watched after you close the dashboard. The KPI Alerts tile is self-serve over five business metrics: CSAT, NPS, CES, LLM spend, and AI containment. Creating a rule is a five-field form:
  1. Metric. Pick from the five.
  2. Trigger. Threshold — aggregate over a trailing window of window_days (1–90, default 7) compared with lt/lte/gt/gte against a fixed number; or Anomaly — z-score against a 28-day learned baseline with no threshold to tune.
  3. Threshold and window (threshold rules). Enter the comparator and the number in the metric’s native unit — percent for CSAT/containment, points for NPS, score scale for CES, USD for spend. Anomaly rules skip this; evaluation is daily against the baseline.
  4. Enabled toggle. Save; a scheduler sweep evaluates all opted-in tenants continuously, so rules fire without a manual Evaluate-now.
  5. Read the feed. The Fired-alerts feed lists the last 50 notifications with a View-metric deep link into the breached surface.
Alerts land as in-app notifications; pairing rules with Usage anomaly alert rules covers the transport signals (SMS delivery rate, outbound volume, spend) while KPI alerts cover the experience and AI-cost numbers. Full mechanics in the KPI alerts guide.

Run the decision loop

The hub is thirty pages, but an operator runs them as one loop:
  1. Compare two variants on Agent comparison — the operator-level walkthrough above.
  2. Confirm durability per campaign on Cohort retention — a comparison win only counts if the entry cohort stayed better after week one.
  3. Assign credit on Funnels and Attribution — the model choice decides which channel earns the budget.
  4. Pin the result with a KPI alert on the metric that decided the rollout — containment, margin, or conversion rate.
The full cross-dashboard narrative — same four steps worked through a realistic exec decision — is in Read the Insights dashboards as one decision picture.

Troubleshooting

Two failure modes recur on the attribution and funnel reads:
  • Attribution returns nothing, or everything lands in unattributed_conversions. The join keys every conversion to touchpoints via COALESCE(contact_id, anonymous_id, user_id) inside the lookback. A conversion with zero in-window touchpoints surfaces as unattributed, not dropped — if the share is large, touchpoints are not arriving with a stitchable id (event tracking is dropping contact_id/anonymous_id on your sends), or the traffic is genuinely outside your sending channels. Widen the lookback before changing the tracking plan: attribution joins only lookback_days days of touches per conversion (1–365, default 30).
  • Funnel and attribution totals disagree. The funnel query and the attribution query use different time scopes by design: the funnel counts events in its own window, attribution joins conversions against a per-conversion lookback. Pick the lookback deliberately and treat the label as part of the read — the same run under last_touch with 14 days is a “closer” report; the same window under first_touch with 90 days is an “introductions” report. When two stakeholders quote different numbers, first align on model + lookback, not on which surface is “right.”
For the per-tile troubleshooting notes — CSV column types, window-label mismatches, missing-attribute causes per page — the linked guides in the Section map each carry their own list.

Fraud alerts strip

Below the stat row, the hub renders the flagged-transactions strip — the top open fraud alerts raised on this account’s spend traffic. Each alert deep-links to its evidence; the strip collapses entirely when the fraud-shield queue is empty rather than rendering an empty container. For alert triage, verdicts, and the how-it-scans model, see the Compliance fraud shield guide.

See also