Wootrack Growth Blog

Klarna Fees WooCommerce Google Ads Profit: Stop the Bleed

TL;DR

**Klarna and other BNPL gateways charge 2–6% per transaction, but almost no WooCommerce store deducts this from the conversion value sent to Google Ads — so Performance Max and Shopping campaigns are bidding on phantom revenue.** The fix is to calculate the exact gateway fee per order at the point of purchase and subtract it from the profit value before firing the offline conversion.

Stores that make this correction typically see a 15–25% drop in reported POAS on high-AOV product lines, which immediately re-ranks which campaigns deserve more budget.

2–6%Typical Klarna / BNPL transaction fee range per order
€18–54Fee cost on a single €900 AOV furniture or electronics order
~22%Average POAS overstatement when BNPL fees are excluded from conversion values
60–70%Share of high-AOV shoppers who choose BNPL when offered at checkout

Why ROAS Makes Klarna Orders Look Like Winners

When a customer buys a €750 mattress using Klarna Pay Later, your WooCommerce order total records €750. Your Google Ads conversion tag fires with a value of €750. ROAS looks great — maybe 4× or 5× on that campaign. What the tag does not capture is that Klarna has already claimed somewhere between €15 and €45 of that revenue before you see a cent.

Standard ROAS reporting is revenue-blind to gateway fees by design. It was built to measure media efficiency, not business profitability. The problem compounds when you’re running Performance Max, because the campaign’s bidding AI interprets every high-value Klarna conversion as a signal to find more customers just like that one — customers who disproportionately choose BNPL, generating more fee-laden orders in a self-reinforcing loop.

The margin math gets uglier when you layer in product COGS. Take a home appliance store with a 35% gross margin selling a €600 dishwasher. Gross profit before fees: €210. Subtract a 3.5% Klarna fee (€21) and standard shipping (€15): net profit is €174. That’s an 8.6% compression relative to the gross figure — enough to flip a borderline campaign from profitable to loss-making at current bid levels.

The Payment Method Mismatch Problem

WooCommerce does not natively attach the gateway fee to the order meta in a way that Google Ads conversion tracking can consume. The WooCommerce order object stores `_payment_method` and `_order_total`, but the fee percentage lives in your Klarna gateway plugin settings — it is never written to the order unless you explicitly hook into `woocommerce_checkout_order_processed` or use a fee-aware plugin to append it as order meta.

This means even stores that have implemented COGS tracking are often still sending inflated conversion values, because they deducted product cost but forgot the gateway layer entirely. The result: Google’s bidding AI has a systematically optimistic view of every order paid via BNPL.

Redefining the KPI: From ROAS to POAS With Fee-Accurate Conversion Values

POAS (Profit on Ad Spend), expressed as a percentage where 100% means you recovered exactly what you spent on ads from net profit, gives you a fundamentally different optimization target. A 400% ROAS on a Klarna order might translate to a 90% POAS once you account for a 38% COGS, 3% Klarna fee, and €12 shipping on a €350 order — meaning you’re below break-even on ad spend.

The migration from ROAS to POAS requires three things: accurate per-order profit calculation, a mechanism to send that profit value as the Google Ads conversion amount, and campaign bid targets recalibrated to the new metric. None of these steps are optional — skipping the profit calculation and just lowering your ROAS target is guesswork, not optimization.

Critically, the BNPL fee must be treated as a variable cost, not a flat deduction. Klarna’s rate varies by product category, country, and your merchant tier. A consumer electronics merchant in Germany might pay 2.99% while a fashion retailer in Sweden pays 5.4%. Hard-coding a single percentage across all orders will still distort your data — you need the fee resolved at the order level, ideally by reading the rate from the gateway configuration at the moment the order is placed.

What Belongs in the Conversion Value Calculation

The conversion value you send to Google Ads should equal: order revenue minus COGS minus shipping cost minus payment gateway fee minus any applicable VAT adjustment (critical for EU stores selling B2C, where VAT is collected on behalf of the government and is not your revenue). For a €500 order with 40% COGS, €10 shipping, 3.2% Klarna fee (€16), and 21% VAT included in the price (making true revenue €413.22), the profit-based conversion value is approximately €123 — not €500.

Same €500 Klarna order — how ROAS reporting vs. POAS reporting changes your bidding decision

Standard ROAS View Fee-Accurate POAS View
Conversion value: €500 Conversion value: €123 (net profit)
ROAS: 4.2× at €119 ad spend POAS: 103% — barely break-even
Campaign flagged as winner, budget increased Campaign flagged as borderline, bid reduced
Klarna fee: not visible Klarna fee: €16 explicitly deducted
VAT included in revenue figure VAT stripped — EU-compliant calculation
Google AI bids for more BNPL customers Google AI targets genuinely profitable segments

