How an order ships

One template. One JSON file. Never a fork.

The Aberdeen portal is the live prototype. The sales demo is a separate tab with fictional cars. An order is a clone of the desk template — one JSON file, a new database, their domain. Never a copy of App.jsx.

  1. 01

    Brand pack

    Logo, hex, trading name, phone, legal, domain — written into tenant.json.

    Brand pack — one page

    • Wordmark + stacked logo
    • Primary / surface / danger hex
    • Trading name and legal name
    • Showroom phone and sales inbox
    • portal.theirdomain.co.uk
    • Staff list: name, email, role, site, franchise if they have more than one
  2. 02

    Clone the desk template

    GitHub template forecourt-desk. Never a copy of Aberdeen App.jsx. Never a copy of the sales demo.

    {
      "slug": "harbour-park",
      "name": "Harbour Park",
      "legal": "Harbour Park Automotive Ltd",
      "groupMark": "HP",
      "phone": "01202 774 410",
      "domain": "portal.harbourpark.example",
      "sites": [
        "Poole"
      ],
      "franchise": {
        "id": "ford",
        "word": "FORD",
        "accent": "#2A6BAC"
      },
      "ingest": "excel",
      "features": {
        "overview": true,
        "stock": true,
        "locator": true,
        "pipeline": true,
        "customer": true,
        "mind": true,
        "manufacturer": false
      },
      "staff": [
        {
          "name": "Alex Reed",
          "email": "alex@harbourpark.example",
          "role": "management",
          "site": "Poole"
        },
        {
          "name": "Sam Cole",
          "email": "sam@harbourpark.example",
          "role": "sales",
          "site": "Poole"
        }
      ],
      "seedDemo": false
    }
  3. 03

    Data plane

    New Supabase project. Own rows, own staff. Paste 0001_core.sql. Never share Aberdeen.

    Each client is a row-set scoped to their account. Aberdeen stays on its own database. The next rooftop does not inherit their deals, VINs, or staff. Until row-level tenancy is proven, the rule is: new project, new keys, first staff user. Never share.
  4. 04

    Ingest adapter

    Excel now (upsert-by-VIN). Manufacturer only if they have credentials, in their project.

    Core is upsert-by-VIN. Škoda UK is one adapter. Excel is another. A Ford group does not get the Škoda function pasted into App.jsx.

  5. 05

    Ship

    Vercel + custom domain + magic-link staff login. Half a day once the template exists.

    gh repo create desk-harbour-park --template mattgirvan/forecourt-desk

    Fill tenant.json, new Supabase, Vercel domain. The tab they played with is the sales demo. This clone is the live glass. Monthly billing starts here.

Who sits where

Job titles vary. Seats do not.

Aberdeen already has execs (own book) and management (the floor). A host, a progressor, an accountant are extra seats on the same desk — not extra products. A group with three franchises is still Group: seats scoped to rooftop and badge.

sales

Sales executive

Own customers only. Locator, GP on their book, customer glass.

Not: Everyone else's deals. Staff admin. Group totals.

management

Sales manager / desk manager

The floor. Reassign. Month-end. GP on every live deal.

Not: Group roll-up across rooftops (that is principal).

progressor

Vehicle progressor

Locator and inbound stock. Stage the car. No GP.

Not: Gross, customer thread, month-end numbers.

host

Showroom host / reception

Who is coming, which exec, where the car is. Lookup only.

Not: Edit a deal, see GP, move locator.

admin

Administrator

Staff list, documents, month-end checklist, handover pack.

Not: Reassign live deals (manager). Close GP (accounts).

accounts

Accounts / office

GP and month-end by deal ref. Export.

Not: Customer thread, phone, email. They get a number, not a person.

  • Pilot is Aberdeen as it runs today: sales + management. Do not dump seven seats on a 60-day trial.
  • A job title is a label. The role is the seat. Host, receptionist, greeter → host.
  • Accountant does not get a finance product. They get GP read and a CSV.
  • Progressor is the locator tab with stock. Not a second app.
  • Multi-franchise is Group: one contract, seats scoped to site and franchise — not a fourth plan.
  • Do not let a client invent roles. If it is not in this list, it is a title on an existing seat.

7 seats in the product. A John Clark–scale group does not get a custom role named “Škoda Aberdeen sales host”. They get host, on Aberdeen, franchise Škoda.

The glass they would get.

Name the group and franchise. Open a full desk on its own page — not a widget here. Feature flags above are what a real order would turn on.

Put their name on the glass

Group, rooftop, franchise. Then open a full desk — their book, their badge, not a widget in this page.

Primary franchise

NORTHBRIDGE+AUDI

Opens a full Audi desk. Fictional stock. Clickable — locator, GP, customer glass.

Open NORTHBRIDGE + AUDI
Start a rooftop