Web

PayPal OTP SMS shows EUR for GBP WooCommerce orders

Why PayPal's OTP SMS displays EUR for GBP WooCommerce orders. Explains issuer/3DS causes, plugin checks, reproduction steps, and what to send to PayPal support.

1 answer 1 view

Why does PayPal’s OTP (“transaction code”) SMS display an amount in EUR for a GBP PayPal Checkout order?

We are a UK merchant using WooCommerce + PayPal Checkout (PPCP). Some payers are prompted for an SMS OTP (“prove it’s you” / transaction code). The OTP SMS displays an amount in EUR (and “EUR” explicitly), e.g. “PayPal: [OTP] is your €31.24 EUR transaction code”, which causes checkout abandonment. We do not sell anywhere other than the UK, all our WooCommerce settings have been checked and triple-checked, and our currency in PayPal is set explicitly to GBP. We have never accepted or converted EUROS while trading.

The PayPal order and capture are unambiguously GBP:

  • CHECKOUT.ORDER.APPROVED webhook for order 6G15811221285062W shows purchase_units[0].amount.currency_code = GBP, value 21.00, including item_total and shipping breakdown in GBP.
  • PAYMENT.CAPTURE.COMPLETED webhook for capture 1MS14669G2808110C shows amount GBP 21.00; fee and net amounts are also GBP; it links back to the same order_id.
  • No currency conversion appears in the PayPal transaction details; settlement is in GBP.

Has anyone seen PayPal’s OTP/SMS step-up flow render a different currency/amount than the underlying order? Is this a known PayPal bug, a buyer-localisation issue (SMS currency based on payer country/phone), or a merchant-side configuration problem? What troubleshooting steps or PayPal settings should I check? I can share the full webhook payloads with PII removed.

Most likely the OTP / transaction code SMS is showing EUR because the 3D Secure (step‑up) challenge or the card issuer’s ACS is presenting the authorization amount in the cardholder’s (issuer) currency, not because your checkout/capture was converted — your webhooks already show GBP. That presentation can come from the issuer or from PayPal’s 3DS/ACS interaction (or, less commonly, a PayPal/WooCommerce integration bug); reproduce with different card BINs, capture sanitized ORDER.APPROVED + PAYMENT.CAPTURE.COMPLETED payloads and the SMS text, update the PPCP plugin, and open a PayPal technical case with those logs.


Contents


How PayPal’s OTP / transaction code SMS is generated (paypal sms, transaction code)

When PayPal requires step‑up authentication the flow usually enters 3D Secure (3DS). That step is an authentication exchange between PayPal (or PayPal’s 3DS gateway) and the card issuer’s Access Control Server (ACS). The OTP/transaction code SMS may be:

  • Generated and sent by the card issuer’s ACS (very common), or
  • Constructed/relayed by PayPal’s 3DS service and delivered to the cardholder.

Either way, the 3DS message text and formatting are controlled by the party doing the challenge. The currency shown in the OTP text is the currency the ACS or relayer chooses to display — which can be the card’s billing/settlement currency (for many EU‑issued cards that’s EUR) even when the merchant’s order and final capture are in GBP. PayPal’s 3D Secure documentation confirms 3DS is part of the advanced checkout flow and supports multiple currencies (so the 3DS step can use whatever currency the ACS expects) — see PayPal’s 3DS docs for details. (The 3DS step is distinct from the final capture you see in your webhooks.)

If you want a concrete test: trigger a live transaction using a UK‑issued card and compare the SMS to a transaction by the same amount using an EU‑issued card. If only EU cards get an OTP in EUR, that strongly points at the issuer/ACS presenting the amount in the cardholder’s currency.

