What You Get
- Contact sync — Import GHL contacts into Tuco with deduplication
- Owner mapping — Map GHL users to Tuco team members
- Tag sync — GHL contact tags imported automatically
- Custom field sync — Map GHL custom fields to Tuco custom fields or tags
- Campaign conditions — Use GHL tags in campaign branching and stop conditions
Connecting GoHighLevel
- Go to Integrations → CRM
- Enter your GHL API key and Location ID
- Click Test & Connect
- A full sync starts automatically
Only one CRM can be connected at a time. Disconnect HubSpot before connecting GHL.
Required API scopes
- Location access
- Contacts: search and read
- Tags: read location tags
Recommended scopes
- Users: read (for owner mapping)
- Custom fields: read (for field mapping)
- Contact tags: add/remove (for campaign automation)
- Conversations: create (for activity logging)
How it works
- First sync — imports all GHL contacts into a “GHL Import” list
- Incremental sync — every 15 minutes, syncs recently modified contacts
- Deduplication — matched by phone number
- Tags — GHL contact tags are imported into Tuco’s tag system
What syncs
| GHL Field | Tuco Field |
|---|
| firstName | First Name |
| lastName | Last Name |
| email | Email |
| phone | Phone |
| companyName | Company |
| tags | Tags |
| assignedTo | Owner (via mapping) |
Owner Mapping
Same as HubSpot — map GHL users to Tuco members.
- Integrations → CRM → Owner Mapping
- Map each GHL user to a Tuco member
- Save & Re-sync
Custom Field Mapping
Map GHL custom fields to Tuco tags or custom fields.
- Integrations → CRM → Property Mapping
- Select a GHL custom field
- Choose Tag or Custom Field target
- Save & Re-sync
Use a GHL contact tag to control which channel a lead’s outbound messages go out on. Tags are read live on every send (workflow action and conversation-provider / CloseBot), so they take effect immediately — no sync, no custom field, no reinstall.
| Tag on the contact | Effect |
|---|
forcefallback | Skip the iMessage check and send via the workspace’s configured fallback (SMS — Twilio / GHL / custom webhook). Use it for leads you already know aren’t on iMessage, or that you simply want on SMS. |
| (no tag) | Normal flow — try iMessage first, fall back only if the contact isn’t reachable on iMessage. |
The tag name is matched loosely (case-insensitive, ignoring spaces/dashes/underscores), so forcefallback, force-fallback, force_fallback, and Force Fallback all work.
forcefallback only changes the channel, not delivery. The lead must have a fallback
configured (Settings → When iMessage isn’t available). With no fallback set up the
send returns an error instead of silently delivering over iMessage. Add or remove the tag
any time to flip a lead between iMessage-first and SMS-only.
Using GHL Data in Campaigns
Stop conditions
- GHL tag — stop if contact has/doesn’t have a tag (live API call)
Branching
- GHL has tag — branch based on GHL tags (live API call)
- GHL property — branch on custom field values
All GHL checks call the live GHL API, not cached data.
Available operators
When comparing GHL property values in stop conditions or branches, all standard operators are supported:
| Operator | Label | Use case |
|---|
eq | equals | Exact match |
neq | not equals | Exclude a value |
contains | contains | Partial text match |
not_contains | does not contain | Exclude partial match |
starts_with | starts with | Prefix match |
gt / gte | greater than (or equal) | Numeric comparison |
lt / lte | less than (or equal) | Numeric comparison |
gt_date / lt_date | after / before date | Date comparison |
exists / not_exists | exists / is missing | Check if field has a value |
Goal Bot integration
GHL tags and custom fields can be used as advance or exit conditions in Goal Bots. When a Goal Bot checks GHL data, it calls the live API — the same way campaigns do.