Hi everyone,
If you accept deferred payment methods (Multibanco, bank transfer, cash on delivery, B2B payment terms), Shopify creates the order at checkout with “Payment pending” status and treats it as a sale straight away.
The biggest impact is outside Shopify: external software, especially ad campaign management tools, reads every order as revenue, and purchase conversions are sent to the ad platforms before payment is confirmed. When an order is never paid, nothing corrects it. ROAS and MER are overstated, and campaigns optimise towards orders that never turn into money.
Inside Shopify Analytics it’s the same: unpaid orders count as sales on the order date, and when they’re cancelled the reversal often lands in a different month.
The existing workarounds don’t fix it:
- Each external tool would need its own logic to exclude unpaid orders, and most don’t offer it.
- Filtering by order_payment_status keeps the sale on the order date, so past months change when an order is paid later.
- The Payments report is cash-based but only shows gross amounts (with VAT and shipping), not net sales.
What I’ve asked Shopify Support for:
- A store setting to count pending-payment orders as sales only when payment is received, across Analytics and in the purchase events sent to marketing channels and pixels (or an automatic retraction when an unpaid order is cancelled).
- An option in sales reports and ShopifyQL to report sales on the payment date instead of the order date.
I’ve already submitted this through Shopify Support. If you have the same problem, please reply or like this post so Shopify can see how many merchants need it.
Related thread: Net Sales Dashboard - Not Including Payment Due Later Sales
Thanks!
Jorge
Same problem here with bank transfer orders. While Shopify looks at this, there are two partial fixes on the tracking side you can do today.
GA4: you can’t delete a purchase, but you can send a refund event with the same transaction_id through the Measurement Protocol when an unpaid order gets cancelled. GA4 then nets that revenue out. It lands on the cancel date, not the order date, so a month can still move a bit, but the totals stop drifting up.
Google Ads: if your purchase conversion passes the order ID, you can upload a retraction for that order (Goals > Uploads, conversion adjustments). Then the conversion is removed instead of left in for bidding.
Before building either, export last month’s cancelled unpaid orders and check their order numbers against the GA4 transaction IDs. That shows how much is actually inflated, and whether the IDs line up well enough to automate it.
This is a real pain for anyone running COD or other deferred methods - especially when ad platforms treat every created order as revenue.
A few practical notes while Shopify considers the feature request:
-
Inside Shopify Analytics, filter by payment status where the UI allows it, and treat Pending separately from paid when you review weekly numbers. For month-over-month, export orders (or use ShopifyQL) and attribute paid orders by payment/transaction date rather than created_at so unpaid cancels do not warp prior months.
-
For ad platforms, do not rely only on the default purchase pixel that fires at checkout completion. Route conversions through a path that only fires when financial_status becomes paid (for example a custom web pixel or a small middleware listening to order payment webhooks). That alone usually fixes most of the ROAS inflation.
-
Keep a simple weekly reconciliation: paid orders vs created orders for deferred methods. The gap is your “phantom revenue” number - useful for media buyers even before Shopify ships a native setting.
Upvoting the request makes sense - a store-level “count sales on payment” toggle would help a lot of markets where COD and similar methods are still common.
Worth adding the inventory side, because it costs you twice. A pending order commits stock the moment it’s created, paid or not. So a bank transfer order that never gets paid sits on those units until somebody cancels it, and the product can show sold out online while the stock is still on the shelf.
It also lands in your sales history. Anything that works out reorder quantities from your orders reads it as demand unless it checks payment status, so the next PO gets sized on money that never came in.
Until there’s a setting, two things help. Filter pending and voided orders out of whatever feeds your reorder math. And once a week pull the pending orders older than your payment window and cancel them with restock ticked, so the units go back to available.