add plans from usability testing: onboarding v2, notifications, live editor
All checks were successful
deploy / deploy (push) Successful in 1m7s

Onboarding UX v2 supersedes the original plan — reworks setup into a
single guided journey with progress bar, forgiving validation, and
contextual prompts for skipped steps.

Notification overhaul replaces floating toasts with inline feedback
and persistent top banners (110+ flash messages audited).

Live site editor is a design exploration for on-site editing with
contenteditable text and live CSS variable injection.

Also adds SEO settings and multiple providers to the roadmap.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jamey
2026-03-03 22:45:41 +00:00
parent 64f083d271
commit 2e5217b010
5 changed files with 536 additions and 92 deletions

View File

@@ -1,109 +1,168 @@
# Onboarding UX improvements
# Onboarding UX v2
Status: Planned
## Context
Supersedes the original onboarding-ux plan. Based on usability testing session (March 2026) covering the setup wizard, launch checklist, email provider setup, and general onboarding flow.
The setup wizard and dashboard launch checklist work, but there are gaps that leave new users guessing. Goal: make onboarding totally fool-proof and guided so a non-technical seller can go from zero to live store without confusion.
## Vision
A non-technical seller should be able to go from zero to a live shop without confusion or frustration. The setup should feel like one cohesive journey, not a scavenger hunt through admin pages. Every step should explain *why* it's needed, be forgiving of mistakes, and never leave the user stranded.
## Current flow
1. **Setup wizard** (`lib/berrypod_web/live/setup/onboarding.ex`): 3 cards — admin account provider API key Stripe connection. Gated by secret in prod, auto-login after account creation.
2. **Dashboard checklist** (`lib/berrypod_web/live/admin/dashboard.ex`): 5 items with progress bar — sync products, connect Stripe, customise theme, place test order, go live. Visible when `site_live` is false and not dismissed.
1. **Setup wizard** (`lib/berrypod_web/live/setup/onboarding.ex`): 3 cards — admin account, provider API key, Stripe connection. Gated by secret in prod, auto-login after account creation.
2. **Dashboard checklist** (`lib/berrypod_web/live/admin/dashboard.ex`): 5 items with progress bar. Visible when `site_live` is false and not dismissed.
3. **Coming soon page**: blocks public access before launch.
4. **Setup status** (`lib/berrypod/setup.ex`): `setup_status/0` returns booleans for each milestone.
## Gaps identified
## What changes
### High priority
### A. Simplify initial setup to account creation only
#### 1. Dead end after setup wizard
The wizard ends at Stripe connection with no redirect or next-steps message. User has to figure out where to go.
The first screen should be dead simple and low-friction: email, password (with confirmation field), shop name. That's it. No provider keys, no Stripe.
**Fix:** After completing the final wizard step, redirect to `/admin` with a flash message like "You're in! Here's your launch checklist." (~30m)
- Live validation on all fields (email format, password strength/match, shop name not blank)
- Note under shop name: "You can change this later"
- On submit: create account, log in, redirect to the guided setup flow
**Files:** `lib/berrypod_web/live/setup/onboarding.ex`
Email/password correction after this point is just normal admin account settings — no special "go back to setup" needed.
#### 2. No shipping rate setup in checklist
Checkout requires shipping rates. There's no checklist item for configuring shipping, and no warning that checkout will fail without it. A user could "Go live" with no shipping rates.
**Files:** `lib/berrypod_web/live/setup/onboarding.ex`, possibly `lib/berrypod_web/live/admin/settings.ex`
**Fix:** Add "Set up shipping" checklist item that links to `/admin/settings` (shipping section). Gate "Go live" on at least one shipping profile existing. (~1h)
### B. Guided setup flow with progress bar
After account creation, the user enters a single multi-step guided journey. This replaces the current approach of separate admin pages.
**Intro screen** — before any steps, briefly explain what Berrypod does and why you need each thing:
> "Berrypod connects your print-on-demand products to your own online shop. To get fully set up, you'll need three things:
>
> - A **print provider** account (like Printify or Printful) to make and ship your products
> - A **Stripe** account to accept payments from customers
> - An **email provider** account so your shop can send order confirmations and shipping updates"
Then the steps with a clear progress bar at the top. Each step shows: step number, title, whether it can be skipped, estimated time.
**Steps:**
1. **Connect print provider** — allow connecting multiple providers (not forced to pick just one). "Skip for now" available.
2. **Connect Stripe for payments** — "Skip for now" available.
3. **Set up email provider** — "Skip for now" available.
Each step embeds the same settings UI components that live in the admin pages (shared, not duplicated). The guided flow adds extra context and hand-holding around them.
On completion (or after skipping all): redirect to dashboard with clear status messaging.
**Key UX decisions:**
- Progress bar visible at all times, showing completed/current/upcoming steps
- Each step has a "Skip for now" with a brief, non-naggy note about what won't work without it
- External service links (create Printify account, etc.) open in new tabs with external-link icon and aria label
- Users can go back to previous steps to correct mistakes
- If revisiting (e.g. after closing browser), detect existing state via `Setup.setup_status/0` and resume from the first incomplete step
**Files:** `lib/berrypod_web/live/setup/onboarding.ex`, `lib/berrypod/setup.ex`, new shared components
### C. Forgiving API key validation
API key entry should be as forgiving as possible:
- Auto-strip leading/trailing whitespace on paste and submit
- Validate format where known:
- Printify: 36-character UUID format
- Printful: specific prefix/length
- Stripe: must start with `sk_live_` or `sk_test_`
- Email providers: provider-specific format checks
- Specific, helpful error messages: "This looks too short — Printify API keys are usually 36 characters" rather than generic "Invalid"
- Validate on blur for fast feedback, not just on submit
- Link to where to find the key: "Find your Printify API key at Settings > Connections"
**Files:** `lib/berrypod_web/live/setup/onboarding.ex`, `lib/berrypod_web/live/admin/providers.ex`, validation logic in contexts
### D. Email provider setup UX
Rework the email provider selection and configuration:
- **Recommended pick** highlighted at top — whichever has the best free tier, easiest setup, and supports newsletters. One clear "if you're not sure, pick this" option.
- **Two groups:** "Also sends newsletters" vs "Transactional only" with one-line explanation of the difference
- **One-liner per provider:** free tier info, setup difficulty ("paste one API key" vs "requires domain verification")
- **Self-hosted/SMTP** in a collapsible "Advanced" section at bottom
- **Guided flow after selection:** link to create account (new tab), then "Now enter these settings:" with config fields
- **Send test email** button after configuration
- **Remove** the masked key display ("Current: 84159e26•••4f3")
- **Default from address** to the admin email automatically — don't surface during setup, it's a general settings thing for later
**Files:** `lib/berrypod_web/live/admin/email_settings.ex`, shared components for guided flow
### E. Contextual prompts for skipped steps
When a step is skipped, surface the need where it matters — once per context, never as global nags:
- **Products page** (no print provider): empty state explaining why products are empty, with link to connect a provider
- **Cart/checkout** (no Stripe): checkout button disabled with explanation and link to connect Stripe
- **Order detail** (no email provider): note saying "Order confirmation emails aren't being sent. Set up an email provider to send them automatically."
- **Dashboard checklist**: always shows outstanding items regardless of skips
Principle: explain what's missing, link to the fix, one instance per context.
**Files:** `lib/berrypod_web/live/admin/dashboard.ex`, `lib/berrypod_web/live/shop/` (various), `lib/berrypod_web/components/`
### F. Dashboard checklist and messaging
Rework the dashboard checklist to match the guided setup flow:
- **Before setup complete:** "Your admin account has been created. Continue the full setup below." with checklist of outstanding items
- **After all steps done and site live:** "Your shop is live! Ready to go"
- Checklist item names match the setup wizard step names exactly (no mismatches)
- Each checklist item links to its admin settings page (for when they return outside the wizard)
- Help/FAQ links next to items involving API keys or complicated config
- Collapsible rather than dismissable (can always get it back)
- Shipping setup and shop settings as additional checklist items (carried forward from v1 plan)
**Files:** `lib/berrypod_web/live/admin/dashboard.ex`, `lib/berrypod/setup.ex`
#### 3. No shop settings in checklist
Shop name, currency, country are critical but not in the checklist. User could go live with "My Shop" as the name.
### G. Coming soon page fixes
**Fix:** Add "Configure your shop" as the first checklist item, linking to `/admin/settings`. Mark complete when shop name differs from default. (~45m)
- Fix logo displaying oddly to the side
- Add a subtle "Admin login" link (footer or corner)
**Files:** `lib/berrypod_web/live/admin/dashboard.ex`, `lib/berrypod/setup.ex`
**Files:** `lib/berrypod_web/live/shop/coming_soon.ex`, associated template
### Medium priority
### H. External links UX
#### 4. Checklist dismissable and gone forever
Once dismissed, no way to get it back. Stored as `checklist_dismissed` setting.
All links to external services throughout the app get:
- `target="_blank"` + `rel="noopener noreferrer"`
- Small external-link icon
- Aria label indicating it opens in a new window
**Fix:** Replace dismiss with a collapse/expand toggle. Or add a "Show launch checklist" link in the dashboard sidebar when dismissed but site isn't live yet. (~15m)
**Files:** templates throughout `lib/berrypod_web/`
**Files:** `lib/berrypod_web/live/admin/dashboard.ex`, possibly `lib/berrypod_web/components/layouts/admin.html.heex`
### I. Input styling — WCAG compliance
#### 5. "Place a test order" has zero guidance
Links to the shop home page. No mention of Stripe test mode, test card numbers, or what a successful test looks like.
Increase input field border contrast to meet WCAG AA (3:1 minimum for UI components), aim for AAA. Clear, visible field edges in all contexts.
**Fix:** Add inline help text under the checklist item: "Use card number 4242 4242 4242 4242 with any future expiry and CVC. You'll see the order appear in Orders when it works." (~45m)
**Files:** `lib/berrypod_web/live/admin/dashboard.ex`
#### 6. Skip completed wizard steps on revisit
If a user closes their browser mid-setup and comes back, the wizard restarts from scratch (session-based). Should detect existing state and skip completed steps.
**Fix:** In `mount/3`, call `Setup.setup_status/0` and set `current_step` to the first incomplete step. (~1h)
**Files:** `lib/berrypod_web/live/setup/onboarding.ex`
#### 7. Better provider connection error messages
If the API key is wrong, the error is generic. No link to where to find the key, no troubleshooting.
**Fix:** Add provider-specific help text: "Find your Printify API key at Printify → Settings → Connections" (with link). Show the actual API error when it's user-facing (auth failure vs server error). (~30m)
**Files:** `lib/berrypod_web/live/setup/onboarding.ex`, `lib/berrypod_web/live/admin/providers.ex`
### Low priority
#### 8. Guide theme customisation
`theme_customised` is true if any setting differs from defaults. Changing one colour counts. No guidance on what to customise.
**Fix:** Add a brief tip under the checklist item: "Upload your logo, pick your colours, and choose a font that matches your brand." (~15m)
**Files:** `lib/berrypod_web/live/admin/dashboard.ex`
#### 9. Clarify "Sync your products" checklist step
Links to `/admin/providers` but user needs to click "Sync" on an already-connected provider. Confusing if they connected during the wizard.
**Fix:** If provider is connected but no products synced, link directly to the provider detail page with a prompt to sync. If products exist, mark as complete. (~15m)
**Files:** `lib/berrypod_web/live/admin/dashboard.ex`
#### 10. Move email setup into checklist as optional step
The orange "email not configured" banner appears on every page but isn't in the checklist. Email is needed for abandoned cart, order confirmations, contact form.
**Fix:** Add as a non-blocking checklist item (doesn't gate "Go live" but shows as recommended). (~30m)
**Files:** `lib/berrypod_web/live/admin/dashboard.ex`, `lib/berrypod/setup.ex`
**Files:** `assets/css/admin/components.css`, `assets/css/shop/` CSS files
## Task breakdown
| # | Task | Priority | Est | Status |
|---|------|----------|-----|--------|
| 1 | Redirect to dashboard after wizard completion with welcome flash | High | 30m | planned |
| 2 | Add shipping setup to checklist, gate "Go live" on shipping existing | High | 1h | planned |
| 3 | Add shop settings to checklist (name, currency) | High | 45m | planned |
| 4 | Make checklist collapsible instead of dismissable | Medium | 15m | planned |
| 5 | Add test order guidance (test card number, what to expect) | Medium | 45m | planned |
| 6 | Skip completed wizard steps on revisit | Medium | 1h | planned |
| 7 | Better provider connection error messages with help links | Medium | 30m | planned |
| 8 | Add theme customisation tips to checklist | Low | 15m | planned |
| 9 | Smarter "Sync products" checklist link | Low | 15m | planned |
| 10 | Add email setup as optional checklist item | Low | 30m | planned |
| # | Task | Est | Status |
|---|------|-----|--------|
| A | Simplify initial setup to account creation only | 1.5h | planned |
| B | Guided setup flow with progress bar | 4h | planned |
| C | Forgiving API key validation | 1.5h | planned |
| D | Email provider setup UX rework | 2h | planned |
| E | Contextual prompts for skipped steps | 2h | planned |
| F | Dashboard checklist and messaging rework | 2h | planned |
| G | Coming soon page fixes (logo + admin link) | 30m | planned |
| H | External links UX (new tabs, icons, aria) | 1h | planned |
| I | Input styling — WCAG compliance | 1h | planned |
Total estimate: ~5.5h
Total estimate: ~15.5h
## Suggested order
1. **A** first — simplify the entry point
2. **B** — the big piece, the guided flow
3. **C** — validation improvements (can be done alongside B)
4. **D** — email provider UX (part of the guided flow)
5. **F** — dashboard checklist rework (depends on the flow being defined)
6. **E** — contextual prompts (depends on knowing what's skippable)
7. **G, H, I** — smaller fixes, can be done any time