Migrate to Unified Webhooks (intent.*)
Migrate to Unified Webhooks (intent.*)
Recurrente unified all payment events into a single format: intent.*. Instead of a separate event per payment method (payment_intent.*, bank_transfer_intent.*, etc.), you receive one intent.* event with a common structure, discriminated by the type field. You write one handler instead of one per type.
Existing accounts keep their contract. This guide is for accounts receiving both formats that want to migrate their integration. New accounts receive only the unified event when a replacement exists; they do not need to unsubscribe from the legacy duplicate.
To recognize payments stored before migration, match legacy_id against the old per-type ID. Once linked, id and receipt_number identify the same payment across both formats. Keep the event type too: a later status change is not a duplicate.
New events to configure
Subscribe your endpoint to these events from your Webhooks dashboard:
How it works
- For existing accounts, Recurrente still sends both formats for each supported payment: the legacy per-type one (
payment_intent.*, etc.) and the unified one (intent.*), as separate deliveries. - In your Webhooks dashboard, subscribe your endpoint to the
intent.*events you care about. - Your handler branches on the
typefield and processes.
If your account keeps both formats and your endpoint doesn’t filter by event type, it will receive both payment_intent.* and intent.* for the same payment. To avoid processing the same charge twice, subscribe to only one of the two formats (or check the event_type field in your handler).
A Sandbox lets you verify your intent.* handler without moving real money: a paid Sandbox checkout (card 4242 4242 4242 4242) fires intent.succeeded of type payment to that Sandbox’s endpoints. Sandboxes created before this change also receive the legacy payment_intent.succeeded.
The unified payload
The envelope and common core are identical for all five types; only type and the details contents change. See the full structure in the Webhooks documentation.
Mapping: legacy → unified
Intermediate card states (requires_capture, requires_verification) are normalized to pending. The concrete state is always available in raw_status.
Migration steps
- Review the new payload. Look at the structure in the Webhooks documentation, or fetch a real payment with
GET /api/intents/{id}(returns the same format as the webhook). - Update your handler to consume
intent.*and branch ontype: - Subscribe your endpoint to the
intent.*events from the Webhooks dashboard. - (Optional) Unsubscribe from the per-type events. Once your unified handler works, unsubscribe from
payment_intent.*,bank_transfer_intent.*, etc., to stop receiving the duplicate format.
Events that don’t change
subscription.*, refund.*, dispute.*, automated_bank_transfer_intent.*, and setup_intent.* stay exactly the same — they’re not part of the unified Intent resource.

