← back to field notes
research DISPATCH Nº 65 · · 9 MIN READ ·

How to segment repeat customers on Shopify

You have customers who have bought from you five times. Shopify knows it, and does nothing with it. Without a tag set by hand, a loyal regular, a one-time discount hunter, and a customer about to leave for good all look identical in the admin, so they all get the same generic blast. Here is why customer segmentation is the lever Shopify never built, and the playbook that reads each customer's whole history and tags them by what they actually do.

Open the customers page on a Shopify store that has been trading for a couple of years and you are looking at a list of names, an order count, and an amount spent. Somewhere in that list is the person who has ordered from you eleven times and tells their friends about you. A few rows down is someone who bought once, two years ago, on a half-price code, and has never come back. And scattered through it are the customers who used to order every month and have quietly stopped. To the store, all three are just rows. There is nothing that marks the first as worth protecting, the third as worth winning back, or the second as not worth a discount. So when you send an email, run a sale, or build an audience, the same message goes to all of them, and the most valuable distinction you own goes unused.

This is the complaint that shows up across merchant communities in a dozen forms. People want to reward repeat buyers, flag their VIPs for priority support, stop sending win-back discounts to people who never lapsed, and catch the regulars before they churn. They go looking for the switch that tags a customer automatically when their behavior says they belong in one of those buckets, and they find that the switch is not really there. You can tag a customer by hand. You can write one blunt rule. Past that, the segmentation that every growth playbook assumes you already have is a thing Shopify mostly leaves you to build yourself.

A loyal regular and a one-time discount hunter look exactly the same in the admin. The store treats your best customer like a stranger.

Why a flat customer list quietly costs you money

Segmentation is not a vanity exercise. It is where most of the cheap growth in a store actually lives. Selling again to someone who already trusts you is far less expensive than acquiring a stranger, and a small core of repeat buyers usually drives a large share of revenue. But you can only act on that if you can tell the groups apart at the moment you send. When every customer is one undifferentiated list, four things you should be doing simply do not happen.

Your VIPs get nothing for being VIPs, because the email tool cannot see who they are, so the thank-you, the early access, the little perk that keeps a loyal customer loyal goes to no one. Your lapsing regulars drift away in silence, because the one signal worth chasing, a good customer who has gone quiet, is invisible until they are long gone. Your discount hunters get more discounts, because the win-back code meant to revive a sleeper gets sprayed at people who only ever buy on a code, training your whole base to wait for the next one. And your support queue treats a first-time buyer and an eleven-order regular with the same urgency, because the ticket does not know which is which. None of these are exotic. They are the default behavior of a store that cannot segment, which is most stores.

What Shopify actually does, and where it stops

Shopify is not blind to customers. It stores the order history, it lets you tag, and it has a segments feature. The gap is between showing you the data and turning that data into a label that travels with the customer and stays true over time. It shows up in three places merchants hit fast.

First, tagging is manual by default. You can add a tag to a customer, one profile at a time or in a bulk selection, but nothing watches behavior and applies it for you. So the vocabulary you would actually use, vip, repeat, at-risk, wholesale, exists only if a person sits there and assigns it, and keeps reassigning it as customers move between groups, which no one does past the first week.

Second, the one automated path is a single blunt rule. Shopify Flow, free on every plan, can add a tag when one simple thing becomes true: when total spend passes a number, tag vip. That handles the easiest possible segment and nothing beyond it. It does not weigh recency against frequency, it does not notice a high spender whose orders have stopped, and it does not tell a customer who spent six hundred dollars across two loyal years from one who spent the same amount once on a deep code. A real segment is several signals read together, and a one-condition rule can only ever read one.

Third, segments are a view, not a label that acts. The segments feature lets you filter customers by order count or amount spent and look at the result, which is genuinely useful for a one-off check. But it is a filter you read, not a tag the rest of your stack can key off, and it does not update a customer's status on the profile as their behavior changes. So you can see your repeat buyers today, then still have no durable, current label for the email tool, the discount, or the support desk to act on tomorrow.

◆ DATA The standard way to read a customer is recency, frequency, and monetary value together, not any one alone. A customer who bought a lot but not lately is a different person from one who buys a little but every month, and both are different from a big one-time spend. The whole reason segmentation is hard to automate natively is that it is a judgment across several signals at once, which is exactly what a single spend threshold throws away.

Why the usual fixes don't hold

Once a merchant feels the flat list, they reach for one of a few workarounds. Each gets you a little way and each breaks in a familiar spot.

