Skip to main content
India has unique payment infrastructure dominated by UPI (60%+ of digital transactions) and Rupay cards. Dodo Payments supports both with full RBI compliance for subscription mandates.

Why India Payment Methods Matter

UPI Dominance

UPI processes 10B+ transactions/month. Many Indian customers don’t have international cards.

Low Transaction Costs

UPI has near-zero transaction fees. Excellent for high-volume, lower-value transactions.

Subscription Support

Unlike most alternative payment methods, UPI and Rupay support recurring payments via RBI mandates.

Supported Methods

MethodTypeSubscriptionsMin Amount
UPI CollectQR code / VPAYes*₹1
Rupay CreditCardYes*₹1
Rupay DebitCardYes*₹1
*Subscriptions require RBI-compliant mandates with special processing rules.

Configuration

API Method Types

TypeDescription
upi_collectUPI via QR code or VPA entry
creditCredit cards including Rupay
debitDebit cards including Rupay

Example: India-Focused Checkout

const session = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'prod_123', quantity: 1 }],
  allowed_payment_method_types: [
    'upi_collect',
    'credit',
    'debit'
  ],
  billing_currency: 'INR',
  customer: {
    email: '[email protected]',
    name: 'Priya Sharma',
    phone_number: '+919876543210'
  },
  billing_address: {
    country: 'IN',
    zipcode: '560001'
  },
  return_url: 'https://example.com/success'
});

Requirements for UPI

For UPI to appear at checkout:
  1. Billing country must be India (IN)
  2. Currency must be INR
  3. For non-Indian merchants: Adaptive Currency must be enabled
If you’re a non-Indian merchant and Adaptive Currency is not enabled, UPI will not be available to your customers.

Subscriptions with RBI Mandates

Indian payment method subscriptions operate under RBI (Reserve Bank of India) regulations with unique requirements.

How RBI Mandates Work

Mandate Types

Subscription AmountMandate TypeLimit
Below Rs 15,000On-demand mandateRs 15,000
Rs 15,000 or aboveFixed-amount mandateExact subscription amount
Important for plan changes: If an upgrade results in a charge exceeding the existing mandate limit, the charge will fail and the customer must re-authorize.

The 48-Hour Processing Delay

This is the most important difference from international card payments:
1

Charge Initiated (Day 0)

On the scheduled renewal date, Dodo initiates the charge with the bank.
2

Pre-Debit Notification

Customer receives notification from their bank about the upcoming debit.
3

48-Hour Window

Customer can cancel the mandate during this period via their banking app.
4

Debit Completed (~48-51 hours)

After 48 hours (plus up to 3 additional hours for bank processing), funds are debited.
5

Webhook Sent

payment.succeeded webhook is sent after actual debit, not at initiation.
Do not grant benefits at charge initiation. Wait for the payment.succeeded webhook, which arrives ~48-51 hours after the scheduled charge date.

Handling the 48-Hour Window

// DON'T do this:
async function handleSubscriptionRenewal(subscription) {
  // ❌ Bad: Granting access immediately when charge is initiated
  grantPremiumAccess(subscription.customer_id);
}

// DO this:
async function handlePaymentWebhook(event) {
  if (event.type === 'payment.succeeded') {
    // ✅ Good: Only grant access after payment is confirmed
    grantPremiumAccess(event.data.customer_id);
  }
  
  if (event.type === 'payment.failed') {
    // Handle failed payment (mandate cancelled, insufficient funds)
    revokePremiumAccess(event.data.customer_id);
  }
}

Webhook Events for Indian Subscriptions

EventWhenAction
subscription.createdMandate authorizedRecord subscription start
payment.succeeded~48h after charge dateGrant/continue access
payment.failedDebit failedNotify customer, pause access
subscription.on_holdPayment failedPrompt for payment method update
subscription.activeReactivated after paymentRestore access

Testing

UPI Test IDs

StatusUPI ID
Successsuccess@upi
Failurefailure@upi

Indian Card Test Numbers

BrandScenarioCard NumberExpiryCVV
VisaSuccess457623891277145006/32123
VisaDeclined470613121121212306/32123
MastercardSuccess540916266938103406/32123
MastercardDeclined510510510510510006/32123

Best Practices

Build your application to handle the gap between charge initiation and actual payment. Consider:
  • Grace periods for subscription access
  • Clear communication to customers about processing time
  • Webhook-driven fulfillment, not date-driven
Customers can cancel mandates via their bank apps at any time. Monitor subscription.on_hold webhooks and prompt customers to re-subscribe or update payment methods.
For variable pricing (e.g., usage-based), consider whether a Rs 15,000 on-demand mandate is sufficient. If charges might exceed this, customers will need to re-authorize.
For Indian customers, UPI should be the primary payment option. Many users prefer it over cards due to familiarity and lower friction.

Troubleshooting

Check:
  1. Billing country set to IN?
  2. Currency set to INR?
  3. If non-Indian merchant: Adaptive Currency enabled?
  4. upi_collect included in allowed_payment_method_types?
Solution: Verify billing address has country: "IN" and billing_currency: "INR".
Cause: New charge amount exceeds existing mandate limit (Rs 15,000 threshold).Solution: Customer must update payment method to establish a new mandate with the correct limit.
Cause: Customer may have cancelled the mandate during the 48-hour window, or their bank declined the debit.Solution: Customer needs to re-authorize the mandate or update their payment method.
Cause: Bank API delays can extend processing by 2-3 additional hours.Solution: This is expected. Build your system to handle variable delays up to ~51 hours total.
Cause: Edge case in RBI regulations — mandate cancellation during processing window doesn’t immediately cancel subscription.Solution: The next charge will fail and subscription will move to on_hold. Monitor webhooks for payment.failed.