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).
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.

