ADR-020: Onboarding reminders
Status: accepted 7 October 2026. The owner asked for reminders to owners who stall, for example no shop after a day or no flowers after three days.
Context
Section titled “Context”onboarding:funnel shows where new owners stop: before confirming the email, before creating the shop, and before adding flowers. Nothing brought them back. The scheduler already runs every minute on production, and mail goes out through Resend.
Decision
Section titled “Decision”-
Four nudges, each at most once per account (
onboarding_reminders, unique by user and kind). A daily run (onboarding:remind, 10:00 Kyiv) sends the one step each account is stuck on:Kind When What confirm_emailemail unconfirmed 24 hours after sign-up the confirmation link again create_shopconfirmed 24 hours ago, no shop with an address, and not a member of anyone else’s shop “Create the shop” → the shop step add_flowersthe shop has had its address for 3 days, no flowers of its own (demo ones do not count) “Add flowers” → quick-add on the shop open_ordering7 days, own bouquets, online ordering off “Open Getting started” → the one-click pickup -
Only recent accounts: created in the last 30 days, so nobody signed up long ago is suddenly emailed.
-
Easy to stop:
- Every reminder links to a signed page,
/reminders/stop/{user}, which needs no sign-in. - The email carries
List-UnsubscribeandList-Unsubscribe-Post: List-Unsubscribe=One-Click(RFC 8058), so mail apps can turn reminders off themselves. - The one-click POST is exempt from CSRF; the signature authorises it.
- Turning reminders off sets
users.onboarding_reminders_off_at. Emails about orders, payments and security are not affected.
- Every reminder links to a signed page,
-
Recorded before sent: the row is inserted first (
insertOrIgnore), then the email is queued. Two runs cannot both send. -
Language: the app’s default (Ukrainian on production), since accounts do not store a language yet.
-
Dry run:
onboarding:remind --dry-runlists who is due, and sends and records nothing.
Consequences
Section titled “Consequences”- An owner hears from Flowery at most four times about setup, then never again.
- Team members do not receive setup reminders. Owners of an invited team are covered by the rules above.
- The steps a reminder checks are the same as Getting started’s (own flowers, own bouquets, checkout on), so the email and the dashboard agree.
- New rules add a kind; a kind once sent is never resent, even if the shop goes back a step.