Finish Setting Up¶
A shop can switch a feature on and still not be able to use it. A restaurant can give staff the till before any store is linked to Stripe Terminal. Central sign-in can be on with no sign-in client. Delivery can be on with no delivery area. Nothing used to point this out. The Finish setting up list does. It shows on the admin home page, on the Settings tiles and in the MCP ops inbox. For each feature the shop uses, it says what is still missing and where to fix it.
What it checks¶
A check only shows when the shop uses its feature. Each item is to do, waiting on another item, or done.
| Feature | Applies when | Items |
|---|---|---|
| Payments | Always | Stripe connected; Stripe able to take card payments (chargesEnabled, Connect accounts only; waits on the first) |
| Till | pos-enabled, a till agent (quick payments or building orders), or a store that sells in person |
Till staff have a card reader location (the same resolution the POS app uses, PosService.tillStripeLocationId; otherwise the app switches their till off with tillNotSetUp); some store sells in person; each such store linked to Stripe Terminal; each linked store has a card reader (waits on the link) |
| Takeaway and delivery | restaurant-ordering-enabled |
Some location takes food orders; each has opening or ordering hours; each local delivery option has an area (postcodes on the location or the option, or a radius), since without one it delivers to any postcode |
| Dining in | Bookings or table service on, or a DINE_IN location |
A location is set up for dining in; each has a dining room; bookings switched on; with table service, tip suggestions (blanking dining-tip-suggestions leaves the tip screen with only "No tip" and a custom amount) |
| Sign-in | central-auth-enabled |
The site has its OAuth2 client (oauth2-client-id); the superadmin tenant page flags the same state |
| Business details | Always | Legal name and registered address (legal-entity-name, legal-entity-registered-address) |
Linking to Stripe Terminal waits on Stripe being connected. The card reader item asks Stripe for
the store's readers, and the answer is cached for five minutes per location. If Stripe can't be
reached, that item is left out rather than shown wrong. The other items use data the site already
has; Stripe's account.updated webhook keeps chargesEnabled current.
There is no custom-domain check: a domain is checked by DNS when it's added and refused if the check fails, so a site never holds an unverified one.
Not needed¶
Some items don't fit every shop. A café that only takes Tap to Pay has no card reader to
register. Not needed takes such an item off the list. It moves under "Show done" with
Put back, and stops counting towards the badges and the progress bar. These choices are the only
thing stored, as item ids in the hidden setup-dismissed setting (Settings › Advanced). Only ids
that are on the current list are accepted.
Where it shows¶
- Admin home page: a Finish setting up card above the sales figures, for people who can change settings. It shows what's still to do (the first item's button is the primary one), what is waiting, a progress bar, a "Show done" fold and a link to any waiting platform upgrades. The card goes away once nothing is outstanding.
- Settings: each section tile has a "N to set up" badge, and the section's page lists its items at the top.
- MCP:
opsInboxhas asetupcount. Itssetuplist holds each outstanding item withfixWith(the tool call, when an agent can fix it) andadminPage. Stripe onboarding, Terminal links and central sign-in can only be fixed by a person in the admin.
How it works¶
Nothing is computed ahead of time. SetupChecklistService.checklist(siteContext) asks every
SetupCheck bean in turn whenever a page or tool wants the list, so the list is always current
and there is no job to keep it up to date. A check that throws is logged and left out, and the
other checks still show. Items are sorted to do, then waiting, then done, then not needed. Within
each group, checks keep their @Order and their own item order.
| Class | Module | Role |
|---|---|---|
SetupCheck, SetupItem, SetupStatus, SetupChecklist, SetupChecklistService |
common |
The contract |
SetupChecklistServiceImpl |
commerce-core |
Gathers the checks; stores dismissals |
StripeSetupCheck (payment), TillSetupCheck (pos), RestaurantOrderingSetupCheck (restaurant), DiningSetupCheck (dining), CentralSignInSetupCheck, BusinessDetailsSetupCheck (setup) |
commerce-core |
One check per feature, next to that feature's code |
AdminRenderer (home, card in admin/fragments/setupCard.html), SetupChecklistAdminController (POST /admin/setup/dismiss and /restore, item=), SettingsAdminController |
web-admin |
The admin surfaces |
OpsInboxTools |
ai |
The MCP section |
Adding a check¶
- Write a
@Componentthat implementsSetupCheck, in the feature's own package. Give it an@Orderto place it among the others. - In
appliesTo, return true only when the shop uses the feature. A shop that doesn't use it should see nothing. - In
check, return oneSetupItemper thing to do, done or not, so the progress bar has something to count. Give each item a stableid(add:<code>for per-location items), since dismissals are stored by id. Write the text as one sentence for the merchant: what's wrong and why it matters, with no class or config names. Give theActionan admin URL, plus an MCP call when an agent can do the fix. Set the section to theSettingsSectionsid the item belongs to. Useblockedwith awaitingOnwhen another item has to be done first. - Read through services, never repositories, and take
SiteContextfrom the caller. Cache anything that calls an outside service for a few minutes. Log site and location ids, never customer data. - Add a unit test for each state the check can report.