Reference · 12 August 2026

White Glove, end to end

From the click that buys it to a working product. Replaces part 3 of the 11 August tech-stack document — that one was a list of jobs; this is the whole road, including the half that happens after the first booking.

Ken's question: "How much of that has to be done by a human? What are those factors? … I can't say what the prices are without knowing this."

Every line below was read out of the code on 12 August. Where nothing could be verified, it says so rather than filling in a number. The headline has not changed: the hours are still unmeasured. What changed is that the list is now longer, and four of the new items make the number bigger.

13stages, enrol → live
4fully automatic
9need a person
3need a developer
0hours measured

What changed since 11 August

ChangeEffect on this question
The build board exists
built 12 Aug
The per-client steps are counted in one place instead of scattered across an env var, a Telnyx console and somebody's head. The biggest single improvement — "how much is by hand?" becomes a read rather than a guess.
The go-live gate is enforced No account can be marked live until its number is routed and its form is submitted. Ken's "no exceptions", in code.
Accelerants bought later get built A real bug closed. An add-on bought in month three was invoiced and never built — indistinguishable from a person forgetting.
Our own e-signature is live Removes a GHL-UI build per client for the signing half. Not the drafting half — Ted's agreement is still open.
Support tickets carry an owner and a first-response time The vehicle for measuring support labour now exists. It still does not record minutes.

Net: the system got better, the estimate got worse — because four things came into view that were not on the 11 August list.

The road, stage by stage

"Who can do it" is the column that decides cost. A step a VA can do and a step that needs the person with the server password price completely differently.

#StageMachine or personWho can do itTime
1Enrol — plan, four facts, CRM contact, tags, slug reservedmachine—seconds
2Pay — checkout, accelerants ticked, acknowledgments stored with version + IPmachine—seconds
3Accept our terms — clickwrap, wording + version + IP stored server-sidemachine—seconds
4Fill the questionnaire — 11 sections: business, inspectors, services, packages & pricing, add-ons, callers, schedule, what Josh asks, agreement & payment, follow-up emails, voice & guardrailsthe clientclient, chased by usunmeasured
5Their own CRM sub-account is createdmachine—seconds
6Load the base template into it⚠️ does not happena person, in the GHL screenunmeasured
7Load the accelerant templates they bought⚠️ does not happena person, in the GHL screenunmeasured
8Port the number inperson + carrierus · client's signature · losing carrierdays–weeks
9Point the number at Josh — Telnyx app and a row in NUMBER_TO_INSPECTORpersondeveloper — code + deployunmeasured
10Issue the portal login — INSPECTOR_PASSCODESpersonserver access + restartminutes
11Build their own inspection agreement as a fillable templatepersonsomeone who can read a contractunmeasured
12Test callpersonanybody — but somebody must listenminutes
13Mark livepersonKen / Beth / Dilseconds

After the first booking — the half that was missing

This is where the product either works or doesn't, and none of it has run end to end for a paying customer.

StageState todayBlocked on
Booking saves; work order + transcript filed on the contactlive—
Text the inspector that a booking came inswitchable, consent-gatedthe client ticking the box
Email the customer a confirmationlive — wording derived from which stages are on—
Send the agreement to signe-sign live, Chad onlyTed's template
Payment link / raise the invoice⚠️ never runno client has connected their own Stripe
Reminders, review requestbuiltthe switches above

⚠️ Every after-booking switch is global, not per client

BACKSHOP_ENABLED, BACKSHOP_SMS_ENABLED, BACKSHOP_PAYMENTS_ENABLED, BACKSHOP_AGREEMENT_ENABLED, BACKSHOP_ESIGN_ENABLED — one setting each, for the whole system.

So one account cannot be "finished" on its own. Turning the payment stage on for client three turns it on for Chad and Ted at the same instant. Today that is invisible because everything is off; the day the first one goes on, it is a per-client feature that isn't one.

The four things that make this bigger

1A new client's CRM is built empty — and the rebuild is not on the board

GHL_CLIENT_SNAPSHOT_ID is unset, so a new sub-account is created bare: no workflows, no pipelines, no custom fields. All six accelerants ship with an empty snapshot id too, so the bolt-on loader correctly resolves to "nothing to do."

Both are technically working as designed. The consequence is not: every workflow, pipeline and field a client needs is built by hand, in the GoHighLevel screen, for every client we sell.

