ClearTalk
Integrations

GoHighLevel

Connect ClearTalk and GoHighLevel both directions — call results into GHL workflows, and GHL leads triggering calls and texts.

GoHighLevel (LeadConnector) pairs with ClearTalk in four ways. The first two use webhooks and work on any GHL plan that includes the relevant workflow features; the last two use the native connection.

GoHighLevelsends toClearTalk

  1. 1.A new lead lands in GoHighLevel.
  2. 2.A workflow posts the lead's details to your campaign's trigger address.
  3. 3.ClearTalk creates or updates the contact and the agent calls or texts within seconds.

ClearTalksends toGoHighLevel

  1. 1.The conversation ends and the AI writes up the result.
  2. 2.ClearTalk posts it to a workflow you've pointed it at.
  3. 3.The workflow updates the contact, adds the notes, and moves the opportunity.
The two webhook recipes. They're independent — set up either, or both.

Native connection

For contact sync and calendar booking, first connect GoHighLevel under Integrations → CRM in your ClearTalk dashboard — click Connect on the LeadConnector tile and sign in. The webhook recipes below don't require the native connection.

1. Send call results into GoHighLevel

After every call, ClearTalk can post the result — caller, outcome, AI notes, transcript, recording link — to a GHL workflow.

Create the receiving workflow in GHL

In GoHighLevel: Automation → Workflows → new workflow → choose the Inbound Webhook trigger. GHL shows a unique URL — copy it. (The Inbound Webhook trigger is a premium workflow feature on GoHighLevel; check that your plan includes it.)

Point ClearTalk at it

In ClearTalk: Integrations → Send data to your system. Add a destination with the GHL URL and subscribe it to call completions (an empty event selection means all events).

Place one real call to map from

Make a short call through your agent, then open the workflow's trigger in GHL — it now has a real sample payload to map fields from.

Map from a real call, not the test button

The Send test data button in ClearTalk sends a synthetic payload whose field names differ from a real call result. A GHL mapping built on the test sample will not match live traffic. Use a real call.

Map the fields and add actions

Typical mapping:

ClearTalk fieldUse in GoHighLevel
to / from (with inbound telling you which is the customer)Find or create the contact
ai_analysis.call_outcomeIf/Else branch → move pipeline stage, apply tags
ai_analysis.call_notesAdd a note on the contact
ai_analysis.appointment_date_timeCreate or verify the appointment
concatenated_transcriptThe note body for reps to skim
recording_urlA custom field linking to the audio

Then publish the workflow, place one more call, and watch the chain run.

Full field documentation, delivery signing, and retry behavior: see the webhook reference. Two things to know up front: payload encryption must be off for GHL to read the data, and a delivery GHL rejects is not retried automatically (use Webhook Logs in your dashboard to inspect and resend).

2. Trigger a ClearTalk call when a lead arrives in GHL

The reverse direction: new lead in GHL → a workflow posts the lead to ClearTalk → your agent calls them within seconds.

Every calling campaign's edit page has a Trigger Instructions panel showing its exact URL and a copyable example — the shape is:

curl -X POST "https://backboard.cleartalk.ai/api/public/calls/trigger/YOUR_CAMPAIGN_ID" \
  -H "X-API-Key: ct_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+15551234567",
    "first_name": "Jamie",
    "last_name": "Rivera",
    "email": "jamie@example.com",
    "custom_fields": { "property_address": "12 Oak Lane" }
  }'

In GHL, add a Webhook action to your new-lead workflow with that URL, method POST, the X-API-Key header, and the lead's fields in the body — mapping GHL's own merge fields ({{contact.phone}}, {{contact.first_name}}, and any custom field on the contact) into the matching keys.

Only phone is required. Everything else is optional, and everything else makes the call better.

Whatever you send arrives as a variable the agent can use by name — no mapping step on the ClearTalk side, nothing to configure first. Post property_address in custom_fields and your agent's instructions can say:

You're calling {{first_name}} about the property at {{property_address}}.

Each field is offered in both snake_case and camelCase, so GHL's spelling doesn't have to match yours. Full details, including what happens to a misspelled variable: using what you sent.

