Skip to content

Ghl

Agency PIT vs Sub-Account PIT — Different Scopes

From legacy section: GHL MCP

Pattern: Created a PIT at the agency level (22 scopes). It could read location metadata but returned 401 on all sub-account endpoints (contacts, calendars, pipelines, custom fields). Had to create a separate sub-account PIT (139 scopes) for full CRM access. Rule: Agency-level PITs are for cross-account operations (listing locations, creating sub-accounts). Sub-account PITs are required for working with contacts, conversations, calendars, pipelines, and all CRM data. Keep both — use ghl-agency for account management and ghl-evolve (or ghl-clientname) for CRM work. Date: 2026-03-31



GHL MCP Has No Workflow or Calendar List Endpoints

From legacy section: GHL MCP

Pattern: Tried to list calendars and read/create workflows via the GHL MCP. Neither endpoint exists — had to ask Jim to screenshot workflows and grab calendar IDs from the GHL UI. Rule: GHL workflows must be built in the visual builder UI — no API access. Calendar IDs must be grabbed from the GHL URL bar or UI. The MCP covers contacts, conversations, pipelines, emails, social posting, blogs — but NOT workflow CRUD or calendar listing. Date: 2026-03-31



FB Lead Forms Cannot Be Edited After Creation

From legacy section: GHL MCP

Pattern: Needed to add a thank-you URL to an existing FB lead form. Discovered lead forms are immutable after creation — must duplicate and recreate. Rule: When building FB lead forms, get everything right before saving: fields, thank-you screen URL, tracking parameters. If changes are needed later, duplicate the form and swap it on the ad. Date: 2026-03-31



Hidden Email Field + Hardcoded Calendar URL = Orphan Contacts

From legacy section: GHL MCP

Pattern: FB Lead captured correctly in GHL with full data. Workflow SMS sent hardcoded calendar URL (no URL params). Lead clicked, booked, but booking form had Email set to "Hidden" with no URL param to populate it → calendar submitted with blank email → GHL couldn't match to existing contact → created duplicate blank contact with source = [calendar name]. Original FB contact orphaned as "not booked." Evolve's own electrician campaign had 8 blank contacts over a month from this. Rule: Never rely on hidden form fields alone. Either (1) make email/name/phone visible + required on the booking form, OR (2) use a GHL Trigger Link as the calendar URL with ALL contact merge fields in the destination: ?first_name={{contact.first_name}}&last_name={{contact.last_name}}&email={{contact.email}}&phone={{contact.phone}}. Best practice: do both (visible fields + trigger link for prefill). Date: 2026-04-19



From legacy section: GHL MCP

Pattern: Tried to add contact URL parameters to calendar link in SMS. Full URL was 135+ chars and ugly. Thought we had to choose between clean URL and merge field prefill. Rule: Use GHL Trigger Links (Marketing → Trigger Links). Destination URL can be the full ugly version with merge fields; lead sees a clean short URL (services.msgsndr.com/urls/l/XXX). GHL substitutes merge fields server-side at send time. Bonus: click tracking built in. Date: 2026-04-19



{{contact.business_name}}{{contact.company_name}}

From legacy section: GHL MCP

Pattern: Used {{contact.business_name}} in a Slack notification template. Rendered blank. Custom field with that name existed in account (leftover from old form) but nothing wrote to it. Rule: Always use standard GHL fields where they exist. Business Name on forms should map to company_name (standard) via the form's Query Key, regardless of what the visible label says. Merge tag is {{contact.company_name}}. Custom "business_name" fields are silent failures. Similarly: prefer {{contact.first_name}} {{contact.last_name}} over {{contact.name}} — the latter often doesn't resolve. Date: 2026-04-19



Contact Created + Source=Facebook Scales Across Verticals

From legacy section: GHL MCP

Pattern: Built FB nurture workflow with trigger "Facebook Lead Form Submitted" + filter on specific form name. When planning to add a chiropractor campaign alongside electrician, the same workflow wouldn't fire for the new form — would require duplicating the entire workflow. Rule: For multi-vertical FB ad campaigns, trigger on Contact Created with a condition branch Source = Facebook, NOT Facebook Lead Form Submitted + Form Name. The first scales to any new form/vertical automatically. The second requires maintaining a form allowlist as campaigns expand. Also: Source = Facebook catches Instagram Lead Ads via the same mechanism — no separate workflow needed. Date: 2026-04-19



"Remove from Workflow" > Per-Step Exit Checks

From legacy section: GHL MCP

Pattern: Initially designed non-booked nurture with "If booked, exit" condition checks before every message step. Jim's Lead Booked workflow already had a "Remove from Workflow" action targeting the nurture sequences. Rule: When you have a terminal event (booking, purchase, etc.), handle the exit in the TERMINAL workflow via "Remove from Workflow" action targeting upstream workflows. Don't sprinkle per-step exit checks through upstream workflow. Active removal > reactive tag-checking, and it's one point of maintenance vs. many. Place the Remove from Workflow as the FIRST action in the terminal workflow so upstream messages stop immediately. Date: 2026-04-19



Turn Off Native GHL Calendar Confirmation Email if Using Workflow Email

From legacy section: GHL MCP

Pattern: Booked leads get two confirmation emails in the same minute — GHL's native calendar confirmation AND the branded workflow confirmation. Looks amateur. Rule: When building a Lead Booked workflow with a branded confirmation email, go to Calendar → Notifications & Additional Options → turn OFF the native "Booking Confirmation Email." Keep the native calendar invite (for Meet link delivery) but disable the confirmation email. Date: 2026-04-19