Webhook events reference
All webhook deliveries share the same envelope:
{
"event": "<event_code>",
"created_at": "2026-06-08T14:23:00.000Z",
"data": { ... }
}
The data object is event-specific and documented below.
Signature verification: see Webhooks concepts.
invoice.created
Fired when an invoice is generated — either at period close (arrears charges) or at subscription start (immediate charges), or when an add-on is applied.
{
"event": "invoice.created",
"created_at": "2026-07-01T00:01:00.000Z",
"data": {
"invoice": {
"id": "uuid",
"number": "INV-2026-0042",
"status": "outstanding",
"payment_status": "pending",
"invoice_type": "subscription",
"currency": "USD",
"subtotal_cents": 847,
"total_cents": 847,
"issuing_date": "2026-07-01",
"due_date": "2026-07-15",
"period_start": "2026-06-01",
"period_end": "2026-06-30",
"fees": [
{
"id": "uuid",
"fee_type": "charge",
"billable_metric_code": "mail_out",
"units": "640",
"amount_cents": 128,
"amount_currency": "USD",
"properties": { "amount": "0.0002" }
}
]
},
"customer": {
"id": "uuid",
"external_id": "emailfs_account_abc123",
"name": "Ali Yilmaz",
"email": "ali@acme.com"
},
"subscription": {
"id": "uuid",
"external_id": "emailfs_sub_abc123",
"plan_code": "emailfs-team"
}
}
}
What to do: initiate payment collection. Record the payment with
POST /v1/payments when confirmed.
payment.succeeded
Fired when a payment is recorded against an invoice via POST /v1/payments.
{
"event": "payment.succeeded",
"created_at": "2026-07-05T14:22:00.000Z",
"data": {
"payment": {
"id": "uuid",
"invoice_id": "uuid",
"amount_cents": 847,
"currency": "USD",
"provider": "stripe",
"provider_payment_id": "pi_3abc123",
"paid_at": "2026-07-05T14:22:00.000Z"
},
"invoice": {
"id": "uuid",
"number": "INV-2026-0042",
"status": "succeeded",
"payment_status": "succeeded",
"total_cents": 847,
"currency": "USD"
},
"customer": {
"id": "uuid",
"external_id": "emailfs_account_abc123"
}
}
}
What to do: update your system's payment records; resume any suspended services.
subscription.period_renewed
Fired when a billing period closes and a new one begins.
{
"event": "subscription.period_renewed",
"created_at": "2026-07-01T00:01:00.000Z",
"data": {
"subscription": {
"id": "uuid",
"external_id": "emailfs_sub_abc123",
"plan_code": "emailfs-starter",
"status": "active",
"current_period_start": "2026-07-01T00:00:00.000Z",
"current_period_end": "2026-07-31T23:59:59.000Z"
},
"customer": {
"id": "uuid",
"external_id": "emailfs_account_abc123"
},
"previous_period": {
"start": "2026-06-01T00:00:00.000Z",
"end": "2026-06-30T23:59:59.000Z"
}
}
}
What to do: reset any internal usage counters you maintain; send period summary emails if desired.
addon.applied
Fired when an add-on is applied to a customer via
POST /v1/addons/:id/apply.
{
"event": "addon.applied",
"created_at": "2026-06-15T10:30:00.000Z",
"data": {
"applied_add_on": {
"id": "uuid",
"add_on_code": "domain-transfer-com",
"add_on_name": ".com Transfer",
"amount_cents": 1296,
"currency": "USD",
"applied_at": "2026-06-15T10:30:00.000Z"
},
"invoice": {
"id": "uuid",
"number": "INV-2026-0043",
"total_cents": 1296,
"currency": "USD",
"invoice_type": "addon"
},
"customer": {
"id": "uuid",
"external_id": "hostco-account-789"
}
}
}
What to do: initiate payment collection for the add-on invoice.
invoice.payment_overdue_reminder_1
Fired by the dunning job when an invoice is 3 days past due_date (configurable in
driptab.yaml).
{
"event": "invoice.payment_overdue_reminder_1",
"created_at": "2026-07-18T00:00:00.000Z",
"data": {
"invoice": {
"id": "uuid",
"number": "INV-2026-0042",
"status": "overdue",
"total_cents": 847,
"currency": "USD",
"issuing_date": "2026-07-01",
"due_date": "2026-07-15"
},
"customer": {
"id": "uuid",
"external_id": "emailfs_account_abc123",
"name": "Ali Yilmaz",
"email": "ali@acme.com"
},
"days_overdue": 3
}
}
What to do: send a payment reminder email.
invoice.payment_overdue_reminder_2
Same shape as invoice.payment_overdue_reminder_1, fired at 7 days past due.
What to do: send a second, more urgent reminder. Optionally retry the payment method.
subscription.suspend_requested
Fired at the configured dunning threshold (default: 14 days past due). Driptab is requesting that your system suspend the subscription.
{
"event": "subscription.suspend_requested",
"created_at": "2026-07-29T00:00:00.000Z",
"data": {
"subscription": {
"id": "uuid",
"external_id": "emailfs_sub_abc123",
"plan_code": "emailfs-starter",
"status": "active"
},
"customer": {
"id": "uuid",
"external_id": "emailfs_account_abc123",
"email": "ali@acme.com"
},
"overdue_invoice": {
"id": "uuid",
"number": "INV-2026-0042",
"total_cents": 847,
"days_overdue": 14
}
}
}
What to do:
- Disable service access in your system.
- Call
POST /v1/subscriptions/:id/suspendto update the subscription status in Driptab. - Send a suspension notification to the customer.
subscription.terminate_requested
Fired at the configured dunning threshold (default: 30 days past due). Driptab is requesting permanent termination.
Same shape as subscription.suspend_requested, with days_overdue: 30.
What to do:
- Permanently terminate service access.
- Call
POST /v1/subscriptions/:id/terminate. - Send a termination notice to the customer.
Delivery guarantees
Webhooks are delivered at-least-once. Your endpoint should be idempotent — check
whether you have already processed an event before taking action. The event +
data.invoice.id (or equivalent resource ID) combination can serve as an idempotency
key.
Driptab retries failed deliveries (non-2xx or timeout) with exponential backoff. The first retry is approximately 5 minutes after the initial failure.