Invoice and Credit Note Events
Three events cover invoicing. All three carry the same object shape; only the wrapping key and the event identifier differ.
| Identifier | Fires when | Payload key |
|---|---|---|
invoiceCreated |
An invoice is created. | invoice |
invoicePaid |
An invoice is paid. | invoice |
creditNoteCreated |
A credit note is created. | creditNote |
Webhook payload
{ "event": "invoiceCreated", "data": { "invoice": {} } }
A credit note uses the same structure under a different key:
{ "event": "creditNoteCreated", "data": { "creditNote": {} } }
invoice / creditNote
{ "id": "SW52b2ljZTo5ODc2", "companyId": "Q29tcGFueTo0MjA=", "companyName": "Acme Corp", "number": "INV-2026-00412", "currency": "USD", "grossAmount": 1650000, "netAmount": 1320000, "taxAmount": 330000, "date": "2026-09-01", "dueDate": "2026-09-15", "markedPaidAt": null, "paymentStatus": "due", "isBatched": true, "paymentRequestIds": [ "QmlsbDoxMjM0", "QmlsbDoxMjM1" ] }
| Field | Notes |
|---|---|
id |
Global ID of the invoice or credit note. |
companyId, companyName |
The company being invoiced. |
number |
The human-readable document number. |
grossAmount, netAmount, taxAmount |
Integers in minor units of currency. |
date, dueDate |
YYYY-MM-DD. |
markedPaidAt |
Timestamp in 24-hour time (YYYY-MM-DD HH:mm:ss), null until the invoice is marked paid. |
paymentStatus |
The invoice’s payment state. |
isBatched |
true when the invoice covers several payment requests. |
paymentRequestIds |
Global IDs of the payment requests billed, which link these events to the payment request events. |
originalInvoiceId |
Credit notes only. Present only when the credit note relates to an earlier invoice, and absent otherwise rather than null. |
Warning
originalInvoiceId is omitted from the payload when it does not apply, rather than being sent as null. Check for the key’s presence rather than its value.
Handling these events
- Amounts are in minor units, so
grossAmount: 1650000inUSDis $16,500.00. paymentRequestIdsis the join back to the work being billed. Use it to reconcile an invoice against the payment requests your system already knows about.- A batched invoice covers several payment requests, so do not assume one invoice maps to one engagement.
- For anything beyond these fields, call the GraphQL API with the IDs supplied. See Handle Webhooks.