Skip to Content
Living documentation — last reviewed 2026-05-28
ReviewsWorkout creation UX review — schedule → week planning → writing → assignment

Workout creation UX review — schedule → week planning → writing → assignment

Reviewed 2026-10-24 against main code and 90 days of PostHog data (project 125602). Scope: everything a schedule-mode coach touches to get “Sunday’s WOD” in front of members: class types, the Schedule page and its three views, the session sheets, the Programming matrix, the Workouts library, the paste-to-structure parser, the structured builder, and Spotter.

TL;DR

  1. The flow the complaining coach describes already exists — it is just hidden. The Programming view (class type × day matrix, DailyProgrammingView) is his “בניית אימונים” calendar. It is the third button of an icon toggle inside the Schedule page, its label is hidden on phones, and it is not in the sidebar. Class types are the sixth item of a dropdown called “הגדרת לוח הזמנים”. Nothing in the product is named after the job.
  2. On the matrix, the only way to type a workout is the AI parser. WorkoutPickerSheet offers paste-to-structure and “pick a saved one”, nothing else (weekly-calendar.tsx does not pass onBuildFromScratch). A coach who wants to write Sunday’s WOD in Hebrew in a textbox cannot do it from the view built for exactly that. The plain textbox (“יצירת אימון מהיר”) only exists inside the session sheet, as the fourth of four options in a popover.
  3. Structure is sold as a conversion, so nobody buys it. The parser is surfaced as “המרה לאימון מובנה” with a 15-second wait, a review dialog, and a Hebrew placeholder that says write in English. Over 90 days, customers (non-internal accounts) made 15 parse requests with an average of 94 characters in the paste box. When a parse does get committed, 7 of the last 8 commits were zero-edit after ~40–60 s of reading: the review step is a toll gate, not a value step.
  4. Spotter is a CRM tool in practice, not a programming tool. 241 turns, 6 users, 6 orgs in 90 days; three orgs account for 94%. Tool calls: leads 87 + 18 + 15, tasks 40, member search 24, workouts.create 1. The one customer who programs through AI does it with their own Claude/ChatGPT over MCP (57 of the 83 workouts created in 90 days) and never through the in-app Spotter.
  5. Recommendation in one line: plain text first, structure as optional background enrichment, and never a discipline’s vocabulary baked into the editor. A text area on the day cell, published on save, Hebrew-first, with movement matching running after save and surfacing only where it finds something, serves a box, a pilates studio and a yoga studio alike while still collecting the structured data the product wants.

1. What the data says

Reach and volume, last 90 days (PostHog)

SignalEventsUsersOrgsNote
$pageview /dashboard/schedule3609—vs. /dashboard/members 1518 / 14 users
$pageview /dashboard/workouts1319—library landing
$pageview /dashboard/workouts/new447—the only “new workout” route
workout_created838657 via MCP (client: assistant, one user), 26 by humans in a browser
wod_published3154days that actually reached members
wod_post_started2455entry: pick 12, freeform 12, paste 0, builder 0
wod_post_completed222instrumentation gap — see §7
parse.requested555515 from customers, 40 internal
parse.committed2145
parse.discarded712
agent.turn.started (Spotter)24166
agent.tool.executed → workouts.create111
mcp.tool.executed3,43933own-AI channel
onboarding_completed101010new orgs in the window

Per-week trend: workouts created peaked at 21–28/week in late September (one MCP user), then fell to 2 in the week of 19 Oct. Schedule page views jumped to 159 in the latest week (new orgs), with 2 workouts created. New coaches are arriving at the Schedule and not producing workouts.

How published days were produced

wod_post_started by entry: 12 “pick a saved workout”, 12 “quick freeform”, 0 paste, 0 builder. Coaches who do succeed either reuse a library row or type free text. No coach has started a WOD post from the paste or builder entry in 90 days.

