Webhooks

A recurring charge succeeded

Sent when a recurring charge settles successfully. data is the Payment record; resourceId and data.subscriptionId are the parent subscription.

postWebhooksubscription.payment.succeeded

Payload

idstring uuid required

Unique id of this delivery (UUIDv7), mirrored in the webhook-id header and covered by the signature. Retries of the same event repeat this id, so use it to dedupe. A replayed event gets a new id — see sequence.

type'subscription.payment.succeeded' required

Identifies the event — one of the types listed under Webhooks. Also sent as the webhook-type header.

timestampstring date-time required

When the event occurred (ISO-8601 UTC, sub-second precision). This is the event's own time and is preserved on retries and replays — it is not the webhook-timestamp header, which is stamped per attempt and is what the signature covers.

sequenceinteger required

Monotonically increasing counter, per resourceId, starting at 1. Payment events share their parent subscription's counter. Apply an event only if its sequence is higher than the last one you applied for that resourceId; that discards both stale redeliveries and replays of old events. Also sent as the webhook-sequence header. Not guaranteed gap-free.

resourceType'subscription' required

The kind of resource this event is about. Always subscription.

resourceIdstring uuid required

The subscription this event concerns — always the subscription id, even for payment events, which route to their parent subscription.

Example payload

{
  "id": "019811b5-2ac0-7f37-a48d-6e1c95b30772",
  "type": "subscription.payment.succeeded",
  "timestamp": "2026-06-29T08:04:18.330967104Z",
  "sequence": 3,
  "resourceType": "subscription",
  "resourceId": "019807c2-6f2a-7b41-9c58-2f9c1a4b8d21",
  "data": {
    "id": "019811b5-2a44-7c19-9f03-5ac7e1b04d68",
    "subscriptionId": "019807c2-6f2a-7b41-9c58-2f9c1a4b8d21",
    "billedAmount": {
      "amount": "29.00",
      "asset": "USD"
    },
    "paidAmount": {
      "amount": "29.02",
      "asset": "USDC"
    },
    "balance": {
      "asset": "USD",
      "amount": "29.00",
      "feeBase": "0.26",
      "feeProvider": "0.03",
      "feeNetwork": "0.00",
      "feeTotal": "0.29"
    },
    "status": "SUCCEEDED",
    "paidAt": 1782720258,
    "cycleNumber": 2,
    "createdAt": 1782720252
  }
}

Response

Return any 2xx status to acknowledge receipt. Any other response (or a timeout) is treated as a delivery failure and retried.

Changes

Webhooks have no change history: a webhook is keyed by its event name rather than a path and method, so no recorded change can name it.