Skip to content

Goal: Tenant Onboarding Milestones (NUX)

Lifecycle: Completed — merged to arda-frontend-app main 15–16 October 2026.

Give a new tenant a reason to reach real value in its first session instead of landing on an empty grid: an in-app onboarding guide with a single goal — 25 items — and a free starter kit earned at the goal. Record the tenant’s progress as milestones (observed facts such as “added first item via scan”, each stamped with when and by whom) so that customer success can see where a trial stalled without asking, and so the guide can decide what to show from durable state rather than from the browser.

  • As a new tenant, I want a guided path to my first 25 items with a free starter kit as the reward, so that I reach real value in my first session instead of an empty grid.
  • As a customer-success operator, I want the tenant’s onboarding progress recorded as durable milestones, so that I can see where a trial stalled without asking them.
RepositoryRoleChanges
arda-frontend-appGuide UI, onboarding provider, and the BFF package that owns milestone writesNew @arda-cards/bff/onboarding package (/bff/onboarding/*); every item create routed through the BFF; onboarding provider and hooks; guide, header meter, kit fulfilment; mock handlers and scenario picker
accounts-componentStores the milestonesNo change — V1 uses the existing free-form Tenant.settings blob. The dedicated module is the graduation path (see the specification)
documentationThis project directoryGoal, as-built specification, atlas
  1. A tenant short of 25 items sees a header meter and can open a guide that offers every add method; a tenant first seen at ≥25 items with no milestones sees nothing.
  2. Each in-app item-creation method’s first successful use is recorded once, server-side, over an item that was actually created — never over one that failed, never twice per key. item-added-email is the V1 exception: it records the inbox-wizard click-out, not a confirmed creation.
  3. At 25 items the starter kit is created, remembered on the tenant, and queued in the order queue, in one idempotent call; a retry never mints a second kit.
  4. The kit’s order URL is correct the moment the kit exists: free shipping applied, tenant and account email carried as order attributes (verified on Shopify test order #G2GCNFIVJ).
  5. Placing the kit order records nux-completed, after which the meter and guide are hidden permanently and nothing further is written.
  6. No milestone is ever written by the browser directly; the BFF stamps actor and time from the verified JWT.

The product’s earlier onboarding work (Userflow tour, “Web to product” flow, the IMTS new-user journey design) left the first session without a persistent, server-known notion of progress. PDEV-1830 originally proposed tagging each Item with a creationChannel; the product owner redirected it to a per-tenant milestones model so progress is a small, key-based record rather than something derived from the item set.

The frontend BFF (API proxy) already held the session and talked to ARDA on the browser’s behalf, which made it the natural single writer for milestones without a backend change.

  • Milestone vocabulary, allowlisted and enforced at the BFF.
  • BFF endpoints: read milestones, record a non-item milestone, create an item with its method, claim the starter kit; completion recorded on the kanban card walk.
  • Onboarding provider composed from single-purpose hooks (tenant record, engagement latch, auto-open once per sign-in, kit fulfilment policy).
  • Guide modal, header meter, celebration and kit sheet; the inbox click-out recorded as item-added-email.
  • Free shipping via a standing Shopify code on the kit’s cart permalink, decoupled from the SupportToolKit reward ladder.
  • Mock-mode parity so the whole NUX can be driven end to end without a backend.
  • creationChannel item provenance — orthogonal analytics value; separate backlog item (DQ-M7).
  • A dedicated bitemporal onboardingMilestone module in accounts — the graduation path; design retained in the specification.
  • Backend- or toolkit-recorded item-added-email and server-side idempotency for a simultaneous kit claim.
  • Per-tenant minted discount codes — PDEV-2150.
  • The SupportToolKit 48h welcome-kit producer’s overlap with this offer — product call, outside this project.
  1. No backend change: milestones live on Tenant.settings, read-merge-PUT by the BFF in one round trip.
  2. Existing tenants must see nothing on deploy — eligibility is judged from the item count and the absence of milestones, and only an enrolled tenant’s adds are recorded.
  3. Nothing may be granted on the strength of a cart attribute; they are attribution only.
  4. The server decides and records completion; the client reads it. No client-side watch on the kit’s card.
  5. One route for every item add, so the method travels with the create and the milestone is written over the created row.
#DeliverableLocation
1BFF onboarding packagearda-frontend-app/packages/bff/src/onboarding/ (#1438)
2Item create via BFFsrc/hooks/collections/items/useAddItem.ts, useAddItems.ts (#1441)
3Onboarding provider and hookssrc/components/onboarding/ (#1443)
4Guide UI, meter, kit fulfilment, completionsrc/components/onboarding/ (#1422)
5As-built specificationspecification.md
6Ticket and PR mapatlas.md
  • Specification — decisions, product rules, write path, provider, UI, trade-offs, graduation path.
  • Atlas — the PR stack, increment traceability, follow-ups.
  • API proxy (frontend BFF) — the platform the endpoints are built on.

Copyright: (c) Arda Systems 2025-2026, All rights reserved