Parser quality vs. parser cost

  • Every completed parse resolved all movements (unresolvedCount = 0 across 51 parses), but on average ~40% of movements come back suggested (e.g. 7 suggested / 11 auto out of 18). The dialog then shows “7 תנועות לאישור מאוחר יותר”.
  • Time from parse to commit: p50 40–58 s. Edits before commit: 0.0–0.3 on average; 7 of 8 fidelity-mode commits were zero-edit.
  • Customers’ paste inputs average 94 characters (internal: 784–1,805). Customers are poking it with “3 rounds 10 squats”, not pasting a real day.

Spotter in practice

Router.actionCallsUsers
leads.create87 (+9 failures)2
tasks.complete402
read.members_search243
leads.add_to_pipeline / list / get18 / 18 / 151–3
help.search164
class_sessions.create71
workouts.create11

Over 180 days, three orgs used Spotter on 12, 23 and 33 distinct days; the other three used it on 1–3 days. Errors shown to users: 18 (provider_invalid_request 10, agent_budget_exceeded 4, network 2, unauthorized 1, max_turns 1) against 241 turns, so roughly one turn in thirteen ends in an error card.

Rage clicks on the schedule page: 6 across 4 users (members 22, branding 28, plans 18). The schedule is not where people rage; it is where they don’t go.

2. The flow today, measured

Conventions: a click is a tap or click; a decision is a point where the UI presents alternatives the coach must understand to proceed; a concept is a product noun they must hold in their head. Starting point is the dashboard sidebar. Hebrew labels are what customers actually see (all customer traffic is on /he/).

A. Create a class type (“WOD, Pilates, Gymnastics”)

#ActionSurface
1Sidebar → לוח זמניםSchedule, Expanded view by default
2Toolbar → הגדרת לוח הזמנים (gear-calendar icon)SetupTimetableMenu dropdown
3Sixth item → סוגי פעילותafter copy last week / apply template / save as template / manage templates
4Sheet → Add class typeProgramClassTypesTab
5–11Program dropdown, name, duration, capacity, default space, colour, “has workout” switch, “deducts an entry” switchClassTypeDialog (510 lines)
12Save

12 clicks, 3 nested surfaces (page → dropdown → sheet → dialog), 2 decisions a non-technical owner cannot answer (“parent program?”, “deducts an entry from the member’s plan?”). The same form is reachable from /dashboard/programs/:id?tab=class-types and from the onboarding setup guide — three doors, none labelled “classes”. The coach’s complaint (“זה צריך לצאת מהתת תפריט של השבוע ולהיות בפני עצמו”) is accurate: class types are a configuration item filed under a recurrence menu.

B. Put Sunday’s WOD on the board via the Programming matrix (the intended path)

#ActionSurface
1Sidebar → לוח זמנים
2View toggle → אימונים (dumbbell icon; text hidden below sm)ScheduleViewToggle, choice persisted in localStorage
3Click the WOD × Sunday cell (“שיוך אימון”)DailyProgrammingView
—Decision: paste text for AI, or pick a saved workoutWorkoutPickerSheet
4aType/paste into the violet box → 5a. “יצירת טיוטה מובנית” → wait ~15 sPasteInput
—Decision: review 15–20 movement chips, “N תנועות לאישור מאוחר יותר”, “שמירה גם ברשימת האימונים” checkbox, Discard / התאמה בבונה / PublishStructureReviewDialog
6aפרסום ל-ראשון · WOD (3 מפגשים)commit + publish in one call
4bSearch list → 5b. click row → 6b. “שיוך”only if the workout already exists in the library (flow D)

6 clicks, 1 AI wait, 2–3 decisions, and no way to just write text. On the Lite tier (no workout_builder) the paste box disappears and the cell can only pick from the library, so a Lite coach must go write the workout somewhere else first. The matrix does publish immediately (status: 'published'), which is what the coach asked for; it just cannot author.

Concepts needed: class type, day cell, draft (AI) vs. saved workout, movement, “confirm later”, library vs. day-only, publish.

C. Put Sunday’s WOD on via the session sheet (what coaches actually do: entry: freeform 12)

