Allocating Shopify Payments & PayPal Fees Per Order For CM

Booking Shopify Payments, PayPal, and Klarna fees at the order level (not as a blended monthly average) is what keeps contribution margin honest on BNPL, Amex, and international orders.
Quick answer
Pull actual per-order fees from the Shopify Payments payout export and the PayPal transaction report, then join them to the order ID before you compute CM. A blended monthly rate (e.g. 2.4%) hides that Klarna orders cost 4-6%, Amex costs ~3.3%, and international cards add ~1.5% — which is exactly where your worst-margin SKUs are hiding.
Allocating Shopify Payments & PayPal Fees Per Order For CM
Booking the actual processor fee against each order — not a blended average — so contribution margin per order and per SKU reflects the real payment mix.
Per-order fee allocation is the practice of joining each order to the exact fee its processor charged (Shopify Payments, PayPal, Klarna, Shop Pay Installments, Amex, international card) before computing contribution margin. Because fee rates vary from ~1.7% for a domestic Shopify Payments card to ~6% for a small Klarna order, a single blended rate applied to every order will systematically overstate CM on BNPL and international traffic and understate it on plain domestic cards. Fixing this is a data-join problem, not an accounting problem: the fees already exist in payout data, they just aren't attached to the order record.
If you're running a Shopify store between €1M and €15M in revenue, payment fees are almost always your second- or third-largest variable cost after COGS and shipping. Getting them wrong at the order level quietly rewires every downstream decision — which SKUs to promote, which payment methods to expose at checkout, which markets to expand into.
Why blended-rate CM breaks
The default finance setup books total monthly processor fees as one line and divides by revenue to get a blended rate. That rate goes into the CM model for every order. It's tidy, and it's wrong the moment your payment mix isn't uniform.
Klarna and Afterpay charge 3-6% plus a fixed fee — the fixed component alone destroys CM on €20 orders. PayPal sits around 2.9% + €0.35 domestically and higher cross-border. Amex cards on Shopify Payments carry a surcharge, and international cards add ~1.5% on top of the base rate. Blend all of that into one 2.4% figure and your CM report looks calm while specific SKUs bleed.
The €25 apparel order trap
A €25 t-shirt paid via Klarna: 5.99% + €0.30 fixed = €1.80 in fees, or 7.2% of order value. The same t-shirt on a domestic Shopify Payments card: 1.7% + €0.25 = €0.68, or 2.7%. Under a 2.4% blended rate you'd book €0.60 for both — hiding a €1.20 gap that compounds across thousands of Klarna orders per month.
How to detect the distortion in your data
First signal: your Shopify Payments payout total for the month doesn't match (blended rate × revenue). If they diverge by more than ~10%, your blended rate is masking a real mix shift. Pull the payout CSV and group fees by payment method — the variance across methods is the number you've been averaging away.
Second signal: CM per order looks flat across payment methods in your BI tool. It shouldn't. Klarna and Afterpay orders should show meaningfully lower CM than card orders; if they don't, you're applying a blended fee. Same check applies to international orders — if EU-outside-home-country CM matches domestic CM exactly, the surcharge isn't being allocated.
How to fix it: the join
The fix is a data join, done once and then automated. Shopify Payments exposes per-transaction fees on the payout endpoint (each payout line includes order_id and fee). PayPal transaction reports do the same via the transaction ID, which you map to Shopify's order ID through the payment gateway reference. Klarna and Afterpay fees come from their merchant portals or, more reliably, from the settlement reports they email.
Land all four into one fees table keyed on order_id. Left-join it to your orders table. Compute CM = (revenue − COGS − shipping − actual_fee − returns_reserve) per order. That's the version that tells the truth. The detail on where to pull each source lives in the payout-vs-report walkthrough for Shopify Payments and PayPal specifically.
One-time setup, permanent fix
Once the join exists, every downstream cut — CM by SKU, by country, by acquisition channel, by AOV band — inherits the correct fee automatically. You never have to re-argue the number in a margin review. It also fixes refund and chargeback distortion, because netted fees flow to the same order row.
What to test once fees are accurate
With true per-order CM in hand, three experiments usually pay for themselves within a quarter. First: raise the minimum order value for Klarna eligibility to €40 or €50 — the fixed fee stops eating small baskets. Second: reorder the express checkout buttons so PayPal doesn't cannibalise Shop Pay on low-AOV orders where the fee gap is widest.
Third: rebuild the SKU-level margin ranking your team uses for merchandising decisions. High-AOV orders often looked more profitable than they were under flat-fee allocation because fixed-fee dilution flattered them; the reverse — a €15 beauty SKU shipped internationally on Klarna — often shows negative CM once real fees hit. That's a merchandising signal, not a payments problem.
Frequently asked questions
You can, and you'll be wrong in the other direction — understating CM on domestic card orders means you'll under-invest in acquisition channels that skew toward that mix. The blended-rate problem isn't the level of the rate; it's that it hides variance across orders that should be treated differently.
Rule of thumb: once PayPal exceeds ~15% of checkout share, the blended rate starts to misprice individual orders enough to distort SKU rankings. Above 25% it breaks CM reporting outright. There's a separate deep-dive on the exact PayPal share threshold that forces the switch.
Yes — they run 2-4x the rate of card fees and carry a fixed component that punishes small baskets. Booking them at a blended rate is the single biggest source of CM error we see on Shopify stores between €1M and €15M.
On the payout object, not the order object. Each Shopify Payments payout line item includes the transaction fee and the associated order_id. You export the payout CSV or hit the Payouts API and join back to orders — the fee is never on the order record itself.
Shopify Payments breaks these out on the transaction detail: base fee plus an amex_fee and/or an international_fee component. Sum all three into one actual_fee value per order. Applying only the base rate is a common mistake that hides ~1.5-2% of margin leakage on cross-border traffic.
Shopify Payments refunds the base transaction fee but keeps the fixed component; chargebacks add a €15-€20 dispute fee. If you net refunds against original orders without also netting the fee behaviour, per-order CM will look worse than it is on refunded orders and better than it is on disputed ones. Handle both in the same join.
Yes — Shop Pay Installments carries a higher merchant fee than a standard Shopify Payments card charge, and subscription orders vs one-time orders on Installments settle differently. Treat it as its own payment method row, not lumped into 'Shopify Payments'.
Daily is ideal because Shopify Payments payouts land on a 1-3 day delay. Weekly is acceptable if you're rebuilding CM in a warehouse. Monthly is too slow — you'll be making merchandising and paid-media decisions on a mix that's already shifted.
Blended, most Shopify stores land between 2.6% and 3.4% depending on Klarna/PayPal share and international mix. Category benchmarks vary — subscription-heavy beauty runs lower because of returning-customer card reuse; fashion with high BNPL uptake runs higher.
It will change the numbers, sometimes by 1-3 points of margin on specific segments. That's the point. Communicate the methodology change to finance before the first cut lands so nobody thinks the business suddenly got less profitable — it was always this profitable, you just measured it wrong.
Start tracking the metric that matters
Free for 30 days. No credit card. Connect your site in 4 minutes and see the one metric driving revenue.