(Reference: PayPal 3DS docs on supported currencies and countries: https://developer.paypal.com/docs/checkout/advanced/customize/3d-secure/)


Why the SMS might show EUR while the order is GBP — possible causes (paypal, paypal sms)

Here are the practical causes you should consider, listed roughly from most to least likely:

  • Issuer/ACS presentation (most likely)
    Many banks’ ACS systems present the authorization amount in the card’s billing currency. The bank issues the OTP via its own channel and formats the message for its customer — often EUR for Euro‑denominated cards. The final PayPal capture can still be GBP.

  • 3DS/authorization used a different currency for the challenge
    The 3DS authentication request carries amount+currency. If PayPal or the payment routing layer sent the ACS an amount in EUR (for routing or legacy reasons), the ACS will display EUR in its OTP. That can happen even if the later capture is GBP.

  • Buyer-side PayPal wallet / card settings
    If the payer’s PayPal wallet or linked card is set to EUR (or the card’s default/issuer currency is EUR), PayPal or the issuer may convert or present values in EUR for the customer’s clarity. Community threads show PayPal sometimes uses wallet/card preferences in non-obvious ways (see community links below).

  • WooCommerce / PPCP integration glitch (less likely given your webhooks)
    Known plugin issues can cause the PayPal button/checkout to send a stale currency to PayPal’s JS SDK (see GitHub issue where changing country didn’t reload PayPal buttons). That can lead to a mismatch between what the 3DS/ACS saw and what the capture later becomes. Because your ORDER.APPROVED and PAYMENT.CAPTURE.COMPLETED both show GBP, this is less probable — but still check plugin versions and the createOrder payload.

  • DCC / routing through an EU processor
    If PayPal routed the auth through an EU processor for that card, the auth/3DS step might show EUR based on processor conventions even when settlement is GBP.

  • Rare PayPal or issuer bug
    Community reports occasionally show PayPal altering card currency or not respecting wallet settings — those are edge cases but they do happen and are worth investigating with PayPal if reproduction is consistent (see Reddit and PayPal community reports referenced below).

Sources that document similar behaviour and integration bugs: GitHub issue on WooCommerce + PayPal not reloading currency, PayPal community and Reddit threads reporting currency presentation oddities (links in Sources).


Known bugs and community reports (WooCommerce + PayPal)

A few community threads and repo issues line up with the types of mismatches you’re seeing:

These posts don’t prove a single global bug, but they show the ecosystem where 3DS/issuer presentation, PayPal routing and wallet/card settings can produce surprising currency text in messages.


Troubleshooting checklist for merchants (WooCommerce + PPCP)

Below is a step-by-step checklist you can run now. Do these in order; they’re designed to isolate whether the issue is issuer/3DS, PayPal, or your integration.

  1. Reproduce and compare by card origin
  • Have a test buyer use a UK‑issued card and an EU‑issued card (or ask affected customers whether their card is EU‑issued). If only EU cards show EUR in the OTP SMS, that points to the issuer/ACS.
  1. Capture the SMS sender ID and text
  • Ask the customer to forward the exact OTP SMS (or a screenshot) and note the sender name/number. If the sender is the bank or a bank shortcode, the issuer likely generated the SMS; if it’s “PayPal” it’s likely PayPal/relay.
  1. Confirm there was no intermediate authorization in EUR
  • Check your PayPal transaction details and webhook history for any authorization events (e.g., PAYMENT.AUTHORIZATION.CREATED) that might have used EUR. You already have ORDER.APPROVED and PAYMENT.CAPTURE.COMPLETED in GBP — good. Still look for any earlier auth events/timestamps.
  1. Inspect the createOrder / button payload live
  • Use your browser dev tools to watch the PayPal JS SDK calls during checkout. Confirm the createOrder payload includes purchase_units[0].amount.currency_code = “GBP” at creation time. If the JS SDK ever sends EUR to PayPal, that’s a smoking gun.
  1. Check WooCommerce and plugin settings
  • Update WooCommerce + PayPal Payments plugin to the latest version. If you run a currency switcher (Aelia or similar), ensure PayPal buttons are re-rendered on currency/country change (see the GitHub issue). Also clear caches and test in incognito.
  1. Collect masked BINs and buyer locale data
  • Ask affected buyers to tell you the card BIN (first 6 digits) or provide it masked; BIN country + issuer are determinative. Also note buyer country_code from the webhook (payer.country or billing_address.country_code).
  1. Ask PayPal to inspect the 3DS/ACS request/response
  • Provide PayPal MTS with order IDs, capture IDs, timestamps, masked BIN and the SMS text. Request they check the 3DS payload PayPal sent to the ACS and the ACS response; PayPal can tell you which currency was passed to the ACS and who issued the SMS.
  1. Test with a controlled live transaction
  • Run a low‑value live transaction (so 3DS triggers) with a known EU card you control, capture the SMS and full webhooks. This gives PayPal a fast reproduction path.
  1. Track incidence rate and patterns
  • Log how many checkouts fail or abandon with EUR OTP. If it’s rare and tied to EU cards only, the fix is different than if it’s systemic across UK cards.

How to prepare evidence and open a PayPal support case

When you contact PayPal Merchant Technical Support (MTS), provide a concise packet so they can locate the 3DS trace quickly:

Required items to include (sanitise PII):

  • Order ID(s) (CHECKOUT.ORDER.APPROVED resource id) and capture ID(s) (PAYMENT.CAPTURE.COMPLETED id).
  • Exact UTC timestamp(s) of the attempted payment(s).
  • Full sanitized JSON for ORDER.APPROVED and PAYMENT.CAPTURE.COMPLETED webhooks (mask names, emails, card numbers) — include the whole resource objects.
  • The OTP SMS text and screenshot(s) with phone number masked, plus the SMS sender ID.
  • Masked BIN (first 6 digits) or card issuer info if available.
  • Which browser / extension / plugin versions were used, and the WooCommerce + PayPal Payments plugin version.
  • Short reproduction steps and how often it happens (1/100, 10/100, etc).

Suggested message to PayPal MTS (short):
“Live transactions show OTP SMS with EUR while ORDER and CAPTURE are GBP (order IDs X). Please check the 3DS/ACS request and tell us whether PayPal or the issuer generated the SMS and which currency was passed to the ACS.”

Why PayPal needs this: they can trace the 3DS request to the ACS and identify whether PayPal passed a GBP or EUR amount to the issuer, and whether the issuer converted it for display.

Helpful docs and references for PayPal to look at are the 3D Secure flow notes in PayPal’s developer docs: https://developer.paypal.com/docs/checkout/advanced/customize/3d-secure/


Temporary mitigations to reduce checkout abandonment

If this is costing conversions, try short‑term mitigations while you investigate:

  • Add a short, calm note at checkout — for example:
    “You may receive a verification code from PayPal or your bank. The message may show amounts in Euros for some cards — please enter the code to complete payment.”
    (Keep the language simple and non‑technical; customers just need reassurance.)

  • Offer alternative payment options for customers who prefer a UK card (Apple Pay, Google Pay, card via Stripe, PayPal Pay Later, etc.). Let customers switch quickly.

  • In customer support scripts, pre‑ask whether the card is EU‑issued and guide them to try a UK card if they’re unsure.

  • If a specific payment plugin or flow is suspected and incidence is high, temporarily disable PayPal for affected geos until you get a definitive fix — only do this if abandonment is severe.

  • Use live chat to intercept confused customers during checkout and guide them through the OTP step.


Sources


Conclusion

Short version: this is most commonly an issuer/3DS presentation issue (the ACS or issuer shows the amount in the cardholder’s currency, e.g., EUR) rather than a final conversion of your GBP capture. Gather sanitized ORDER.APPROVED + PAYMENT.CAPTURE.COMPLETED webhooks, the OTP SMS text and masked BINs, update your WooCommerce PayPal Payments plugin, reproduce with different card origins, and open a PayPal technical case with those logs so they can trace the 3DS request and confirm exactly which component sent the EUR in the message.

Authors
Verified by moderation
Moderation
PayPal OTP SMS shows EUR for GBP WooCommerce orders