GoHighLevel
This follows the three moves in How every recipe works.
Send new contacts
Section titled “Send new contacts”- In GoHighLevel, open Automation > Workflows and make a workflow. Trigger it with “Contact Created”, or “Form Submitted” for your quote form.
- Add a Custom Webhook action, set like this, with the body below:
| Setting | Value |
|---|---|
| Method | POST |
| URL | https://v2-api.callview.ai/api/v1/external/leads |
| Headers | Authorization = Bearer cs_live_... (your secret), Content-Type = application/json, Idempotency-Key = ghl-{{contact.id}}-create |
| Body | Raw JSON, with your campaign’s ID |
{ "campaign_id": "7c1f2b9e-4a3d-4e8f-9b21-5d6a7e8f9a01", "external_id": "ghl-{{contact.id}}", "phone": "{{contact.phone}}", "name": "{{contact.name}}", "email": "{{contact.email}}", "consent": { "source": "web_form", "agreed_at": "{{right_now.iso}}", "url": "https://example.com/quote" }, "call_now": true}Check the merge fields against your account: GoHighLevel’s names for them can differ. Use a date merge field that gives a full date and time, or a fixed date when you know it.
Update the contact when the call is over
Section titled “Update the contact when the call is over”- Make a second workflow with the Inbound Webhook trigger. Copy the address it gives you.
- Point a CallView webhook endpoint at that address, with
"events": ["call.completed", "lead.opted_out"]. - Send a sample with
POST /webhook_endpoints/{id}/testand{ "type": "call.completed" }, so GoHighLevel can see the fields. - Find the contact by
data.object.lead.external_id(minusghl-), then update it: putdata.object.outcomein a custom field, adddata.object.noteas a note, and add a tag such ascallview-interestedso your other workflows can act on it.
GoHighLevel can’t check our signature, so keep the inbound webhook address private.