Every entry channel, every email that fires (with its real subject and link), and every onboarding screen — in the order they actually happen. Read straight from the code, not the roadmap.
A person lands, signs in, and — if they're new — walks a five-step wizard while a context pipeline runs in the background. Two transactional emails bracket that (welcome at sign-up, context-ready when the pipeline finishes), and a day-based cadence follows.
There is one convergence point. Whether someone signs in with Google, email/password, or enterprise SSO, the very first server write is the same, and it's what kicks the whole funnel off.
Every new Firebase Auth user (Google, email/password, or a workos_<id> account
minted by the SSO callback) fires functions/src/authOnboardingBridge.ts. It writes
users/{uid} with status:"created", onboardingStep:1,
creditBalance:50. That single create fans out to two triggers:
| Trigger A | onboardingInitializer.ts — seeds credits + a user_profiles/{uid} doc and creates context_pipelines/{uid} (status:"queued"). This is what the wizard's first step watches. |
| Trigger B | onboardingSequencePersonalizer.ts — classifies intent (Vertex AI) and schedules the email cadence. Which ladder depends on whether signupChannel is set. |
signupChannel from the entry domain
(persistSignupMetadata → domainToChannelId); inbound-email first-touch stamps
signupChannel:"direct_email". A plain Google/email sign-up has no channel — which routes it
down the legacy 5-email ladder instead of the per-domain cadence (see below).Two emails are triggered by status transitions on users/{uid}
(emailTriggers.ts → emailOnUserUpdate). The rest are a day-based cadence scheduled at sign-up.
Every subject and link below is verbatim from the template source. Brand base:
platformUrl = https://aaas.love.
| Fires when | Subject (verbatim) | Primary link | Template | |
|---|---|---|---|---|
welcome |
status → created (no signupChannel) | Welcome, ${firstName} — your agents are one email away | “Open the dashboard” → aaas.love/dashboard |
welcome.ts |
welcome_per_domain |
status → created (+ signupChannel) | per-channel (12 aaas-* variants via routeWelcomeForChannel) |
per-channel builder | welcome/channel-router.ts |
context_ready |
status → context_ready | Your context package for ${domain} is ready | “Download Context Package” → packageUrl ?? /dashboard |
context-ready.ts |
context_engine_explainer |
deep-context close-out | Your context engine is online, ${firstName} | “See all 12 surfaces →” → aaas.love/select |
context-engine-explainer.ts |
first_task |
first agent_tasks write (day-0 cadence) | Send your first prompt to ${agentName} | “Send my prompt →” → mailto:${agentEmail} |
first-task.ts |
three_new_agents |
cadence · day 2 | Three new agents joined your supervisor | “Browse the full catalog →” → catalogUrl |
three-new-agents.ts |
new_agent_solutions |
cadence · day 5 | New solution available — ${periodLabel} | “See everything new →” → seeAllUrl |
new-agent-solutions.ts |
architecture_brief |
cadence · day 7 (enterprise / sso only) | ${industry} agent stack — briefed for ${companyName} | “Get the full brief →” + “Book a 30-min call →” (calendar.app.google/…) |
architecture-brief.ts |
legacy onboarding_sequence 1–5 |
no signupChannel days 0/2/4/7/14 | e.g. “Welcome to AaaS — your AI workforce is being assembled” · “The one agent ${firstName} should try first” · … | “Open Skill Vault” → aaas.love/vault |
onboarding-sequence.ts |
Every send passes an opt-out check
(email-preferences-guard.ts): global emailOptIn, then a per-category flag
(defaults to send). Two examples below are rendered straight from the template code — this is exactly what lands in the inbox.
render → HTML script so emails are reviewable.Shown by AuthGate whenever onboardingStep < done. The steps are
context → agents → first_task → vault → welcome; the parent persists the step index after each
advance. Step 1 watches the context pipeline; steps 2–4 read what that pipeline produced.
Seed the business context every agent and dashboard reads. In the platform build this animates a live pipeline checklist; in the Canvas port it captures goal, company, mission, one-liner and ICP.
| Reads | onSnapshot(context_pipelines/{uid}) — status + per-step status |
| Writes | the intake + context datapoints (goal / company / mission / one-liner / ICP) |
| Advance | auto when the pipeline completes (or “Continue anyway” after a stall) |
Pick the specialist you'll hand your first task to. Cards come from the context pipeline's suggestions — with a static fallback when it hasn't produced any (which, today, it usually hasn't).
| Reads | context_pipelines.suggestedAgents → fallback list |
| Writes | favoriteAgents on the star toggle; selection held client-side |
| Advance | manual — “Continue with this agent” |
A pre-written brief for the chosen agent, with copy-to-clipboard and open-in-email.
| Writes | nothing server-side — purely a client mailto: / clipboard |
| Advance | manual — any of three buttons; sending is never verified |
agent_tasks doc — so the day-0 first_task cadence email (which fires on the first real
agent_tasks write) will not trigger from finishing this step alone.A short tour of the skill vault plus up to five recommended skills matched to context.
| Reads | context_pipelines.recommendedSkills (this field is populated for business emails) |
| Advance | manual — “Start using AaaS” |
“You're all set” — a celebration with quick actions. Finishing writes the done step and reloads into the dashboard.
| Writes | onboardingStep = DONE · platform done = 5; the Canvas gate exits at < 6, so completion writes 6 |
| Advance | “Enter Dashboard” → finishOnboarding() → reload |
ONBOARDING_DONE_STEP is 5, but the vendored
Canvas gate keeps the wizard open while onboardingStep < 6. Completion therefore writes 6 —
the only value that satisfies both. Writing 5 would trap a Canvas user in the wizard forever.Onboarding and the app share one route — /select, gated by AuthGate.
Once onboardingStep clears the threshold, the same gate renders the Canvas shell instead of the wizard.
These are the surfaces a member lands in.
/delivery-funnel pageThe live aaas-design.web.app/delivery-funnel page describes a 10-stage pipeline — but much of it predates the current onboarding and has drifted from the code. These are the substantive gaps to close before that page is overwritten with this one.
Agents are emailed at {agent-id}@aaas.select; a “Challenge Invite” template, no sign-up.
Handles are <handle>@aaas.name; the real first email is welcome.ts (“your agents are one email away”). No “ChallengeInviteTemplate” exists.
Execution runs on Agent Zero dispatched to GCE VMs (A0 → VM → callback).
Agent Zero LLM-routing was retired 2026-05-21; AI is direct gemini-2.5-flash. The A0/VM stages are legacy.
Delivery lives at aaas-canvas.web.app/#/portal/{id} and /#/zui/{id}.
The one Canvas is aaas-canvas-live.web.app (+ the platform /select Canvas 2.0). ZUI is a dashboard kind inside the Canvas, not a separate portal route.
Nothing about a step-by-step onboarding wizard, the status-transition emails, the cadence ladder, context_pipelines, or onboardingStep.
The entire current onboarding — the 5-step wizard + the email ladder documented above — is missing from that page. This is the biggest gap.
Five fixed personas (developer / researcher / executive / agent-builder / enterprise) drive all comms.
Email routing keys off signupChannel + Vertex intent classification, not those five persona labels. The persona idea survives only loosely.
A quick end-to-end pass. Tick each; if the “expect” doesn't happen, that's the bug.
aaas.love.the “I am a …” radial hero and a Login button are visible./select — either the wizard (new user) or the Canvas (returning).@aaas.name, a working “Open the dashboard” link.Front-end smoke test only. The agent just clicks and checks what appears — no login, no typing beyond the wizard fields, no back-end. Use the public Canvas showcase so nothing is gated.
https://aaas-canvas-live.web.app · Goal: confirm the
onboarding wizard and the main dashboards render and advance. Report pass/fail per step.https://aaas-canvas-live.web.app.a page titled “Fleet — public showcase” with a grid of dashboard cards.#personal/onboarding and press Enter.the onboarding wizard appears, showing “Step 1 of 5 · Context”.step N — PASS/FAIL — what you saw.