Skip to content

Onboarding and demo shop

Sign-up asks for a name, an email and a password, with a button to show the password instead of a repeat field. It also says what the shop gets.

Continue with Google (ADR-019), on sign-up and sign-in, skips both the form and the confirmation email: Google has verified the address. It appears once the Google client is configured.

The email must be confirmed before anything else. The owner chose to keep this on 6 October 2026: it guards shop addresses against throwaway accounts.

The confirm page:

  • names the address the link went to;
  • lets the owner correct a mistyped address, which sends the link there (POST /email/verify/address, unconfirmed accounts only);
  • checks every five seconds and moves on by itself once the link is opened, on any device.

The confirmation and password-reset emails are written for Flowery in the owner’s language (AppServiceProvider::registerAccountEmails()). Sign-up, sign-in and onboarding pages use the brand palette (.brand-surface in app.css), in light and dark.

Step Where What
1. Your shop root domain, /onboarding/workspace The shop’s name and web address on one screen. The address follows the name in Latin letters, made unique by the server (POST /onboarding/address/suggest), until the owner edits it; then it is checked as they type. Creates the workspace (owner role, UAH, Europe/Kyiv, 14-day trial field) with its final address (shop addresses), emails the owner the addresses, and continues on the shop
2. About the shop the shop, /control/welcome Phone, address and opening hours, written straight into the storefront profile (and so into pickup windows) and published. Optional
3. How to start the shop, /control/welcome?step=start With the demo shop or empty. Records welcomed_at; the welcome then sends the owner to the dashboard

Steps 2 and 3 are for those who edit settings (owners and admins), and can be skipped. Until 6 October 2026 the name and the address were separate steps. The old address page /onboarding/subdomain now leads to step 1, and a form still open from before is accepted. The old completion URL /onboarding/complete leads to the welcome.

The welcome email (ShopOpened, queued) is sent when the shop gets its address. It holds the control-panel and storefront addresses and the first steps, so the owner can find the shop again from the inbox.

The dashboard shows a checklist (App\Services\Demo\SetupChecklist). It is computed from the shop’s own data on every visit, so there is nothing to tick by hand:

Step Done when
Shop details The live profile has a phone, an address and at least one day of opening hours
Your flowers The shop has a flower of its own
Your bouquets The shop has a catalogue bouquet of its own
First delivery The shop recorded a supply of its own
Your storefront A member published a version from Settings → Storefront (or the storefront agent). The welcome’s details do not count
Online ordering Checkout is on, usable and offers at least one method
Uklon courier (optional) The shop’s Uklon account is connected and checked

Demo records never count: with the demo loaded, the shop still has to add its own flowers. Each step links to the page that does it, shown only to those allowed to do it.

Two steps also have a one-click button for owners and admins (Onboarding\QuickSetupController):

  • “Your website” → “Publish as it is” (POST /control/getting-started/storefront) publishes the current draft from Settings → Website. For a new shop that is the Bloom theme with its default home blocks and the details from the welcome. It is recorded as a settings publish, so the step counts as done; the look can change any time.
  • “Online ordering” → “Turn on pickup” (POST /control/getting-started/checkout) switches checkout on with pickup during opening hours and cash or card on receipt. Delivery, Uklon, slots and lead time stay as they are. It refuses, saying why, until the shop has an address and opening hours, since pickup happens there.

Quick-add flowers (/control/flowers/quick-add, where “Your flowers” leads):

  • the owner ticks flowers in the built-in list (flower_references, 75 flowers, popular first, searchable);
  • enters a price per stem and, if they like, the purchase cost and the days a stem stays fresh;
  • adds them all at once.

Names follow the interface language. A flower the shop already has under that name is marked and left alone; demo flowers do not count. The flower list links to it too.

Quick bouquets (/control/bouquets/quick-add, where “Your bouquets” leads; App\Services\Catalogue\StarterBouquets) propose ready recipes from the shop’s own active flowers (demo flowers do not count):

  • a mono bouquet of each main flower, up to six, with the stems usual for its kind (roses and tulips 15, peonies 7, hydrangeas 3, other flowers 11);
  • mixes of two main flowers (7 + 5 stems, plus 3 of a filler when the shop has one);
  • a main flower with a filler (9 + 5).

A flower’s kind comes from the built-in list by name; fillers and greenery do not lead a bouquet. The price starts at the exact sum of the stems at the shop’s prices and follows the stems until the owner types one; managers see the material margin as they go. The owner ticks, renames and adjusts, and creates them all at once. A name the shop already uses is skipped. Photos follow on each bouquet’s page, where AI can make them from its stems.