And it cannot be automated later either

GoHighLevel has no workflow API at all — not to create one, not even to read one. Funnels, websites and pages are read-only. This is not a build we have not got to; it is a build no agent can ever do.

It is also not one of the six steps the build board counts. The board shows "Accelerant templates applied ✅" when the loader ran and found nothing to load. The most expensive manual job in the process is invisible on the page built to count manual jobs.

The single biggest cost lever we have

Build the base snapshot once, by hand, in the screen. Every future client then gets it in seconds. That one job converts an unbounded per-client cost into a one-off — and it is currently recorded on the board only as a question that was answered, not as the lever it is.

2Three by-hand steps need a developer, not a VA

This is the staffing answer, and it changes the rate rather than the hours.

StepWhy it is not VA work
Point the number at JoshNUMBER_TO_INSPECTOR is a hard-coded map in the code. There is no env override. A new client's number means a commit, a merge to main, and a deploy.
Issue the portal loginINSPECTOR_PASSCODES is a server environment variable — SSH, edit, pm2 restart.
Any change to Josh's brainbot.py does not auto-deploy. Copied to the server by hand, then pm2 restart austin-voice.

The GHL build above is the other side of it: not developer work, but not unskilled work either — somebody who knows GoHighLevel well, doing the same build repeatedly. Two different rates, and neither is the one usually assumed when people say "white glove setup".

3The after-booking half has never been proved

Written in the code itself: "the whole chain after a booking — does the stage fire, does an email go, does the link arrive, does a card actually charge — has never been run end to end."

It is blocked on a step only the client can do: connect their own Stripe inside their own GoHighLevel. Nobody has. Until one does, we do not know how long that step takes, how much hand-holding it needs, or what breaks after it.

For pricing this counts twice. It is unmeasured labour, and it is the stage that gets our clients paid — the thing Ted does by hand today, and the clearest single thing this product does for him.

4The board that counts the work currently shows nothing

The build board lists accounts whose status is exactly submitted. In the live store today, none is.

AccountStatusOn the board?
gc — Chaddraftno
qhi — Tedactiveno
three test recordsdraftno

So the board reads zero accounts, zero steps, zero hours — while two clients are live. Two separate reasons, both worth knowing:

That second point is why this cannot be closed from a desk: the first real measurement can only be the next client.

What is genuinely automatic now

Four stages, and they are real — so nobody should double-count them as labour:

  1. Enrolment and payment, including the acknowledgment record with version, timestamp and IP.
  2. Their own CRM sub-account, created on submit, with the guard that stops a re-submitted form creating a second one.
  3. The accelerant ledger — what was applied, what failed, what still needs sending. Failures retry; successes are never re-sent, because loading a snapshot twice sends every one of that client's customers two of every email.
  4. Josh's brain. The moment the form is submitted, their prices, hours, service area and services are what he says on every call. No hand-off, no config file, no deploy.

The last one is the one people underestimate. The thing that used to be the whole job — teaching the receptionist the business — is now free and instant.

The number still missing, and the cheapest way to get it

There are two numbers hiding under "how long does a client take", and mixing them up is what has kept this open.

What it isState
Elapsed timeenrol → live. How long a customer waits.already stamped — createdAt, submittedAt, goLiveAt. Needs no build. Does not tell you what it costs.
Hands-on minuteswhat somebody was actually doing.recorded nowhere. This is the one that decides staffing, and therefore price.

The alternative to a stopwatch and a month of timesheets

The 11 August answer was "time the next onboarding, and log support minutes for a month." That relies on people remembering, every day, for a month — and the first week it slips, the data is worthless.

There is a cheaper version and the parts are already built. About an hour of work, in three pieces:

  1. A minutes box and a done state on a support ticket. Tickets already carry an owner and a first-response time. One number typed at close turns support labour into a report instead of a feeling.
  2. A started/finished stamp on each build-board step. The board already knows the steps and whether each is done. Two clicks — starting this / done — and the next onboarding measures itself with nobody keeping a diary.
  3. A "who did it" pick from a short list: developer · GHL builder · anybody. Minutes without a rate cannot be costed, and the rate depends which it was.

Then the answer arrives on its own, from real work, in a month — and it keeps arriving, which a one-off stopwatch exercise does not. It does not remove the human step; somebody still types the number. It removes remembering to keep a record, which is the part that always fails.

What could not be verified from here