Coaching coach-satisfaction survey V1 spec
Summary
This delivers the V1 spec for the coach-satisfaction survey scoped in 2026-05-22-coaching-coach-satisfaction-survey-scoping. It resolves that memo's four open questions and delivers the buildable content: the quarterly coach eNPS message and one-tap form, the coach_satisfaction_of_platform formula, and the trigger configuration. The initiative is Coaching-owned. The one external dependency, reusing the existing comms infrastructure for the send, is the confirmation the scoping memo asked Platform for; this spec proceeds on the expectation that it is a yes, since the customer program already proved that path, and only the send section depends on it.
Open questions resolved
The scoping memo left four open questions. Coaching resolves them here.
- Cadence: quarterly. The scoping memo leaned monthly, but monthly is too frequent a touch for a coach pulse. Quarterly is the standard relationship-survey cadence, keeps coach contact light, and still feeds the metric adequately given the trailing window in question 3.
- eNPS scoring: a mean normalized rate, not a true promoter-minus-detractor eNPS. This keeps
coach_satisfaction_of_platformconsistent withcoach_quality_score, which is also a mean rate, satisfieskind: rate, and is simpler. The promoter and detractor split stays visible through the raw score distribution and the reason data for anyone who wants it. - Trailing window: 180 days, two quarters. Long enough that the weekly-emitted metric stays continuously populated between quarterly surveys and tolerates a coach skipping a quarter.
- Onboarding coaches: active coaches only for V1. A coach enters the quarterly rotation when their Coach status becomes
active.
Survey copy
The recipient is the coach. There is one instrument, the coach eNPS.
Message (SMS):
{brand_name}: Hi {coach_first_name}, one quick question about coaching with us, about 15 seconds: {link}
One-tap form:
- Heading:
{brand_name} - Question: "How likely are you to recommend {brand_name} as a place to coach?"
- Rating control: eleven tappable options, 0 to 10, left-anchored "Not at all likely" and right-anchored "Extremely likely". One tap records the score.
- Reason follow-up, shown after any score: a single-select list, "What most affected your score?" Options: "Pay and compensation", "Scheduling and workload", "Support and tools from {brand_name}", "Students and families", "Facility or equipment", "Growth and development", "Other". The reason is optional and skippable.
- Confirmation screen: "Thanks, {coach_first_name}. Your feedback helps us make {brand_name} a better place to coach."
One-tap form behavior
The same principles as the customer program apply.
- The link carries a signed binding to the coach and the survey period, so the form needs no login.
- Mobile-first. One tap records the score and reveals the single-select reason list and a submit control.
- The reason follow-up is optional and never blocks submission.
- The program captures no free text in V1. Every captured field is structured: a numeric score and an optional categorical reason code. All output is quantitative and countable.
- After submit, the confirmation screen ends the flow. Re-opening the link after a response is recorded shows the confirmation rather than accepting a second submission.
- V1 is English only.
The coach_satisfaction_of_platform formula
coach_satisfaction_of_platform is computed from the coach eNPS score. One structural difference from coach_quality_score shapes the formula: there, many customers rate one coach, so a coach accrues many responses; here the coach is both the subject and the sole respondent, so a coach contributes one response per quarterly pulse, roughly two within a trailing 180-day window. The minimum-N rules account for that.
Per-response normalization. Each eNPS response is an integer 0 to 10. It normalizes to a rate
r = raw / 10, so 0 maps to 0.00 and 10 to 1.00.Per-coach value, the
coach × weekgrain. For each(coach, week), the value is the mean ofrover that coach's own responses in the trailing 180 days. Because the coach is the sole respondent, the per-coach minimum-N is 1: a coach with at least one response in the window is scored, and a coach with none emitsnull:insufficient_data. A coach answering the quarterly pulse carries one to two responses in the window.Org-market value, the
org_market × weekgrain. The registry'sweighted_mean_by_customer_countrollup over the coach-level values in the org-market, emitted when the org-market has at least 5 coach responses in the trailing 180 days, otherwisenull:insufficient_data. The small-N guard sits at the org-market grain, where there is genuine volume across coaches, not at the per-coach grain, where one response is the expected and complete sample.
The score is a rate in the range 0 to 1, higher is better, emitted weekly. coach_satisfaction_of_platform's allowed_null_reasons already includes null:insufficient_data, so unlike coach_quality_score this metric needs no allowed_null_reasons change.
Worked example: a coach whose trailing-180-day eNPS responses are 9 and 8 normalizes to 0.90 and 0.80, a mean of 0.85, so their coach_satisfaction_of_platform is 0.85.
Trigger configuration
- A Coaching-owned quarterly scheduled job over Coach records with status
active. - The send day is staggered across the quarter per coach, by a stable per-coach send day derived from the coach id, so the weekly-emitted metric is fed evenly through the quarter rather than in a once-a-quarter spike.
- A coach enters the rotation when status becomes
activeand leaves it when status leavesactive. - Send path: recipient resolution through Platform's comms-routing endpoint, send through the External Actions Queue (ADR-0011) as its own
action_kind, and a one-tap link to the Coaching-hosted form. This reuses the customer program's settled path, and it is the reuse the scoping memo asked Platform to confirm.
Platform note
The trailing-180-day window means coach_satisfaction_of_platform's period_attribution, currently survey-week, should be updated to a trailing-window descriptor when the metric compute is wired (here, trailing-180-day), the same one-field free-text edit Platform made for coach_quality_score (snapshot-week to trailing-8-week). No other registry change is needed: the metric exists, kind: rate holds, and allowed_null_reasons already covers the insufficient-data case.
What remains
With this spec, Coaching's design work for coach_satisfaction_of_platform is complete. The build that follows is: the Coaching-local coach-survey table, the quarterly trigger job, the one-tap form, the External Actions Queue integration, and the coach-grain aggregate the mart reads; then Platform wiring the coach_satisfaction_of_platform compute against it. Coaching owns all of that except the metric compute. No dated commitment here, consistent with the no-rocks discipline.
References
- Scoping memo:
2026-05-22-coaching-coach-satisfaction-survey-scoping - Customer survey program V1 spec, the pattern this follows:
2026-05-22-coaching-nps-program-v1-spec - Platform's period_attribution precedent:
2026-05-22-platform-nps-program-v1-period-attribution-confirmation - Thread root:
2026-05-19-platform-mart-100-percent-deployment-per-domain-asks - Registry entry for
coach_satisfaction_of_platform:platform/lib/mart/registry.ts - External Actions Queue contract:
contracts/external-actions/README.md; ADR-0011 - Coaching domain doc:
coordination/domains/coaching.md