#ActionSurface
1Sidebar → לוח זמניםExpanded grid
2Click the 06:00 WOD cardSessionDetailSheet (2,924 lines: details, capacity, fields, session plan, roster, check-in, QR, trials, rules)
—Decision: scope selector “כל הפעילויות היום (3)” vs. “הפעילות הזו בלבד” with two paragraphs of help textWorkoutScopeSelector
3הוספת אימוןAddWorkoutPopover
—Decision: הדבקו טקסט אימון / search box / library list / יצירת אימון מהיר / בונה מתקדם — 4 creation modes in one popover
4יצירת אימון מהירQuickCreateWorkoutDialog
5Type title (optional) and bodyBuilderTextEditor
—Decision: scoring select (8 options), time cap, and a violet card “חלוקה לחלקים ולתרגילים → המרה לאימון מובנה”
6Saveattaches and (day scope) publishes

6 clicks, 3 decisions, 2 sheets stacked on a page. The textbox is the right primitive, but it is buried as option four of a popover inside a 3,000-line sheet whose primary job is running the class, not planning it. The scoring/time-cap pair and the conversion card are structured-builder leakage into the freeform path.

D. Write a workout in the library, then assign it

  1. Sidebar → ספריית אימונים → 2. New → /workouts/new freeform editor (title, body, scoring, time cap, conversion card) → 3. Save → 4. go back to Schedule → 5. switch to Programming view → 6. click cell → 7. search → 8. pick → 9. שיוך. 9 clicks across two sections, plus the “Saved for reuse / Posted by day” tab pair on the library page, which reads as two kinds of workout. The library is a reuse concept; a coach writing this week’s programming does not have a reuse problem yet.

E. Build a whole week

  • Timetable (sessions): הגדרת לוח הזמנים → העתקת השבוע שעבר or apply a template. One click once set up. Good.
  • Programming (workouts): there is no “copy last week” for workouts on the Schedule page any more (use-programming-week-actions.ts notes the standalone board that had it was removed). Each of 5–7 day cells is flow B. 30–40 clicks and 5–7 AI waits for a week of paste-parsed WODs.
  • “בניית השבוע עם Spotter” exists on the toolbar and opens Spotter with a generated prompt. It is Latin-script “Spotter” inside a Hebrew label, and nothing in the matrix hints what it will do.

F. Build it in the structured builder

Add part → add section → section type (7) → shape (8: AMRAP, EMOM, for time, rounds, rep scheme, intervals, tabata, linear) → movement autocomplete against a ~600-row English canonical library → prescription panel (39 inputs/selects across sets, reps, load kinds, tempo, rest, levels, by-sex, percent-of-reference, superset) → repeat per movement. A three-part day with eight movements is comfortably 40+ clicks and requires knowing the vocabulary of CrossFit programming and Taikan’s schema. This is the surface the docs benchmark Spotter against (“<10 s versus 2–3 minutes hand-clicking the builder”), which is why Spotter looks fast on paper and irrelevant in practice: the real alternative is a textbox.

G. Add a session to a cohort (coaching program)

#ActionSurface
1Sidebar → ליוויlist of coaching programs
2Open the programprogram page: board, comments, settings sheet
3”+” in a day cellProgramBoard
—Decision: paste text for the AI, or pick a saved workoutthe same WorkoutPickerSheet as the schedule matrix
4–5Create structured draft (~15 s wait) → reviewStructureReviewDialog
6Addsession lands as a draft
7Publish weekboard toolbar

7 clicks and an AI wait, with the same gap as flow B: no plain text box. The cohort board is already “program × day”, the same shape as the schedule matrix, but a cell holds several ordered sessions, sessions stay drafts until the week is published, and each session carries its athletes (results, comments, who still follows it) with per-athlete exceptions opening the structured builder.

Vocabulary load

Across A–F a coach meets: program, class type, session, timetable template, daily programming, scope (day/session), draft vs. published (twice: sessions and programming), workout, library / “saved for reuse” / “posted by day”, freeform vs. structured, part, section, shape, movement, resolution/confirm, “advanced builder”, paste draft, Spotter. Nineteen concepts to publish one WOD. The coach’s proposal uses four: activity type, timetable, day, part.