"I will just tag the VIPs by hand." Fine for the first afternoon and the obvious names. It collapses because segmentation is not a one-time chore, it is a moving target. The customer you tagged vip in March stops ordering in June and is still wearing the VIP tag in December, now actively misleading every flow that reads it. Hand-tagging captures a snapshot and then rots, and a stale segment is often worse than none because you trust it.

"I will set up a Flow rule on spend." A real step up for the single easy case, and worth doing. But the moment you want anything truer than a number, lapsing regulars, discount-only buyers, customers who love one category, serial returners, you are stacking conditions Flow was never meant to reason across, and the rule either gets unmanageable or quietly tags the wrong people. It also mostly adds tags and rarely removes them cleanly, so customers pile up labels they have outgrown.

"I will buy a segmentation or loyalty app." The good ones help, and for plenty of stores they are the right call, which by itself tells you the native gap is real. But many work off the same rigid thresholds in a nicer interface, you still have to decide and encode every rule, and now the truth about your customers lives in a second system that has to be kept in sync with the tags your email, ads, and support actually read. The judgment, who counts as what and when that changes, is still yours to specify; the app just runs the thresholds you hand it.

What the automation actually has to do

The real job is not "tag the big spenders." It is "for every customer, read their whole history the way a sharp retention manager would, decide which one lifecycle group they are in right now, write that as a single clean tag, remove the one that no longer fits, and do it again as they keep buying." That is reading, judgment, and bookkeeping across the entire customer base. As a Dugong playbook, in plain prose, it reads like this:

# trigger
On a schedule, and again whenever a customer
places, returns, or cancels an order

# steps
1. Pull each customer's full history: orders, total and recent
   spend, recency, frequency, products, returns,
   discount use, support contacts
2. Read the pattern, not a single threshold: a loyal regular,
   a rising VIP, a one-time discount hunter, a lapsing
   buyer, a serial returner
3. Assign one clear lifecycle tag from a single clean
   vocabulary, and remove the tags that no longer fit
4. Keep it current: re-evaluate as new orders land so a VIP
   who goes quiet becomes at-risk, not a stale VIP forever
5. Write the tags back through the Admin API, touching
   nothing else on the profile
6. Hand the segment to the systems that act on it: email,
   discounts, support priority, ad audiences
7. Log every change with the reason, and flag the edge cases
   a human should eyeball

Seven lines. The compiler fills in everything beneath: pulling each customer's full record, weighing recency against frequency against value instead of any one alone, telling a loyal regular from a code-only buyer with the same lifetime total, noticing the good customer who has gone quiet and moving them to at-risk while there is still time, choosing one tag from a vocabulary you defined rather than letting labels pile up, writing it back without disturbing anything else on the profile, and re-running as orders, returns, and cancellations land so the segment is true this week and not last quarter. The merchant never sat there re-tagging the customer list by hand. They described how a careful retention manager would sort the base, and let the compiler do the volume and keep it current.

◆ NOTE The dangerous segment is the one that goes stale. A VIP who quietly stopped ordering is your single most recoverable customer, and a flat list, or a tag set once by hand, never tells you they slipped. The goal is not "the big spenders are labeled," it is a living read of who each customer is becoming, which is precisely the judgment a one-time tag or a single-spend rule can never keep.

Why this is a compiler problem, not an app problem

There are capable segmentation and loyalty apps, and for many stores they are a fine answer. But deciding what a customer is is not a slot to fill, it is a read of a specific person's behavior: bought a lot but not lately, buys small but every month, only ever on a code, loves one category and ignores the rest, keeps half of what they order. Those are judgments about the pattern in front of you, weighed together, not a single token compared to a single number. And the right label changes underneath you every time that customer acts, which means the work is never done, it is maintained.

A natural-language compiler fits because segmentation was never really a data problem. It is a reading and judgment problem wearing a data problem's clothes. Storing the order history is the easy part, which is why Shopify does it. The hard part is everything around it: read each customer whole, weigh the signals against each other, pick the one label that fits today, drop the one that does not, write it where the rest of your stack can act on it, and keep doing it as the base moves. You can write that brief in a paragraph. You could never hold it as a living, hand-maintained spreadsheet of every customer's status, re-checked every week. It sits in the same family as the order tag you set by hand, where the tag that should route everything downstream needs the whole record read together, not one condition at a time.


The workflow worth building this week

