The route from sale to a personalized, revealed Commercial Electrical Contractors system. Five phases: confirm the foundation, build the product once, prove the thinnest end-to-end path, fill in the rest, then keep it running.
Every major architectural question has an answer. What's left is confirming each one against a real sandbox before Phase 1 leans on it.
sms_activation_status), never a hard blocklocationIdPUT /locations/{id} with snapshot: {id, override}. Agency token, not location tokenoverride: true overwrites a client's personalization. Forbidden in automation — always pass false, explicitly, and lint for itinstructions, personality, goal, knowledgeBaseIds[], channels[], modemode: off → auto-pilot is the agent's reveal switch; omitting SMS from channels[] is the A2P gateid that feeds knowledgeBaseIds[]. Max 15 KBs per location429, honor Retry-After, don't pollLocationCreate webhook carries the new locationId. Agency-level app required — or the signal never arrives/saas/locations by Stripe ID. Webhooks get delayed and dropped — build both pathslocationId writes one customer's data into another's accountLocationCreate fire reliably — and which verification route actually works?personality, instructions, opening and follow-up messages. Do not assume in knowledge-base content or action parameters. One field resolving does not mean they all do — check each one that mattersBuild the Commercial Electrical vertical, once, and get a versioned snapshot out the door. Everything authored token-first — retrofitting tokens later means a rebuild.
vertical-01-vX.YNot greenfield — an existing Node.js app on AWS, already wired to intake, provisioned server-side from the payment payload. This is an embed + entitlement adaptation, but Onboarding lives inside it, so it has to be ready before Phase 2 can run end to end.
frame-ancestors for HighLevel domainsOne vertical, one test client, zero exceptions: a purchase produces a provisioned, locked, intaken, compiled, personalized, verified, revealed location. Everything else in Phase 3 is elaboration on this.
locationId resolutionLocationCreate webhook. Fallback: reconcile via /saas/locations by Stripe ID. Correlate, verify the subscription, bind. Staged escalation — 10 min internal alert, 20–30 min manual ticket. The customer is never told it "failed"PUT /locations/{id} with snapshot: {id, override: false}. First write of the apply phase, post-onboarding. Agency token{{...}} anywhere — the single most valuable assertion in the systemoff → auto-pilotEvery remaining write and every remaining assertion. This is where real human minutes per activation get measured — the number that decides whether the business scales.
mode: off, attach actions, set follow-up. Omit SMS from channels until A2P clears201 on KB creation is not a pass — retrieval is the assertionDrift, entitlement upgrades, churn, and the two things that quietly decide whether this scales: chasing pending channels and watching the Priority Launch calendar against ad spend.
DELETE /locations/{id}?deleteTwilioAccount=. Deleting the Twilio account is irreversible — they lose their phone number. An explicit decision, never a defaultsms_activation_status and add SMS to the agent's channels — one workflow releases both gates