3. Why coaches aren’t using Spotter

Evidence-based, in order of weight.

  1. It is not where the work is. The launcher is a header pill plus ⌘J; the empty state says “איך אפשר לעזור?”; the Schedule-page suggestions are “מה היום בלו״ז?”, “מצא חלון פנוי השבוע”, “הצג סוגי פעילות”. None says “כתוב את ה-WOD של מחר”. A coach standing on an empty Sunday cell is never offered Spotter for that cell.
  2. For writing a workout, chat loses to a textbox. The coach already has the text. Spotter routes it through workouts.parse, may suspend with a picker for ambiguous movements, lists warnings, and then needs a separate publish step. The textbox is one paste and one save. Spotter’s genuine advantages are multi-step and week-level (copy the pattern of last week, shift the strength day, fill gaps from a template), and that is the one button (“בניית השבוע עם Spotter”) that is unexplained.
  3. It has found its users, and they are owners doing CRM. 87 lead creations, 40 task completions, 24 member searches. The product positioned Spotter as “the coach’s build-the-day interface” (spotter-agent README); the usage says it is the owner’s back-office assistant. That is fine, but it means workout-authoring UX cannot lean on Spotter.
  4. Language and library. Canonical exercises are English; Hebrew/Russian aliases depend on an enrichment job; the parser placeholder tells Hebrew coaches to write in English. A Hebrew coach writing “3 סבבים של 10 סקוואט” to Spotter is betting on alias coverage.
  5. Error rate and budget. ~1 in 13 turns ends in an error card, provider_invalid_request being the largest bucket (10) — that is a bug, not a user problem. Lite tier gets $1/day; 4 budget-exceeded cards were shown. A coach who hits either once does not come back for something a textbox already does.
  6. The power path is MCP, not Spotter. The single heaviest workout author in the data (57 workouts in 90 days) connected their own Claude/ChatGPT. That is a real signal about what works: a long-form chat with the coach’s own tooling and no in-app budget, used for whole-day text. It is not evidence that the in-app sheet will ever be a programming surface for the median coach.

4. Why free text → structured isn’t happening

  1. The benefit accrues to someone else, later. Structure buys members demo links, scoreboards, PR tracking, and the whiteboard formatter. At the moment of writing, the coach gets a 15-second wait and a review dialog. The copy (“המרה לאימון מובנה”, “חלוקה לחלקים ולתרגילים”) describes the mechanism, not a benefit.
  2. English-only in a Hebrew product. workouts.parse.inputPlaceholder (he): “כתבו או הדביקו אימון באנגלית”. The orchestration actually accepts Hebrew guidance around English movement names, but the UI says no before the coach tries.
  3. The review is a gate with nothing to decide. Zero-edit commits dominate; ~40% of movements arrive as “suggested” and are shown as a count to “confirm later”. The coach reads 18 chips, changes nothing, and has learned that the step is ceremony.
  4. It is tier-gated and padlocked. Lite orgs see a lock icon on the entry and an upgrade card on the route. For them “structured” means “pay”, so they never form the habit.
  5. Three entry points, three vocabularies. “הדבקו טקסט אימון” (session popover), “הדבקת אימון” (matrix picker), “המרה לאימון מובנה” (text editor card, session row icon). Same pipeline, three names.
  6. The parse is a fork in the road, not a step on it. /dashboard/workouts/new swaps the whole route to PasteWorkoutView; the session row “structure” action replaces the workout in place and clears the freeform description on commit. Trying it feels irreversible (it isn’t entirely, but the UI says “Discard draft”).

5. The coach’s mental model vs. the product’s

Coach saysTaikan hasGap
”First I define activity types: hall, max people”Class types with default space, capacity, colourBuried under “הגדרת לוח הזמנים”; asks “which program?” and “deducts an entry?"
"Then I build the timetable”Sessions, templates, copy last weekFine
”Then I write content per type, weeks ahead”Programming matrix (class type × day), publishes immediatelyHidden as a view toggle; no month view; cannot type into it
”Click a day → pick type → Part 1: warm-up / strength / metcon / cooldown / finisher, free text each, add part 2…”Parts + section types (warmup, strength, conditioning, skill, main, cooldown, accessory) + sourceText per sectionOnly reachable through AI parse or the movement-level builder; the part-level editor does not exist
”It automatically becomes Sunday’s WOD”Matrix saves status: 'published'Already true on the matrix; session-sheet path adds a scope decision