The first delivery names a new supplier on the supply form when the shop has none, or picks “+ New supplier”; a supplier the shop already has under that name is reused. An empty catalogue on that form points to quick-add.

Until the shop has an active catalogue bouquet or an active flower, its website shows “opening soon” with the shop’s name, phone, address and opening hours, not an empty catalogue. It is not indexed by search engines. The owner’s preview links still show the theme, and order status links keep working (runtime).

An owner brings in staff from Settings → Team (ADR-021). The invited person:

  • gets an email with a link, valid for seven days;
  • creates an account with that address or signs in, and comes straight back to the link;
  • joins with the role chosen for them and lands in the shop’s control panel. Members never go through the shop steps.

Owners who stall get one email per stuck step, at most once each, from a daily run at 10:00 Kyiv (ADR-020):

  • the confirmation link again after a day;
  • “create the shop” a day after confirming;
  • “add flowers” when the shop is three days old with none of its own;
  • “turn on online ordering” after a week with bouquets but ordering off.

Each email links to a signed page that turns the reminders off without signing in, and mail apps can do it in one click. php artisan onboarding:remind --dry-run shows who is due.

Terminal window
php artisan onboarding:funnel [--days=30] [--json] # read-only

For the owners who signed up in the period, it counts how many:

  • confirmed the email;
  • created the shop and finished the welcome;
  • completed each “Getting started” step (the same checks as the dashboard);
  • got a first real order.

It also gives the median time from sign-up to the shop and to the first own flower. Nothing is tracked or stored for it; it reads the records.

The demo is a small Kyiv florist, and gives a full shop to look around:

  • Catalogue: 9 flowers and 10 bouquets with free-licence photos (resources/demo/CREDITS.md) and 3 packaging options.
  • Stock: a supplier and yesterday’s delivery as 9 batches, received through the ledger. Some are fresh, some expiring, one expired, one partly used and one scarce, so the Attention page and the “few left” label have something to show.
  • Orders: 6 orders taken through the real lifecycle: pending, confirmed (reserved), in progress (assembled), ready, delivered and paid, and cancelled.
  • Storefront: the Bloom home page with a hero photo and the week’s bouquets.
  • Expenses: three small operating expenses this month, so Finance has a statement to show.

The content lives in App\Services\Demo\DemoCatalogue. The local demo seeders use the same catalogue.

It can be added in step 4, or later: while the shop has no bouquets and no orders of its own, the dashboard offers it and every control-panel page carries a banner with the same button (owners and admins). Flowers the shop already added do not stand in the way; the demo’s flowers are its own and leave with it (amended 12 October 2026, after a shop that had added one flower by hand had no way to see the demo).

While it is loaded:

  • every control-panel page shows a banner;
  • the storefront shows a demo notice on every page (“Демонстраційний магазин: товари й ціни — приклад, а замовлення тестові…”);
  • storefront orders are test orders, so the whole process can be tried: they are marked “Демо” for staff and “[Демо]” in the emails, never book a real Uklon courier, and are removed with the demo.

Removing it takes one click and one confirmation, for owners and admins: the banner or the dashboard, “Видалити демо-дані”. Removal deletes every demo record with its photos and history.

What the owner created stays. So does any demo record that real work already uses, which becomes the shop’s own:

  • a demo bouquet in a real order, with its flowers and the batches that order holds;
  • a demo flower the shop restocked;
  • the supplier those came from.

The storefront gets a new version without the demo’s bouquets and photos. Afterwards the books reconcile, the currency can change again, and storefront orders are real again. The rules behind this are in ADR-016.

A walkthrough as a new owner on 6 October 2026 found and fixed:

Finding Fix
The confirmation email had an English subject and body under a Ukrainian greeting; so did the password reset email Own emails in the owner’s language
The confirm page did not say where the link went, and a mistyped address could only be fixed by signing out The page shows the address, corrects it, and continues by itself
Step 1 asked for a “workspace” name with the label twice; step 2 for a “subdomain” One step in plain words: shop name, web address
“First delivery” led an empty shop to a supply form whose supplier list was empty, with no way to add one A supplier is named on the form
A new shop entered flowers one form at a time Quick-add from the built-in list
Sign-up was the generic starter page, apart from the landing page’s look Brand palette, a show-password button instead of the repeat field, what the shop gets