With UPI Autopay, shoppers can link their bank account to a mobile app, allowing them to set up recurring payments via instant bank transfer. Shoppers can use one of a number of apps built by participating banks or third party app partners that support UPI Autopay. Refer to this comprehensive list.
Requirements
| Requirement | Description |
|---|---|
| Integration type | Make sure that you have an existing API-only integration. |
| Setup steps | To design your front-end, follow the recommended design guidelines to provide an optimal checkout experience to your shoppers on UPI Autopay. |
Special characters are not allowed by the acquirer.
All merchant-defined values, such as for merchantReference, shopperReference, and remarks, that you send to the various applicable API requests (like /payments and /payments/{paymentPspReference}/refunds must be alphanumeric.
Set up a billing plan
To initiate a billing plan for a shopper, you need to get shopper approval to create an Autopay mandate in their UPI app and store their payment details when the mandate is approved successfully . The UPI payment service provider and the issuing bank use this mandate to track the shopper's billing plan. This setup also enables the shopper to cancel the mandate directly from their UPI app.
| Field | Required | Description |
|---|---|---|
paymentMethod.type |
![]() |
Type of UPI flow. Possible values: upi_collect, upi_intent, and upi_qr. |
paymentMethod.virtualPaymentAddress |
![]() |
Required for upi_collect. Virtual Payment Address. A unique identifier used to let UPI connect to the shopper's bank account. |
paymentMethod.appId |
![]() |
Required for upi_intent. The ID of the Third Party Application that is used in intent flow. Possible values: gpay, phonepe, bhim, and paytm. If omitted or set to null, response returns a generic Android app drawer link (not supported on iOS). |
storePaymentMethod |
![]() |
Set to true to store shopper's payment details. |
shopperInteraction |
![]() |
Set to Ecommerce. |
recurringProcessingModel |
![]() |
Set to Subscription or UnscheduledCardOnFile. |
shopperReference |
![]() |
The shopper reference associated with the billing plan (minimum length three characters). |
reference |
Optional, must be alphanumeric when included. No space and special characters allowed. | |
amount.value |
![]() |
The first authorisation amount to charge the shopper in minor units. Note that this amount should be less than or equal to the mandate.amount and the first authorisation on this amount happens automatically within 5 minutes of successful mandate registration. If there is no amount to be charged during the signup (in case of free trails, tokenising shopper payment details etc.,) refer to handling free trials section |
amount.currency |
![]() |
Set to INR. |
mandate.amount |
![]() |
The maximum amount the shopper will be charged per recurring debit in minor units. Must be more than or equal to amount.value. The recurring charge does not need to go through authentication if the amount is less than or equal to INR 15,000. |
mandate.amountRule |
![]() |
Possible values: max and exact.
|
mandate.frequency |
![]() |
The frequency at which the shopper will be charged. Possible values: monthly, weekly and adhoc. Use adhoc if free trial or billing cycles differ. |
mandate.startsAt |
Current transaction date in YYYY-MM-DD format. Defaulted to the current date if not sent explicitly in the request. | |
mandate.endsAt |
![]() |
End date of the billing plan, in YYYY-MM-DD format. |
mandate.remarks |
![]() |
Limited to 20 characters, spaces allowed, but no special characters. Displayed in the shopper's UPI app (on supported apps), under the Autopay section. |
mandate.billingAttemptsRule |
![]() |
Required for monthly and weekly frequencies. Possible values: before, after, and on.
This field does not apply to adhoc frequencies. |
mandate.billingDay |
![]() |
Required for monthly and weekly frequencies. The day of the billing cycle when the shopper will be charged. For monthly frequency: If mandate.billingDay is 26, the shopper is charged on the 26th of every month. Valid values: 1–31.For weekly frequency: If mandate.billingDay is 5, the shopper is charged every Friday. (1 = Monday, 2 = Tuesday, ..., 7 = Sunday). Valid values: 1–7. This field does not apply to adhoc frequencies. |
Webhooks for payment result
You can receive the mandate details as part of your standard webhooks. To do this:
- In your Customer Area, go to Developers > Webhooks.
- Next to Standard webhook, select the edit webhook icon.
- Under Additional Settings, select Include Mandate Details.
- If you would like to receive additional UPI metadata like VPA, issuer handle and bank code, Under Additional Settings, select Include UPI Metadata (VPA, handle and issuer bank code).
- Select Save Configuration.
Specific fields for UPI Autopay in the authorization webhook:
| Field | Description |
|---|---|
mandate.mandateId |
Unique Mandate Number for the mandate created by NPCI (also called UMN). Store this id for future use. |
mandate.status |
Current status of the mandate (for example active, or cancelled). |
mandate.txVariant |
Transaction variant used (upi_collect or upi_qr) |
upi.vpa |
Shopper's Virtual Payment Address. |
upi.handle |
Third-party UPI app handle (for example okhdfc, or okicici). |
upi.issuerBank |
First four characters of the shopper's issuing bank IFSC code. |
Webhook for payment result:
| eventCode | success | Description | Action to take |
|---|---|---|---|
| AUTHORISATION | false | The transaction failed. | Cancel the order and inform the shopper that the payment failed. Any amount debited will be refunded in 2–3 days. |
| AUTHORISATION | true | The shopper successfully completed the payment and a mandate was created. | Inform the shopper that the payment was successful and proceed with the order. |
Make recurring payments
For every subsequent payment in a billing plan, you need to:
- Send a pre-debit notification.
- Make the recurring payment.
As per the latest NPCI guidelines, you are required to perform any non-customer initiated transactions, such as Autopay pre-debit notifications and recurring transactions, during non-peak hours only, as outlined below for Indian Standard Time:
- Before 10:00 AM
- Between 1:00 PM and 5:00 PM
- After 9:30 PM
Send a pre-debit notification
A pre-debit notification is an email, SMS or a push notification alert sent to a shopper, informing them of an upcoming recurring charge by the issuer.
- To trigger this notification, you must notify Adyen using the /notifyShopper endpoint.
- Adyen then forwards the request to the UPI network, which will subsequently inform the relevant Issuer(s) to send the alert to the shopper.
- Upon receiving this notification, shoppers have the option to cancel their mandate.
As per UPI regulations, the pre-debit notification must be sent at least 24 hours before each recurring payment.
To send a pre-debit notification to your shopper, send a /notifyShopper request and include the following:
| Field | Required | Description |
|---|---|---|
storedPaymentMethodId |
![]() |
The token for your shopper's stored payment details. |
merchantAccount |
![]() |
Your merchant account associated with the shopper's stored payment details. |
shopperReference |
![]() |
The shopper reference associated with the billing plan. |
amount |
![]() |
The amount you are going to charge the shopper. If mandate.amountRule = max: You can charge any amount between INR1 and the value of mandate.amount.If mandate.amountRule = exact: You must charge exactly mandate.amount. |
billingDate |
![]() |
The date on which the shopper will be charged. Must be at least 24 hours from the notification date. Example: If the notification date is 2025-08-13, the billing date should be 2025-08-14 or later. |
billingSequenceNumber |
![]() |
Required when mandate.frequency = adhoc. Maximum length is 3. Use a unique number for each /notifyShopper request. If using a single-digit number, use any value other than 1, ensuring it is unique for each subsequent recurring cycle. |
reference |
The reference for the pre-debit notification. |
The /notifyShopper response contains:
message: Information about the status of the pre-debit notification.
shopperNotificationReference: Unique reference to the pre-debit notification. Store this value to make the subsequent payment.
Make the recurring payment
Once the pre-debit notification is successful, you can carry out a recurring payment on your billing date.
- From your server, make a /payments request containing fields listed in the below section.
- Check your webhooks to see the payment result. Refer to the webhook section below to understand how to handle failed recurring payments.
Include the following in your /payments request:
| Field | Required | Description |
|---|---|---|
paymentMethod.type |
![]() |
Type of UPI flow. Possible values: upi_collect, upi_intent, and upi_qr. |
paymentMethod.storedPaymentMethodId |
![]() |
The token value for the shopper's stored payment information. |
paymentMethod.shopperNotificationReference |
![]() |
Unique reference to the pre-debit notification, taken from the /notifyShopper response. |
paymentMethod.billingSequenceNumber |
![]() |
Required when mandate.frequency = adhoc.The value must match the value used in the corresponding /notifyShopper request. In case of retries, the same sequenceNumber from the /notifyShopper request can be used until the no of allowed retries are exceeded and new /notifyShopper request is raised. |
amount |
![]() |
The recurring charge. Include both currency and value. |
merchantAccount |
![]() |
Your Adyen merchant account. |
shopperReference |
![]() |
Unique reference identifying the shopper associated with the billing plan. |
reference |
Optional, must be alphanumeric when included. No space and special characters allowed. | |
shopperInteraction |
![]() |
Set to ContAuth. |
recurringProcessingModel |
![]() |
Set to Subscription or UnscheduledCardOnFile. |
Webhook for payment result:
| eventCode | success | Description | Action to take |
|---|---|---|---|
| AUTHORISATION | false | The transaction failed. | Cancel the order. You can retry the authorization request up to 3 times, with a minimum 1-hour interval between each attempt. If all retries fail, inform the shopper and initiate a new /notifyShopper request. |
| AUTHORISATION | true | The shopper successfully completed the payment and a mandate was created. | Inform the shopper that the payment was successful and proceed with the order. |
Cancel a billing plan
If your shopper decides to end their billing plan, you must cancel the corresponding UPI Autopay mandate linked to their stored payment details.
Merchant-initiated cancellation:
- Send a delete request using
/storedPaymentMethods/{storedPaymentMethodId}to remove the shopper’s stored token and cancel the mandate. - You will receive a recurring.token.disabled webhook to confirm the cancellation status.
Shopper-initiated cancellation (via UPI App):
- If the shopper cancels their billing plan on their UPI app, you will receive a recurring.token.disabled webhook.
Test and go live
Contact your Implementation Manager to set up your test environment for UPI Autopay. You can use the following magic amounts to test various transaction outcomes.
| Scenario | Description | Magic amount (amount.value) |
|---|---|---|
| Signup – Success | Shopper signup successful | 7005 |
| Signup – Failure | Shopper signup unsuccessful | 7006 |
| Pre debit notification - Success | Pre debit notification successful | 7005 |
| Pre debit notification - Failure | Pre debit notification unsuccessful | 1401 |
| Recurring Charge – Success | Successful recurring charge | 7005 |
| Recurring Charge – Failure | Failed recurring charge | 7008 |
| Mandate Revoke – Success | Successful mandate revoke | 7008 |
| Mandate Revoke – Failure | Failed mandate revoke | 7010 |
| Refund – Success | Successful refund | 2010 |
| Refund – Failure | Failed refund | 2011 |
Before you can accept live UPI Autopay payments, contact your Account Manager to begin the onboarding process.
