Concept · v1 · 2026-09-25 · Activation & onboarding · in the shell · tagged

The workspace first-run, in the shell, and counted

What a Team pick hands off to: create the workspace, say who is in it, one welcome frame, then the Overview where your agent sets the workspace up with you, sample relays fill the empty state, and the Get-started card leads with the first Code. It is one document in the responsive shell, shown here at desktop and at 390px. Every control carries a tag; the Measure drawer on the desktop frame shows what fires, whether consent let it through, and which server stamp is the record. Nothing on this page invents a tag manager: it follows the one telemetry path the app already has.

Drawn, not built · proposal One document · two frames Tagged · data-track Consent-gated · relay_consent Follows the gate-denied precedent
Desktop · rail docked · the workspace preview in a sticky aside · Measure drawer open ≥ 861px
390 × 844 · rail folded (☰) · Get-started and plan state in the drawer · action fixed in the bottom third

Drive the left frame: type a name and watch the handle, the rail chip and the aside fill; claim the domain; reach the Overview; answer the agent; bring context; remove the samples. Each act lands in the drawer with its disposition. Flip the consent switch above to see unknown queue and denied drop. Open the document directly at /concepts/shell-responsive-v1/workspace-first-run.html?measure=1; the plan-pick intake carries the same kit at /concepts/shell-responsive-v1/plan-pick.html?measure=1.

Tags are names for questions

A tag earns its place by answering a question on the funnel read. Client events are best-effort and consent-gated; the server stamps are the record, so any metric that can only be read client-side is a metric the product does not have. Names are stable ids of the form onboarding.<stage>.<action>; props are enums and integers, never free text and never an address, a name or a handle (the kit refuses those keys).

EventFires onPropsServer recordGA4 (server-side)Answers
onboarding.intake.vieweach intake screen renderstep · index · of · arrival · plane— client onlyfunnel_intake_viewdrop-off per question; time on step
onboarding.intake.answeran option or chipstep · optionthe intake row (persisted answer) drawnfunnel_intake_answeranswer distributions; which goal, which size band, which clients
onboarding.intake.backBackstep——where people reconsider
onboarding.intake.continue · .doneContinue on a multi-select; "Go to Overview"step · count · plan——how many chips before people move on; who reaches the end
onboarding.plan.skipSkip on any screensteponboarding_plan_picked_at (picked=skip) drawnfunnel_plan_pickedSkip rate, and at which step
onboarding.plan.pickthe plan screen's primary or "Free instead"plan · recommended · accepted · arrival · seatsonboarding_plan_picked_at drawnfunnel_plan_pickedpick rate; recommendation acceptance; paid pick; gated-Team intent
onboarding.plan.alternativean alternative cardfrom · plan——which alternatives get considered
onboarding.plan.join · .seatsan invitee's Join; the seat stepperplan · dir——invitee completion; how often the seat prefill is changed, and which way
onboarding.receive.firstthe first Code receivedarrivalonboarding_step2_at builtfunnel_first_claim builttime to first receive — the guard
onboarding.workspace.vieweach first-run screen renderstep · plane—funnel_workspace_viewdrop-off between create, members, overview
onboarding.workspace.fieldname, handle, logo, region changefield · valid · reason · option——handle collisions; region split; logo adoption
onboarding.workspace.createContinue on the create stepplane · region · has_logo · handle_lenworkspace_created_at drawnfunnel_workspace_createdworkspace-created rate after a Team pick
onboarding.members.autojoinclaim / release the domainactiondomain_claimed_at drawnfunnel_domain_claimedautojoin adoption
onboarding.members.invitean invite addedcountonboarding_step4_at builtfunnel_first_invite builtinvite rate by method; addresses never leave the page
onboarding.members.skip · .continuethe members step's actionsautojoin · invites——how many create with nobody in it
onboarding.workspace.view (step=welcome) · onboarding.welcome.openthe welcome frame; "open now"step——whether anyone waits the 1.6 s
onboarding.setup.correctedit / save the pre-filled descriptionaction——how often the public-data pre-fill is wrong
onboarding.setup.answerthe agent's question answeredq · option (free_text for typed)the intake row drawnfunnel_setup_answerwhere teams come from; "starting fresh" share
onboarding.data.methodpaste · file · describemethodfirst send, when it seals builtfunnel_first_send builtwhich import path works
onboarding.sample.purgeRemove samples———whether samples help or annoy
onboarding.checklist.itema Get-started itemitem · donethe item's own signal built for receive · invite—checklist completion by item
onboarding.plan.actionKeep · Re-size in the railaction—funnel_plan_actiontrial-state actions; re-size demand

Follow the gate-denied precedent

The app has one telemetry path today: a refused surface posts a small PII-free record to a first-party endpoint, the server logs a funnel stage and forwards it to GA4 through the Measurement Protocol, and a consent script decides whether GTM loads at all. This plan is that path with more event names, not a second system.

1 · data-tracka stable name on the control; props as data-track-* attributes drawn
2 · track kitbinds clicks and views; PII guard; consent gate from relay_consent: unknown queues, denied drops, granted sends and flushes drawn
3 · POST /api/user/v1/telemetrybatched, PII-free, 202 always — the shape of gate-denied drawn
4 · funnel.stage[funnel] event.<name> log line + first-time stamps for the events that are the record built
5 · GA4 server-sideMeasurement Protocol, salted client id, never in the redirect path built
6 · dataLayer mirroronly when GTM loaded post-consent; never the record consent script built

Rules the kit enforces

  • Names are ids, never copy; renaming a button never renames an event.
  • Props are enums and integers; a PII guard drops keys named email, name, handle, phone, address, ip.
  • Disabled controls never fire; a control fires once per click, no double-count on re-render.
  • Consent unknown queues in memory only; denied drops and empties the queue; granted flushes.
  • Best-effort everywhere: telemetry never surfaces to the user and never blocks a flow.

What the board reads

  • Pick rate — explicit picks ÷ activations, split Free-by-choice vs Skip.
  • Recommendation acceptance — picked the recommended plan ÷ shown.
  • Paid pick at activation; gated-Team intent while self-serve is off.
  • Workspace-created rate after a Team pick; invite rate by method.
  • Checklist completion by item; sample purge rate.
  • Guard: time to first receive, before and after — the metric the intake must not move.

Where it sits

  • The plan is picked before the workspace is created — a workspace is never created onto a plan nobody chose. This flow starts where the plan-pick intake's Team pick ends.
  • Create and members are two steps in the content area with the rail present; the workspace preview in the aside is the same live-assembling panel the intake uses.
  • The Overview after the welcome frame is the product's real Overview: the agent panel, sample relays, the first Code and the Get-started card are cards in it, not a wizard over it.
  • Phone: the rail folds; the Get-started card and the plan state live in the drawer; the action bar is fixed in the bottom third.

Built · drawn

  • built tenancy, handle validation with reserved words, residency on the org (fail closed), domain autojoin end to end, email invites, the first-Code seed, funnel stamps for connect · first receive · first send · first invite, GA4 server-side, the consent script.
  • drawn the composed create and members screens, the welcome frame, the agent-led setup panel and its public-data pre-fill, sample relays with a purge, the Get-started card as a shell element with server signals, the plan-state rail footer, the track kit, the telemetry endpoint, the drawn stamps (plan picked, workspace created, domain claimed).

Record

concepts/onboarding-workspace-first-run-v1.html · clean URL /concepts/workspace-first-run Open the document ← All concepts