Skip to content

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.

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.

  1. 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_email email unconfirmed 24 hours after sign-up the confirmation link again
    create_shop confirmed 24 hours ago, no shop with an address, and not a member of anyone else’s shop “Create the shop” → the shop step
    add_flowers the 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_ordering 7 days, own bouquets, online ordering off “Open Getting started” → the one-click pickup
  2. Only recent accounts: created in the last 30 days, so nobody signed up long ago is suddenly emailed.

  3. Easy to stop:

    • Every reminder links to a signed page, /reminders/stop/{user}, which needs no sign-in.
    • The email carries List-Unsubscribe and List-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.
  4. Recorded before sent: the row is inserted first (insertOrIgnore), then the email is queued. Two runs cannot both send.

  5. Language: the app’s default (Ukrainian on production), since accounts do not store a language yet.

  6. Dry run: onboarding:remind --dry-run lists who is due, and sends and records nothing.

  • 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.