Webhook event: lead.converted
The payload Cooledge sends when a lead becomes an active opportunity.
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
| Field | Type | Notes |
|---|---|---|
lead_id | string | UUID of the lead that became an opportunity. |
customer_id | string or null | UUID of the linked customer, when one is set. Null otherwise. |
converted_via | string | What moved the lead into the opportunity stage: quote, job or manual. |
quote_id | string or null | UUID of the quote that converted the lead. Set when converted_via is quote, otherwise null. |
job_id | string or null | UUID of the job that converted the lead. Set when converted_via is job, otherwise null. |
external_ghl_opportunity_id | string or null | The matching GoHighLevel opportunity id. Agencies match lead events on this field. |
attribution | object | Marketing attribution captured with the lead: UTM parameters, click ids and a derived channel. An empty object when nothing was captured. |
form_id | string or null | UUID of the Cooledge form that captured this lead. Null when the lead did not come from a form. |
landing_page_id | string or null | UUID 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