One per household: how to enforce address-level purchase limits on Shopify
You set up your trial box as one per customer. Your partner orders one. Then your teenager orders one with their own email. Your college-age kid does the same from the same Wi-Fi network. Three trial boxes, one household, three losses.
"One per customer" means one per email address. It does not mean one per household. And for products priced below cost to acquire new customers, that distinction costs you real money.
The gap between "per customer" and "per household"
When you limit a product to one per customer on Shopify, you are limiting it to one per email address. That is all "customer" means in Shopify's system — an email.
A household typically has multiple people with separate emails. A couple has two. A family with teenagers has three or four. A shared apartment might have five or six. Every one of those people looks like a unique new customer to Shopify.
This matters most for products with aggressive intro pricing:
- A $1 trial box that costs $25 to fulfill. One per household means a $24 loss. Four per household means a $96 loss.
- A free sample pack with $5 shipping. One is a customer acquisition cost. Four is a donation.
- A welcome kit at 80% off. The margin absorbs one. It does not absorb a household of repeat orders.
The abuse is not always intentional. Sometimes one person in a household genuinely orders, and another sees the offer independently. But the result is the same: your intro product ships to the same address multiple times, and you pay the difference every time.
Then there is the intentional version. One person orders your trial box, loves it, and tells their partner to order one too. Same address, different name, different email. From your system's perspective, two completely unrelated new customers.
The address matching problem
Even if you decide to check shipping addresses against previous orders, you immediately run into the formatting problem. People do not type addresses the same way twice, let alone the same way as someone else in their household.
Here is the same address written six different ways:
- 123 Main Street, Apt 4B
- 123 Main St Apt 4B
- 123 Main St, #4B
- 123 Main St. Apartment 4B
- 123 Main, Unit 4B
- 123 main st apt 4b
A simple string comparison would treat all six as different addresses. If your partner ordered with version 1 and you order with version 3, a basic check sees two different addresses and lets both orders through.
This is why most merchants who try to manually deduplicate orders by address give up. The variation is endless:
- Street type abbreviations: Street vs St vs St.
- Directional prefixes: North vs N vs N.
- Unit designators: Apt vs Apartment vs Unit vs Suite vs Ste vs #
- Unit number formats: 4B vs 4-B vs 4 B
- Capitalization: anything goes
- Punctuation: commas, periods, hyphens — all optional
- Typos: "Steet" instead of "Street," transposed numbers
Any address matching system that uses exact string comparison will miss the majority of duplicates. You need fuzzy matching.
How fuzzy address matching works
Fuzzy address matching normalizes and compares addresses through multiple steps:
Normalization strips away the noise. "123 Main Street, Apt 4B" and "123 main st #4b" both normalize to a canonical form. Street types get standardized (Street becomes ST), unit designators get unified (Apt, Apartment, Unit, # all become a single format), punctuation and extra spaces get removed, everything goes to the same case.
Component extraction breaks the address into parts: street number, street name, unit type, unit number, city, state, zip. Comparing components individually is far more accurate than comparing full strings.
Similarity scoring handles what normalization cannot — typos, transpositions, and unusual abbreviations. If two addresses are 95% similar after normalization, they are almost certainly the same address.
ZIP code anchoring narrows the comparison space. Two addresses in different ZIP codes are not the same household, regardless of street name similarity. This also dramatically improves performance — you only need to compare against addresses in the same ZIP code, not your entire order history.
The result: "123 Main Street, Apt 4B" and "123 main st #4b" resolve to the same household. Your second trial box gets blocked.
Why address matching alone is not enough
Address matching catches household-level abuse. But people move. Roommates leave. Addresses get recycled. If you rely solely on address matching, you will eventually block a legitimate new customer who just moved into an apartment where the previous tenant ordered your trial box.
That is why address matching works best as one signal among several. The most reliable approach combines five identity signals:
- Email address — The baseline. Catches the simplest repeat purchases.
- Shipping address — Fuzzy-matched. Catches household-level abuse, different family members, and same-person-new-email scenarios.
- Phone number — People change emails casually. They change phone numbers rarely. A matching phone number is a strong identity signal.
- IP address — Not conclusive on its own (coffee shops, offices, and VPNs exist), but a matching IP combined with a matching address is a near-certain duplicate.
- Device fingerprint — Browser characteristics, screen resolution, installed fonts, and other device attributes that persist across accounts. If the same device is used to purchase the same trial product twice, the second one is almost certainly the same person.
Each signal alone has weaknesses. Email is trivially changed. Addresses have the formatting problem. Phone numbers can be shared. IP addresses can be shared. Device fingerprints can be spoofed by the technically savvy.
But when you combine them, the accuracy compounds. A new email from the same address and same phone number is not a new customer. A new email from the same device and same IP is not a new customer. The more signals that match, the higher the confidence.
OfferGuard uses all five signals simultaneously when evaluating a checkout. You configure which products to protect, and the system checks every checkout against your full order history across all five dimensions. If enough signals match a previous purchaser, the checkout is blocked — the customer cannot complete the purchase.
Setting the right threshold
Not every situation calls for the same sensitivity. OfferGuard lets you configure how many signals need to match before a checkout is blocked.
For a $1 trial box with high abuse rates, you might block on any two matching signals. Aggressive, but the cost of a false negative (a repeat abuser getting through) far outweighs the cost of a false positive (a legitimate customer being asked to contact support).
For a welcome kit at 50% off with moderate margins, you might require three matching signals. This catches most abuse while keeping false positives near zero.
The right threshold depends on your product economics. The more you lose on each repeat purchase, the more aggressive your matching should be.
What this looks like in practice
A new customer visits your store, adds the trial box to their cart, and checks out. OfferGuard checks their email, address, phone, IP, and device against every previous purchaser of that product. No matches. Checkout proceeds normally. The customer has no idea the check happened.
Two weeks later, their partner visits the same store from the same house. Different name, different email, different phone. But the shipping address fuzzy-matches, and the IP address matches. That is two signals. If your threshold is two, the checkout is blocked. The partner sees a message: "This product is limited to one per household."
They are not banned from the store. They can buy anything else. They just cannot buy the trial box, because someone at their address already did.
Your trial box shipped once to that household. Your $24 loss happened once, not twice or three times. Your customer acquisition cost is what you planned it to be.
Stop shipping your intro offer to the same household twice
If your trial product is limited to "one per customer" but not "one per household," you have a gap. Different emails, same address — and your below-cost product ships again.
Fuzzy address matching, combined with email, phone, IP, and device fingerprinting, closes that gap at checkout. Not after the order. Not with manual review. At the moment the customer tries to pay.
Set up household-level protection for your intro products. Visit our pricing page to get started.
Related reading:
More posts
Why IP validation matters for Shopify discount protection
A customer switches emails and clears cookies. But their IP address stays the same. Here's why IP validation is a critical layer in stopping repeat discount abuse.
The Complete Guide to Protecting New-Customer-Only Products on Shopify
Your intro offer, trial box, or new-customer product is being bought by the same people over and over. Here's why Shopify can't stop it — and how to fix it.