GHL Integration Checklist¶
Status tracker for GoHighLevel automation build-out. For webhook event schemas and payload details, see
docs/internal/WEBHOOK_EVENTS.md.
0. Critical Migrations¶
- [x] ~~[DEADLINE: July 1, 2026]~~ Migrate inbound webhook auth from
X-GHL-Secret(HMAC) toX-GHL-Signature(Ed25519) — Completed 2026-03-25 (Tooling & Auth Hardening phase).app/api/ghl_inbound.pynow verifies Ed25519 signatures verified against GHL's published Ed25519 public key (hardcoded PEM in_GHL_ED25519_PUBLIC_KEY_PEMinghl_inbound.py).
1. Webhook Configuration¶
- [ ] Inbound webhook URL — Set purchase webhook URL in GHL automation:
POST /api/v1/webhooks/ghl/purchase— see WEBHOOK_EVENTS.md (inbound event) - [ ] Outbound webhook receiver — Create inbound webhook in GHL, copy URL to
GHL_WEBHOOK_URLenv var — see WEBHOOK_EVENTS.md for all outbound event schemas - [ ] Inbound auth — Ed25519 auth (primary): GHL's public key is hardcoded; no configuration needed. Legacy fallback: If GHL hasn't migrated this webhook yet, generate a shared secret (
openssl rand -hex 32), set in GHL header (X-GHL-Secret) and Railway (GHL_WEBHOOK_SECRET). Legacy path will be removed after July 1, 2026. — see SECRETS_INVENTORY.md - [ ] Test inbound webhook — Send test purchase curl and verify
200 OK - [ ] Test outbound webhook — Trigger pipeline event, verify GHL receives it in execution logs
2. Customer Email Automations¶
One automation per customer-facing event. Each triggers on the inbound webhook filtered by event field.
- [ ]
project_started— "We've started working on your pages!" welcome email — see WEBHOOK_EVENTS.md event #1 - [ ]
research_in_progress— "Our team is researching your market." progress email - [ ]
strategy_complete— "Your content strategy is mapped out." progress email - [ ]
content_writing_started— "We're writing batch N of your pages." progress email - [ ]
assembly_in_progress— "We're building and styling batch N of your pages." progress email - [ ]
batch_article_review_needed(customer) — "Content ready for review" email (Batches 2-5) - [ ]
batch_html_review_needed(customer) — "Pages ready for review" email (Batches 2-5) - [ ]
batch_ready_to_ship— "Ready to deploy" email with portal link - [ ]
content_approved— "Content approved, building your pages" confirmation email - [ ]
photos_upload_needed— "Upload Your Business Photos" email with link to /portal/photos - [ ]
photos_upload_needed→ SMS: Reminder to upload photos with portal link - [ ]
photos_complete— "Photos Received! Building Your Pages..." confirmation email; stop photo reminder sequence - [ ]
revision_started(customer) — "Your Feedback Is Being Applied" notification email - [ ]
revision_complete(customer) — "Revised Content Ready for Review" email - [ ]
revision_rejected(customer) — "Revision Update — Please Check Portal" email - [ ]
revision_failed(customer) — "Issue Processing Revisions — Team Investigating" email - [ ]
visibility_measured— "Your AI Visibility Score is in!" email with score — see WEBHOOK_EVENTS.md - [ ]
batch_visibility_measured— "Your Visibility Score for Batch {batch} Is Ready" email - [ ]
readiness_intake_complete— No customer email (operator-only informational event) - [ ]
consultation_requested— No customer email (operator-only; triggers internal consultation workflow) - [ ]
project_complete(customer) — "All your pages are live!" email — see WEBHOOK_EVENTS.md
3. Operator Notification Automations¶
Internal notifications for the ops team. Route to Slack, email, or GHL internal notification.
- [ ]
bi_review_needed— BI research complete, operator gate pending - [ ]
matrix_review_needed— Content matrix complete, operator gate pending - [ ]
batch_article_review_needed(operator) — Batch articles ready for operator review (Batch 1) - [ ]
batch_html_review_needed(operator) — Batch HTML pages ready for operator review (Batch 1) - [ ]
pipeline_failed— URGENT: Pipeline failed, check Railway logs — see WEBHOOK_EVENTS.md - [ ]
readiness_critical— Critical website readiness issues found; Slack/email alert with project link - [ ]
readiness_intake_complete— Website readiness check complete (informational) - [ ]
readiness_post_deploy_complete— Post-deployment readiness check finished; Slack summary for operator - [ ]
visibility_score_drop— Visibility score dropped, potential upsell — see WEBHOOK_EVENTS.md event #29 - [ ]
revision_proposal— Customer requested revisions — see WEBHOOK_EVENTS.md - [ ]
revision_approval_needed— Revision request needs operator approval - [ ]
revision_auto_approved— Revision auto-approved and executing (informational) - [ ]
revision_started(operator) — Revision executing for a batch - [ ]
batch_deployed— Batch deployment confirmed - [ ]
pages_deployed— Customer confirmed full deployment - [ ]
project_complete(operator) — All batches shipped - [ ]
consultation_requested— Customer requested a visibility consultation - [ ]
photos_gate_waiting→ Internal Slack/email notification to operator
4. Password Reset Automation¶
- [ ]
password_reset_requested— Send reset email with{{metadata.reset_link}}(15min expiry) — see WEBHOOK_EVENTS.md
5. Pipeline Stages¶
Create a GHL pipeline named "AEO Bunny Delivery" with these stages:
- [ ] Stage 1: Lead Captured — Purchase webhook fires, PendingLead created
- [ ] Stage 2: Onboarding — Customer fills intake form
- [ ] Stage 3: Content Generation — Pipeline running (automated)
- [ ] Stage 4: Customer Review — Content/pages ready for customer review
- [ ] Stage 5: Deployment — Customer uploading and confirming pages
- [ ] Stage 6: Live & Measuring — Pages live, visibility scans running
6. Custom Contact Fields¶
Add to GHL contacts:
- [ ]
aeo_project_id(Text) — Links to AEO Bunny project UUID - [ ]
aeo_product_tier(Dropdown) —starter_497,pro_997 - [ ]
aeo_pipeline_status(Dropdown) —onboarding,in_progress,content_review,deployed,complete - [ ]
aeo_visibility_score(Number) — Latest composite score (0-100) - [ ]
aeo_portal_url(URL) — Customer's portal login link - [ ]
aeo_photo_count(Number) — Number of photos uploaded by the customer - [ ]
aeo_photos_complete(Checkbox) — True when customer has uploaded 100+ photos - [ ]
aeo_revision_count(Number) — Number of revision rounds completed - [ ]
aeo_readiness_score(Number) — Latest composite website readiness score (0-100) - [ ]
aeo_visibility_trend(Text) —up,down, orstablebased on recent score delta
7. Email Templates to Design¶
- [ ] Welcome email — "We've started working on your pages!" (trigger:
project_started) - [ ] Research progress email — "Our team is researching your market." (trigger:
research_in_progress) - [ ] Strategy complete email — "Your content strategy is mapped out." (trigger:
strategy_complete) - [ ] Content writing started email — "We're writing batch N of your pages." (trigger:
content_writing_started) - [ ] Assembly in progress email — "We're building and styling batch N of your pages." (trigger:
assembly_in_progress) - [ ] Content review email — "Your content is ready for review" (trigger:
batch_article_review_needed) - [ ] Pages preview email — "Preview your finished pages" (trigger:
batch_html_review_needed) - [ ] Ready to deploy email — "Your pages are ready to deploy" (trigger:
batch_ready_to_ship) - [ ] Content approved email — "Great news, building your pages" (trigger:
content_approved) - [ ] Revision in progress email — "We're working on your revisions" (trigger:
revision_started) - [ ] Revision complete email — "Revised content ready for review" (trigger:
revision_complete) - [ ] Visibility score email — "Your AI Visibility Score is in!" (trigger:
visibility_measured) - [ ] Project complete email — "All your pages are live!" (trigger:
project_complete) - [ ] Password reset email — "Reset your password" (trigger:
password_reset_requested) - [ ] Deployment confirmed email — "Congratulations, you're live!" (trigger:
pages_deployed) - [ ] Visibility drop email — "Your visibility needs attention" (trigger:
visibility_score_drop) - [ ] Revision issue email — "There was an issue with your revisions" (trigger:
revision_failed) - [ ] Photos needed email — "Upload Your Business Photos" (trigger:
photos_upload_needed) - [ ] Photos received email — "Photos Received! Building Your Pages..." (trigger:
photos_complete) - [ ] Revision rejected email — "Revision Update — Please Check Your Portal" (trigger:
revision_rejected) - [ ] Batch visibility email — "Your Visibility Score for Batch {batch} Is Ready" (trigger:
batch_visibility_measured)
8. Tags & Segments¶
- [ ] Tag:
aeo-customer— Applied on purchase - [ ] Tag:
aeo-starter/aeo-pro— Product tier tags - [ ] Tag:
aeo-active-pipeline— Applied during content generation, removed on completion - [ ] Tag:
aeo-review-pending— Applied when content/pages await customer review - [ ] Tag:
aeo-photos-needed— Applied when customer has not yet reached 100-photo minimum - [ ] Tag:
aeo-photos-complete— Applied when 100+ photos received; removeaeo-photos-needed - [ ] Tag:
aeo-revision-pending— Applied when a revision request is awaiting operator approval - [ ] Tag:
aeo-revision-in-progress— Applied while revisions are being processed - [ ] Tag:
aeo-readiness-critical— Applied when readiness check finds critical issues - [ ] Tag:
aeo-visibility-drop— Applied when visibility score drops; triggers upsell sequence - [ ] Segment: "Active AEO Customers" — Filter:
aeo_pipeline_statusis notcomplete - [ ] Segment: "Upsell Candidates" — Filter:
aeo_visibility_score< 40 AND project complete - [ ] Segment: "Photos Needed" — Filter: tag
aeo-photos-neededis present - [ ] Segment: "Readiness Critical" — Filter: tag
aeo-readiness-criticalis present