The coach is not asking for less structure than the product has. He is asking for structure at the granularity he thinks in (parts), with free text inside, and no questions about the granularity he doesn’t (movements, shapes, prescriptions). His part names are CrossFit’s, and the platform is not a CrossFit-only product, so the lesson to take is the granularity (free text, with parts taken from the coach’s own heading lines) and not the vocabulary.

The complaining coach’s actual path

He wrote his workouts in the Workouts library (ספריית אימונים → New), not on the Schedule. That path explains every sentence of his message:

  • /dashboard/workouts/new opens a freeform editor with a title, a body, a scoring select, a time cap and a violet “המרה לאימון מובנה” card. Nothing on it mentions a class type or a day, so he met the full structured vocabulary (scoring, time cap, parts, movements) before anything connected the text to Sunday’s WOD.
  • After save, the workout page (WorkoutExecutionView) offers Back, Edit, Log result and View results. There is no “put this on a day” action anywhere on the library side. The sidebar’s “Workout Library” (nav.workouts) and the “Saved for reuse / Posted by day” tabs tell him this is a storage room, and the room has no exit to the calendar.
  • “השיוך” (“assignment”) is therefore a concept he was forced to discover on his own: go to Schedule, find the Programming toggle or open a session card, then pick the saved row from a list. Nine clicks across two sections, with the matrix never surfacing unless he happened to press the dumbbell icon. He did not find it. His proposal is a description of the matrix built from memory of what he wished existed.
  • The route /workouts/new/builder is not linked from anywhere; the structured builder is reached only through edit?mode=builder, “התאמה בבונה”, or the schedule popover’s “בונה מתקדם”. A coach who says “the builder is complex” most likely means the freeform editor plus the conversion card, which is the first thing the library shows a new coach.

Implication for the recommendations: P0.1 (one sidebar “אימונים” that opens the matrix, library demoted to a tab) is the fix for his exact complaint, and the saved workout page needs a “פרסום ליום” action until the library stops being the front door.

6. Recommendations — the agreed map

The first draft of this section moved the programming matrix under a new sidebar destination and left everything else in place. Built, that read as a relocation: the grid looked the same, the most-used writing path (the session sheet) was untouched, and the product had gained a fourth text editor and a third door to the parser. The map below replaces it. Its rule is one home per concept and one door per job, with what a coach sees derived from how the org is set up.

Two personas, derived not asked

Onboarding already records how the org trains (programs.deliveryMode: schedule, coaching, or both), and useOrgPrograms exposes hasScheduleMode / hasCoachingMode. Today only the sidebar’s לוח זמנים and ליווי entries read them. Every surface below does.

SurfaceClass studio (schedule only)Online coach (coaching only)Both
Sidebar · Trainingלוח זמנים · אימונים · תנועותליווי · אימונים · תנועותall four
אימונים pageתכנון (grid, default) · ספרייהספרייה only, no tabsתכנון · ספרייה
Settingsno Booking route (it lives in the schedule’s cog)no Booking; payment grace days under כלליas studio
”פרסום ליום” targetsclass typescohortsboth
Day sheet primary actionפרסוםהוספה לשבוע (draft)per board

Schedule = sessions

Who, when, where, how many. The view keeps week navigation, the expanded/condensed toggle, drafts and bulk publish, and the session sheet’s roster and check-in. The third “programming” toggle goes; the grid has one home (אימונים → תכנון). The old “הגדרת לוח הזמנים” dropdown mixed the weekly rhythm with set-once setup and splits in two:

  • השבוע — only this-week actions: copy last week’s timetable, apply a template, publish drafts.
  • ⚙ הגדרות — one sheet with three nested views, a rail on desktop and stacked on phones: סוגי פעילות (plan-quota deduction under “מתקדם”, no “parent program” dropdown), תבניות לוח זמנים (the saved weeks the timetable is built from) and מדיניות הרשמה (the whole of today’s Settings → Booking: cancellation window, late cancel, registration opens/closes, plan required to book, and the layered rules). Nothing else: spaces are org setup and stay in Settings.

