WooCommerce fixes / 3D Secure not triggering

WooCommerce 3D Secure Not Triggering? Causes & Fix

If Stripe's 3D Secure step never appears at checkout, the payment stops dead: the PaymentIntent sits at requires_action, the charge never confirms, and the order fails. Here's how to find out why the modal isn't mounting.

Last updated: 16 Jul 2026 · ~6 min read

Quick answer

The most common cause is a JavaScript conflict that stops Stripe's 3D Secure modal from ever mounting — usually another plugin's script throwing an error, or an optimiser deferring and bundling Stripe.js. The PaymentIntent stays at requires_action and the charge never confirms. Open the browser console at checkout and look for the error, then exclude Stripe.js from JS optimisation.

What "3D Secure not triggering" actually means

When a card needs authentication, Stripe doesn't decline it — it parks the payment at requires_action and waits for your store to show the bank's 3D Secure challenge in an iframe. Stripe.js mounts that modal. If Stripe.js can't run, nothing is shown, nobody authenticates, and the PaymentIntent never advances.

The customer sees the Place order button spin and then a failure, or simply nothing at all. You see a failed or pending order, often with authentication_required attached. The money was never taken — this is a stalled payment, not a lost one.

The most common causes (most likely first)

  1. A JavaScript error stops the 3D Secure modal mountingAnother plugin or theme script throws before Stripe.js can open the iframe. Open the browser console at checkout — there's a red error at the moment you press Place order, and the PaymentIntent in Stripe stays at requires_action forever.
  2. An optimisation plugin is deferring, combining or minifying Stripe.jsStripe.js has to load directly from js.stripe.com and cannot be bundled, minified or deferred. Turn off JS combine/defer for the checkout page and retry — if the modal appears, this was it.
  3. The iframe loads but is hiddenA theme overflow or z-index rule, a popup blocker, or a Content-Security-Policy frame-src rule hides it. The console shows a CSP frame violation, or the modal element is in the DOM but not visible on screen.
  4. The payment is being taken off-session, so there is no browser to show a modal inIt only fails on subscription renewals, admin-created orders or pay-links — never on a live checkout. That's where authentication_required shows up as a decline: the card wanted authentication and no customer was present.
  5. Nothing is broken — 3DS simply isn't being requestedStripe only triggers 3D Secure when the issuer or regional rules require it, or when a Radar rule asks for it. Look at the payment in the Stripe dashboard: if it went straight to succeeded with no requires_action step, the card never needed authenticating.
  6. You're testing with a card that doesn't require authentication4242 4242 4242 4242 never triggers 3DS. Use Stripe's authentication test card 4000 0025 0000 3155 instead.

Where to look first

Losing sales to a modal nobody can see?

Chasing a 3D Secure modal that won't mount means bisecting plugins on a live checkout — slow, and every test costs you real traffic. DiagnosticIQ's free dashboard checks the checkout render chain, the Stripe key-mode integrity and the script path in one screen, and the AI names the concrete break rather than leaving you to guess. It keeps watching afterwards, so if the next plugin update knocks Stripe.js over again, you hear it from DiagnosticIQ before a customer tells you.

Get the free plugin

Made by Prima Digital — the team behind this guide. Free forever; no card to install.

How to know you fixed it

Verify

Place a test order with Stripe's authentication test card 4000 0025 0000 3155 — the 3D Secure modal should appear, and the Stripe log for that payment should read requires_actionsucceeded.

Frequently asked

Was the customer charged?

No. A PaymentIntent stuck at requires_action never captures — there is nothing to refund. Check the Stripe dashboard to confirm no successful charge exists.

Will the payment go through later on its own?

No. Authentication has to happen in the browser while the customer is there. An unauthenticated PaymentIntent eventually expires and the order stays failed or pending.

What does authentication_required mean?

The card's bank wanted 3D Secure and didn't get it. On a live checkout that means the modal never mounted; on a renewal it means the charge was attempted with no customer present.

Can I just turn 3D Secure off?

Not if you sell into the UK or EEA — SCA rules make it mandatory for most in-person-absent card payments. Fix the modal rather than trying to bypass the step.

>_
John O'Keane — Founder, Prima Digital · LinkedIn
Contributions by David Zhang · LinkedIn
I build DiagnosticIQ, the WooCommerce diagnostic plugin, and I've spent too many evenings in a browser console working out which script was stopping Stripe's 3DS modal from opening.