ALL DOCSOVERVIEWP1 CHECKLISTSPECCOPY BRIEFAPPENDIX
AI Architect Elite · Phase 1 execution · Aug 25

Elite P1 Builder Checklist

Click-by-click build order for Phase 1 only. Every name below is canonical: copy-paste it exactly, no renaming, no paraphrasing. Logic and rationale live in the Implementation Spec and are final; this document is only the build.

Scope lock

Build exactly what is on this page and nothing more. P1 workflows: S00, S02, S02b, S02c, S03, HT00, HT01, HT02, HT03b, HT03 plus the two alarm workflows. Everything else (S01 and the Setter Pipeline, S04, S05, HT00w, HT04, HT05, HT05r, full alarm set) is Phase 2/3 and is deliberately excluded. The one rule that protects the whole system: never send a second Documents & Contracts document from the same template to the same contact; re-share the existing document's link instead.

Section 1

Data: fields, tags, form

1.1 · Contact custom fields

Settings → Custom Fields → Add Field (object: Contact). Create all 13. Field keys must match exactly; GHL derives the key from the name, so name them exactly as written.

  • elite_plan_type — Type: Single Options (dropdown). Options, exactly: PIF · 2-Pay (in-house) · 3-Pay (in-house) · External Financing (via Whop)
  • elite_price_paid — Type: Monetary
  • elite_contract_value — Type: Monetary
  • elite_closer — Type: Single Options. Options: Jasmine (add more later)
  • financing_provider — Type: Single Line text
  • whop_order_id — Type: Single Line text
  • launchpad_grad — Type: Single Options. Options: Yes · No
  • grad_credit_applied — Type: Monetary
  • elite_first_payment_date — Type: Date
  • elite_sale_notes — Type: Multi Line text
  • app_readiness_score — Type: Number. Populated by the application form's readiness question (1-10)
  • app_needs_financing — Type: Single Options. Options: Yes · No
  • loss_reason — Type: Single Options. Options: price · timing · spouse-partner · no-show dead · ghosted unsigned · DQ not-a-fit · other

1.2 · Tags

Settings → Tags → create every tag below now, exactly as written including the [AI Elite] prefix and spaces. Workflows match by exact string; never free-type a variant later.

  • Journey: [AI Elite] Pending Application · [AI Elite] Completed Application · [AI Elite] Lead: SQL · [AI Elite] Lead: NQL · [AI Elite] Booked Call · [AI Elite] Booked Call: No Show · [AI Elite] Completed Call · [AI Elite] Completed Call: Deciding · [AI Elite] Completed Call: DSQ · [AI Elite] Closed: Paid · [AI Elite] Closed: Contract Signed · [AI Elite] Onboarding: Complete · [AI Elite] Nurture: Not Now · [AI Elite] Lost: Refunded
  • Machine: [AI Elite] Ops: Sale Form In · [AI Elite] Ops: Whop Paid · [AI Elite] Ops: Intake Done · [AI Elite] Closed: Contract Pending · [AI Elite] Onboarding: Booking Needed · [AI Elite] Onboarding: Call Booked · [AI Elite] Ops: Dunning Active · [AI Elite] Ops: At Risk · [AI Elite] Ops: Confirmed Attending
  • Plan: [AI Elite] Plan: PIF · [AI Elite] Plan: 2-Pay · [AI Elite] Plan: 3-Pay · [AI Elite] Plan: Financed
  • Flags: [AI Elite] Launchpad Grad · [AI Elite] Milestone: First Win · [AI Elite] Ops: Skool Joined

1.3 · New Sale form

Sites → Forms → open the existing New Sale form (keep its URL). Add/verify these elements, each mapped to its custom field via the form builder's custom-field elements.

  • Required: First Name, Last Name, Email, Phone
  • Required, mapped: elite_plan_type · elite_price_paid · elite_contract_value · elite_closer · launchpad_grad · grad_credit_applied · elite_sale_notes
  • Required: a checkbox element labeled "Kickoff call booked on the Elite Onboarding calendar?" (Yes/No, not mapped; it exists to make Jasmine look)
  • Optional, mapped: financing_provider · whop_order_id

1.4 · Application form mapping DO THIS FIRST

