Webhook event: invoice.paid
The payload Cooledge sends when a payment is recorded against an invoice.
invoice.paid
Sent when an invoice is paid (a payment is recorded against it). payment_amount is this payment, amount_paid_total is the cumulative total and amount_due is the remaining balance. 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 |
|---|---|---|
invoice_id | string | UUID of the paid invoice. |
invoice_number | number | The internal invoice number. |
invoice_seq | number | The per-business sequence number for the invoice. |
total | number | The invoice total. |
payment_amount | number | The amount of this payment. |
amount_paid_total | number | The cumulative amount paid against the invoice. |
amount_due | number | The remaining balance after this payment. |
status | string | The invoice status after this payment. |
payment_method | string | How the payment was made, for example card or bank_transfer. |
payment_reference | string or null | A reference for the payment, when one was recorded. Null otherwise. |
payment_notes | string or null | Notes on the payment, when any were recorded. Null otherwise. |
job_id | string or null | UUID of the linked job, when one is set. Null otherwise. |
customer_id | string or null | UUID of the linked customer, when one is set. Null otherwise. |
paid_at | string or null | ISO 8601 timestamp the payment was recorded. Null when not recorded. |
external_ghl_contact_id | string or null | The matching GoHighLevel contact id, from the linked customer when one exists. |
external_ghl_opportunity_id | string or null | The matching GoHighLevel opportunity id, from the linked lead when one exists. |
customer_name | string or null | The customer's name from the live customer row. |
customer_email | string or null | The customer's email from the live customer row. |
customer_phone | string or null | The customer's phone from the live customer row. |
The customer_* and external_ghl_* fields are the shared correlation block, resolved from the live customer and lead rows.
Example
{
"version": "v1",
"event_type": "invoice.paid",
"event_id": "c6a2e904-3b59-4d27-9610-5f2d8a0c4b69",
"business_id": "a7f3c9d1-2e84-4b6f-8c01-5d9e2a1f7b30",
"occurred_at": "2026-06-17T11:02:48.117Z",
"invoice_id": "7d2c9e64-1a38-4b05-8f72-3e1a0c5d9b48",
"invoice_number": 1042,
"invoice_seq": 58,
"total": 2310.00,
"payment_amount": 1000.00,
"amount_paid_total": 1000.00,
"amount_due": 1310.00,
"status": "partial",
"payment_method": "bank_transfer",
"payment_reference": "EFT-20260617-0042",
"payment_notes": "Part payment received, balance to follow.",
"job_id": "5c1a0e74-3d29-4b06-9f81-2e7a0c4d6b18",
"customer_id": "8c3e1a72-5d49-4b06-9f81-2e7a0c4d6b18",
"paid_at": "2026-06-17T11:02:48.117Z",
"external_ghl_contact_id": "x9TpL2mQ7sV4nB1k",
"external_ghl_opportunity_id": "pT8wK3rN6vM1jQ5d",
"customer_name": "Priya Nair",
"customer_email": "priya.nair@example.com",
"customer_phone": "+61498765432"
}
See webhooks for signature verification and delivery semantics, and all events.
Need a hand with an integration? Contact support