UPI AutoPay
Accept UPI AutoPay recurring payments on Recurly via Ebanx for Indian merchants — with mandate setup, QR code and App Intent authentication, and webhook-driven subscription lifecycle management.
Supported gateways
Definition
Key details
Use cases
Subscription plans — Combine Recurly's subscription management with Ebanx to offer UPI AutoPay for recurring billing in India.
Trial subscriptions — Let customers authorize their enrollment and complete a free trial period before their first charge.
UPI concepts
VPA (Virtual Payment Address)
A Virtual Payment Address (VPA) — for example, payer@bankname — uniquely identifies a customer's bank account in a UPI app without exposing their actual bank details. Recurly stores the VPA for future subscriptions, but the underlying payment method is stored in the UPI app, not with Recurly or the gateway.
QR Code and App Intent authentication
- QR Code — Allows customers to scan a code on desktop to authenticate.
- App Intent — Allows mobile users to authenticate by launching their UPI app directly, for customers who cannot scan a QR code.
UPI apps
Multiple consumer UPI apps exist — including Google Pay, Amazon Pay, Paytm, and WhatsApp Pay — each with its own handle format (the @bankname portion of a VPA). See NPCI's third-party UPI apps for the full list. Each bank maintains its own consumer-facing UPI flow, which is not customizable by merchants.
UPI AutoPay limitations
UPI AutoPay is designed specifically for subscriptions and does not support many standard Recurly features available with credit cards.
- One-time transactions, force collections, and purchases are not supported.
- Forced trial conversions are not supported — mandate creation and pre-notification requirements prevent early conversion. Upgrades that create an immediate charge are also not supported.
- Creating subscriptions through the Recurly Admin UI is not recommended — UPI requires a customer to be in session to confirm the subscription.
- When using QR Code or App Intent authentication, billing info is not stored in Recurly — updates must be made in the UPI app directly. If a customer changes their bank or has a major financial change, they must resubscribe.
- Renewal date changes are not supported after enrollment — UPI mandates are strict about the charge date. Modifying the renewal date after signup causes declines. Calendar billing and aggregation features are not supported.
- UPI Checkout and Hosted Payment Pages are not currently supported.
- 100% coupons during signup are not supported — e-mandate creation is required. Use a free trial instead. Standard coupons are supported.
Customer actions in the UPI app
Customers interact with their subscription through their UPI app:
- Confirm enrollment — Required for every new subscription. Without confirmation, the subscription expires and the transaction fails.
- Pre-debit notification — Customers receive a push notification 48 hours before each charge, giving them the opportunity to pause or cancel. This notification is sent for every charge for the lifetime of the subscription and is not customizable.
- Transactions ≥ 15,000 INR — Customers must confirm these within one hour of receiving the push notification.
- 2FA for amounts > 15,000 INR — Customers receive a push notification for confirmation per their specific UPI app's design.
- Pause or cancel — Customers can pause or cancel subscriptions directly from their UPI app. Recurly is notified via webhook.
Mandate setup
All UPI AutoPay transactions require an associated mandate. Key mandate details:
Mandate amounts are calculated from three factors:
- Base plan amount (fixed amount or highest ramp price)
- Taxes, if any (for free trials, the effective tax rate for the customer is used)
- 18% tolerance added to base plan + taxes
Discounts are excluded from mandate amounts to ensure future payments succeed even when the first payment is discounted.
Mandate expiration dates are set to the plan billing term end date + 2 years. For rolling monthly plans (billing period of 1 with auto-renew), the mandate expires 2 years and 1 month from the sign-up date.
See mandate tolerances documentation for details.
Required fields
Always send the following with UPI AutoPay transactions:
- VPA (if using legacy VPA method)
- Type / Authentication Mode: QR or App Intent
- Customer email address
- Customer first and last name
- Customer billing address (street address, city, region/state, country, postal/PIN code)
- Street address — House/street name and number (e.g., HOUSE NO. 32, MG ROAD)
- City — Locality and city (e.g., VILLAGE OF AMARPUR, NEW DELHI)
- State — State or union territory (e.g., MAHARASHTRA)
- Postal code — PIN code (e.g., 110019)
- Country — Country code (e.g., IN)
- Customer phone number
Integration guide
UPI AutoPay is not supported on Recurly Checkout or Hosted Payment Pages. See the UPI AutoPay Integration Guide for full implementation details.
Creating subscriptions
Use the subscription or purchase endpoints to create UPI AutoPay subscriptions.
- VPA — Provide the VPA in Recurly's
payment_gateway_referencesobject withupi_vpaas the reference type. - QR / App Intent — Provide
type: upi-autopayand theauthentication_method. See the developer guide for authentication method details.
Billing information updates
UPI AutoPay doesn't support direct billing info updates in Recurly. Customers must update banking details in their UPI app. If a customer's VPA changes, cancel the existing subscription and have them re-enroll with the new VPA to create a new mandate.
Net terms and subscription updates
- Use Net Terms = 0 to avoid payment failures due to limited UPI charge windows.
- Avoid changing subscription prices on a fixed-price UPI mandate. If the price changes, cancel and re-create the subscription with new customer consent.
Enrollments and charges (webhooks)
UPI AutoPay is asynchronous — transactions begin in a Scheduled state until the customer authenticates in-app. Listen for the following webhooks:
At signup:
payment.scheduledsubscription.created
After customer authenticates in-app:
payment.transaction_status_updatedpayment.successcharge_invoice.paid
When the invoice moves to Paid, that indicates successful customer authentication from the UPI app.
Unconfirmed or rejected enrollments
If the customer rejects the enrollment or doesn't respond to the in-app notification, the subscription moves to Expired and the invoice/transaction fails. Listen for:
subscription.expiredcharge_invoice.failed
Cancellations
If a customer cancels via their UPI app, Recurly receives a webhook and automatically cancels the subscription. See automatic subscription cancellations for details.
Listen for: subscription.canceled
Paused subscriptions
If a customer pauses via their UPI app, Recurly receives a webhook and automatically pauses the subscription.
Listen for: subscription.paused
Resumed subscriptions
A customer may resume a paused subscription directly in their UPI app. Recurly sends a webhook and resumes the subscription automatically. If you'd prefer not to allow resumption after a pause, cancel the subscription when you receive the pause webhook.
Listen for: subscription.resumed
Retries
UPI AutoPay retries occur within UPI timeframes (12:00 AM – 7:00 AM IST) on the same day as the initial failure. See the Static Retries documentation for UPI-specific retry strategy details.
Testing
Refer to the Ebanx gateway documentation for testing procedures.
Checkout flow
Initial signup
Collect authentication details
Allow the customer to provide their VPA (if using legacy method), or present a QR code or App Intent link depending on your chosen authentication method. Pass the details to Recurly using the documented gateway token parameters. Confirm INR currency and applicable pricing are set up correctly.
Renewals
Renewals occur per plan settings unless the customer pauses or cancels from their UPI app.
Recommended webhooks
Listen for the following Recurly webhooks to stay in sync with customer-driven changes in the UPI app:
Mandate lifecycle:
- subscription.canceled — Fired when the customer cancels their UPI mandate externally.
- subscription.paused — Fired when the customer pauses their UPI mandate externally.
- subscription.resumed — Fired when the customer unpauses their UPI mandate externally.
Signup and enrollment:
charge_invoice.created— Sent on initial signup with no trial.charge_invoice.processing— Sent when enrollment has not yet been confirmed (no trial).charge_invoice.paid— Sent when enrollment is confirmed (no trial).charge_invoice.failed— Sent when enrollment is rejected by the customer (no trial).payment.transaction_status_updated— Sent when enrollment is confirmed (no trial).payment.scheduled— Sent when enrollment has not yet been confirmed (no trial).subscription.created— Sent when a subscription is created (with or without trial).subscription.expired— Sent when a customer does not confirm enrollment (with or without trial).
payment.scheduled and subsequent payment webhooks instead.FAQs
Do you support UPI QR Code or one-time transactions?
QR Code authentication is supported for subscription sign-ups. See the UPI AutoPay Integration Guide for details. One-time UPI transactions are not supported.
My UPI subscription is failing. How can I fix it?
Check the following:
- Confirm the subscription price hasn't changed without re-engaging the customer.
- Verify your Mandate Management settings. If set to Manual, you may have missed a webhook requiring a subscription status change.
- Confirm your customer is responding to UPI app push notifications, especially for charges above 100,000 INR.
- Check whether you've missed a pause or cancel webhook — your customer may have requested a change that requires action via API or the Admin UI.
I updated my customer's VPA on an existing subscription but the original bank account was charged. How do I fix this?
Billing info updates are not supported with UPI AutoPay. Cancel the current subscription and have your customer resubscribe with their new VPA to create a new mandate.