How to test the Indian credit card 3DS flow with Stripe in Lago

Last updated: July 10, 2026

Lago applies India-specific payment settings based on the country field on the Lago customer record, not on the card itself. Setting a customer's country to IN is what triggers the RBI-compliant 3DS flow; without it, Lago treats the payment as a standard off-session charge and errors out if Stripe requires 3DS authentication, so payment.requires_action never fires.

How it works

When a customer's country is IN, Lago adjusts the Stripe PaymentIntent parameters to comply with RBI (Reserve Bank of India) recurring payment mandates: it disables off_session mode and allows requires_action responses.

How to set it up

  1. Set the customer's country field to "IN", a top-level field on the customer record, via POST /api/v1/customers or PUT /api/v1/customers/:external_id ({"customer": {"country": "IN", ...}}), or in the Lago UI under the customer's billing country.

  2. Use a test card from Stripe's India recurring payments test cards page, not the general Stripe test cards page. The India-specific cards are at https://docs.stripe.com/india-recurring-payments#testing.

  3. Trigger a payment. Lago receives a requires_action status from Stripe, stores the 3DS redirect URL, and fires the payment.requires_action webhook.

If the webhook still isn't firing

Check that invoice.customer.country is exactly "IN" (two-letter ISO code, uppercase). The 3DS flow is gated on this exact value; other India-related fields like city or address aren't used for this check.


This article reflects guidance drawn from customer case resolutions. It is not officially supported documentation and may not apply to all situations.