The session sheet writes a workout in one move: one “אימון” button opens the shared day sheet in day scope; “לפעילות הזו בלבד” is a quiet link inside the sheet. The four-way “הוספת אימון” popover, the quick-create dialog, the scope segmented control and the row’s “structure” icon go.

אימונים = this week’s workouts, then the library

Real tabs (components/ui/tabs, like messages and programs): תכנון is the class-type × day grid, classes only; ספרייה is the saved list. The “פורסמו לפי יום” view is dropped; GET /workouts/posted and the daily_programming rows it reads stay, so the tracking can be built on later.

ליווי = the cohort board, unchanged

The board is already program × day with ordered sessions, drafts and publish-week, next to athletes and comments. It gains the shared day sheet behind its ”+” and its own “copy last week”. No class types, booking or timetable concepts appear on that path.

Shared between the two

  1. The day sheet. Text first, title defaulted from the day, saved workouts behind a collapsed toggle, one background parse per day, one chip. Same component on the grid, the session sheet and the cohort board; only the primary action and the scope hint differ.
  2. The saved workout page. “פרסום ליום” (targets follow the org) and the single door to the full editor.
  3. The library and the structure chip.

Plain text first; structure as optional, discipline-neutral enrichment

The product serves boxes, pilates and yoga studios, and functional gyms. The complaining coach’s proposal (a WOD-type dropdown, then “part 1: warm-up / strength / metcon / cooldown / finisher”) is a CrossFit day template and should not become the editor’s menu. What generalises is the shape of the interaction, not his vocabulary:

  • A day cell is a text area. Save publishes. A reformer coach writes “footwork, hundred, short spine, …” and is done; a box coach pastes the day.
  • No blocks. Parts already exist end to end (sections carry part, the parser splits a day into parts, members see them through the shared part renderer). The coach makes parts the way coaches already write a day: a heading on its own line. No built-in list of part names ships.
  • Parts and movements come from one call to the existing day-grain parser on the whole day’s text, in the background after save. The result is one quiet chip (“7 תנועות זוהו · 1 לבדיקה”) whose popover groups movements by part and opens the existing resolution choices. Confident matches attach silently and light up as demo links on the member whiteboard. No dialog, no wait, no gate; in a discipline the exercise library does not cover, the chip never appears. sourceText remains the rendering source.
  • The foreground parse (PasteWorkoutView, ?mode=translate, the “חלוקה לחלקים ולתרגילים” card) goes. The parser has no button.
  • Without workout_builder, no parse runs and no chip appears; the text box is the whole workout.

The full editor is an advanced option

Most coaches who meet the prescription builder are overwhelmed by it, so it is never the first thing shown. One door: “עריכה מפורטת” on an existing workout (saved-workout page, and the day sheet’s edit mode), opening /workouts/:id/edit?mode=builder. Never on a blank workout. Consequences: /workouts/new/builder (unlinked), the popover’s “בונה מתקדם” and the unused onBuildFromScratch prop are deleted; /schedule/sessions/:id/builder folds into the edit route, which already returns history-aware; cohort per-athlete exceptions and template cells keep the builder because they need per-movement prescriptions; the freeform editor’s “save for reuse” checkbox goes.

Entry points, before and after

BeforeAfter
Ways to type a workout3 editors (day sheet, quick-create dialog, library editor) behind a 4-way popover1 editor, 1 button per board
Ways to reach the parser3 named entries0 (background), 1 chip to review
Ways to reach the full editor3 live + 1 dead route1
”Copy last week”sessions (setup menu) and workouts (toolbar), same labeltimetable in השבוע, workouts in תכנון, named apart

Spotter

