| Method | What the customer does | Future invoices |
|---|---|---|
| Payment link (default) | Pays a one-time hosted link | Each one needs a new link |
| UPI Autopay mandate | Authorizes a recurring UPI mandate once | Auto-charged, no customer action |
| Card mandate | Saves a card and authorizes recurring charges once | Auto-charged, no customer action |
Prerequisites
- Razorpay connection with invoice sync enabled. Set
sync_config.invoice.outbound: truewhen you connect Razorpay so future invoices sync automatically. - Customer
contact(phone number). A mandate registration is rejected without it ("The contact field is required"). The requirement comes from Razorpay’s authorization step, so setcontactwhen you create the customer if you plan to use autopay. - A plan and price in the currency you will charge. The examples below use
INR.
Register a mandate at checkout
Create a checkout session and includepayment_provider_config. This is what switches the session from a one-time payment link to a mandate registration.
payment_action.url, this time a Razorpay UPI Autopay authorization link:
payment_action.url. They authorize the mandate once in their UPI app.
payment_provider_config fields
| Field | Required | Description |
|---|---|---|
collection_method | Yes | Set to charge_automatically to register a mandate. Omit payment_provider_config entirely for the default one-time payment link. |
preferred_method | Yes | UPI for UPI Autopay, CARD for a card mandate. |
max_mandate_limit | Yes | Ceiling, in the major currency unit (e.g. rupees), for any single future auto-charge. Invoices above this are not auto-charged. |
Card mandate
A card mandate uses the same request. Changepreferred_method to CARD:
What happens after authorization
Once the customer authorizes, Razorpay confirms the mandate (token.confirmed) and captures the first payment (payment.captured). Flexprice marks the checkout session completed, activates the subscription, and finalizes the invoice — the same completion path as a one-time payment link.
From then on, every new invoice for that customer is checked for a usable saved token and charged automatically, with no further customer action. This applies to subscription renewals, and also to one-off invoices and wallet top-up invoices.
An invoice falls back to a normal Razorpay payment link when there is no usable saved token, or when the invoice amount exceeds max_mandate_limit. The fallback is automatic and safe to rely on — the customer receives a link to pay that invoice manually.
max_mandate_limit is a hard ceiling, not a soft warning. An invoice above it never auto-charges; it always falls back to a payment link. Set the limit high enough to cover your largest expected invoice.Gotchas
contactis mandatory to register a mandate. Collect it at customer creation — see Prerequisites.max_mandate_limitis a hard ceiling. Invoices above it fall back to a payment link rather than auto-charging. This is an intentional safety cap.- Currency casing. Send
currencyin any casing — Flexprice normalizes it to uppercase before calling Razorpay.
Razorpay Setup
Enable the webhook events, including the mandate events autopay needs.
Checkout Sessions API
Full field reference for the create session call.
Implementation Guide
End-to-end integration with webhook handling.