Sites → Forms → open each application form in use (Elite form, AI app building form, Masterclass). Lead grading reads these two answers, so an unmapped form silently grades every lead NQL.

  • Map the readiness question ("how ready are you", 1-10) to app_readiness_score.
  • Map the financing question to app_needs_financing (Yes = they said they need a plan or financing).
  • Submit one test entry per form and confirm both values land on the contact record before building S00.
Section 2

Pipeline & prerequisites

2.1 · Pipeline stages

Opportunities → Pipelines → edit AI Architect Elite Pipeline. Rename/create so the stages read exactly, in order:

  • 1 New Application
  • 2 Call Booked: SQL
  • 3 Call Booked: NQL
  • 4 No Show
  • 5 Call Held · Deciding
  • 6 Paid · Contract Out
  • 7 Signed · Onboarding
  • 8 Active · 30-Day Ramp
  • 9 Not Now · Nurture
  • 10 Lost / DQ

Existing "Closed PIF" and "Closed Payment Plan" stages collapse into 5-7; move any live opportunities before deleting them. In every workflow's Create/Update Opportunity action below, enable "Allow Opportunity to Move to Any Previous Stage" where offered (a rebooked no-show moves back to its Call Booked stage). Do not build the Setter Pipeline yet; that is Phase 2.

2.2 · Elite Onboarding calendar

  • Calendars → create a Personal Booking calendar named exactly Elite Onboarding, team member: Rone. Availability per Rone; slot length 45-60 min; minimum scheduling notice ~12h; booking window 2 weeks.
  • Calendar-level notifications ON: booking confirmation plus 24h and 1h reminders (email + SMS). These cover kickoff reminders so no workflow has to.
  • Confirm Jasmine's user can book onto this calendar from the Calendars view (she books the kickoff live on the sales call when time allows).

2.3 · Elite Client Agreement template

  • Payments → Documents & Contracts → Templates → New Template, named exactly Elite Client Agreement.
  • Paste the agreement text (supplied separately). Using the merge-field picker, insert: contact first/last name, elite_contract_value, elite_price_paid, elite_plan_type. Plan-terms wording stays placeholder until amounts are final.
  • Add the signature element for the client role. Test-render once to confirm every merge field resolves.
  • Never send this template to a contact who already has a live document from it. Re-share the existing document's link to remind (this rule is load-bearing; a duplicate freezes the post-signature automation).
Section 3

Workflows

Automation → Workflows → create a workflow folder named AI Elite and build everything inside it. The workflow name in GHL is the ID, a colon, then the title, exactly as each card header reads: HT00: New Sale Intake, HT01: Contract Send + Chase, and so on. Publish each one only after its Section 5 test passes. Every Add Task action: set the assignee named and a due time. All email and SMS copy is supplied separately. Build every send step with placeholder content now and drop the final copy in when it arrives; the structure is what matters here.

S00Application Scoring
TriggerForm Submitted → add one trigger per application form (Elite form, AI app building form, Masterclass)
  1. Add Contact Tag: [AI Elite] Completed Application
  2. If/Else, one branch, name it NQL. Condition group, joined with OR: app_needs_financing is Yes  OR  app_readiness_score is less than 8. The None/else branch is your SQL path.
  3. NQL branch → Add Contact Tag [AI Elite] Lead: NQL. Else branch → Add Contact Tag [AI Elite] Lead: SQL.
  4. Both branches then: Create/Update Opportunity → pipeline = AI Architect Elite Pipeline, stage = New Application, status = Open, source = the form name.
  5. End. S02 picks them up if they book; unbooked applicants are worked by hand until Phase 2 adds S01.

A blank readiness answer evaluates false on "less than 8" in some GHL versions. Test it: if a blank scores SQL, add a third condition to the NQL branch, app_readiness_score is empty.

