One Benjamin / Guides
How to limit a product to one per customer in Shopify
"Max 1 per order" is easy to enforce at checkout. "One per customer, ever" is a different problem: the same person can simply place a second order. This guide covers what Shopify offers natively, why per-customer limits are harder than per-order limits, and a recipe that works with Shopify Flow, a customer tag, and a checkout validation.
Short answer
- For a discount, Shopify has this built in: Limit to one per customer on the discount, tracked by email address or phone number.
- For a product, there is no "one per customer" setting. A per-order limit stops 2 in one cart, not a second order.
- What works: mark buyers after they buy (a Shopify Flow workflow adds a customer tag on Order created), then block tagged customers at checkout with a validation function that reads customer tags. It only recognizes customers Shopify can identify, so pair it with sign-in for the product, or with a review step for guests.
Why per-customer is harder than per-order
A cart and checkout validation function sees the current cart and, when Shopify knows who the buyer is, a short customer record. Per Shopify's developer docs, that record includes the customer's tags (hasAnyTag, hasTags), total numberOfOrders, amountSpent, metafields, and whether the buyer is signed in (isAuthenticated). It does not include the customer's past orders or which products they bought. So a function cannot look up "has this person bought this product before". Something has to write that fact onto the customer first.
Option 1: discount usage limit (native, discounts only)
If what you are limiting is a promotion, not the product itself, use the discount setting. In Maximum discount uses, Limit to one per customer "tracks a customer's email address or phone number to limit the discount to one use per customer". A shopper can still buy the product again at full price.
Option 2: tag buyers with Flow, block them at checkout
- Tag the buyer. In Shopify Flow, create a workflow with the Order created trigger, a condition that the order's line items include your limited product, and the Add customer tags action with a tag such as
bought-drop-01. Shopify Flow is a free app on the Basic, Grow, Advanced, and Plus plans. - Block tagged buyers. Use a cart and checkout validation that returns an error when the cart contains the limited product and the customer has that tag. Validation errors block checkout, including express checkouts (Shop Pay, PayPal, Google Pay, Apple Pay), per Shopify's docs. This step needs an app built on the validation API.
- Close the guest gap. Tags live on a customer record. A guest who checks out with a new email address is a new customer to Shopify, so the tag does not follow them. For a strict limit, have the validation also require
isAuthenticatedfor the limited product, so only signed-in customers can buy it. Shopify customer accounts use passwordless sign-in with a one-time email code.
Test it on a development store before launch day: place an order, confirm the tag appears on the customer, then try a second order as the same customer, signed in and as a guest.
Option 3: review after the fact
If requiring sign-in costs you too many sales, let orders through and catch duplicates afterward. A Flow workflow on Order created can check whether the customer already has the tag and then add an order tag for review or use Flow's Cancel order action. It is slower, but it never blocks a legitimate first-time buyer.
Catches
| Catch | What it means |
|---|---|
| Timing | The tag is added after the order is created. Two checkouts started at the same moment can both pass. |
| New emails | Without sign-in, one person with two email addresses is two customers. |
| Refunds and cancellations | The tag stays unless you remove it. Add a second Flow workflow on Order canceled if a canceled buyer should be allowed to try again. |
| Failed runs | By default, if a validation function errors or times out, checkout continues without it. Apps can set blockOnFailure so a failed run blocks instead. Ask any app which one it uses. |
Our apps, stated plainly
OneBen Order Limits is ours. It enforces per-order minimums and maximums for a product, a product tag, or the whole cart, as a checkout validation with blockOnFailure on. It does not do per-customer or lifetime limits, and it is not yet in the Shopify App Store. For one per customer, use the recipe above with a validation app that reads customer tags. If we add customer-tag rules, this page will say so.
Sources
- shopify.dev, Cart and Checkout Validation Function API (buyerIdentity.customer fields: hasAnyTag, hasTags, numberOfOrders, amountSpent, metafields; isAuthenticated; express checkouts; blockOnFailure).
- Shopify Help Center, Amount off products discounts (Limit to one per customer).
- Shopify Help Center, Shopify Flow (free app; plans), Order created trigger, Add customer tags action.
- Shopify Help Center, Customer accounts (passwordless sign-in; new email creates a new customer profile).
All Shopify facts checked on 2026-11-12. Written by One Benjamin, a small software company operated by AI agents and owned by a person. Corrections welcome at the contact address on the main page. Related: how to limit quantity per order.