Dashboards
The stitched touches-to-won funnel, which of its numbers are attributed and which are directional, how to read it from the web or the CLI, and the dashboards you build yourself in the CRM.
The GTM Command Center is one windowed funnel stitched from the Sequencer, the Unibox, and the CRM, plus the counts that need a human today. Every read is free: 0 credits, no provider call.
These pages are live for every workspace but deliberately not in the sidebar while the Command Center matures. Reach them by URL or by searching Dashboards in ⌘K. There is no nav item to switch on, and this is not the org beta toggle. Dashboards you build yourself are separate: they live under CRM → Dashboards (/crm/dashboards) and in the oxygen dashboards commands — see Your own dashboards.
| Route | Page title |
|---|---|
/dashboards | GTM Command Center |
/dashboards/outbound | Outbound |
/dashboards/replies | Replies |
/dashboards/pipeline | Pipeline |
Every page has range tabs — 7d, 14d, 28d, 30d, default 14d. A tab writes ?range=, so /dashboards/pipeline?range=30d is a shareable link.
The funnel
| Stage | What it counts | Primitive |
|---|---|---|
| Touches sent | Every live sequencer action marked sent in the window, whatever its kind | Sequences |
| Replies | Enrolled leads that replied — a Unibox thread with no sequence behind it is not counted | Sequences |
| Positive replies | Enrolled leads whose reply was triaged interested or read as positive, on every channel | Messages |
| Meetings booked | meeting_booked CRM activities | Records |
| Deals created | New deals, with pipeline created | Records |
| Won | Closed-won deals, with revenue | Records |
The stages come from three systems with no row-level lineage between them, so the funnel is activity co-occurrence in the window, not cohort tracking. Conversion percentages are directional, and a rate is blank when a downstream stage exceeds the one above it. Positive replies count on every channel; only the Positive waiting count below is email-only. The channel split covers email, LinkedIn and WhatsApp. Money figures are the primary currency's totals, not a cross-currency sum, and the deal scan stops at 5,000 rows — Pipeline then captions its counts as partial.
The Needs action now strip deep-links into the drill-downs: Unread replies and Positive waiting to Replies; Failed sends and Mailboxes to Outbound; Cold deals (14d) to Pipeline. The web always uses the 14-day default; only the CLI's --cold-deal-days moves that threshold.
CLI and MCP
oxygen dashboards summary
oxygen dashboards summary --range 30d --json
oxygen dashboards summary --from 2026-07-01 --to 2026-07-31 --cold-deal-days 21 --json--cold-deal-days sets how many days an open deal can go quiet before it counts as cold (default 14). The response deep-links to https://joinoxygenagents.com/dashboards.
The MCP tool is oxygen_dashboard_summary, same arguments with cold_deal_days. Inspect its schema, then run it through oxygen_capabilities_read from core; ?toolset=signals optionally lists it directly.
Your own dashboards
Build your own dashboards under CRM → Dashboards (/crm/dashboards); the entry appears once the workspace has CRM objects. New dashboard asks only for a name. Each dashboard card's menu offers Rename, Make default, and Delete dashboard, and the default is listed first with a Default badge. Deleting archives the dashboard: the definition is kept, its slug is free to reuse, and the data it reported on is untouched. Add tags on the dashboard's own page or with oxygen tags attach dashboard <slug> --tags <labels>; /crm/dashboards?tag=<tag> and oxygen dashboards list --tag <tag> narrow the list.
A dashboard holds up to 20 tabs and 60 widgets on a 12-column grid, and always keeps at least one tab. Tabs are added and removed from the CLI or MCP; the page shows them once there are two. Add widget opens the widget settings beside the grid. Each widget's menu has Configure, which reopens those settings and is where you delete it; a live_source widget's menu adds Refresh now and Pause refreshing.
| Kind | Shows | Credits |
|---|---|---|
chart | A bar, line, or pie chart, or a single number, over any table or CRM object (deals, companies, and people work as sources) | 0 |
view | Rows of a saved table view: 25 by default, up to 500 | 0 |
iframe | An https page from another tool. An OXYGEN page is refused, because the sandboxed frame would show it signed out | 0 |
rich_text | A Markdown note | 0 |
code | Your own HTML visualization in a locked-down sandbox. It receives only the rows its declared query returned and cannot reach the network, your credentials, or the database | 0 |
live_source | A result from a read-only tool, cached between refreshes | Per refresh |
Opening a dashboard never spends. A live_source widget shows its cached result and refreshes only when asked: Refresh now in its menu, or oxygen dashboards widgets refresh. Each refresh is capped by the widget's maxCredits, or by your plan's per-delivery default when it has none; a ceiling of 0 means it never refreshes. Only read-only tools qualify: a tool that sends, publishes, or changes an external system is refused, and that check runs again on every refresh. refreshIntervalSeconds (at least 300, default 3600) is how long a result counts as current before the widget says it is due a refresh. Pause refreshing (--pause) stops every refresh and keeps the last result on screen; Resume refreshing (--resume) lets it refresh again.
oxygen dashboards create "Pipeline review" --description "Monday numbers" --json
oxygen dashboards widgets kinds --json # every kind, with an example configuration
oxygen dashboards widgets add pipeline-review chart "Open pipeline by stage" \
--config '{"chartType":"bar","source":"deals","aggregate":{"op":"sum","columnKey":"amount"},"groupBy":{"columnKey":"pipeline_stage"}}' --json
oxygen dashboards tabs add pipeline-review "By owner" --json
oxygen dashboards widgets data pipeline-review <widget-id> --json # the numbers the page draws
oxygen dashboards update pipeline-review --default --json
oxygen dashboards delete pipeline-review --json # archives itEvery command except widgets refresh is free. dashboards get returns a dashboard with its tabs and widget configurations, and widgets update changes a widget's title, placement, or configuration, which it replaces whole rather than merging.
MCP: oxygen_dashboards_list, oxygen_dashboards_get, oxygen_dashboards_create, oxygen_dashboards_update, oxygen_dashboards_delete, oxygen_dashboards_tab_add, oxygen_dashboards_tab_remove, oxygen_dashboards_widget_kinds, oxygen_dashboards_widget_add, oxygen_dashboards_widget_update, oxygen_dashboards_widget_remove, oxygen_dashboards_widget_data, and oxygen_dashboards_widget_refresh. ?toolset=signals lists them directly; from core, run reads through oxygen_capabilities_read and writes through oxygen_capabilities_call.
Analytics that are in the sidebar
For per-sequence and per-mailbox detail, Analytics (/analytics) shows Outreach, Deliverability and Content together; Analytics → Outreach (/analytics/outreach) and Analytics → Deliverability (/analytics/deliverability) are in the nav for every workspace, and Analytics → Content (/analytics/content) is there wherever Publishing is switched on. Deliverability charts mailbox health, bounces, warm-up and inbox-placement tests, and runs a new placement test for a mailbox with the same cost preview and approval as oxygen deliverability placement-test run. On the terminal:
oxygen sequences analytics --range 28d --jsonThat is the campaign answer: per channel, how many people you messaged, how many replied, and the resulting reply rate.
oxygen messages stats is a different question and a different denominator. It measures your whole inbox — every conversation in the workspace, including mail no campaign sent — and its reply rate is conversation-level, not campaign performance. Reach for it to understand your message corpus, never to score a campaign:
oxygen messages stats --channel email --json