Patterns
Flows, not screens. Each step names its component, its event and the honest-design rule it must pass.
Waitlist with honest position
D02 · Pre-launchPosition is real and shown as a number, not a vague “you’re early”. Referrals move you up by a fixed, stated amount.
- 1waitlist_joined Email only One field, work email, typo suggestion. “Join the waitlist”
- 2waitlist_confirmed Double opt-in Confirm email before a position is assigned. “Confirm your spot”
- 3waitlist_position_viewed Position Show position and total, with a date. “You’re #1,284 of 3,912”
- 4referral_shared Referral boost Personal link; each confirmed invite = 100 spots. “Invite a teammate, move up 100”
- 5waitlist_invited Early access Invite in cohorts, with a date range. “Your invite is ready”
Show the real position and exactly how many spots each invite is worth.
Fake counters, “only 3 spots left”, or positions that never change.
Launch day
All marketing · LaunchThe announcement bar, launch badge and offer all share one real end date.
- 1announcement_clicked Announcement bar Dismissible, links to the release note. “Roadnote Studio is live”
- 2cta_viewed “We’re live” states Waitlist CTAs switch to Start free. “Start free”
- 3offer_viewed Launch offer Printed end date, in the user’s timezone. “30% off Pro until Oct 15, 2026”
- 4email_sent Notify waitlist Email in cohorts to protect support. “You’re in. Here’s your workspace.”
Launch offers have a real end date that is printed and honored.
Countdown timers that reset on reload.
Demo workspace
D01 · D03 · K11A full read-write workspace with sample data. Signup is offered only when the visitor wants to keep their changes.
- 1demo_opened Open demo No signup, no cookie wall beyond essentials. “Try the demo workspace”
- 2tour_step_completed Guided hotspots 3 hotspots, skippable. “Drag a request into a theme”
- 3demo_aha_reached Aha moment Ship a theme and see requesters notified. “42 requesters notified”
- 4signup_started Keep it Offer signup to keep this workspace. “Keep this workspace”
The demo is the real product, clearly labeled “Demo · sample data”.
Gating the demo behind an email.
Signup → onboarding → activation → invite → upgrade
D09 · D10Activation = first theme shipped with at least one requester notified. Everything before that is scaffolding to get there.
- 1signup_completed Sign up Google, Microsoft, magic link or passkey. “Continue with Google”
- 2onboarding_step_completed 3-step setup Workspace name, role, goal. “What do you want to fix first?”
- 3import_started Import or sample One-click import or sample data. “Import from Canny”
- 4activation_reached First value Ship a theme, see notification. “You closed the loop on 12 requests”
- 5invite_sent Invite Prompt after activation, not before. “Bring in Jonas from support?”
- 6plan_upgraded Upgrade At limit, value-based, non-blocking. “Keep everything on Starter”
Invite teammates after first value, upgrade at a real limit.
Asking for a credit card to start a trial.
Trial lifecycle
D10 · K1314 days, no card. Reminders at day 7 and day 13, with what will change and what won’t.
- 1trial_started Day 1 Welcome + checklist. “Your Pro trial ends Oct 9”
- 2trial_midpoint Midway Usage recap with real numbers. “You’ve merged 184 duplicates”
- 3trial_ending Ending 7 days and 1 day before. “Tomorrow you move to Free”
- 4trial_converted Converted Receipt + what’s unlocked. “Welcome to Pro”
- 5trial_expired Expired Free plan, data intact. “You’re on Free. Nothing was deleted.”
Say exactly what happens on expiry: downgrade to Free, nothing deleted.
Silent auto-conversion to paid.
Plan selection & checkout
D04Monthly/annual, seats and usage priced live, VAT ID for EU businesses, coupon field collapsed by default.
- 1plan_selected Plan Recommended plan marked, not preselected in cart. “Pro · annual”
- 2seats_changed Seats Slider + stepper, live total. “8 seats · $232 / month”
- 3vat_id_added Billing details Company, VAT ID validated (VIES). “VAT reverse-charged”
- 4checkout_completed Order Button states the obligation. “Buy now · $2,784 / year”
Show total incl./excl. VAT before the order button.
Pre-checked add-ons.
Dunning
D10 · K13Three retries over 10 days. Access continues during retries; the banner says so.
- 1payment_failed Payment failed Email + in-app banner. “Your card was declined”
- 2payment_retried Retry Day 3 and day 7, automatic. “We’ll retry on Sep 28”
- 3payment_method_updated Update card One screen, no re-login for owners. “Update card”
- 4payment_recovered Resolved Confirmation + receipt. “All set, thanks”
Tell users what still works and exactly when anything will change.
Locking users out on the first failed charge.
Cancellation & downgrade
D10 · K12Two clicks. Pause and downgrade are offered once, with equal weight, then we let you go. Consumer subscriptions get a dedicated cancellation button (e.g. Germany’s § 312k BGB).
- 1cancel_started Cancel From Billing, visible. “Cancel subscription”
- 2cancel_offer_viewed Offer once Pause 3 months or downgrade to Free. “Pause instead?”
- 3cancel_reason Reason (optional) Skippable one-question survey. “What didn’t work?”
- 4data_exported Export CSV/JSON, always available. “Download your data”
- 5cancel_completed Confirm Email confirmation with end date. “Canceled. Access until Oct 31.”
“Cancel subscription” is always visible in Billing and equally weighted.
Confirmshaming or forcing a call.
Roadmap → changelog → notify
D06The core Roadnote loop. Every vote is a subscription to the outcome.
- 1roadmap_voted Vote On public roadmap, with email. “Vote”
- 2status_changed Status change Planned → In progress. “Now in progress”
- 3release_published Ship Release note links the item. “v2.15 · Bulk actions”
- 4requesters_notified Notify Email every voter and requester. “You asked, we shipped”
Roadmap items are plans, not promises; no dates on public items.
Hiding items that were declined; mark them “Not planned” with a reason.
Integrations marketplace
D08Browse → detail → connect with explicit permissions.
- 1integration_viewed Browse Categories + search. “Support tools”
- 2integration_detail_viewed Detail What it does, setup, permissions. “Reads tickets tagged #feedback”
- 3integration_installed Connect OAuth, scopes listed. “Connect Zendesk”
- 4integration_synced Confirm First sync preview. “218 tickets found”
List every scope requested in plain English before OAuth.
Requesting write scopes “just in case”.
Consent & double opt-in
All pagesAccept and Reject are equally weighted. Tracking loads only after consent.
- 1consent_shown Banner Accept all / Reject all, same style. “Reject all · Accept all”
- 2consent_customized Choose Per-category toggles. “Analytics: off”
- 3newsletter_opt_in Opt-in Unticked newsletter checkbox. “Send me product updates”
- 4newsletter_confirmed Confirm Double opt-in email. “Confirm your subscription”
No tracking before consent; marketing emails need double opt-in.
Pre-ticked marketing checkboxes.
Status & incident communication
Utilities · FooterThe footer shows live status. Incidents get a timeline, in plain language, with next update time.
- 1incident_opened Detect Footer turns amber. “Degraded: Slack sync”
- 2incident_updated Update Every 30 min, timestamped. “Next update 14:30 CEST”
- 3incident_resolved Resolve Root cause within 5 days. “Resolved · postmortem”
- 4incident_email_sent Follow up Email affected workspaces. “What happened on Sep 12”
Post the next update time, and meet it.
“Some users may experience issues” for a full outage.