Skip to content

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) to X-GHL-Signature (Ed25519) — Completed 2026-03-25 (Tooling & Auth Hardening phase). app/api/ghl_inbound.py now verifies Ed25519 signatures verified against GHL's published Ed25519 public key (hardcoded PEM in _GHL_ED25519_PUBLIC_KEY_PEM in ghl_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_URL env 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_failedURGENT: 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, or stable based 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; remove aeo-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_status is not complete
  • [ ] Segment: "Upsell Candidates" — Filter: aeo_visibility_score < 40 AND project complete
  • [ ] Segment: "Photos Needed" — Filter: tag aeo-photos-needed is present
  • [ ] Segment: "Readiness Critical" — Filter: tag aeo-readiness-critical is present