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.
No breaking changes. Recurrente sends both formats: the classic per-type one and the unified one. Your current integration keeps working untouched; you choose which to subscribe your endpoint to, and migrate whenever you want.
New events to configure
Subscribe your endpoint to these events from your Webhooks dashboard:
How it works
- Recurrente sends both formats for each 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 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).
Test mode delivers the unified event too: a paid test checkout (card 4242 4242 4242 4242) fires a simulated intent.succeeded of type payment to your test endpoints, alongside the legacy payment_intent.succeeded — so you can build and verify your intent.* handler before going live. Test mode only simulates card payments, so it never emits the other four types.
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.*, and setup_intent.* stay exactly the same — they’re not part of the unified Intent resource.

