# Stripe: card declined with authentication_required

> Stripe returns authentication_required when the bank wants 3D Secure, often on renewals charged off session. Bring the customer back to confirm the payment.

Canonical: https://app369.com/fix/stripe-authentication-required/
Last updated: 2026-11-09

authentication_required is the Stripe decline code for a card payment the bank refused because it wants 3D Secure first. It shows up most on renewals and saved-card charges made while the customer is away. Nothing is charged, and the customer has to come back and confirm.

**Short answer**

Catch the decline, keep the PaymentIntent it returns, and email or notify the customer with a link to a page that calls confirmPayment with that PaymentIntent’s client secret. The bank then shows its check and the payment can succeed. If the same code comes back after a passed check, the customer has to call the bank.

Rather not fix it yourself? [**Stripe Billing Fix and Setup**](https://app369.com/fixed-price/stripe-billing-setup/) handles it at a fixed price, agreed before work starts.

## **Why the bank asks, and the fix**

1. 01 ### **The charge ran while the customer was away**
  > “Set off_session to true to indicate that the customer isn’t in your checkout flow to respond to any authentication requests.” [**Stripe, Save and reuse payment methods**](https://docs.stripe.com/payments/save-and-reuse) With off_session set to true, Stripe asks the bank to skip the check. When the bank says no, the payment fails with this code, and only the customer can finish it.
2. 02 ### **The card wasn’t saved for later charges** Save the card while the customer is present, with a SetupIntent or setup_future_usage set to off_session on the first payment. The bank can then ask for the check once, up front, and later charges are less likely to need it.
3. 03 ### **Bring the customer back to confirm**
  > “If the payment failed due to an authentication_required decline code, use the declined PaymentIntent’s client secret with confirmPayment to allow the customer to authenticate the payment.” [**Stripe, Save and reuse payment methods**](https://docs.stripe.com/payments/save-and-reuse) The failed request carries the PaymentIntent. Save its ID, send the customer a link, and confirm it on that page so the bank can show the check.```
try {
  await stripe.paymentIntents.create({
    amount, currency: 'usd', customer: customerId,
    payment_method: paymentMethodId, off_session: true, confirm: true,
  });
} catch (err) {
  if (err.code === 'authentication_required') {
    await notifyCustomer(customerId, err.raw.payment_intent.id);
  }
}

// the page the customer opens asks your server for the PaymentIntent
// by ID and gets its client_secret back (never put it in the email link)
await stripe.confirmPayment({ clientSecret, confirmParams: { return_url } });
```
4. 04 ### **The customer skipped the check**
  > “The customer tried to proceed without performing the required authentication, so the issuer declined again.” [**Stripe, Decline codes (authentication_not_handled)**](https://docs.stripe.com/declines/codes) A second decline after the customer closed or skipped the check comes back as authentication_not_handled. Show the check again, or let them use another card.
5. 05 ### **The check passed and the bank still declined**
  > “If the card issuer returns this decline code despite a successfully authenticated transaction, the customer needs to contact their card issuer for more information.” [**Stripe, Decline codes (authentication_required)**](https://docs.stripe.com/declines/codes) Your code can’t fix this one. Tell the customer to call the bank, or to pay with another card.
6. 06 ### **Test the renewal path**
  > “The card requires authentication for the initial setup and also requires authentication for subsequent payments.” [**Stripe, Save and reuse payment methods (testing)**](https://docs.stripe.com/payments/save-and-reuse) In a sandbox, save test card 4000 0027 6000 3184 and charge it off session. It asks for authentication every time, so your recovery email or page runs.

Checked against the vendor’s docs on November 9, 2026: [Stripe docs: Decline codes](https://docs.stripe.com/declines/codes); [Stripe docs: Save and reuse payment methods](https://docs.stripe.com/payments/save-and-reuse).

## **Rather hand it over?**

Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.

- [$950**Stripe Billing Fix and Setup**Subscriptions, webhooks, customer portal and failed payments set up or fixed, tested in Stripe test mode.**See scope and start**](https://app369.com/fixed-price/stripe-billing-setup/)
- [from $450**App Fix Ticket**One reproducible bug in an existing mobile or web app, diagnosed and fixed.**See scope and start**](https://app369.com/fixed-price/flutter-firebase-bug-fix/)
- [from $450**AI-Built App Rescue**A Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.****No issues worth fixing, no charge.**** If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.**See scope and start**](https://app369.com/fixed-price/ai-app-rescue/)

[**All 127 Fiverr reviews**](https://app369.com/reviews/)

Related: [**Stripe payment_intent_authentication_failure**](https://app369.com/fix/stripe-payment-intent-authentication-failure/) · [**Stripe subscription incomplete (requires_action)**](https://app369.com/fix/stripe-subscription-incomplete-requires-action/) · [**Stripe card declined (generic_decline)**](https://app369.com/fix/stripe-card-declined-generic-decline/) · [**Stripe setup_intent_authentication_failure**](https://app369.com/fix/stripe-setup-intent-authentication-failure/)

Questions

## **More on this error**

<details>

<summary>**Was the customer charged? **+</summary>

No. The payment was declined, and the PaymentIntent waits in requires_payment_method until the customer confirms it or pays another way.

</details>

<details>

<summary>**Does the customer have to be told? **+</summary>

Yes. Stripe’s guide says to notify the customer to return and complete the payment, for example by email or an in-app notification.

</details>

<details>

<summary>**Can you fix it for me? **+</summary>

If one bug is the whole problem, the App Fix Ticket covers it: a written diagnosis first, then the fix. If the app has more going on, the Launch Check is a written check of the whole app. Each issue found is rated critical, high, medium or low, with where it is and how it was confirmed. No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.

</details>

A different error?

## **Describe it and get a written quote**

Send the error and what you were doing. You get a written scope, a fixed price and a timeline; Simon replies by email, usually within one business day.

[**Describe your problem **→](https://app369.com/contact/) [**All fixes**](https://app369.com/fix/)