Webhook Events
This page documents all webhook events and their payload structures.Available Events
Invoice Events
| Event | Description |
|---|---|
invoice.created | Fired when a new invoice is created |
invoice.updated | Fired when an invoice is updated (status change, payment, void) |
Contract Events
| Event | Description |
|---|---|
contract.created | Fired when a new contract is created |
contract.updated | Fired when a contract is modified |
contract.terminated | Fired when a contract is terminated or cancelled |
Customer Events
| Event | Description |
|---|---|
customer.created | Fired when a new customer is created |
customer.updated | Fired when a customer is modified |
Credit Events
| Event | Description |
|---|---|
credit.threshold_crossed | Fired when balance drops below a configured threshold |
credit.balance_depleted | Fired when a credit wallet balance reaches zero |
Event Payloads
All webhook payloads follow this structure:Invoice Events
invoice.created
Fired when a new invoice is created.When it’s triggered
- Invoice is manually created in the dashboard
- Invoice is created via API
- Invoice is auto-generated by a rolling contract
Payload
Invoice UUID
Human-readable invoice number (e.g., “INV-001”)
Invoice status:
Drafted, In Progress, In Transit, Paid, Cancelled,
RefundedTotal amount in cents (e.g.,
10000 = $100.00)Invoice date in
YYYY-MM-DD formatPayment due date in
YYYY-MM-DD formatOptional memo or notes on the invoice
URL to the payment portal where customer can pay (expires after 90 days)
Customer information
ISO 8601 timestamp when invoice was created
ISO 8601 timestamp when invoice was last updated
Example Payload
invoice.updated
Fired when an invoice is modified.When it’s triggered
- Invoice status changes (e.g., In Progress → Paid)
- Invoice is cancelled or refunded
- Invoice fields are updated
- Payment is applied to invoice
Payload
The payload structure is identical toinvoice.created. The status field reflects the new invoice state.
Example Payload (Invoice Paid)
Contract Events
contract.created
Fired when a new contract is created.When it’s triggered
- Contract is created from a plan via API
- Contract is created from a plan in the dashboard
- Contract is created via integrations (e.g., Stripe sync)
Payload
Contract UUID
Contract name
Contract start date in
YYYY-MM-DD formatContract end date in
YYYY-MM-DD format. Null for month-to-month contracts.Whether the contract is currently active
Whether auto-pay is enabled for this contract
Customer information
ISO 8601 timestamp when contract was created
ISO 8601 timestamp when contract was last updated
Example Payload
contract.updated
Fired when a contract is modified.When it’s triggered
- Contract fields are updated
- Auto-pay is enabled or disabled
- Contract dates are modified
Payload
The payload structure is identical tocontract.created.
Example Payload
contract.terminated
Fired when a contract is terminated or cancelled.When it’s triggered
- Contract is cancelled via API
- Contract is terminated in the dashboard
- Subscription is cancelled at end of billing period
Payload
The payload structure is identical tocontract.created. The isActive field will be false.
Example Payload
Customer Events
customer.created
Fired when a new customer is created.When it’s triggered
- Customer is created via API
- Customer is created in the dashboard
- Customer is created via integrations
Payload
Customer UUID
Public-facing customer ID (e.g., “cus_Hk7Lm9Np3Qr5Tv8X”)
Customer display name
Customer legal name
Customer tags for organization and filtering
ISO 8601 timestamp when customer was created
ISO 8601 timestamp when customer was last updated
Example Payload
customer.updated
Fired when a customer is modified.When it’s triggered
- Customer fields are updated via API
- Customer is updated in the dashboard
- Customer tags are modified
Payload
The payload structure is identical tocustomer.created.
Example Payload
Credit Events
credit.threshold_crossed
Fired when a credit wallet balance drops below a configured alert threshold.When it’s triggered
- Usage deductions cause the balance to fall below a threshold percentage of the High-Water Mark
- Each threshold only fires once until the balance recovers past it (partial reset)
Thresholds are calculated as a percentage of the High-Water Mark (HWM) —
the maximum balance ever reached in the wallet. This auto-scales with customer
growth. Default thresholds are 25%, 10%, and 0%.
Payload
Contract UUID associated with the credit wallet
Customer UUID
Customer display name
The threshold that was crossed, as a decimal (e.g.,
0.25 = 25%)Current wallet balance in cents
High-Water Mark (maximum balance ever reached) in cents
Current balance as a percentage of HWM (e.g.,
0.08 = 8%)ISO 8601 timestamp when the threshold was crossed
Example Payload
credit.balance_depleted
Fired when a credit wallet balance reaches zero. This is a special case ofcredit.threshold_crossed with threshold: 0.
When it’s triggered
- Usage deductions consume the remaining credit balance
- The wallet balance reaches exactly zero
Credit balances are updated in near-real-time as part of usage aggregation.
There is minimal delay between when usage depletes the wallet and when this
webhook fires.
Payload
Contract UUID associated with the credit wallet
Customer UUID
Customer display name
High-Water Mark (maximum balance ever reached) in cents
ISO 8601 timestamp when the wallet was depleted
Example Payload
Reference
Invoice Status Values
| Status | Description |
|---|---|
Drafted | Invoice is being prepared, not yet finalized |
In Progress | Invoice is finalized and ready for payment |
In Transit | Payment initiated, awaiting reconciliation |
Paid | Invoice has been fully paid |
Cancelled | Invoice has been cancelled |
Refunded | Invoice has been refunded |