HT00New Sale Intake
TriggerForm Submitted → form = New Sale form
  1. If/Else — branch A condition: contact has tag [AI Elite] Ops: Intake Done → End. All remaining steps go on the None/else branch.
  2. Add Contact Tag: [AI Elite] Ops: Sale Form In
  3. Add Contact Tag: [AI Elite] Closed: Paid
  4. Update Contact Field: elite_first_payment_date = today (use the current-date custom value; if your GHL version cannot set "today" here, skip and rely on the form submission timestamp)
  5. Slack message to #elite-pipeline (see Section 4): "🔔 New Elite sale: {{contact.name}} · {{contact.elite_price_paid}} · {{contact.elite_plan_type}} · closer {{contact.elite_closer}}"
  6. Create/Update Opportunity: pipeline = AI Architect Elite Pipeline, stage = Paid · Contract Out, status = Open, opportunity value = elite_contract_value
  7. If/Else on launchpad_grad: Yes branch → Add Contact Tag [AI Elite] Launchpad Grad. Both branches continue to the next step.
  8. If/Else on elite_plan_type, four branches. In EACH branch add the matching Plan tag, then add [AI Elite] Ops: Intake Done, then End: PIF → [AI Elite] Plan: PIF · 2-Pay (in-house) → [AI Elite] Plan: 2-Pay · 3-Pay (in-house) → [AI Elite] Plan: 3-Pay · External Financing (via Whop) → [AI Elite] Plan: Financed. On the None branch: Slack "plan type missing on {{contact.name}}" + Add Task → Jasmine, due 1 hour (no Intake Done tag until fixed, which correctly holds the contract).
HT01Contract Send + Chase
TriggerContact Tag Added → tag = [AI Elite] Ops: Intake Done
  1. Add Contact Tag: [AI Elite] Closed: Contract Pending
  2. Action: Send Documents & Contracts → template = Elite Client Agreement, sender = Rone's user, mode = Send Directly, channels = Email + SMS
  3. Send SMS: agreement-just-landed text ("takes 2 minutes, a laptop works best")
  4. Wait 3 hours → Send Email: nudge #1
  5. Wait 21 hours → Send SMS + Send Email: nudge #2, and Add Task → Jasmine: "Call {{contact.name}}, contract unsigned 24h", due 4 hours
  6. Wait 24 hours → Slack: "⚠️ 48h unsigned: {{contact.name}}" + Add Task → Rone: "Personal SMS/video nudge", due 12 hours
  7. Wait 24 hours → Send Email: final nudge + Slack: "🚨 {{contact.name}} going into kickoff unsigned (Rone pre-call check applies)"
  8. Wait 4 days → Add Task → Rone + program owner: "Day 7 unsigned. If no kickoff was held either, decide per ghost policy. Never auto-refund." + Slack ping
  9. Last step — Goal Event: type = Document/Contract Status, template = Elite Client Agreement, status = Completed, behavior = Wait until the goal is met. The moment the signature lands, the contact skips every remaining chase step and lands here.

Reminders re-share the SAME document link. This workflow must never contain a second Send Documents & Contracts action.

HT02Welcome & Access
TriggerDocuments & Contracts → status = Completed, template = Elite Client Agreement
  1. If/Else: contact has tag [AI Elite] Closed: Contract Signed → End (status changes fire this trigger more than once; this stops double-sends). Continue on else.
  2. Remove Contact Tag: [AI Elite] Closed: Contract Pending · Add Contact Tag: [AI Elite] Closed: Contract Signed
  3. Create/Update Opportunity: stage = Signed · Onboarding, status = Won
  4. Slack: "✍️ {{contact.name}} signed · {{contact.elite_price_paid}} · {{contact.elite_plan_type}}"
  5. Send Email: welcome email (contains the Inner Circle Skool invite link, next-24-hours plan, roadmap, bonus reveal, billing-descriptor line)
  6. Send SMS: welcome text from Rone's number, Skool invite link repeated
  7. Send Email: intake form link (goals, background, tools)
  8. Add Task → Rone: "Record 60-90s personal welcome video for {{contact.name}}", due 24 hours
  9. If/Else: contact has tag [AI Elite] Onboarding: Call Booked? YES branch: Wait 24 hours → Add Task → Jasmine: "SOP-3: verify {{contact.name}} joined Skool", due 4 hours → End. NO branch: Add Contact Tag [AI Elite] Onboarding: Booking Needed → Wait 24 hours → same SOP-3 task → End.

