Webhook events

Webhook event: lead.converted

The payload Cooledge sends when a lead becomes an active opportunity.

Updated 17/06/2026

lead.converted

Sent once when a lead becomes an active opportunity: the first quote or job is created for it, or it is qualified manually. This is the lead moving out of the new pile and into real work in progress. It does not mean the deal is won. The win is reported separately by lead.won. Delivered to your webhook subscriptions. Deliveries are at-least-once, so dedupe on X-Cooledge-Event-Id.

Envelope

Every event shares the flat envelope: event_type, version ("v1"), event_id, business_id, occurred_at, plus the fields below. See the events overview for the envelope detail and webhooks for signature verification and delivery semantics.

Fields

FieldTypeNotes
lead_idstringUUID of the lead that became an opportunity.
customer_idstring or nullUUID of the linked customer, when one is set. Null otherwise.
converted_viastringWhat moved the lead into the opportunity stage: quote, job or manual.
quote_idstring or nullUUID of the quote that converted the lead. Set when converted_via is quote, otherwise null.
job_idstring or nullUUID of the job that converted the lead. Set when converted_via is job, otherwise null.
external_ghl_opportunity_idstring or nullThe matching GoHighLevel opportunity id. Agencies match lead events on this field.
attributionobjectMarketing attribution captured with the lead: UTM parameters, click ids and a derived channel. An empty object when nothing was captured.
form_idstring or nullUUID of the Cooledge form that captured this lead. Null when the lead did not come from a form.
landing_page_idstring or nullUUID of the Cooledge landing page that captured this lead. Null when the lead did not come from a landing page.

These three fields were added on 29 July 2026. Events delivered before then do not carry them, so treat all three as optional.

The lead converts once. A lead that already has a quote or job does not re-emit this event when more work is added.

Example

{
  "version": "v1",
  "event_type": "lead.converted",
  "event_id": "c1a4e672-8b35-4d09-9f21-7e0c3a8d1b46",
  "business_id": "a7f3c9d1-2e84-4b6f-8c01-5d9e2a1f7b30",
  "occurred_at": "2026-06-17T04:42:18.205Z",
  "lead_id": "2f6d9a18-4c73-4e85-bf02-7a1e5c8d3b96",
  "customer_id": "8c3e1a72-5d49-4b06-9f81-2e7a0c4d6b18",
  "converted_via": "quote",
  "quote_id": "6a2c9e74-1d38-4b05-8f72-3e1a0c5d9b48",
  "job_id": null,
  "external_ghl_opportunity_id": "pT8wK3rN6vM1jQ5d",
  "attribution": {
    "channel": "google_ads",
    "utm_source": "google",
    "utm_medium": "cpc",
    "utm_campaign": "brighte-interest-free",
    "gclid": "Cj0KCQjw_7SzBhD..."
  },
  "form_id": null,
  "landing_page_id": "3a7f2d64-8e19-4c05-b72a-6d1e9f4c8b03"
}

See webhooks for signature verification and delivery semantics, and all events.

Need a hand with an integration? Contact support