A1: Login
Step-by-step walkthrough for A1 (Login) on route `/auth` in the Nervly console.
A10: Google OAuth
Walkthrough for A10 (Google OAuth) on route `/auth`: marked gated (GOOGLE_CLIENT_ID unset in docker-compose.yml environment; OAuth handshake fails upstream.).
A2: MFA challenge at login
Walkthrough for A2 (MFA challenge at login) on route `/auth`: marked gated (Requires an account with MFA enabled; no MFA-enrolled user is seeded in dev_seed.sql.).
A3: Signup
Step-by-step walkthrough for A3 (Signup) on route `/auth?mode=signup` in the Nervly console.
A4: Email-code (OTP) verification
Walkthrough for A4 (Email-code (OTP) verification) on route `/auth?mode=otp&email=…`: marked gated (Verification code only exists in emailed payload/NATS notify.>; without INTERNAL_API_KEY the mailer is nil and the code is unrecoverable (HMAC-hashed in Redis).).
A5: Link verification
Walkthrough for A5 (Link verification) on route `/auth?mode=verify&token=…`: marked gated (Verification token only exists in email/NATS; mailer is nil without INTERNAL_API_KEY and `${FRONTEND_URL}/verify-email` has no SPA route.).
A6: Resend verification (link or code)
Step-by-step walkthrough for A6 (Resend verification (link or code)) on route `/auth` modes otp/verify in the Nervly console.
A7: Password reset request
Step-by-step walkthrough for A7 (Password reset request) on route `/auth?mode=reset` in the Nervly console.
A8: Password reset confirm
Walkthrough for A8 (Password reset confirm) on route `/auth?mode=reset-confirm`: marked gated (Reset token only exists in emailed payload/NATS notify.>; without INTERNAL_API_KEY the mailer is nil and token is unrecoverable.).
A9: Invite accept (new member)
Step-by-step walkthrough for A9 (Invite accept (new member)) on route `/auth?mode=invite&token=…` or `?invite=` in the Nervly console.
An1: Date-range window (From/To)
Step-by-step walkthrough for An1 (Date-range window (From/To)) on route `/analytics` in the Nervly console.
An2: Delivery funnel + by-event/channel/provider slices
Step-by-step walkthrough for An2 (Delivery funnel + by-event/channel/provider slices) on route `/analytics` in the Nervly console.
An3: Vendor latency (p50/p99)
Step-by-step walkthrough for An3 (Vendor latency (p50/p99)) on route `/analytics` in the Nervly console.
Au1: Segment list + selection
Step-by-step walkthrough for Au1 (Segment list + selection) on route `/audiences` in the Nervly console.
Au10: CSV audience import
Step-by-step walkthrough for Au10 (CSV audience import) on route `/audiences` in the Nervly console.
Au11: Cohorts by lens
Step-by-step walkthrough for Au11 (Cohorts by lens) on route `/audiences` in the Nervly console.
Au2: Create segment
Step-by-step walkthrough for Au2 (Create segment) on route `/audiences` in the Nervly console.
Au3: Predicate builder: preference/suppression/erasure/recency/delivery, match all/any
Step-by-step walkthrough for Au3 (Predicate builder: preference/suppression/erasure/recency/delivery, match all/any) on route `/audiences` in the Nervly console.
Au4: Save segment
Step-by-step walkthrough for Au4 (Save segment) on route `/audiences` in the Nervly console.
Au5: Refresh membership
Step-by-step walkthrough for Au5 (Refresh membership) on route `/audiences` in the Nervly console.
Au6: Export segment CSV
Step-by-step walkthrough for Au6 (Export segment CSV) on route `/audiences` in the Nervly console.
Au7: Delete segment
Step-by-step walkthrough for Au7 (Delete segment) on route `/audiences` in the Nervly console.
Au8: Members list with state labels
Step-by-step walkthrough for Au8 (Members list with state labels) on route `/audiences` in the Nervly console.
Au9: Batch entry: send segment to a published journey
Step-by-step walkthrough for Au9 (Batch entry: send segment to a published journey) on route `/audiences` in the Nervly console.
C1: CLI login — signed-out redirect
Step-by-step walkthrough for C1 (CLI login — signed-out redirect) on route `/cli?user_code=…` in the Nervly console.
C2: CLI login — approve device code
Step-by-step walkthrough for C2 (CLI login — approve device code) on route `/cli?user_code=…` in the Nervly console.
Co1: DND hits (window select, deep link to Messages)
Step-by-step walkthrough for Co1 (DND hits (window select, deep link to Messages)) on route `/compliance` in the Nervly console.
Co2: Consent state table
Step-by-step walkthrough for Co2 (Consent state table) on route `/compliance` in the Nervly console.
Co3: Residency map
Step-by-step walkthrough for Co3 (Residency map) on route `/compliance` in the Nervly console.
Co4: Compliance export CSV/JSON (admin)
Step-by-step walkthrough for Co4 (Compliance export CSV/JSON (admin)) on route `/compliance` in the Nervly console.
Co5: Global opt-out manager apply/remove
Step-by-step walkthrough for Co5 (Global opt-out manager apply/remove) on route `/compliance` in the Nervly console.
Co6: Non-admin refusal copy
Walkthrough for Co6 (Non-admin refusal copy) on route `/compliance`: marked gated (Refusal copy renders only for member/analyst role; seeded login dev@nervly.local is workspace owner (admin role).).
D1: Key list + All/Live/Test filters
Step-by-step walkthrough for D1 (Key list + All/Live/Test filters) on route `/developers` in the Nervly console.
D2: Create key modal (name, Live/Test, Read & write/Read only)
Step-by-step walkthrough for D2 (Create key modal (name, Live/Test, Read & write/Read only)) on route `/developers` in the Nervly console.
D3: Reveal-once token + copy + test-key caveat
Step-by-step walkthrough for D3 (Reveal-once token + copy + test-key caveat) on route `/developers` in the Nervly console.
D4: Rotate key (overlap window)
Step-by-step walkthrough for D4 (Rotate key (overlap window)) on route `/developers` in the Nervly console.
D5: Promote rotation
Step-by-step walkthrough for D5 (Promote rotation) on route `/developers` in the Nervly console.
D6: Revoke key
Step-by-step walkthrough for D6 (Revoke key) on route `/developers` in the Nervly console.
D7: Quickstart snippets (cURL/Node/Go) + telephony normalisation
Step-by-step walkthrough for D7 (Quickstart snippets (cURL/Node/Go) + telephony normalisation) on route `/developers` in the Nervly console.
D8: Empty key state
Step-by-step walkthrough for D8 (Empty key state) on route `/developers` in the Nervly console.
G1: Sidebar navigation to all 11 console routes
Step-by-step walkthrough for G1 (Sidebar navigation to all 11 console routes) on route any in the Nervly console.
G2: Command palette (⌘K / topbar search): fuzzy navigation, actions, AI intents
Step-by-step walkthrough for G2 (Command palette (⌘K / topbar search): fuzzy navigation, actions, AI intents) on route any in the Nervly console.
G3: Quick-create dropdown
Step-by-step walkthrough for G3 (Quick-create dropdown) on route any in the Nervly console.
G4: Help menu, audio toggle, user menu, logout
Step-by-step walkthrough for G4 (Help menu, audio toggle, user menu, logout) on route any in the Nervly console.
G5: Workspace warning banners (suspended / past-due)
Walkthrough for G5 (Workspace warning banners (suspended / past-due)) on route any: marked unreachable (Renders only when workspace.status === "suspended" or subscription_status === "past_due"; seed workspaces are active with no past-due subscription.).
G6: Offline notice + offline mutation guard
Step-by-step walkthrough for G6 (Offline notice + offline mutation guard) on route any in the Nervly console.
G7: PWA install prompt
Walkthrough for G7 (PWA install prompt) on route any: marked unreachable (Renders when Chromium fires beforeinstallprompt event and app is not installed/dismissed; not triggered in headless test environment.).
G8: Global message drawer (opened from Overview/Messages rows)
Step-by-step walkthrough for G8 (Global message drawer (opened from Overview/Messages rows)) on route any in the Nervly console.
J1: Journey list + selection (auto-selects first)
Step-by-step walkthrough for J1 (Journey list + selection (auto-selects first)) on route `/journeys` in the Nervly console.
J10: Free-plan authoring gate
Walkthrough for J10 (Free-plan authoring gate) on route `/journeys`: marked unreachable (Renders disabled inputs and warning note when workspace plan === "free"; seed workspaces have growth and beta plans.).
J2: Create journey
Step-by-step walkthrough for J2 (Create journey) on route `/journeys` in the Nervly console.
J3: Builder header + journey-level sender panel
Step-by-step walkthrough for J3 (Builder header + journey-level sender panel) on route `/journeys` in the Nervly console.
J4: Graph editing: send/wait/branch/exit nodes
Step-by-step walkthrough for J4 (Graph editing: send/wait/branch/exit nodes) on route `/journeys` in the Nervly console.
J5: Save draft
Step-by-step walkthrough for J5 (Save draft) on route `/journeys` in the Nervly console.
J6: Publish (draft persisted first, then validated)
Step-by-step walkthrough for J6 (Publish (draft persisted first, then validated)) on route `/journeys` in the Nervly console.
J7: Pause / Resume
Step-by-step walkthrough for J7 (Pause / Resume) on route `/journeys` in the Nervly console.
J8: View runs + run-step detail
Step-by-step walkthrough for J8 (View runs + run-step detail) on route `/journeys` in the Nervly console.
J9: Delete journey
Step-by-step walkthrough for J9 (Delete journey) on route `/journeys` in the Nervly console.
M1: Status tabs (ALL/DELIVERED/SENT/QUEUED/TRIGGERED/FAILED/SUPPRESSED)
Step-by-step walkthrough for M1 (Status tabs (ALL/DELIVERED/SENT/QUEUED/TRIGGERED/FAILED/SUPPRESSED)) on route `/messages` in the Nervly console.
M10: Empty + error states
Step-by-step walkthrough for M10 (Empty + error states) on route `/messages` in the Nervly console.
M2: Channel filter (all/sms/email/push/whatsapp/voice)
Step-by-step walkthrough for M2 (Channel filter (all/sms/email/push/whatsapp/voice)) on route `/messages` in the Nervly console.
M3: Time window (all/24h/7d/30d)
Step-by-step walkthrough for M3 (Time window (all/24h/7d/30d)) on route `/messages` in the Nervly console.
M4: Subscriber search + clear
Step-by-step walkthrough for M4 (Subscriber search + clear) on route `/messages` in the Nervly console.
M5: Live ingest stream toggle (3 s cursor poll)
Step-by-step walkthrough for M5 (Live ingest stream toggle (3 s cursor poll)) on route `/messages` in the Nervly console.
M6: Refresh button
Step-by-step walkthrough for M6 (Refresh button) on route `/messages` in the Nervly console.
M7: Cursor pagination
Step-by-step walkthrough for M7 (Cursor pagination) on route `/messages` in the Nervly console.
M8: Message detail drawer: timeline/overview/payload, copy ids, refresh
Step-by-step walkthrough for M8 (Message detail drawer: timeline/overview/payload, copy ids, refresh) on route `/messages` in the Nervly console.
M9: URL-driven filters (deep links from Compliance/AI intents)
Step-by-step walkthrough for M9 (URL-driven filters (deep links from Compliance/AI intents)) on route `/messages?status=SUPPRESSED&channel=…&subscriber_id=…` in the Nervly console.
O1: Stat cards + volume/spend charts + channel/provider breakdowns
Step-by-step walkthrough for O1 (Stat cards + volume/spend charts + channel/provider breakdowns) on route `/` in the Nervly console.
O2: Refresh telemetry
Step-by-step walkthrough for O2 (Refresh telemetry) on route `/` in the Nervly console.
O3: Recent ingested messages table (top 6)
Step-by-step walkthrough for O3 (Recent ingested messages table (top 6)) on route `/` in the Nervly console.
O4: 403 Forbidden analytics state
Walkthrough for O4 (403 Forbidden analytics state) on route `/`: marked unreachable (Renders only when /console/overview returns 403; server RBAC allows all roles and seed has owners only.).
P1: Provider grid + channel filters
Step-by-step walkthrough for P1 (Provider grid + channel filters) on route `/providers` in the Nervly console.
P10: Slack notification sink: save webhook/token, remove, send test
Step-by-step walkthrough for P10 (Slack notification sink: save webhook/token, remove, send test) on route `/providers` in the Nervly console.
P11: Sender readiness banner + per-card sender section
Step-by-step walkthrough for P11 (Sender readiness banner + per-card sender section) on route `/providers` in the Nervly console.
P12: Add sender 3-step dialog (value → how to verify → verify/poll)
Step-by-step walkthrough for P12 (Add sender 3-step dialog (value → how to verify → verify/poll)) on route `/providers` in the Nervly console.
P13: Sender recheck / shared-identity edit / remove binding
Step-by-step walkthrough for P13 (Sender recheck / shared-identity edit / remove binding) on route `/providers` in the Nervly console.
P14: Import discoverable senders
Walkthrough for P14 (Import discoverable senders) on route `/providers`: marked gated (Requires live provider credentials; discoverable sender import queries the real upstream provider account.).
P15: Webhook signing secret set/rotate/clear
Step-by-step walkthrough for P15 (Webhook signing secret set/rotate/clear) on route `/providers` in the Nervly console.
P16: Provider version history rail
Step-by-step walkthrough for P16 (Provider version history rail) on route `/providers` in the Nervly console.
P2: Enable/disable provider (+ undo)
Step-by-step walkthrough for P2 (Enable/disable provider (+ undo)) on route `/providers` in the Nervly console.
P3: Failover priority stepper
Step-by-step walkthrough for P3 (Failover priority stepper) on route `/providers` in the Nervly console.
P4: Test Connection
Walkthrough for P4 (Test Connection) on route `/providers`: marked gated (Requires live provider credentials; test connection makes a real upstream call with fake credentials, failing with 422.).
P5: Delete provider credentials (+ undo)
Step-by-step walkthrough for P5 (Delete provider credentials (+ undo)) on route `/providers` in the Nervly console.
P6: Connect provider modal
Walkthrough for P6 (Connect provider modal) on route `/providers`: marked gated (Requires live provider credentials; POST /console/providers/validate calls the real upstream provider before persisting.).
P7: Delivery mode selector
Step-by-step walkthrough for P7 (Delivery mode selector) on route `/providers` in the Nervly console.
P8: Platform child accounts + provisioning legend + request isolation
Walkthrough for P8 (Platform child accounts + provisioning legend + request isolation) on route `/providers`: marked unreachable (Platform delivery mode is not enabled in this deployment (DELIVERY_MODE defaults to byo); native-child accounts are not provisioned.).
P9: Platform path composer
Walkthrough for P9 (Platform path composer) on route `/providers`: marked gated (Refused locally with platform_delivery_unavailable because effective delivery mode is BYO only.).
R1: Pipeline canvas + node context rail
Step-by-step walkthrough for R1 (Pipeline canvas + node context rail) on route `/routing` in the Nervly console.
R2: Channel priority cascade reorder
Step-by-step walkthrough for R2 (Channel priority cascade reorder) on route `/routing` in the Nervly console.
R3: Workspace version history + rollback
Step-by-step walkthrough for R3 (Workspace version history + rollback) on route `/routing` in the Nervly console.
R4: Inline carrier credential + failover rank edit
Step-by-step walkthrough for R4 (Inline carrier credential + failover rank edit) on route `/routing` in the Nervly console.
R5: Empty providers state
Step-by-step walkthrough for R5 (Empty providers state) on route `/routing` in the Nervly console.
S1: Tabs + URL param (?tab=general|members|channels|security|billing)
Step-by-step walkthrough for S1 (Tabs + URL param (?tab=general|members|channels|security|billing)) on route /settings in the Nervly console.
S10: MFA enroll → activate → recovery codes → disable
Step-by-step walkthrough for S10 (MFA enroll → activate → recovery codes → disable) on route `/settings?tab=security` in the Nervly console.
S11: Billing owner view: subscription card, usage meter, invoice history, invoice artifacts
Step-by-step walkthrough for S11 (Billing owner view: subscription card, usage meter, invoice history, invoice artifacts) on route `/settings?tab=billing` in the Nervly console.
S12: Cancel subscription / Subscribe
Walkthrough for S12 (Cancel subscription / Subscribe) on route `/settings?tab=billing`: marked gated (Requires live Paystack credentials; mutations call real Paystack API and fail locally with dummy key.).
S13: Billing restricted (non-owner)
Walkthrough for S13 (Billing restricted (non-owner)) on route `/settings?tab=billing`: marked gated (Owner-only panel renders only for non-owner users; seeded login is workspace owner.).
S14: Export account data
Step-by-step walkthrough for S14 (Export account data) on route `/settings` (danger zone) in the Nervly console.
S15: Delete workspace modal
Step-by-step walkthrough for S15 (Delete workspace modal) on route `/settings` in the Nervly console.
S16: Delete own account modal
Step-by-step walkthrough for S16 (Delete own account modal) on route `/settings` in the Nervly console.
S2: General profile save (name/slug)
Step-by-step walkthrough for S2 (General profile save (name/slug)) on route `/settings?tab=general` in the Nervly console.
S3: Workspace ID copy + plan/rate-limit facts
Step-by-step walkthrough for S3 (Workspace ID copy + plan/rate-limit facts) on route `/settings?tab=general` in the Nervly console.
S4: Members table + role change
Step-by-step walkthrough for S4 (Members table + role change) on route `/settings?tab=members` in the Nervly console.
S5: Invite member modal + created token view
Step-by-step walkthrough for S5 (Invite member modal + created token view) on route `/settings?tab=members` in the Nervly console.
S6: Revoke invite modal
Step-by-step walkthrough for S6 (Revoke invite modal) on route `/settings?tab=members` in the Nervly console.
S7: Remove member modal
Step-by-step walkthrough for S7 (Remove member modal) on route `/settings?tab=members` in the Nervly console.
S8: Last-owner refusal
Step-by-step walkthrough for S8 (Last-owner refusal) on route `/settings?tab=members` in the Nervly console.
S9: Channel priority reorder (channels tab)
Step-by-step walkthrough for S9 (Channel priority reorder (channels tab)) on route `/settings?tab=channels` in the Nervly console.
T1: Template list, channel filter, search
Step-by-step walkthrough for T1 (Template list, channel filter, search) on route `/templates` in the Nervly console.
T2: Create template modal
Step-by-step walkthrough for T2 (Create template modal) on route `/templates` in the Nervly console.
T3: Edit modal: copy edit, inline diff, save
Step-by-step walkthrough for T3 (Edit modal: copy edit, inline diff, save) on route `/templates` in the Nervly console.
T4: Preview render with sample variables
Step-by-step walkthrough for T4 (Preview render with sample variables) on route `/templates` in the Nervly console.
T5: Delete confirmation
Step-by-step walkthrough for T5 (Delete confirmation) on route `/templates` in the Nervly console.
T6: Template version history + rollback
Step-by-step walkthrough for T6 (Template version history + rollback) on route `/templates` in the Nervly console.
T7: Draft-from-palette deep link
Step-by-step walkthrough for T7 (Draft-from-palette deep link) on route `/templates?draft=…&channel=…` in the Nervly console.
T8: Analyst (member) hidden controls
Walkthrough for T8 (Analyst (member) hidden controls) on route `/templates`: marked gated (Template mutation controls hidden only for analyst (member) role; seeded login dev@nervly.local is workspace owner (admin role).).