Blog

How to text customers by store location without double-texting anyone

The day you open a second store, your SMS list quietly becomes wrong. “Text everyone” annoys half of them about a store they don't visit; per-store sends double-text the people who shop at both — and those people are usually your best customers. Here's the data model that fixes it.

On this page

  1. Two wrong answers, and why both feel right
  2. What it costs you, in actual numbers
  3. The model: one primary store, plus everywhere they shop
  4. The three sends you'll actually run
  5. Why overlap customers are your best customers
  6. The members with no store data yet
  7. How the store even gets recorded

Single-store SMS marketing is easy. There is one list, one store, one message. You text “new stock of the vanilla, in today” and everyone who gets it can act on it.

Two stores breaks that, and it breaks it silently — nothing errors, no report goes red. You just start getting slightly worse results and slightly more opt-outs, and it takes a year to notice.

Two wrong answers, and why both feel right

Wrong answer one: text everyone. You send “vanilla is back in stock” to all 2,400 members. But the vanilla is back in stock at the north store. The 1,100 people who only ever shop at the south store get a message about inventory they can't reach, from a store they don't think of as theirs. Once, they ignore it. Four times, they stop reading your texts. Eight times, they reply STOP — and an opt-out is permanent. You didn't lose a message; you lost a channel to that person forever.

Wrong answer two: send per store. So you get smarter: you export the north store's customers and text them, then export the south store's customers and text them. Cleaner — except your regulars who shop at both stores are in both exports. They get the same message twice, sometimes minutes apart. Now you look like a system with a bug, to exactly the customers who like you most.

And the reason this second mistake is so common is that it's not obviously a mistake. Each individual send is correct. The overlap only exists between the sends, so nothing in either one looks wrong. If you're eyeballing recipient counts, the numbers even add up: 1,300 + 1,400 = 2,700 from a 2,400-member list. That 300 discrepancy is the double-text, sitting in plain sight and reading like a rounding artifact.

What it costs you, in actual numbers

Let's price both mistakes so you can substitute your own figures. Say you have 2,400 members across two stores, with 300 who shop at both, and you send four promos a month. Texts beyond your included allowance cost 2¢ each on our pricing; use whatever your provider charges.

The blast approach:

  • 4 sends × 2,400 = 9,600 texts/month. Against 5,000 included, that's 4,600 overage × 2¢ = $92/month — for messages that are, for roughly half of each send, about the wrong store.
  • Harder to price but worse: opt-outs. If irrelevance pushes even 0.5% of recipients to unsubscribe per send, that's ~12 people per send, ~144 a year. At a $55 basket and five purchases a year, a lost member is ~$275/yr of reachable revenue. 144 × $275 = ~$39,600 of list you can no longer text. Not all of them would have bought because of a text — but you deleted the option.

The naive per-store approach:

  • 4 sends × 2,700 (the double-counted total) = 10,800 texts. The 300 overlap members get 4 duplicate texts a month = 1,200 wasted texts/month, $24 of pure waste at 2¢.
  • The money is trivial. The damage isn't: your 300 best customers now see your marketing as broken.

Neither number is the real argument. The real argument is that both mistakes train your most valuable people to ignore you, and SMS only works while people still read it.

The model: one primary store, plus everywhere they shop

The fix is a small piece of data modelling, and it's worth understanding because it's the thing you should ask any vendor about.

For each member, you keep two facts about location, not one:

  1. Everywhere they shop — a row per store, carrying visit count, first seen, last seen. A member who shops at both stores has two rows. This is a list, so it can hold as many stores as the member actually visits.
  2. One primary store — a single value, derived from those rows. Most visits wins; ties broken by most recent; and a staff member can override it when they know better (“she works next to north but lives by south”).

The second one is the whole trick, and the reason is almost boring: a per-store send keyed on the primary store cannot double-send, because each member has exactly one primary store. It's not a de-duplication pass you have to remember to run, or a “suppress previous recipients” checkbox someone forgets. Sending to primary = north and primary = south partitions your list — every member lands in exactly one bucket, by construction. Correctness comes from the shape of the data, not from operator discipline. That's the kind of fix that survives a busy week.

And keeping the full visit list alongside it is what lets you deliberately do the opposite when you want to: “anyone who shops here” includes the overlap on purpose.

Primary store versus everywhere-they-shop, as overlapping store audiences Two overlapping circles for the north and south stores. The 300 members in the overlap shop at both. A send keyed on primary store assigns each of those 300 to exactly one store, so nobody is texted twice. A send keyed on anyone-who-shops-here deliberately includes all 300. North store 1,000 only here South store 1,100 only here 300 both Send by PRIMARY store each of the 300 counts once, in one store only 1,180 + 1,220 = 2,400 · no duplicates possible Send to ANYONE WHO SHOPS HERE all 300 included on purpose north = 1,300 · use for one-store events 2,400 members · 300 shop at both stores
Same data, two questions. “Their store” is single-valued, so per-store sends partition the list and can't overlap. “Anyone who shops here” is the list of visits, so it deliberately includes the people who shop at both.

