Subscription webhooks are emitted from confirmed on-chain events. They use the same signing headers and retry behavior as order webhooks, but have their own envelope.

Envelope

Event types

Payment-success data

For subscription.payment_succeeded, use payment.grossAmount with token.symbol and token.decimals for the amount paid. The raw fields emitted by SubscriptionPaymentExecuted remain in data:
Amounts are token atomic units, not display decimals. Resolve token decimals from the plan configuration before presenting them to users. executor may be a Keeper address; it is not necessarily the payer.

Failure and lifecycle data

subscription.failed includes subscriptionId, cycleIndex, and reasonHash. The cancellation and expiry events include subscriptionId. Preserve the full raw payload for reconciliation because delivery order between distinct confirmed transactions is not a substitute for your own entitlement idempotency.

Retry behavior

SixPay retries non-2xx, network, and timeout failures. The same event may be delivered more than once, while a different event can refer to the same subscription. Return a 2xx response only after durable handling, or persist the event before queuing asynchronous work.