Control Centre
Clicking any card on the Workspaces grid takes you to /dashboard/workspaces/{id} — a dedicated page that pulls together health signals for one workspace without switching into it first. It's a normal routed page, not an overlay or modal: there's no × button and no Escape handling, you just navigate back with the sidebar or your browser.
Layout
The header is a plain 56px bar: the workspace name, and an Active badge if it's your current workspace. There's no "Switch & open" or "Open campaigns" button here — those don't exist on this page.
Below the header, the page splits into two equal-width columns, not rows: the left column stacks AI Summary, Alerts, and Inboxes; the right column stacks Send volume and Campaigns (Campaigns is the only card that scrolls internally, since it can be the longest list).
Acme Corp
Active⚡ AI Summary
⚠ Alerts
✉ Inboxes
📊 Send volume (7 days)
▤ Campaigns
AI Summary
Clicking Generate summary sends the workspace ID to POST /ai/workspace-summary, which calls Claude to produce a plain-English health assessment from current campaign status, inbox status, and send stats. It costs a flat 5 credits, deducted from the workspace's shared credit balance — the same balance used for enrichment actions.
AI Summary
Generate a plain-English health assessment using Claude. Costs 5 credits.
Generate summary- Generation is blocked with an error if the workspace has fewer than 5 credits.
- Generation is unavailable if the server has no Anthropic API key configured.
- Every generation is logged as a line item in the workspace's enrichment ledger, so the spend is auditable alongside enrichment costs.
Once generated, the result replaces the card body with the summary text and a {credits} credits remaining line. The summary is generated on demand — it's not pre-computed or cached, so reopening the page starts from the idle "Generate summary" state again.
Alerts
Alerts are computed in the browser from data already loaded into the page — they aren't a separate stored alert feed. There are exactly four rules today:
| Condition | Severity |
|---|---|
An inbox's status is ERROR | Error |
| An inbox has 0 sends remaining today | Warning |
| A campaign's bounce rate is above 5% | Error |
A campaign has been PAUSED for 3+ days | Warning |
If none of these conditions are met, the panel shows "No active alerts." There's no acknowledgement or dismissal action — alerts simply stop appearing once the underlying condition clears.
Alerts (2)
An earlier version of this panel also warned when an inbox's OAuth token was expiring within 48 hours. That rule was deliberately removed — access tokens roll over hourly by design and self-heal on the next send, so the alert fired for nearly every healthy, idle inbox. The ERROR status check (set only when a refresh attempt actually fails) is the one reliable "needs reconnect" signal that's left.
Inboxes
Every connected inbox in the workspace, with a health label, remaining sends against the daily limit, the last error if any, and a color-coded score.
Inboxes
Healthy · 40/40 remaining
Degraded · 0/40 remaining · Auth error, reconnect required
The score dot's color and the health label text next to it come from two slightly different thresholds. The dot is green at 80+, amber at 50+, and red below that; the label text ("Healthy" / "Degraded" / "At risk" / "Blocked") switches at 80 / 60 / 40. In the narrow 50–59 range you can see an amber dot next to an "At risk" label — that's this mismatch, not a bug in your data.
Send volume
A daily bar chart of sends over the last 7 days, scaled to the busiest day in that window.
Send volume (7 days)
Campaigns
Every campaign in the workspace, with total sent, reply rate, bounce rate, and a status badge showing the raw status value — ACTIVE, PAUSED, DRAFT, or ARCHIVED.
Campaigns
Q3 enterprise rollout
1,204 sent · 8.2% reply · 1.1% bounce
Clicking a campaign opens it directly in the Campaign Builder (/dashboard/campaigns?campaignId=...). If this workspace isn't your active one, clicking a campaign silently switches your active workspace to it first, then navigates — there's no separate "switch" step or confirmation, it just happens as part of opening the campaign.
Campaigns, Alerts, and Send volume all load from one combined request and share a single loading state — so if any one of them is slow, all three show their loading skeletons together rather than populating independently. Inboxes loads separately, straight from data already fetched by the page itself, so it has no loading skeleton of its own.
Where to go next
Next: Workspace settings