Verify after the test sale: the signed PDF appears on the contact record automatically (native behavior, but confirm it).

HT03bOnboarding Booking Detector
TriggerAppointment Status → calendar = Elite Onboarding, status = Confirmed/Booked. Do NOT add a Modified By filter (Jasmine's staff bookings must count; the "Customer Booked Appointment" trigger would silently miss them).
  1. Add Contact Tag: [AI Elite] Onboarding: Call Booked
  2. Remove Contact Tag: [AI Elite] Onboarding: Booking Needed
HT03Onboarding Booking Guard
TriggerContact Tag Added → tag = [AI Elite] Onboarding: Booking Needed
  1. If/Else: contact has tag [AI Elite] Onboarding: Call Booked → End. Continue on else.
  2. Send Email: Elite Onboarding calendar link ("lock your kickoff, we hold your build slot")
  3. Wait 24 hours → Send SMS: calendar link nudge
  4. Wait 24 hours → Add Task → Jasmine: "Call {{contact.name}} and book the kickoff by phone", due 4 hours
  5. Last step — Goal Event: type = Appointment, calendar = Elite Onboarding, status = booked/confirmed, behavior = Wait until the goal is met.
S02Show-Up Machine
TriggerAppointment Status → calendar = sales calendar, status = Confirmed/Booked. No Modified By filter.
  1. Add Contact Tag: [AI Elite] Booked Call
  2. If/Else on lead grade: has tag [AI Elite] Lead: NQL → Create/Update Opportunity stage = Call Booked: NQL. Else → stage = Call Booked: SQL. Both branches continue.
  3. Send Email: confirmation (calendar file, what to have ready, Rone expectation video link)
  4. Send SMS: "Reply C to confirm your spot" (replies route to Jasmine)
  5. Wait → Event/Appointment Time, 48 hours before → Send Email: reminder
  6. Wait → 24 hours before → Send Email + Send SMS
  7. Wait → 4 hours before → Send SMS
  8. Wait → 1 hour before → Send SMS with the Zoom link
S02bMorning-Of Confirmation SMS
TriggerAppointment Status → calendar = sales calendar, status = Confirmed (add Booked as a second status if you want it to arm at booking time)
  1. Wait #1: Add Action → Wait. Wait Type = Event/Appointment Time. Reference = Appointment Start Time. Before/After = Before. Duration = 20 hours. This lands the contact in the afternoon or evening of the day before the call.
  2. Wait #2: Add a second Wait immediately after. Restrict it to a time window of 09:00 – 09:30. Depending on your GHL version this is a Wait Type called "Time Window", or a setting inside the Wait step labelled "wait for a specific time of day" / "only continue during these hours".
  3. Send SMS: morning-of confirmation naming the appointment time, asking for a YES reply. Merge fields available: {{contact.first_name}}, {{appointment.start_time}}.
Two things to watch

Leave the existing 30-minutes-before reminder exactly as it is. This workflow is additive.

This breaks for calls booked before roughly 9:30am, where the SMS would land after the call has happened. If the sales calendar never opens before 10am, ignore it. If it does, add an If/Else as the first step: appointment time before 10am → send the SMS 2 hours before instead of running the two waits.

If your account has no time-window option on the Wait step, stop and flag it rather than improvising: the fallback is a single Event/Appointment Time wait tuned per booking slot, and it needs to be specified properly.

S02cConfirmation Reply Handler
TriggerCustomer Replied → message contains "yes"
  1. Add Contact Tag: [AI Elite] Ops: Confirmed Attending
  2. Notify the closer: internal SMS to Jasmine, or a Slack message to #elite-pipeline.

This is what makes asking for a reply worth anything: anyone still untagged an hour before their call is the no-show risk list to work. Do not ship the S02b SMS without this.

S03No-Show Recovery
TriggerAppointment Status → calendar = sales calendar, status = No Show (Jasmine marks it right after the missed slot)
  1. Add Contact Tag: [AI Elite] Booked Call: No Show
  2. Create/Update Opportunity: stage = No Show
  3. Send SMS (immediately): "We held your spot, grab a new time" + rebook link
  4. Add Task → Jasmine: "Call no-show {{contact.name}}", due 1 hour
  5. Send Email: same-day recovery email
  6. Wait 1 day → Send SMS · Wait 2 days → Send Email · Wait 4 days → Send Email (final)
  7. Create/Update Opportunity: stage = Not Now · Nurture + Add Contact Tag [AI Elite] Nurture: Not Now
  8. Last step — Goal Event: type = Appointment, calendar = sales calendar, status = booked/confirmed, behavior = Wait until the goal is met (a rebooked call ends the recovery instantly; S02 takes over and re-files the opportunity into the Call Booked stage matching its lead grade).

3.8 · The two P1 alarm workflows

AL-1Paid Unsigned 48h
TriggerStale Opportunities → pipeline = AI Architect Elite Pipeline, duration = 2 days
  1. If/Else: opportunity stage = Paid · Contract Out → Slack: "🕳️ 48h in Paid · Contract Out unsigned: {{contact.name}}". Else End.
AL-2Signed Not Onboarded 3d
TriggerStale Opportunities → pipeline = AI Architect Elite Pipeline, duration = 3 days
  1. If/Else: opportunity stage = Signed · Onboarding → Slack: "🕳️ Signed 3 days, no kickoff held: {{contact.name}}" + Add Task → Jasmine, due 4 hours. Else End.

Build no other alarms in Phase 1.

Section 4

Slack

  • Create one Slack channel: #elite-pipeline. Wins and alarms both land here.
  • Settings → Integrations → connect the Slack workspace, authorize the channel. Use the native Slack premium action in every workflow step above (pennies at this volume). If premium actions are unavailable on this account, use a Slack incoming webhook + the workflow Webhook action instead; same messages.
  • Members: Rone, Jasmine, program owner.
Section 5

P1 test checklist

Run with a dedicated test contact before the first real buyer. Every box checks or Phase 1 is not done.

  • End-to-end test sale: Whop payment → New Sale form → contract → signature → welcome email/SMS → Skool link present → kickoff booked. Every Slack ping fires.
  • Merge-field render check on the contract for each of the four plan types.
  • Sign on desktop AND attempt on mobile; confirm the Completed status fires both ways.
  • Duplicate-template test: confirm nothing in any workflow can send a second document from Elite Client Agreement to one contact.
  • Unsigned chase: leave the test contact unsigned; confirm the +3h / +24h / +48h / +72h ladder, the "going into kickoff unsigned" Slack, and the day-7 decision task.
  • Signature mid-chase: sign at hour ~30 and confirm the contact jumps to HT01's goal and no later chase messages send.
  • Staff-booked appointments fire S02 and HT03b (book as Jasmine from the Calendars view, not the widget).
  • No-book pathway: signed sale with no kickoff booked → HT02 adds [AI Elite] Onboarding: Booking Needed, HT03 sends the self-book link, the +48h book-by-phone task fires, and self-booking ends HT03 via its goal.
  • Lead grading, NQL: submit a test application with financing = Yes (or readiness below 8). Confirm [AI Elite] Lead: NQL lands, then book a call and confirm the opportunity sits in Call Booked: NQL.
  • Lead grading, SQL: repeat with readiness 9 and financing = No. Confirm Lead: SQL and Call Booked: SQL.
  • Blank-answer default: submit an application with the readiness question left empty. It must grade NQL, not SQL.
  • Morning-of SMS: book a test appointment for tomorrow afternoon on a number you control. Confirm the SMS arrives at 9am AND the existing 30-minute reminder still fires.
  • Reply handler: reply YES to that SMS. Confirm [AI Elite] Ops: Confirmed Attending is applied and the closer is notified.
  • No-show marking fires S03 within 15 minutes; rebooking ends S03 and starts S02.
  • Signed PDF lands on the contact record and the buyer receives their emailed copy.
  • HT02 double-fire test: manually re-trigger the Completed status if possible and confirm the idempotency check blocks a second welcome.
  • Alarms: age a test opportunity in stages 5 and 6; confirm AL-5 and AL-6 fire and nothing else does.

Companions: Elite Build Overview (phases, indexes) and Elite Implementation Spec (full logic, risk register R1-R10, SOPs). If anything here seems to conflict with the Spec, the Spec wins; flag it before building.