Sushinet

Block Cash on Delivery for First-Time Customers

Hide Cash on Delivery for first-time Shopify buyers via a guest-checkout proxy, and keep it available for repeat customers.

explainerpayment methodscash on deliverylimits

Cash on Delivery risk isn't evenly spread across your customers — it concentrates in the orders you have the least information about. A first-time buyer with no order history is a bigger unknown than someone who's completed three orders with you already, but Shopify's checkout treats them identically unless something tells it otherwise — and, as it turns out, order history is not something any rule can read while a buyer is checking out.

The native way

Shopify's payment customizations can hide a payment method based on a handful of built-in conditions — cart contents, shipping destination, cart total. On eligible plans, that's the correct native tool for a checkout-level payment restriction.

Where it breaks

None of the native conditions read a customer's order history — whether this is their first purchase or their fifteenth simply isn't one of the available conditions, no matter which plan you're on.

Why no app can read order count at checkout either

This is the part most articles on this topic get wrong, so it is worth being precise.

Shopify caps how much data a rule may read while a buyer is actually checking out. Everything a checkout rule looks at has to fit inside one input query, and that query has a hard complexity budget. A customer's past order count does not fit — not because apps are lazy about it, but because the budget is already spent on the cart, the address and the customer's identity.

So if you find an app promising to hide a payment method based on order history at checkout, be sceptical, and test it on a real order before you trust it. A rule built on a condition Shopify will not evaluate does not error — it simply never fires, which looks identical to a rule that is working and finding no matches.

Ruleproof states this on the rule itself rather than letting you discover it in production: a condition that cannot run at checkout is labelled as such while you are writing it.

The proxy that does work: guest versus signed-in

Whether the buyer is checking out as a guest is available at checkout, and it is the closest usable signal:

If the customer is checking out as a guest → hide Cash on Delivery.

Because it's a rule:

  • Signed-in customers keep COD. A customer with an account who signs in is recognised at checkout and keeps COD — no manual list to maintain.
  • Combine with cart total. Restrict COD only above a value where the risk is actually worth avoiding, and leave small orders unaffected.
  • Preview and monitor. Test it as a guest and as a signed-in shopper before it's live, then run it in monitor mode to see exactly how many real orders it would have restricted.

It is not the same predicate, and it is worth being honest about the difference: a returning customer who does not sign in looks like a guest, and a first-time buyer who creates an account does not. What it captures is "we know nothing about this person right now", which is the risk you were actually trying to price.

Sizing it with the data you can see

Order count is unavailable at checkout, but it is not unavailable everywhere. Two things you can still do:

  • Monitor mode will tell you how many real orders the guest rule would have affected, before you switch it on, so you are not guessing at the trade.
  • Tagging happens after the order, through the Admin API, where the order-count limit does not apply. Rules2Tag can tag customers by their real order count for segments and email flows — just not in time to change a checkout that is already happening.

Which should you use?

If your store's COD risk is genuinely spread evenly across every customer, a simple cart-total restriction may be enough. If it concentrates in buyers you know nothing about, the guest rule is the honest version of what you were reaching for — and Ruleproof lets you write it as a sentence, preview it on a guest and a signed-in shopper, and monitor it before it changes a real checkout.

Do this without touching code

Ruleproof builds every rule on this page as a plain sentence, previews it on a test shopper, and watches it against your real orders before it changes one — then switches on.

Questions

Why single out first-time customers specifically?

A repeat customer has already completed at least one order successfully — a real, verifiable signal that they follow through on a purchase rather than refusing the parcel or vanishing after checkout. A buyer you know nothing about is exactly where Cash on Delivery's risk concentrates: refused parcels, fake or incomplete addresses, no-shows at the door, all cost more when it's a customer you've never dealt with before. It's worth being precise about the mechanism, because a checkout rule genuinely cannot read order count itself — Shopify caps what a rule may look at while a buyer is actively checking out, and a customer's full order history doesn't fit inside that budget. The usable signal instead is whether the buyer is checking out as a guest, which approximates 'we know nothing about this person yet' closely enough to be useful, even though it isn't literally the same fact.

Doesn't Shopify's native payment customization already support this?

It can hide a payment method based on a handful of built-in conditions — cart contents, shipping destination, cart total — and for a single simple case, that's a real, correct native capability worth using instead of installing an app. But 'this customer has no prior orders with us' is a fact about their HISTORY, not about the current cart, and history-based conditions are outside what the native condition set covers on most stores. That's a meaningful gap for exactly the use case this page is about: a store can restrict COD by order value using native tools alone, but restricting it by whether this is someone's first purchase requires either a workaround (the guest-checkout proxy covered elsewhere on this page) or a rules app that can express the condition directly as a readable sentence rather than a manual native-settings workaround.

Can I combine this with a cart-total condition too?

Yes — combining conditions is exactly how you avoid an all-or-nothing restriction. Hide COD for a first-time customer only on carts over $100, for example, and a small first order still gets the convenience of COD while a large, riskier first order doesn't — rather than blocking COD for every brand-new buyer regardless of how much risk that specific order actually represents. That's usually the more accurate rule anyway: the real risk in Cash on Delivery isn't 'this is someone's first order,' it's 'this is a large, unverified commitment from someone with no track record,' and stacking the guest condition with a cart-total threshold gets you closer to that actual risk rather than a blunter proxy for it. You can tune the exact dollar threshold to wherever your own COD losses tend to concentrate, rather than guessing at a generic number.

What happens once they've ordered once?

Their next checkout sees them as a returning customer rather than a guest — assuming they check out signed in, or Shopify otherwise recognises them — so the rule no longer applies and COD reappears as an available option automatically. Nothing needs updating manually: there's no list of 'customers who've now ordered once' to maintain, no tag to remove, no admin task to remember. The rule re-evaluates the same condition fresh on every single checkout, so a customer's status is always judged by their current state at that exact moment, not by a snapshot taken the first time they ever showed up. That's part of what makes a guest-checkout proxy workable despite not being literally 'order count': it self-corrects the moment the underlying signal genuinely changes, with no separate cleanup step required on your end.

Related guides

Ready to try it?

Ruleproof builds every rule on this page as a plain sentence, previews it on a test shopper, and watches it against your real orders before it changes one — then switches on.

← All checkout rule guides · See what Ruleproof does