04 — Client Impact Dashboard — Product Spec
Audience: Engineering (frontend + Supabase), Product, Account Managers
Status: Spec for build. Pair with 05-data-model-and-events.md for schema.
Purpose
Give the client HR sponsor a live, anonymised view of the engagement so they can:
- See what's happening this week without waiting for a report.
- Spot dropping engagement early and intervene with us.
- Show their exec / board the value mid-engagement, not just at Week 12.
Audiences & access
| Role | Access scope | Auth |
|---|---|---|
| Client HR sponsor | Their org's cohorts only | Magic-link email, expires 7d |
| Client exec sponsor | Read-only summary view of their org | Magic-link email, expires 7d |
| MEM Account Manager | All client orgs they manage | Standard staff auth + RLS by account_mgr_id |
| MEM Delivery Lead | All cohorts | Staff role |
| MEM Admin | All data | Admin role |
Never accessible: individual line managers within the client org. They get the manager pocket card (Sprint 1 §03) and the W11 debrief — not dashboard access.
Layout (HR sponsor view)
┌─────────────────────────────────────────────────────────────────┐
│ Header: Org name · Cohort · Week N of 12 · Account Mgr contact │
├─────────────────────────────────────────────────────────────────┤
│ ROW 1 — HEADLINE │
│ [SROI Row 1 tile — populated from W12, placeholder until then] │
├─────────────────────────────────────────────────────────────────┤
│ ROW 2 — ENGAGEMENT (live from W2) │
│ [Workshop attendance] [Coaching utilisation] [Nudge engagement]│
├─────────────────────────────────────────────────────────────────┤
│ ROW 3 — SENTIMENT & BEHAVIOUR (live from W6, n ≥ 5 only) │
│ [Confidence delta] [Behavioural deltas] [Pulse response rate] │
├─────────────────────────────────────────────────────────────────┤
│ ROW 4 — STORIES (curated, anonymised) │
│ [2-3 quote cards from coaching, anonymised, coach-approved] │
├─────────────────────────────────────────────────────────────────┤
│ ROW 5 — WHAT'S NEXT │
│ [Next milestone] [What we need from you] [Download W4/W8/W12] │
└─────────────────────────────────────────────────────────────────┘
Tile specifications
Row 1 — Headline SROI
- Source:
sroi_rollupstable (one row per cohort per snapshot). - Display before W12: Placeholder text — "Headline impact will land at Week 12. Track progress in Rows 2-3."
- Display from W12: Single sentence — "For every £1 invested, this cohort returned £X.XX in value — driven by [top 2 drivers]." Plus link to PDF (Sprint 3 §03).
Row 2 — Engagement (3 tiles)
| Tile | Metric | Formula | Threshold |
|---|---|---|---|
| Workshop attendance | % of invited who attended | attended / invited | Green ≥80%, Amber 60-79%, Red <60% |
| Coaching utilisation | % of expected sessions delivered | delivered / (participants × expected_sessions_by_week) | Green ≥75%, Amber 50-74%, Red <50% |
| Nudge engagement | % of nudges opened/clicked | engaged / sent (last 14d rolling) | Green ≥40%, Amber 25-39%, Red <25% |
Each tile shows the number + a 6-week sparkline.
Row 3 — Sentiment & Behaviour (3 tiles, n ≥ 5)
| Tile | Metric | Source | Display rule |
|---|---|---|---|
| Confidence delta | Mean change in confidence (pre vs Day-30) | Sprint 4 §08 pulse + workshop pre-survey | Hidden if n<5; show "+X pts on 0-10 scale" |
| Behavioural deltas | Top 3 self-reported behaviour changes | Sprint 3 §05 Day-30 pulse Q4-7 | Bar chart, % who answered yes |
| Pulse response rate | % of eligible who completed pulse | completed / eligible | Show actual %; informs reliability of above tiles |
Anonymisation rule (hard): Any tile drawing from <5 individual responses renders as "Building — needs 5+ responses to display." No exceptions, even if client requests.
Row 4 — Stories
- 2-3 quote cards. Source: coaching session notes flagged
share_anonymised = trueANDparticipant_consent = true. - Cards show: quote (≤30 words), role category (e.g. "Frontline manager, retail"), week of engagement.
- Never: name, exact job title, team name, location more specific than country.
- Curation: Account Mgr selects from queue; Delivery Lead approves; renders to client dashboard.
Row 5 — What's Next
- Next scheduled milestone (pulled from W0 calendar).
- Action list for sponsor (e.g. "Confirm W11 debrief attendees by [date]").
- Download buttons: Dashboard PDF snapshot (W4, W8, W12).
States
| State | When | Display |
|---|---|---|
pre-engagement | W-4 to W0 | Onboarding checklist only; tiles greyed |
live | W1 to W12 | Tiles populate per the W availability above |
wrapping | W12 to W13 | Board report banner; retro pending |
archived | W14+ | Read-only; banner: "Engagement complete. Contact your Account Mgr to start the next cohort." |
Non-goals (explicit)
- No real-time chat with coaches.
- No participant-facing view (participants use the coaching portal, not this dashboard).
- No comparison to other clients' benchmarks in v1 (industry benchmarks ship in v2).
- No editable fields — this is a read surface. Edits happen in coach tooling.
Tech notes (for engineering)
- TanStack Start route:
/_authenticated/client/dashboard/$cohortId - Magic-link auth for sponsor roles via Supabase Auth
signInWithOtp. - RLS:
cohortstable policy joins onclient_org_membersfor sponsor reads; staff role bypass viahas_role(auth.uid(), 'staff'). - All tiles are server-fn queries (
createServerFn), cached 60s. - PDF snapshots generated server-side via Puppeteer-alternative compatible with Worker runtime (use HTML→PDF via external service; Puppeteer is banned per server-runtime constraints).
See 05-data-model-and-events.md for schema and event spec.
