Guide7 min read2026-03-27

How to prevent repeat purchases on Shopify with a lifetime limit

ByViralPilot|Ecommerce SaaS agency, 8 years experience

You have a product that should only be purchased once per customer. A trial box, a starter kit, a free sample, an intro-priced bundle. One per person, ever. Not one per order. One per lifetime.

Shopify has no setting for this. There's no checkbox that says "limit this product to one purchase per customer." You can limit discount code usage. You can limit quantity per order. But you cannot tell Shopify "if this person already bought this product, don't let them buy it again."

That's a problem if your business model depends on it.

Where this matters most

Lifetime purchase limits aren't a niche requirement. They show up in several common Shopify business models:

Trial and sample boxes. You sell a $5 trial box (or give it away free) so new customers can try your products. The goal is to convert them to full-price purchases. If the same person orders 6 trial boxes with different emails, you're paying for product and shipping 6 times with zero conversion.

Starter kits at introductory pricing. A $79 starter kit that normally costs $120. It's priced at a loss to acquire new customers. Every repeat purchase deepens that loss instead of recovering it.

Free product promotions. "First one free" campaigns where you absorb the full cost of goods and shipping. A single repeat abuser at $30 per order, placing one order per week, costs you $1,560/year.

Welcome bundles tied to a discount. A special product that's only available with a new-customer code. The discount protects the code, but nothing protects the product itself. A returning customer can buy it at full price, or with a different code, and you still lose the unit economics you planned around.

Limited edition or exclusive items. Products meant for broad distribution, not for one person buying the entire stock.

In all of these cases, you need something Shopify doesn't offer: a per-customer lifetime cap on a specific product.

What merchants try (and why it fails)

When you search for solutions, you'll find several approaches. Here's what each one actually does and where it breaks down.

Quantity limits per order

Shopify lets you limit how many units of a product someone can add to their cart in a single order. This has nothing to do with repeat purchases. A customer can buy one today, one tomorrow, one next week. The limit resets with every new checkout.

Shopify Flow

Shopify Flow can tag customers after purchase or cancel orders that meet certain criteria. Some merchants build flows that tag a customer after they buy a specific product, then use that tag to trigger actions on future orders.

The problems: Flow runs after the order is placed, not before. The customer has already checked out and been charged. You then need to cancel and refund, which creates a bad experience and operational overhead. Flow also only works on Shopify Plus or with accounts that have access to Flow, and the tag-based approach fails entirely at guest checkout where there's no persistent customer record to tag.

Locksmith

Locksmith is a popular access-control app that can hide or lock products based on customer tags, passwords, or other conditions. You could tag customers who've purchased your trial product and then lock the product for anyone with that tag.

This approach has two issues. First, it relies on customer tags, which means it only works for logged-in customers with accounts. Guest buyers don't get tagged. Second, it hides the product or blocks access to the product page, but a determined customer can still reach checkout if they have a direct link, a saved cart URL, or buy through Shop Pay. The block happens at the storefront level, not at checkout.

Manual order review

Some stores manually review orders for their protected products. A team member checks each order against the customer database, looks for duplicate addresses, and cancels suspicious ones.

This works, sort of, until you're processing more than a handful of these orders per day. It's slow, error-prone, and expensive in labor. A customer using a different email and slightly different address formatting ("St" vs "Street") can easily slip through.

Limit Once app

There's a Shopify app called Limit Once that's specifically built for one-time purchase restrictions. It checks if a customer has previously bought a product and prevents repeat purchases.

Limit Once handles the basic case where a logged-in customer tries to re-order the same product. But it identifies customers primarily through their Shopify customer ID and email. If someone checks out as a guest, creates a new account, or uses a different email address, Limit Once treats them as a new customer. It doesn't do multi-signal identity detection, so the same person with a Gmail alias or a throwaway email address bypasses the restriction.

If your customers are not actively trying to game the system, Limit Once may work fine. If you're dealing with intentional repeat abuse from people who know how to use a different email, you need deeper identity matching.

What a real lifetime purchase limit looks like

A working lifetime purchase limit needs two things: product-level blocking at checkout (not on the product page, not after the order) and identity matching that goes beyond email addresses.

Product-level blocking at checkout means the restriction is enforced at the moment of payment. The customer can browse the product page, add it to cart, and start checkout. But when they hit the payment step, the system checks their identity against your order history for that specific product. If they've bought it before, checkout is blocked. No completed order, no refund needed, no manual review.

This is different from discount-level restrictions. You're not protecting a coupon code. You're protecting the product itself. Even if the customer pays full price with no discount, they can't buy it again.

Multi-signal identity matching means the system doesn't rely on email alone to recognize a returning buyer. It checks across several data points:

  • Normalized email to catch Gmail dots, plus aliases, and domain variants that all point to the same inbox
  • Phone number from shipping details, which most people reuse even when changing emails
  • Address similarity using fuzzy matching to catch "123 Main St" vs "123 Main Street, Unit A" as the same location
  • IP address to identify multiple "new" customers coming from the same network
  • Device characteristics that create a fingerprint persisting across incognito sessions and cookie clearing

When these signals are evaluated together, the system can recognize a returning customer even when every visible identifier has changed. Three matching signals out of five is a strong indicator, regardless of what email they typed in.

You can read more about how product-level blocking works at checkout in our guide on blocking products at checkout based on purchase history, and how address matching catches household-level abuse in Shopify one-per-household address matching.

How OfferGuard handles this

OfferGuard runs server-side through Shopify's Checkout Extensions API. You select which products need a lifetime purchase limit. When any customer reaches checkout with one of those products in their cart, OfferGuard checks their checkout details against your full order history using all five identity signals.

If the customer is recognized as a previous buyer of that product, the checkout is blocked before payment. The customer sees a clear message explaining the product is restricted to first-time buyers.

This works for every checkout path. Logged-in customers, guest checkout, incognito browsers, Shop Pay, buy-it-now buttons. The check runs at the server level regardless of how the customer reaches checkout.

A few things OfferGuard doesn't do, for transparency: it can't prevent someone from using a completely different device on a different network with a genuinely new email and a different shipping address. No identity system catches that. What it catches is the 90%+ of repeat abuse that relies on quick, easy tricks like email aliases, guest checkout, and incognito browsing.

The cost of not having a limit

Every unprotected trial product, starter kit, or free sample that gets claimed by a repeat buyer is margin you're handing away. A $5 trial box doesn't sound like much until you realize someone ordered it 12 times across 12 emails over 3 months. That's $60 in product cost plus shipping for one person who was never going to convert.

Multiply that across everyone in your customer base who's figured out the trick (and they share notes in deal-hunting communities), and you're looking at hundreds or thousands of dollars per month in preventable loss.

The product-level protections you need don't exist natively in Shopify. The workarounds either run after the order is placed, only work for logged-in customers, or rely on email as the sole identifier. None of them solve the actual problem.

Get a real lifetime purchase limit

OfferGuard's free plan lets you protect one product with full five-signal identity matching. If you need to protect multiple products, paid plans start at $4.99/mo. It works on every Shopify plan, not just Plus.

See plans and protect your products →

Try OfferGuard on your store.

Free plan available. No credit card.

Install free on Shopify