Matching custom_fields to the field picker

Once GoHighLevel is connected, the agent and campaign forms' Variables button lists your location's contact fields — standard ones under From your CRM, everything else under Custom fields. This only works one direction: ClearTalk reads the field's name, not its value, so it can show you what to call it. Sending the value is still your workflow's job.

Two places a value can travel. Nested under custom_fields, as shown above, or as a plain top-level key alongside phone. Any top-level key ClearTalk doesn't already use for something else is collected as a custom field, so a GHL webhook that posts the contact record flat works without reshaping it first. The names already spoken for are phone, first_name, last_name, full_name, email, list_name, tags and custom_fields, plus task_override on a call trigger and message_override, timezone, segment_tag and consent on a text trigger — send one of those at the top level and it's read as itself, not as a custom field. A top-level value also has to be a simple one (text, a number, or true/false); a nested object or a list is skipped there, because neither has a sensible form to drop into a sentence. Inside custom_fields values are taken as sent, and if the same key appears in both places the custom_fields copy wins.

The key you push must match the field name shown in the picker, snake_cased, or the merge field won't resolve — a GHL field named "Property Address" expects property_address, either way you send it.

Custom fields need a reconnect. Reading them requires a permission that wasn't part of the original LeadConnector authorization. If your GoHighLevel connection predates this, its Custom fields group will be empty until you disconnect and reconnect it under Integrations → CRM. The From your CRM group needs no reconnect, and for a GoHighLevel location it lists Company Name, Address, City, State, Postal Code, Country, Website and Source.

Name, Email and Phone aren't in that group, and nothing is broken. First name, Last name, Full name, Email and Phone resolve on every send whether or not a CRM is connected, so the picker lists them once at the top under Contact rather than repeating them under From your CRM.

Why isn't my campaign dialing?

Standard calling and texting campaigns dial only when a lead is posted to their trigger URL — they don't work through a contact list on their own. If a campaign sits "active" doing nothing, it's waiting for triggers. (Batch campaigns are the exception; they dispatch themselves on schedule.)

  1. 1

    A lead appears in your system

    A form fill, a new CRM record, a row in a spreadsheet — wherever your leads arrive.

  2. 2

    Your system posts it to the campaign

    One request to that campaign's trigger address, carrying the phone number and anything else you want the agent to know.

  3. 3

    ClearTalk creates or updates the contact

    And the custom fields you sent become variables the agent can use by name.

  4. 4

    The campaign's agent calls or texts

    Within the campaign's working hours, using its agent and its follow-up rules.

  5. 5

    The result comes back to you

    Through the webhook, into whichever system you pointed it at.

Nothing happens until step 2. That's the part people miss.

Triggering a campaign covers the same thing from ClearTalk's side, including how to find the address and what's worth putting in custom_fields.

3. Text new GHL leads automatically

Same recipe, texting campaign URL instead:

POST https://backboard.cleartalk.ai/api/public/sms/trigger/YOUR_CAMPAIGN_ID

Identical body shape, plus two optional extras: consent (an object stored verbatim with the enrollment as your compliance record — see the texting compliance playbook) and timezone (IANA name; otherwise inferred from the lead's area code). The response tells you what happened: sent, enrolled in the message sequence, skipped_engaged (the lead is mid-conversation and won't be interrupted), or suppressed (opted out — not texted).

4. Book straight into a GHL calendar

With the native connection, no webhook mapping is needed for appointments: in your agent's calendar settings choose your connected GHL calendar as the calendar source, and the agent checks availability and books directly into GoHighLevel during the conversation.

Bookings made this way live in GoHighLevel, not on ClearTalk's Bookings tab — that's the point of choosing a CRM calendar. See Booking in conversations for how the agent handles time zones and unavailable slots.

5. Keep GHL's do-not-disturb in sync

Add a second webhook destination subscribed only to the opt-out event (sms.conversation.opted_out), pointed at a small GHL workflow that applies your DND tag. Every STOP reply in ClearTalk then flows into GoHighLevel automatically, so no other system texts that lead either.

On this page