Keep the header pill for owners (CRM is its real job). On the grid, the only Spotter entry is a named week action (“השלמת הימים הריקים לפי שבוע שעבר”) with a preview before anything is written. Fix provider_invalid_request before adding any other entry point. Stop benchmarking Spotter against the builder: its honest comparison for single-day authoring is the textbox.

Instrumentation

Emit wod_post_completed from every path that writes a day, with entry (text / saved / structured) on it and on wod_published; until then the authoring funnel cannot be measured.

Rollout

  • workout-text-first-authoring, per org, default off, gates everything a coach sees change: the day sheet replacing the popover and quick-create, the chip, the אימונים tabs, the Booking move into the cog (flag-off keeps today’s Settings route). The old components are deleted when the flag reaches 100%; until then they stay reachable through flag-off.
  • Unflagged: hiding Booking for coaching-only orgs (restores intended behavior), the dead-route removals, the tab component fix, and collapsing the spaces and booking-policy-rules flags, both at 100% with no targeting.
  • Removal condition for the new flag: delete it and the old paths once the two pilot studios have each published two weeks through the sheet.

Arbox habit vs. product gap

The complaining owner comes from Arbox and runs a CrossFit-shaped studio; some of his ask is muscle memory he can be expected to unlearn (the WOD-type wizard, the fixed part list, resistance to writing once and placing on days). Three findings in this review are not his habit and hold for every discipline: the matrix day cell cannot take typed text; the library has no exit to the calendar after save; and of 10 orgs onboarded in 90 days, 4 published any programming while none started a post from paste or the builder. Fix those three for everyone, and let the “write once, place on days” model stand.

7. What to measure after

  • Funnel per org: cell opened → text saved → published → viewed by a member (wod_post_started → wod_post_completed → wod_published → member_workout_viewed), with entry on every event.
  • Share of published days that have ≥1 auto-resolved movement (structure acquired without coach effort).
  • Chip interactions on “לבדיקה” (do coaches ever confirm suggestions when it is optional?).
  • Time from onboarding_completed to first wod_published for new orgs; today 10 orgs onboarded in 90 days and 4 published anything.
  • Spotter: turns seeded from the matrix vs. from the header, and workouts written per seeded turn.

Appendix — surfaces referenced

SurfaceFile
Schedule page shell, three-view toggleapps/web/src/app/[lang]/(protected)/dashboard/schedule/schedule-screen.tsx, apps/web/src/components/overview/schedule/weekly-calendar.tsx
Programming matrixapps/web/src/components/overview/schedule/daily-programming-view.tsx
Matrix cell picker (paste + library, no textbox)apps/web/src/components/overview/programming/workout-picker-sheet.tsx
Session sheet, scope selector, workout rowsapps/web/src/components/overview/schedule/session-detail-sheet.tsx
Four-way add-workout popoverapps/web/src/components/overview/schedule/add-workout-popover.tsx
Quick freeform dialog / text editorapps/web/src/components/overview/schedule/quick-create-workout-dialog.tsx, apps/web/src/components/overview/workouts/workout-builder/components/builder-text-editor.tsx
Timetable menu holding class typesapps/web/src/components/overview/schedule/setup-timetable-menu.tsx
Parse input and review dialogapps/web/src/components/overview/workouts/paste-workout/paste-input.tsx, structure-review-dialog.tsx
Structured builderapps/web/src/components/overview/workouts/workout-builder.tsx and workout-builder/components/*
Cohorts list and program pageapps/web/src/app/[lang]/(protected)/dashboard/coaching/page.tsx, apps/web/src/app/[lang]/(protected)/dashboard/programs/[id]/page.tsx
Cohort board and session sheetapps/web/src/components/overview/programming/program-board.tsx, program-session-sheet.tsx
Spotter launcher, suggestions, week actionapps/web/src/components/agent/agent-launcher.tsx, suggested-prompts.tsx, apps/web/src/hooks/use-programming-week-actions.ts
Copylibs/shared/src/lib/i18n/dictionaries/{en,he}.json — schedule.session.*, workouts.parse.*, programmingBoard.*, agent.*