Stop Treating Every Buyer the Same: A New vs Returning Purchase Playbook for Shopify Apps
A detailed Spreeflo journey that routes Shopify and e‑commerce app buyers down different paths based on purchase history, turning a single `purchase` event into tailored activation, expansion, loyalty, and referral flows that grow lifetime value automatically.
Industry
Niche
Pattern
Loading sequence...
The CartWizard team thought they had post-purchase nailed.
Every time a merchant paid for the app or bought an upsell pack, CartWizard fired the same “Thanks, here’s how to get started” email. It was clean, on-brand, and automated. Job done.
Except when they finally pulled the numbers apart, something ugly showed up: merchants who bought a second or third add-on were no more likely to expand again than one‑time buyers. Repeat customers got the exact same “day one” onboarding as fresh installs. No special treatment, no recognition, no tailored offer.
They were paying for “loyalty,” getting “stranger” in return.
The sequence at the top of this page is the whole journey, end to end, for fixing that. It takes a single purchase event and routes it differently depending on whether this is the first time you’ve seen money from that account, or the fifth. First‑time buyers get activation plus a gentle cross‑sell. Returning buyers get loyalty content and VIP offers.
For a Shopify or e‑commerce app doing $10k–$300k MRR, this is low-hanging fruit. You already track purchases. You already email customers. The gap is what happens in the minutes and days after a payment clears.
This article walks through that journey node by node in Spreeflo, and shows how to adapt it for your own app.
Why “generic thank you” emails leak so much lifetime value
As an app developer, you care about MRR and churn more than single‑order AOV. But you still have “purchase moments” that behave like e‑commerce orders:
First subscription payment after trial
Upgrades to higher plans
One‑off add‑ons, credit packs, or services
Annual prepayments
Most teams push every one of those into the same bucket. A single “thanks for upgrading!” template. Maybe with a line or two added if it’s an annual plan.
The problem is that the job of the message changes completely depending on who just paid:
A first‑time buyer needs to experience the core value quickly so they keep paying.
A returning buyer has already seen value. Now the job is to deepen the relationship: higher‑tier features, add‑ons, referrals.
Treat them the same and you leave money on the table in both directions. New buyers churn because you didn’t guide them. Loyal buyers don’t grow because you didn’t recognize them.
Spreeflo’s job here is simple: capture enough detail about every customer’s purchase history so you can speak to each one uniquely, without creating a mess of lists and manual campaigns.
The journey at the top of the page, in plain language
Before we zoom into the nodes, here’s the big picture you’re seeing in the sequence at the top of this page:
A
purchaseCustom Event from your billing system starts the journey.Every purchaser gets tagged as a customer.
An If/Else split checks how many
purchaseevents this account has fired over all time.First‑time buyers:
Returning buyers:
If this is purchase number one, they go down the “first‑time buyer” path.
If it’s number two or higher, they go down the “returning buyer” path.
Get a quick welcome/activation email shortly after purchase.
A few days later, they’re split again based on whether they’ve hit an activation milestone.
Activated accounts get an upsell/cross‑sell email.
Non‑activated accounts get a “need help?” email instead.
Get a loyalty‑flavored thank‑you.
Later, they get a VIP offer or referral ask.
Same trigger. Two very different experiences, tuned to where the account is in its lifecycle.
Now let’s walk it step by step inside Spreeflo.
Step 1: Track the purchase that really matters
Everything hangs off a Custom Event trigger.
In your app’s backend or via the JavaScript SDK, you’re already calling something like Spreeflo.identify(email, attributes) when a merchant signs up. For this journey you add one more call whenever money changes hands:
Event name:
purchaseProperties: at minimum,
amount,plan_name, and maybebilling_type("monthly","annual","addon").
You send that event using the Spreeflo API or SDK. Spreeflo stores it against the contact, and it becomes available as both:
A trigger in journeys (Custom Event), and
A filter in the segment builder (Custom Events category).
On the canvas, drop a Custom Event trigger:
Trigger type: Custom Event
Event name:
purchaseRe-enrollment: on
Re-enrollment needs to be enabled here. You want this journey to fire every time a customer pays you, not just the first time. Spreeflo will still prevent duplicate copies of the same contact running in parallel, so if someone does something wild like buy twice in an hour, they won’t get two overlapping sequences.
Step 2: Mark them as a paying customer
Immediately after the trigger, add an Add Tag action:
Action: Add Tag
Tag:
customer(orpaid-user/subscriber, whatever fits your naming)
This seems cosmetic, but it’s doing two things:
It gives you an easy way to separate buyers from free users in future campaigns.
It captures a coarse “has given us money at least once” state that’s useful beyond this journey.
Because this tag is foundational, you don’t need to force downstream tag triggers here. Leave “Force tag trigger” off unless you have other journeys listening specifically for “customer” being applied.
Then the interesting part begins.
Step 3: Split the stream: who is new, who is returning
Drop an If/Else process node right after the tag.
The question you want this node to answer: “Has this account purchased at least twice?” That gives you “first purchase” vs “second or later purchase” without needing custom attributes.
Configure the condition with the segment builder:
Category: Custom Events
Event:
purchaseFrequency: “at least 2 times”
Time window: “over all time”
Anyone who has triggered purchase two or more times over their lifetime goes down the “Yes” branch: returning buyers. Anyone who’s only buying for the first time (count = 1) falls into the Else branch: first‑time buyers.
You’re not guessing from tags or hoping the billing system sets a special flag. You’re using the actual event history Spreeflo has, which is exactly the kind of customer detail you want to build on.
This one node is the heart of the pattern.
Step 4: Turn first-time buyers into activated, expanding accounts
Let’s follow the Else branch first: contacts who have fewer than two purchase events.
4.1 Give them a minute, then send a “real” welcome
Directly after the branch, add a Time Delay:
Time Delay: 1 hour
You do not want your marketing email to land at the exact same moment as a receipt or transactional notification. An hour gives billing emails time to clear and feels more human.
Then add a Send Email action:
Email: “Welcome to CartWizard Pro (here’s what to do today)”
From: your usual sending identity
Send only once: leave on (nobody can be a first‑time buyer twice)
This is where Spreeflo’s email builder earns its keep. For this email, the job is activation, not selling:
Remind them why they bought (“recover abandoned carts on autopilot”).
Give them a three‑step checklist they can complete in 10–15 minutes.
Link to your best “first campaign” template or quick‑start video.
Personalization matters here. Because Spreeflo holds both contact attributes and event data, you can tailor copy based on their plan, store size, or vertical without building separate journeys for each.
4.2 After a few days, check if they actually activated
Next, add another Time Delay:
Time Delay: 3 days
You’re giving the merchant a little space to follow the checklist and get a result. Then comes another If/Else process node.
This time, the condition checks for your app’s activation event. For CartWizard that might be recovery_campaign_activated. For an analytics app like ShopMetrics it could be report_scheduled or dashboard_shared.
Configure it like this:
Category: Custom Events
Event:
recovery_campaign_activated(or your equivalent)Frequency: “at least 1 time”
Time window: “in the last 3 days”
Anyone who’s done the thing that correlates strongly with retention goes down the “Activated” branch. Everyone else goes down Else: “Not yet activated.”
4.3 Activated: now it’s time to cross-sell
On the Activated branch:
Add a Send Email action right after the If/Else.
Send only once: on.
This email assumes they’ve already had a small win. The job is to nudge expansion and repeat purchases:
Suggest an add‑on or higher tier that aligns with their current usage.
Show “people like you” examples: “Stores your size typically add multi‑store support within the first 30 days.”
If you sell credit packs or advisory services, introduce them here.
Because this is a marketing journey (not transactional), you control pacing. If you want a softer approach, slip in another Time Delay and additional educational content before this upsell, but keep at least an hour between every Send Email node.
4.4 Not activated: rescue them before they churn
On the Else branch:
Add a different Send Email action: something like “Need help getting your first recovery live?”
Keep Send only once: on.
This email is not about more features. It is about saving the account:
Offer a checklist, loom video, or 15‑minute “we’ll do it with you” call.
Acknowledge that setup can be confusing and you want them to see results quickly.
If you have even a part‑time success person, this is a good place to add a Send Internal Email action too, flagging high‑value accounts that still aren’t activated three days after paying.
You’ve just stopped treating “paid but stuck” users like “happy customers,” which is where a lot of apps silently bleed MRR.
Step 5: Treat repeat buyers like VIPs, not strangers
Now back up to the Yes branch on that first If/Else: customers with at least two purchases.
These are your expansion and advocacy engine. The worst thing you can do is send them another generic “getting started” message.
5.1 Space out the loyalty touch
Right after the branch, drop a Time Delay:
Time Delay: 1 day
Again, you’re avoiding a pileup with receipts and giving the transaction 24 hours to feel “complete.”
5.2 Send a loyalty-flavored thank-you
Add a Send Email action:
Email: “You’re in our top customers — here’s something extra”
Send only once: on
This is the moment to recognize the relationship:
Thank them explicitly for being a multi‑purchase customer.
Share advanced tips that only make sense once they’re up and running.
Include something that feels like a perk: extended trial of a higher tier, priority access to a new feature, a credit pack discount.
You can tie this to purchase amount as well. Because you tracked amount on the purchase event, you can build segments where lifetime revenue passes a certain threshold and reference those segments in future journeys or campaigns. All powered through the same campaigns and journeys interface.
5.3 Follow up with a referral or VIP offer
Finally, add another Time Delay:
Time Delay: 7 days
Then another Send Email:
Email: “Want to be a CartWizard VIP?” or “Know a store that needs help with abandoned carts?”
Send only once: on
Seven days gives them time to experience the value of whatever upgrade or perk you just gave them. Then you ask for something that deepens the relationship again:
A referral (ideally with a reward that aligns with your pricing model)
An upgrade to an annual plan
Participation in a case study or beta group
You’ve now turned a raw payment event into a loyalty‑building cadence that acknowledges their history with you.
Variants worth testing for your app
The exact branches in the sequence at the top of this page are a starting point. A few variations that work well for e‑commerce and Shopify apps:
Different thresholds: instead of “at least 2 purchases,” create a third path for “at least 5 purchases” and treat them like true VIPs.
High‑ticket vs low‑ticket purchases: use event properties on
purchase(likeamount) in the segment builder, so a $2,000 annual plan renewal gets a different follow‑up than a $49 add‑on.Feature‑specific paths: if your app has two very different core jobs (e.g., cart recovery and post‑purchase upsells), route based on which feature they actually used after buying.
All of these reuse the same pattern: Custom Event trigger, some combination of If/Else and Time Delay nodes, and targeted Send Email actions. You don’t need a new tool or separate account. You just need to wire more of your app’s data into Spreeflo’s web tracking and analytics layer and design the logic once.
What to watch: the two numbers that tell you this is working
You’re not building this journey for fun. You’re building it to move specific numbers.
For this pattern, focus on:
Repeat purchase rate
Among accounts that make one purchase (initial subscription, add‑on, credit pack), what percentage make at least one more within a set window (30, 60, 90 days)? Your returning‑buyer branch should move this.First‑vs‑repeat AOV
Compare the average revenue from first purchases to the average revenue from subsequent purchases. If your cross‑sell emails and VIP offers are landing, repeat AOV should climb.
Because Spreeflo stores both event data and email engagement on the same contact record, you can build segments like:
“Has at least 1
purchaseevent” and“Has at least 2
purchaseevents and opened the loyalty email.”
Then compare behavior and revenue between them over time.
This is how founder‑led teams win: not by blasting bigger lists, but by capturing meaningful detail on every customer and speaking to each one in a way that matches their history.
Why this pattern plugs a quiet lifetime-value leak
Most SaaS and Shopify apps already have some flavor of “new customer onboarding” and “thanks for upgrading” emails. The problem is that they run in isolation, blind to what the account has actually done before.
When you wire purchase events into Spreeflo, and route new vs returning buyers differently, three things happen:
New customers are more likely to activate, because you guide them toward the one action that matters instead of throwing a feature tour at them.
Returning customers feel seen, because your messages acknowledge their history and offer them something that actually fits.
Your team stops running manual “VIP campaigns” pulled from CSVs and starts relying on journeys that work every time a purchase fires.
Most businesses leak lifetime value right here: at the point where they finally have someone willing to pay, but fail to nurture that engagement in a way that respects the customer’s stage.
The sequence at the top of this page is a small, concrete fix. One trigger. A couple of splits. Four or five well‑written emails. Built once, it then runs quietly in the background, routing every purchase event exactly where it belongs.
If you’re already tracking installs, upgrades, and add‑ons, you have everything you need to build it. The difference is what you do with that data, and whether your customers can feel that you know who they are when you show up in their inbox.