To set a minimum order quantity on Shopify you have three options: the native catalog quantity rules, which apply to B2B customers only; a theme customisation, which a shopper can walk around; or an app that enforces the rule at checkout through Shopify Functions. Only the last one holds for every customer on every path into the order. This guide covers when each is enough, how to pick the scope for a rule, and the deadline that makes this urgent for anyone still running quantity logic on Shopify Scripts.
The three places a quantity rule can live
This is the distinction that decides everything else, and most guides skip it.
- The product page. A minimum set in the theme's quantity selector. It stops an honest shopper who uses the page as designed, and nothing else.
- The cart. Validation that runs when the cart updates and blocks the checkout button. Better, and it catches the common cases — but the cart is not the only way to reach checkout.
- Checkout. A rule Shopify itself evaluates as the order is placed. Nothing gets past it, because there is no path to an order that skips it.
Why does the difference matter in practice? Because there are several routes into a Shopify checkout that never touch your product page or your cart: a permalink like /cart/12345678:10 that adds a variant and quantity directly, a saved cart from a previous session, a dynamic checkout button, a draft order, or the buy button on an external page. A rule that lives only in the theme sees none of these.
For a store using MOQs as a suggestion, cart-level validation is fine. For a store using them to protect margin, meet case-pack constraints, or enforce a wholesale agreement, only checkout enforcement is a rule at all. The rest is a request.
Shopify's built-in option, and where it stops
Shopify has native quantity rules. They live in Products → Catalogs, where you can set a minimum, a maximum and an increment per product for a given catalog.
They are genuinely good, and if they fit, use them — nothing beats a native feature for reliability. The constraint is a single sentence: catalog quantity rules apply to B2B customers buying from that catalog.
So they cover you if every customer who needs a minimum is a B2B company in your Shopify B2B setup. They do not cover:
- A DTC store that wants a minimum on a specific product, with no B2B at all.
- A mixed store where some retail customers are wholesale by agreement but not set up as B2B companies.
- Rules keyed to a customer tag rather than a catalog.
- Cart-level rules — a minimum order value, or a maximum across a collection.
- Per-customer limits over time, like "two per customer, ever".
The honest test: if you can express your rule as "this catalog, this product, min/max/increment", use the native feature and stop reading. If you cannot, you need something else.
Shopify Scripts already stopped: what that means now
If your quantity rules were built by a developer a few years ago, there is a reasonable chance they ran on Shopify Scripts. Two dates have already passed:
- 15 April 2026 — Scripts could no longer be edited or published.
- 30 June 2026 — Scripts stopped executing.
The failure mode is worth being clear about, because it was never an error message. When a Script stopped running, the rule simply stopped applying. Orders carried on being placed. They were just placed without your minimum, your maximum or your case-pack multiple, and nothing on the order said so.
Which means a store can have been running without its quantity rules since the end of June without anybody noticing. If you are not certain yours were migrated, that is worth checking today rather than at the next stocktake.
How to check whether you were affected:
- Place a test order that should be blocked. Add one unit of a product that used to carry a minimum of six and try to check out. If it goes through, the rule is not running.
- Look at orders since 1 July for quantities your rules should have prevented — single units on case-pack products, orders under a wholesale minimum, quantities that are not a multiple of your pack size.
- Check whether Script Editor is still in your admin. Its presence tells you Scripts were in use; it will not tell you what they did, because editing ended in April.
That last point is the awkward one. The usual advice was to document what your Scripts enforced before they were switched off. Past 15 April that was no longer possible, so if nobody wrote the rules down, they have to be reconstructed from what the business actually needs rather than from the code.
The replacement is Shopify Functions, which is what Shopify now uses for checkout-time logic and what a modern quantity-limit app is built on. Rebuilding on Functions is the migration, and it is worth testing through the permalink route below rather than only the product page.
What "enforced at checkout" actually means
Shopify Functions run inside Shopify's own checkout. A cart validation Function is evaluated when the buyer tries to proceed, and it can block the order with a message you write.
The practical consequences:
- It cannot be bypassed. There is no URL, no API call and no saved cart that reaches an order without passing the Function.
- It works on every surface. Online store, dynamic checkout buttons, buy buttons, and carts restored from another device.
- It does not slow the storefront down. The Function runs server-side at checkout, not as JavaScript on every page.
That is the entire argument for choosing a Functions-based app over a theme tweak. An app like Limit uses this on every plan, including the free one, which is unusual — checkout enforcement is often held back for paid tiers.
Choosing the scope for a rule
"Minimum order quantity" covers at least five different rules, and picking the wrong scope is the most common setup mistake.
- Per variant. The strictest and usually the right default. "At least 6 of this size" behaves predictably because the shopper sees it against the thing they are buying.
- Per product. Across all variants: "at least 6 of this shirt, any mix of sizes". Correct for case packs sold as an assortment; confusing when a shopper adds two sizes and the rule fires on neither individually.
- Per collection or product group. "At least 12 items from Wholesale". Useful for category-level agreements.
- Per cart. A minimum across the whole order, by quantity or by value. This is a different rule from the ones above and often the one merchants actually want when they say "minimum order".
- Per customer. Keyed to a customer tag, so tagged wholesale buyers get one set of rules and everyone else gets another. This is what lets a single storefront serve both.
Decide which of these you mean before you open any app's settings. Most support tickets about MOQ apps are a scope mismatch, not a bug.
Minimum, maximum, and multiples of
Three rules, often needed together:
- Minimum — protects margin on small orders and enforces wholesale terms.
- Maximum — stops one buyer clearing a limited run, and is the rule that matters during a launch or flash sale.
- Multiple of (also called increment or case pack) — the one people forget. If a product ships in boxes of 6, an order of 7 is a problem for your warehouse even though it clears a minimum of 6. A multiplier rule makes 6, 12 and 18 valid and 7 impossible.
Case-pack multipliers matter more than their obscurity suggests. Any store shipping from a distributor who packs in fixed quantities either enforces the multiple or spends staff time repacking and reconciling.
Minimum order value, not just quantity
Half the time a merchant says "minimum order" they do not mean units at all. They mean money: do not let anyone check out for less than £50, because below that the shipping and the picking cost more than the margin.
That is a cart-level rule and it behaves differently from a quantity rule in two ways worth planning for.
Discounts. A £55 cart with a 20% code is a £44 order. Does that clear a £50 minimum? Both answers are defensible — you might be protecting against low-value fulfilment, in which case the discounted total is what matters, or enforcing a commercial floor, in which case it is the subtotal. Decide deliberately, because an app that quietly checks the wrong one produces complaints you cannot reproduce.
Shipping and tax. Almost always the minimum should test the merchandise subtotal, not the total the customer pays. A cart that only clears your minimum because of a £9 express shipping charge has not really cleared it.
The same logic applies to weight. Stores shipping heavy goods sometimes need a minimum or maximum weight per order rather than a count, because that is what the courier actually prices.
Wholesale MOQ without a separate storefront
The common wholesale setup is expensive: a second store, or a B2B catalog, or a password-protected area. Often the requirement is much smaller than that — the same catalogue, at the same prices, with different minimums for approved buyers.
Customer tags handle that. Tag approved accounts wholesale, attach the MOQ rules to that tag, and one storefront serves both audiences. Retail customers see no minimum; tagged buyers get one.
Two things to get right:
- The rule must apply to logged-in customers only, or the tag is meaningless. Make sure wholesale buyers are actually signing in.
- Say what the minimum is before checkout. A wholesale buyer who discovers a 12-unit minimum at the checkout blocker will not enjoy it. Show it on the product page too — the enforcement lives at checkout, but the communication should not.
Per-customer and lifetime caps
A per-order maximum stops one large order. It does not stop ten small ones.
For limited releases, allocated stock, or anything a reseller wants in bulk, the rule you need counts across orders rather than within one:
- Lifetime cap. "Two per customer, ever." The right rule for genuinely allocated products.
- Time-window cap. "Three per customer per 30 days." Better for consumables, where a permanent cap punishes a genuine repeat buyer.
Both depend on identifying the customer, which means a customer account. A determined reseller with several email addresses will get around it, and no app on the Shopify App Store can honestly claim otherwise. What these rules do is raise the effort enough that casual bulk-buying stops, which is usually the actual goal.
Rules that should only apply for a while
Some limits are permanent — case packs, wholesale terms. Others exist for a week and then become a problem if nobody removes them.
The usual offenders:
- Launch caps. Two per customer for the first 48 hours of a drop, then unrestricted once the panic-buying window closes.
- Flash sale limits. A maximum that stops one buyer clearing the discounted run, removed when the sale ends.
- Allocation during a shortage. A cap while stock is tight, lifted when the supply chain recovers.
Every one of these is a rule somebody has to remember to turn off. In practice they get left on, and three months later a wholesale customer is quietly blocked from ordering more than two of something by a cap set during a launch nobody remembers.
A scheduled rule with a start and end date removes the remembering. If the app you pick does not support scheduling, put a calendar reminder in when you create the rule — the failure here is silent and slow, which is the worst combination.
The error message is part of the feature
When a rule blocks a checkout, the shopper sees one line of text. That line decides whether they fix their cart or abandon it.
A default message — "Cart does not meet the minimum requirements" — tells the buyer they have done something wrong without telling them what. Compare it with: "This product ships in boxes of 6. Please order 6, 12 or 18."
Three rules for writing them:
- Say the number. The shopper cannot infer a minimum you have not told them.
- Say which product. In a cart of eight items, "an item does not meet the minimum" is a puzzle.
- Say why, when the reason helps. "Sold in case packs of 6" reads as a fact about the product. "Minimum not met" reads as an obstacle.
Setting it up
With Limit the sequence is short:
- Install and pick the scope. Product, variant, collection, customer tag or cart — decided before you touch the settings.
- Set the rule. Minimum, maximum, or a multiplier for case packs. These combine.
- Write the error message. Name the number and the product.
- Add the product-page block so the requirement is visible before the cart, not just enforced after it.
- Test through a cart permalink, not only the product page. That is the path that proves enforcement is real.
The free plan covers three products or variants with full checkout enforcement, which is enough to test the behaviour properly before committing. Unlimited products, wholesale and B2B tag rules, lifetime and time-window caps, and scheduled rules are on the $9.99 plan.
Testing a rule properly
Most people test by opening the product page, setting the quantity too low, and confirming they cannot continue. That proves the least interesting thing — that the theme block works.
The test that matters uses a route that skips the product page entirely. Shopify supports cart permalinks: yourstore.com/cart/VARIANTID:QUANTITY adds that variant at that quantity and sends the shopper to checkout. Build one that violates your rule and open it.
- Blocked at checkout with your message? The rule is real.
- Order goes through? Your enforcement lives in the theme, whatever the app's marketing says.
Worth testing on the same day: adding to cart from a collection page, a saved cart from another device, and — if you use them — a dynamic checkout button like Shop Pay, which takes the buyer straight from the product page past the cart.
For per-customer and lifetime caps, the test needs a second order from the same account rather than a bigger single one, since that is exactly the case the rule exists for.
Mistakes worth avoiding
- Enforcing only in the theme. Covered at length above, and it is the one that matters.
- Setting the minimum per product when you meant per variant. Or the reverse. Decide first.
- Hiding the rule until checkout. Enforcement belongs at checkout; communication belongs on the product page.
- Forgetting the multiplier. A minimum of 6 still lets someone order 7.
- Assuming Scripts still enforce anything. They stopped on 30 June 2026, silently.
Where to go next
If your rules fit Shopify's native catalog quantity rules, use those. If they do not — because you are DTC, or mixed, or tag-based, or cart-level — you need checkout enforcement, and the thing to check in any app is whether it runs on Shopify Functions or on your theme.
You can see how Limit handles scopes, multipliers and per-customer caps, with checkout enforcement on the free plan.