The three sends you'll actually run

With those two facts in place, almost everything a multi-store operator wants to send is one of three shapes.

1. “This store, once each” — keyed on primary store

Store-specific promos, a staff introduction, a local event, a schedule change. Each member hears about the store that is theirs, exactly once. This is your default for anything you'll send separately per store on the same day.

2. “Anyone who shops here” — keyed on the visit list

Use this when the message is about the store rather than about the person: a closure, a relocation, a grand re-opening, a one-day sale at that location. If a member shops at both stores, they genuinely should hear that the north store is closed on Tuesday. The overlap is the point — just don't send this shape twice in a day for two different stores.

3. Company-wide — everyone, including members with no store recorded

New product line, a policy change, a brand-level announcement. This one has a trap in it, which is the next section.

One rule to keep these from colliding: one store-scoped promo per member per day. If both stores want to send something Thursday, either use primary-store keying (shape 1, and they can't collide) or stagger the days. This is a calendar discipline, not a software problem — but it's the discipline that makes the software worth having.

If you want to see what these segments look like against your own customer list before you commit to anything, book a demo — bringing a rough member count and the number of stores is enough to make it concrete.

Why overlap customers are your best customers

The 300 in the middle of that diagram deserve more than being a de-duplication problem, because they're usually the most commercially interesting group you have.

Think about what it takes to be in that set. A customer shops at your north store, and then one day is somewhere else and goes to your south store rather than to whatever shop is nearer. That's a person who buys often enough to need you when they're not on their usual route, and who thinks of your brand rather than of one address. Both of those correlate with frequency.

Which means, practically:

  • Look at them before you assume. Pull the multi-store segment and compare its average purchase frequency and basket against everyone else's. Most operators find it sits meaningfully higher. If yours doesn't, you've learned something real about your catchment areas — that's worth knowing too.
  • They're your best audience for anything brand-level: a new house product, a loyalty tier launch, a referral ask. They already behave like customers of the company rather than of one store.
  • They're the group a badly-run program annoys first. Double-texting is concentrated entirely in this segment. The people most likely to receive your duplicate messages are the people you can least afford to bore.
  • Protect them from cross-store noise. A member whose primary store is north but who occasionally visits south should not be in south's weekly promo rotation. Occasional visits are not a subscription.

Being able to ask “who shops at more than one of my stores?” as a plain filter is what turns this from a theory into a segment you can actually message — see how lifecycle and location segments combine.

The members with no store data yet

Here's the failure mode that bites people three months in. You set up your lovely per-store sends, and your total reach quietly drops, because some members have no store recorded at all.

How does that happen? Plenty of ways, all normal:

  • They were imported from your previous loyalty vendor, which never tracked a location.
  • They joined online, or through your Shopify store, and have never been to either counter.
  • They signed up on a form or at an event, before their first in-store visit.
  • Their visits came from a register whose store id was never mapped to one of your locations.

These members are real, they consented, and if your only send shapes are per-store, they will never receive anything again. Nothing errors. They simply fall out of every audience, and your list appears to shrink for no reason.

So the rule: a company-wide send must include members with no location yet. Don't implement “everyone” as “the union of my per-store segments” — that silently excludes exactly the people you haven't met in person, which includes most of your online customers.

Two practical follow-ons:

  1. Audit the unmapped count during setup. Backfilling from historical check-ins and orders usually assigns a store to most of your list at once; whatever's left is genuinely unknown, and you want that number in front of you rather than hidden.
  2. Map every register. If a POS register's location id isn't mapped to one of your stores, every visit through it produces an unassigned member. That's a five-minute setup task with a long tail if skipped.

How the store even gets recorded

Last piece: none of this works unless visits carry a location in the first place. Three capture points do the work, and they should all feed one member record:

  • Check-in — a self-serve kiosk at each store stamps the visit with that store. This is the highest-volume signal and the most reliable, because the device is fixed to a location and can't be wrong about where it is.
  • The POS sale — a paid order at a register belonging to a store attributes to that store. Register-resident loyalty helps here: if the sale context carries the shop id, attribution is automatic rather than inferred.
  • Enrollment at the counter — a sign-up at a specific store is that member's first visit there.

Add those up over a few months and the primary store stops being a guess. The member who checks in at north 22 times and south twice has an obvious home; the one who's 9 and 8 is a genuine overlap customer and should be treated as one. The visit counts are what make that distinction, which is why the rollup keeps counts rather than just a flag.

And the honest note to close on: if you have one store, you need none of this. One list, one store, no targeting problem. Add it when the second location opens — that's precisely when it stops being over-engineering and starts being the thing keeping your best customers from unsubscribing.

More on our side: multi-location member records and per-store targeting, how SMS sends and consent work, and the full picture for stores like yours on the supplement & nutrition retail page.

Next step

See your own stores split into segments that can't double-text.

Book a 20-minute demo — per-store audiences, the overlap segment, and what a company-wide send looks like when nobody gets left out.

$200/mo platform · 5,000 texts included · no contracts