If any part of how you grow depends on treating customers differently, your email flows, your discounts, your loyalty perks, your ad audiences, your support queue, this is the automation to set up before your next campaign, because the segmentation you never built is quietly handing your best customers the same message as a stranger and letting your lapsing regulars leave without a word. It sits right next to the other Shopify chores that need the whole record read at once, like the order tag you set by hand, and it feeds the recovery work we have written about, like the abandoned cart that gets one email, where who the customer is should change what you say to them.

Describe it the way you would brief a sharp retention manager: here is the customer base, read each person's whole history, tell me who is a loyal regular, who is a rising VIP, who is only here for a discount, and who used to buy and has gone quiet, tag each one with a single clean label, take the label off when it stops being true, and keep it current as people keep ordering. That is the whole brief. The compiler does the reading, the weighing, the write-back, and the upkeep. You keep your attention for the campaigns themselves, and you stop discovering that the customer who has bought from you eleven times got the exact same email as someone who never came back.

◆ READING If this resonates, two companion pieces: our dispatch on the order tag you set by hand, the same read-the-whole-record problem one level over, and the field study on the Shopify automations no one builds, where the work that actually compounds is a sliver of what merchants wire up. Also worth reading: the review request you never send, on the post-purchase message that earns the next order and almost never goes out.

If you are a Shopify merchant who has wired up a segmentation workflow that actually reads each customer and keeps the tags current, or you have a story about the VIP you only noticed after they stopped buying, the inbox is open: field-notes@dugong.live. We are collecting case studies for the next issue.

research essay
share · copy link · ✦
◆ COMMON QUESTIONS

Can Shopify automatically tag customers?

Not from the admin on its own. You can add and remove customer tags by hand, one profile at a time or in a bulk action, but there is no native rule that watches behavior and tags a customer when it changes. The one built-in path is Shopify Flow, free on every plan, which can add a tag when something simple becomes true, for example tag a customer vip when their total spend passes a number. That covers the easiest case and nothing past it, so the moment your segment is more than one threshold the native tooling runs out and the tagging falls back to a person or never happens.

How do I find repeat or VIP customers in Shopify?

Shopify's customer segments let you filter by things like number of orders or amount spent, so you can build a list of customers with two or more orders, or spend over a figure, and view it. That is useful for a one-off look, but it is a filter you read, not a label that travels with the customer. It does not write a tag the rest of your stack can act on, it does not tell a rising regular from a fading one, and it does not update the customer's status as their behavior changes. So you can see who your repeat buyers are today, but acting on it consistently across email, discounts, and support is still manual.

Why isn't tagging customers by total spend enough?

Because total spend is one number and a customer is a pattern. Two people can both have spent six hundred dollars: one bought steadily for two years and is your most loyal regular, the other bought once on a fifty-percent code and never came back. A spend threshold tags them identically. It also never flags the customer who used to order every month and has gone quiet, which is the most valuable signal you have, because winning back a lapsing regular is far cheaper than finding a new one. Good segmentation reads recency, frequency, value, the products someone buys, their returns, and their discount use together, and that judgment is exactly what a single-condition rule cannot make.

Why do win-back discounts end up going to discount hunters?

Because a flat customer list cannot tell a lapsed regular from a customer who only ever buys on a code. A win-back offer is designed for one specific person, the good customer who used to order steadily and has gone quiet, and winning them back is far cheaper than acquiring a stranger. But when the store has no living segmentation, the code gets sprayed at the whole quiet end of the list, which includes the shoppers whose entire history is one deep-discount purchase. They redeem it, the pattern repeats, and over time the discounts train your whole base to wait for the next code instead of paying full price. The fix is reading discount use as its own signal, so the lifecycle tag separates the lapsing regular worth a generous offer from the code-only buyer who was never going to pay full freight anyway.

How do I keep customer tags from going stale on Shopify?

Remove a tag every time you add one, and re-evaluate on every order. Stale tags are the failure mode of every manual approach: the customer you tagged vip in March stops ordering in June and is still wearing the label in December, actively misleading every flow that reads it, and Flow rules mostly add tags and rarely remove them cleanly, so customers pile up labels they have outgrown. The discipline that holds is a single clean vocabulary with one lifecycle tag per customer, re-run on a schedule and again whenever an order, return, or cancellation lands, so a VIP who goes quiet becomes at-risk instead of a stale VIP forever. Write the change back through the Admin API touching nothing else on the profile, and log every change with the reason. A stale segment is often worse than none, because you trust it.

◆ Ready when you are

Stop configuring. Start describing.

Write your workflow in plain English and an AI agent runs it — calling your apps directly. Your first automation takes under five minutes.

Try Dugong now → free · no credit card required