Migration Path: Wiring BNPL Fees Into Your Profit Conversion Pipeline

  1. 1
    Capture the gateway fee rate at order creation

    Hook into `woocommerce_checkout_order_processed` to read the active payment gateway’s fee percentage from its settings and write it to order meta (e.g., `_gateway_fee_rate` and `_gateway_fee_amount`). For Klarna specifically, the WooCommerce Klarna Payments plugin exposes its rate via `get_option(‘woocommerce_klarna_payments_settings’)` — parse the relevant country/category rate and store it on the order object immediately.

  2. 2
    Build a per-order profit calculation function

    Create a function that reads `_order_total`, `_order_shipping`, all line item COGS (stored as product meta), the gateway fee amount from step 1, and the VAT amount from WooCommerce’s built-in tax totals. Subtract all costs from revenue. For EU stores, use `WC_Order::get_total_tax()` to strip VAT before calculating margin. Output a single profit figure per order.

  3. 3
    Send profit as the offline conversion value

    Use the Google Ads Enhanced Conversions or Offline Conversion Import API to transmit the profit figure — not order revenue — as the conversion value. If you’re using server-side tagging, pass the calculated profit into the `value` parameter of the `purchase` event. Ensure the conversion action in Google Ads is set to use the submitted value, not a default value override.

  4. 4
    Recalibrate your POAS bid targets by product category

    Once profit-based conversion values are flowing, your historical data will show a new POAS baseline per campaign. Set target POAS thresholds by product category — high-margin categories (e.g., accessories at 60% gross margin) can tolerate a lower POAS target; low-margin categories (e.g., large appliances at 20% gross margin) need a higher threshold to remain profitable. Avoid applying a single store-wide POAS target.

  5. 5
    Label products by POAS performance and sync to campaigns

    After 30 days of profit-accurate data, segment products into winners (POAS > 150%), borderline (80–150%), and losers (< 80%). Use custom labels in your product feed to reflect these tiers, then structure your Shopping or Performance Max campaigns around them — isolating losers for bid suppression or exclusion. Tools like WootrackApp automate this A/C/X labeling and feed sync, removing the manual overhead of weekly re-segmentation.

Don't average your Klarna rate across all orders Using a blended gateway fee (e.g., ‘we pay about 3% on average’) and applying it uniformly will still distort POAS on your highest-AOV orders, where the absolute fee amount is largest and margin compression is most severe. Always resolve the fee at the individual order level.

Pre-Launch Verification: Is Your POAS Pipeline Fee-Complete?

  • Order meta includes `_gateway_fee_rate` and `_gateway_fee_amount` written at checkout for every Klarna transaction
  • Profit calculation function reads gateway fee from order meta — not from a hardcoded constant
  • VAT is excluded from the revenue base before margin calculation (mandatory for EU B2C stores)
  • Shipping cost is deducted per order, not averaged across the store
  • COGS is stored at the product or variation level and pulled per line item
  • Google Ads conversion action is configured to use submitted value, with no default value override active
  • At least one test order placed via Klarna with conversion value verified in Google Ads event log
  • POAS targets set per product category, not as a single store-wide figure
  • Product feed custom labels reflect current A/C/X tier assignments based on profit-accurate data
  • WootrackApp or equivalent tool is reconciling payment method fees automatically on new orders

Frequently asked questions

Does Klarna's fee structure differ between Pay Later and Pay in 3 instalments?

Yes — and this matters for your per-order calculation. Klarna’s Pay Later (invoice) product typically carries a lower merchant fee than Pay in 3 or Pay in 30, because the risk profile differs. In some markets, instalment products can cost 0.5–1.5 percentage points more than the standard deferred payment option. Your gateway fee capture logic should read the specific product type from the Klarna order metadata, not just the top-level gateway slug.

Will switching from ROAS to POAS targets break my existing Performance Max campaigns?

Not immediately, but expect a learning phase. When you change the conversion value signal from revenue to profit, Google’s bidding AI needs 2–4 weeks to recalibrate. During this period, avoid making simultaneous changes to campaign structure, budgets, or audience signals. Run the new profit-based conversion action in parallel with your existing revenue-based one for 2 weeks before making it the primary optimization target.

What if my COGS data is incomplete for some products — should I still send partial profit values?

A partial profit value (revenue minus gateway fee and shipping, without COGS) is still more accurate than raw revenue for bidding purposes, because it at least corrects the BNPL distortion. However, flag orders with missing COGS in your conversion data and prioritize filling those gaps — incomplete COGS on high-volume SKUs will skew your POAS thresholds and lead to incorrect product tier assignments.

How do I handle Klarna chargebacks or refunds in my profit tracking?

WooCommerce fires the `woocommerce_order_refunded` hook when a refund is processed. You should send a negative conversion adjustment to Google Ads via the Conversion Adjustment Upload API, using the original order’s GCLID and the refunded profit amount (not the full order value). Klarna typically does not refund the gateway fee on chargebacks, so your refund adjustment should reflect the net loss including the retained fee.

At what AOV does the Klarna fee become material enough to change bidding decisions?

At a 3% fee rate and a 30% gross margin, the gateway fee represents 10% of your gross profit on any order. For a €150 AOV order, that’s €4.50 — small but not trivial at scale. For a €600 AOV order, it’s €18, which on a €180 gross profit represents a 10% margin hit that can shift a campaign from profitable to borderline. The materiality threshold depends on your margin structure, but practically speaking, any store with AOV above €200 and gross margins below 40% should treat BNPL fees as a first-class cost in their bidding pipeline.

Can WootrackApp handle multiple payment gateways with different fee structures simultaneously?

Yes — WootrackApp reads the payment method recorded on each WooCommerce order and applies the corresponding fee rate from your configured gateway settings, so a store running Klarna, Stripe, and PayPal simultaneously will have each order’s profit calculated using the correct gateway cost. This per-order fee resolution is what makes its POAS bidding signal accurate across a mixed-gateway checkout environment.