
Klarna & Afterpay Not Showing at Checkout? 5 BNPL Culprits & Fix
Buy Now, Pay Later options drive 25% to 35% of revenue for high-growth e-commerce brands. When Klarna, Afterpay, or Affirm vanish from checkout, conversion rates plunge overnight. Here is the engineering guide to diagnose and permanently resolve BNPL widget failures.
Buy Now, Pay Later (BNPL) services like Klarna, Afterpay (Clearpay), and Affirm are no longer just alternative payment options—for apparel, cosmetics, luxury goods, and electronics, they represent over one-third of total gross merchandise volume. Shoppers rely on flexible installment plans to justify higher average order values (AOV).
However, e-commerce engineering teams frequently encounter an insidious failure mode: Klarna or Afterpay suddenly disappears from the payment selection list, or the widget displays on product pages but vanishes the moment a customer reaches the final step of checkout. Even worse, server monitoring tools report HTTP 200 OK because the checkout page itself is functional—only the third-party client SDK silently failed to render the payment pill.
Below, we dissect the five root technical causes behind missing BNPL buttons across Shopify, WooCommerce, Stripe, and headless storefronts—along with step-by-step diagnostic checklists to restore revenue.
Want automated verification that Klarna and Afterpay are physically visible 24/7?
Standard HTTP ping monitors only check server status codes and miss broken JavaScript hydration, invisible overlays, and disabled checkout buttons. UptimeClick runs real headless Chromium every 2 hours to verify that buttons like Klarna or Afterpay 4-Pay are physically actionable—alerting you immediately with error screenshots if a click fails.
The 60-Second Chrome DevTools Triage
Before modifying theme templates, disabling payment gateways, or filing support tickets with your payment processor, reproduce the checkout flow in an incognito window with Chrome DevTools open (F12 or Cmd + Option + I).
- Inspect the Network Tab: Filter by
klarnaorafterpay. Examine the status code of session creation requests:- HTTP 400 Bad Request: Your frontend dispatched invalid parameters (typically unsupported currency, missing billing address, or an order amount outside permitted limits).
- Blocked / Failed: Your Content Security Policy or an ad-blocker prevented the script from connecting to the BNPL API endpoint.
- Check Console Warnings & Errors: Look for SDK exceptions such as
KlarnaPayments.load() rejected,amount_out_of_bounds, orcurrency_mismatch. - Inspect DOM Container Visibility: Find the HTML container where the BNPL widget should mount (e.g.
#klarna-payments-containerorafterpay-placement). Check if CSS rules likedisplay: noneor zero height have collapsed the container.
Cause 1: Order Total Outside Min/Max Price Thresholds
The most common reason a BNPL widget mysteriously disappears is that the total order value breached the provider's strict minimum or maximum eligibility thresholds:
- Minimum Floor ($35 to $50): Most BNPL plans will not split transactions under $35. If a shopper has a $40 item in their cart, Klarna renders fine. But if they apply a 15% discount code, the total drops to $34—and the SDK immediately suppresses the button. (See our guide on discount code checkout conflicts).
- Maximum Ceiling ($1,000 to $2,000): For standard 4-installment plans, providers set an automatic ceiling based on merchant risk tier. Baskets exceeding the ceiling fail authorization unless longer-term financing products (e.g. Klarna Monthly Financing) are explicitly enabled.
// Example: Afterpay Price Threshold Check in JavaScript
const cartTotalInCents = 3200; // $32.00
const minThreshold = 3500; // $35.00
if (cartTotalInCents < minThreshold) {
// SDK deliberately does not mount the button
console.warn("Cart total below BNPL threshold. Button suppressed.");
}To prevent customer confusion, implement defensive fallback logic: rather than letting the button vanish silently, display an informative callout like “Add $3.00 more to pay in 4 interest-free installments with Klarna.”
Cause 2: Billing Country & Currency Mismatches
Unlike credit cards (which can be charged in any global currency with automatic exchange rates), Buy Now, Pay Later transactions are legally bound to specific regional credit jurisdictions.
If a mismatch occurs between the customer's billing address, shipping country, and the currency selected at checkout, the BNPL engine rejects the session:
// Valid Regional Pairs vs. Invalid Cross-Border Pairs
Valid: Country = "US" | Currency = "USD"
Valid: Country = "GB" | Currency = "GBP"
Valid: Country = "AU" | Currency = "AUD"
INVALID: Country = "GB" | Currency = "USD" // Throws: "unsupported_currency_for_country"If your Shopify or WooCommerce store utilizes automated geo-location currency switchers, ensure that the checkout step synchronizes the currency parameter with the customer's verified billing country before invoking the payment session API.
Cause 3: Content Security Policy (CSP) & Iframe Sandbox Blocks
BNPL providers handle sensitive financial disclosures and installment agreements inside sandboxed iframes. If your server sends modern, strict security headers that omit the provider's subdomains, the browser aborts rendering:
# Required CSP Headers for Klarna & Afterpay
Content-Security-Policy:
script-src 'self' https://x.klarnacdn.net https://js.klarna.com https://static.afterpay.com;
frame-src 'self' https://*.klarna.com https://*.afterpay.com;
connect-src 'self' https://api.klarna.com https://api.afterpay.com https://*.stripe.com;Additionally, if you run a headless storefront (Next.js, Remix, or Nuxt) where payment components reside within child iframes, ensure the iframe declaration includes:
<iframe
src="/checkout/payment"
allow="payment"
sandbox="allow-scripts allow-same-origin allow-forms allow-popups"
/>Omission of allow="payment" or allow-popups prevents the 3D Secure modal or Klarna authentication window from launching.
Cause 4: AJAX Cart Drawer & Dynamic DOM Hydration Deadlocks
Modern e-commerce themes use asynchronous slide-out drawers. When a shopper adds a product or modifies a quantity, the theme fetches updated HTML and replaces the DOM contents via JavaScript.
If your theme scripts replace the drawer DOM without re-initializing the BNPL widget, the button vanishes:
- Lost Event Listeners: The initial event listener bound to the original DOM node is destroyed when the HTML is overwritten.
- Missing On-Site Messaging Refresh: For Klarna On-Site Messaging (OSM), you must trigger
window.KlarnaOnsiteService.push({ eventName: 'refresh-placements' })whenever the active price in the cart changes.
Cause 5: Payment Processor / Aggregator Configuration (Stripe & Shopify Payments)
Many merchants do not integrate directly with Klarna or Afterpay APIs; instead, they activate them through aggregators like Stripe Payment Elements or Shopify Payments.
If BNPL vanishes unexpectedly, verify these backend prerequisites:
- Automated Risk Underwriting Hold: Stripe periodically conducts automated merchant risk reviews. If a sudden spike in chargebacks or dispute volume occurs, Stripe may temporarily disable BNPL payment methods without disabling standard credit card processing.
- Category Exclusions: Products categorized as digital downloads, pre-orders with extended delivery windows, gift cards, or age-restricted items are prohibited by BNPL terms of service and automatically filtered out by the gateway.
- Payment Method Order in Checkout Extensibility: On Shopify, check your Checkout Settings → Payment Customizations to ensure a rule has not hidden BNPL for specific customer segments.
Automating BNPL & Checkout Health with UptimeClick
Server monitoring tools (like UptimeRobot) only perform simple HTTP GET requests. Because your store serves HTTP 200 OK even when Klarna, Afterpay, or Google Pay buttons are completely absent, standard uptime monitors will never alert you to revenue-draining checkout failures.
To catch missing payment widgets before conversions drop, e-commerce brands rely on UptimeClick synthetic browser monitoring:
- Real Headless Chrome Engine: UptimeClick spins up clean browser sessions every 2 hours to visit your live product, cart, and checkout steps.
- Physical DOM & Button Verification: It waits for JavaScript hydration, confirms that payment buttons (Klarna, Afterpay, Apple Pay, Credit Card) are physically visible, attached to event listeners, and actionable.
- Instant Screenshot Alerts: If a theme update, currency mismatch, or API outage suppresses your buttons, you receive an immediate alert containing full error screenshots and DevTools console logs.
Ensure Your BNPL & Checkout Buttons Are Actionable 24/7
UptimeClick runs automated headless Chrome checks every 2 hours to ensure your Klarna, Afterpay, and buy buttons remain physically visible, clickable, and error-free.