TL;DR
Shopify's manual payment methods (cash on delivery, bank transfer, money order) create orders that are unpaid when they're placed [1]. By default the app reports each one to your ad platforms as a full purchase at that moment, the same way Shopify's own sales report counts it [4], and it never retracts one later. For a store with a meaningful share of COD, that means Meta and Google Ads are learning from buyers who never pay. The app's Plus plan can hold the purchase, destination by destination, until Shopify marks the order paid. The trade is timing, and the date each platform records shifts in ways worth knowing before you switch.
Key Takeaways
- Card orders are paid at checkout, so they go out at checkout under either setting. The choice only changes pay-later orders, and card orders on manual capture, which wait until capture [3].
- "When the order is paid" releases the purchase when Shopify marks the order paid, whether a staff member marks it paid in the admin [2] or an app records the payment through Shopify's mark-as-paid API [6].
- A partially paid order doesn't count as paid, so the purchase waits for the full amount.
- Google Ads keeps the order's creation date in paid mode. Meta, TikTok, Reddit, Snapchat, Pinterest and OpenAI Ads keep it unless payment lands more than 6 days later. GA4 and Klaviyo take the payment day.
- The setting is per destination, not per payment method. You can hold Meta and Google Ads and leave GA4 on creation.
- Your own refusal rate and payment lag come from the Payment Method, Created at, Paid at and Canceled at columns of Shopify's order export [10].
Where 1,000 COD orders end up
Start with the only public number that has a name and a date on it. Shipway, an Indian logistics platform, reported in its FY25 ShipNotes data that "nearly 26% of the non-prepaid orders are returned", against "less than 2% of prepaid orders" [9]. The scope is narrow: India, D2C shipments processed through Shipway in its FY25 year, with no total order count published [9]. Treat it as one market's benchmark rather than yours.
Run the arithmetic on an illustrative store using that rate:
| Orders | Value at $50 average | ROAS on $10,000 spend | |
|---|---|---|---|
| COD orders placed (reported by default) | 1,000 | $50,000 | 5.0 |
| Returned instead of paid (26%) | 260 | $13,000 | |
| Actually paid | 740 | $37,000 | 3.7 |
Reported purchases run about 1.35 times the paid ones (1,000 against 740). Every one of the 260 returned orders stays a purchase as far as Meta's and Google's bidding can tell, at the full order value.
That last part is the one people miss. Nothing already sent is ever taken back. The app doesn't send cancellations to ad platforms, so canceling the order in Shopify after the courier brings the parcel back changes Shopify and nothing else. Refunds and cancellations in ad platform reporting covers the manual clean-up path per platform, including Google Ads adjustments.
If you've ever reconciled a courier's remittance file against your Meta purchase count for the same week, you already know which number is bigger.
For bank transfers there is no equivalent public figure. We couldn't find a named, dated non-payment rate for them anywhere. The section on deciding per payment method below shows how to pull your own from Shopify.
What does the app send for a pay-later order by default?
A full purchase, at the order total, when the order is created.
Shopify treats cash on delivery, money orders and bank transfers as manual payment methods, switched on under Settings > Payments in the Payment providers section [1]. "Orders that accept manual payments are marked as unpaid on the Orders page" [1], and you mark them paid once the money arrives. A customer who picks one of them at checkout places a normal online store order, so it reaches every destination you've connected, with the browser session and click IDs that visit carried.
On the default "On order creation" setting, the app doesn't look at payment status at all. The purchase goes out to Meta, Google Ads, GA4, TikTok and the rest the moment the order exists. On the free plan, which covers GA4, that's the only behavior available.
This matches Shopify's own reporting. Shopify's sales report states that "Pending, unpaid, and canceled orders are included in the reports", with cancellations appearing later as sales reversals [4]. So a refused COD parcel shows up in Shopify first as a sale and then as a reversal, while the ad platforms only ever see the first half. The pending-payment gap is one line in our piece on why Shopify and GA4 revenue never match; this is the operational answer to it.
What changes with "When the order is paid"?
The purchase moves from the moment the order is placed to the moment Shopify marks it paid. Each destination in the app has a "When to send the Purchase event" choice (Klaviyo's reads "When to send the Placed Order event"), with two options: "On order creation (default)" and "When the order is paid". It's on the Plus plan ($39/mo, the app's plan, unrelated to Shopify Plus) [11].
The app's own help text for the paid option: "Unpaid Pix, boleto or bank transfer orders that expire are never reported, manual orders are reported when you mark them as paid, and conversions appear when payment is confirmed rather than at checkout."
In practice:
-
What releases it. Shopify notifies apps "whenever an order is paid" [5]. That can be your team clicking Collect payment and then Mark as paid in the order's Payment pending section [2], or a courier or reconciliation app calling Shopify's
orderMarkAsPaid, which "Marks an order as paid by recording a payment transaction for the outstanding amount" [6]. The app never reads which payment method was used. It keys on Shopify's paid status. - What counts as paid. Paid, partially refunded and refunded. A partially paid order waits until the balance is settled.
- What goes out. The full order total as it stands when the order is paid.
- What never goes out. An order canceled before payment, or never paid. The waiting purchase is simply never sent.
- $0 orders still go out at creation, since no money is ever going to arrive for them.
The same setting covers net-terms B2B orders, where the wait runs as long as the payment terms.
Is holding the purchase free? No. Meta asks for events "as soon as they occur and ideally within an hour" [7], and a COD order that pays on delivery day 4 reaches Meta four days later than it would have.
Which date each destination records when payment lags
Paid mode moves the send. It doesn't always move the date. Here's one COD order paid on day 3 and one bank transfer paid on day 9, both placed on day 0:
| Destination | COD paid day 3 | Bank transfer paid day 9 |
|---|---|---|
| Google Ads | Dated day 0 | Dated day 0 |
| Meta, TikTok, Reddit, Snapchat, Pinterest, OpenAI Ads | Dated day 0 | Dated day 9 |
| GA4 | Dated day 3 | Dated day 9 |
| Klaviyo (Placed Order) | Dated day 3 | Dated day 9 |
Why the split? Meta accepts an event_time "up to 7 days before you send an event" [7], and the app treats the other five ad platforms the same way: it keeps the creation date on those six only while payment lands within 6 days. Past that, it sends the payment time so the event isn't rejected. Google Ads measures its click window against the conversion time, so the app always gives it the creation date. GA4 and Klaviyo are stamped when the event is sent, which in paid mode is the payment day.
The day-9 row has a real cost. Google's own description of a click window: "If you set your conversion window to 7 days, any conversion that happens more than 7 days after the ad interaction won't be recorded" [8]. Google Ads avoids that by keeping day 0. On the other six, a shopper who clicked an ad on day 0 and paid by transfer on day 9 is measured against whatever click window your attribution setting uses, and a 7-day window misses them. Attribution windows and reporting delays covers the window settings per platform.
GA4 moves too. A COD order placed Friday and paid Monday lands in Monday's GA4 revenue, which will disagree with Shopify's Friday order for that week's reporting. How long until conversions show up has the normal delays to compare against.
Deciding per payment method
What you need is two numbers from your own store: what share of each pay-later method never pays, and how long the ones that pay take.
- In Shopify admin, go to Orders and click Export [10].
- Choose Orders by date, cover the last 90 days, and export to CSV (Shopify emails the file) [10].
- Filter the Payment Method column to one method at a time, for example cash on delivery [10]. Count orders, not rows: extra line items get their own rows with most fields blank [10].
- Count the orders with a Canceled at date and no Paid at date, plus any still unpaid long after delivery. Divided by that method's total, that's your non-payment rate [10].
- For the paid ones, subtract Created at from Paid at [10]. Note the share that took more than 6 days.
Then read it this way. If your export shows a high non-payment rate with short payment lag, that's the strongest case for paid mode on the ad platforms you bid on: you remove the refused orders and keep day-0 dates on all six. If it shows a low non-payment rate with long lag, paid mode costs you dates and click windows for very little correction. Money orders fall wherever your own export puts them.
One option is to keep GA4 on creation even when the ad platforms wait. Seeing every placed order there, dated to the day it was placed, keeps GA4 close to Shopify's order list, and the ad platforms still learn only from orders that pay.
What if your COD orders come from a form app?
Check the order's sales channel first. Some stores collect cash on delivery through a form app instead of Shopify's checkout, and those orders reach Shopify by whatever route the app uses. If the app creates the order through Shopify's API, the order is an app-created one, which the app treats like other back-office orders: not sent at all on the free plan, and removable per channel with the "Exclude Admin/API Orders" setting on the Plus plan. If the app completes a draft order with no staff member attached, it counts as a storefront order. Which route a given app uses is the app's choice, so look at a recent order in your admin rather than assuming. Staff-built phone and manual orders are a separate case again; our admin and POS order guide covers how back-office orders are tracked.
If you'd rather your ad platforms learn only from COD and transfer orders that actually pay, WeltPixel Conversion Tracking lets you set the moment the purchase is sent for each of its nine destinations on the Plus plan, with Google Ads keeping the order's original date.
FAQ
Does Shopify count unpaid cash-on-delivery orders as sales?
Yes. Shopify's sales report includes pending, unpaid and canceled orders, and a cancellation shows up later as a sales reversal [4]. The default tracking setting behaves the same way, minus the reversal.
Will canceling a refused COD order remove the purchase from Meta or Google Ads?
No. Nothing already sent is taken back when you cancel. With "When the order is paid" on, a refused order was never sent, so there's nothing to remove.
Does a partial payment release the purchase?
No. A partially paid order doesn't count as paid, so the purchase waits until the full amount is settled. Partially refunded and refunded orders do count as paid.
Can I hold COD orders but send card orders immediately?
You don't need to choose. Card orders are paid at checkout [3], so with "When the order is paid" on they still go out as soon as the order is placed. Only unpaid orders wait.
Sources
- Shopify Help Center, "Manual payment methods", help.shopify.com/en/manual/payments/manual-payments, accessed September 30, 2026
- Shopify Help Center, "Managing orders with deferred payments", help.shopify.com/en/manual/fulfillment/managing-orders/payments/deferred-payments, accessed September 30, 2026
- Shopify Help Center, "Capturing payments", help.shopify.com/en/manual/fulfillment/managing-orders/payments/capturing-payments, accessed September 30, 2026
- Shopify Help Center, "Sales report", help.shopify.com/en/manual/reports-and-analytics/shopify-reports/report-types/default-reports/sales-report, accessed September 30, 2026
- Shopify developer documentation,
WebhookSubscriptionTopicenum (orders/paid: "Occurs whenever an order is paid."), shopify.dev/docs/api/admin-graphql/latest/enums/WebhookSubscriptionTopic, accessed September 30, 2026 - Shopify developer documentation,
orderMarkAsPaidmutation, shopify.dev/docs/api/admin-graphql/latest/mutations/orderMarkAsPaid, accessed September 30, 2026 - Meta for Developers, Conversions API, "Using the API", developers.facebook.com/documentation/ads-commerce/conversions-api/using-the-api, accessed September 30, 2026
- Google Ads Help, "About conversion windows", support.google.com/google-ads/answer/3123169, accessed September 30, 2026
- MediaBrief, "ShipNotes reveals 26% RTO rate on COD orders across India" (Shipway FY25 ShipNotes report), July 29, 2025, mediabrief.com/shipnotes-reveals-26-rto-rate-on-cod-orders-across-india/, accessed September 30, 2026
- Shopify Help Center, "Exporting orders" (Payment Method, Created at, Paid at, Canceled at columns), help.shopify.com/en/manual/fulfillment/managing-orders/exporting-orders, accessed September 30, 2026
- WeltPixel Conversion Tracking, Shopify App Store listing, apps.shopify.com/weltpixel-conversion-tracking, accessed September 30, 2026