Offering a free product once per customer

Topic summary

Goal: limit a free sample product to once per customer; current setup prevents multiple in one cart but not on return visits.

Key approaches proposed:

  • Theme-level gating (Liquid): require login, tag customers after they claim the sample (e.g., “bought free sample”), and hide the add-to-cart button for the sample if the tag exists. Simple, but can be bypassed via direct add-to-cart links or other apps.
  • After-the-fact filtering: use automation (Shopify Flow, Mechanic, or a custom app) to detect repeat sample orders, tag them, auto-cancel or queue for review, and notify staff to stop fulfillment and contact the customer. Doesn’t block order placement but reduces leakage.
  • Checkout-level validation: when the sample SKU is in cart, look up past orders by customer ID/email (optionally phone/address); if a prior sample exists, block checkout with a friendly message while allowing full-size products. One contributor is building an app that exposes a “once-per-customer” rule via Checkout Validation.
  • Alternative app: add the sample post-checkout for eligible orders, with a “run each rule once” option; a short video demo is linked.

Caveat: “once per customer” usually means once per email/customer record; determined users can use new emails.

Status: no confirmed resolution; consensus leans toward a layered approach for best enforcement.

Summarized with AI on November 26. AI used: gpt-5.

Hi,

I’m working with a client who offers a free sample product, but they want to limit it to once per customer. Currently the customer can only add one to the cart, but if they come back again they can get another without any problem. I’m looking for an app or solution where I can stop this from happening. I tried one app that adds a tag to the customer when they activate the free sample sale, but I can’t get it to limit them from getting another one. Any suggestions would be greatly appreciated.

Cheers

Rob

To identify the customer pre-sale they would have to have an account and be logged in. If they’re logged in, you can use liquid to hide the add to cart button for that product.

Example:

{% unless customer.tags contains "bought free sample" %}
put add to cart button code here
{% endif %}

The only other solution I can think of is to have the app notify your staff if a customer makes a 2nd purchase with the free sample. For example, you have the tag applied on first purchase, then have a tag rule that if customer has that tag, send a notification to staff so they can stop the fulfillment and contact the customer. If the app you’re using doesn’t have notifications like that, Order Automator does this.

Have you solved this problem now?

Hey Rob and @justin456770 ,

I built an app for precisely this purpose. Our approach is to add the sample to the order AFTER checkout, and is great for cross selling a customer into a subscription or a new product category that they haven’t tried yet. We even have a checkbox that only runs each rule once.

Link to our App: https://apps.shopify.com/pls-smart-pack-ship

And a short video demonstrating the setup:https://www.youtube.com/watch?v=Ei4LGhkZh3Y&themeRefresh=1

Hi @robofmanyfaces and @justin456770,

Not sure if you’ve already solved this by now, but for anyone else who finds this thread with the same “free sample once per customer” problem, here’s how I’d think about it.

You’re running into the core limitation that most approaches are really just “one per email” or “one per customer record”. That’s fine for casual use, but as soon as people are motivated enough they’ll just come back with a new email and grab another freebie.

There are basically three layers you can combine:

  1. Theme-level hiding (what Joe suggested)
  2. After-the-fact filtering (cancel / tag repeat sample orders)
  3. Checkout-level validation (stop the second sample at checkout)

  1. Theme-level hiding

Joe’s suggestion is the simplest version:

  • Require accounts and login for the free sample.
  • Tag customers once they’ve ordered the sample (e.g. bought free sample).
  • In Liquid, hide the add-to-cart button for that product if the tag is present.

That works for basic cases, but it won’t protect you against:

  • Direct “add to cart” links
  • Other apps adding the product
  • People bypassing the product page

It’s a nice UX layer, but I wouldn’t rely on it as the only gate.


  1. After-the-fact filtering

What you tried with tagging is half the story. The other half is “what happens when someone with that tag orders the sample again?”

You can use automation (Shopify Flow, Mechanic, or a custom app) to:

  • Trigger on order creation.
  • Check: does this order contain the free sample SKU AND does the customer already have the sample tag?
  • If yes:
    • Tag the order / customer as “repeat sample”
    • Auto-cancel or send it to a review queue for your team.

This doesn’t stop the order from being placed, but it lets you clean it up and reach out to the customer before fulfillment.


  1. Checkout-level validation (one-time for all time)

If you really want a true “once per customer, ever” rule for a specific product, you need something that runs at checkout and looks at past orders, for example:

  • When the free sample SKU is in the cart:

    • Look up past orders for that email / customer ID (and optionally phone / address)
    • If a previous sample order exists, block the checkout and show a friendly message like:

    “It looks like you’ve already claimed your free sample.
    This offer is limited to one per customer, but you can still order the full-size product here.”

That can be done with:

  • A custom Checkout Validation function if you have a dev, or
  • An app that exposes a “one-time per customer” rule for selected products and handles this lookup + blocking for you.

Full disclosure: I work on a Shopify app that does exactly this kind of “one-time per customer / household” rule for selected SKUs using Checkout Validation. You mark your free sample product as one-time-only, keep your existing tagging/automation if you want, and the a