Stop Emailing Ghosts: A Cold Contact Re‑Engagement Journey for Shopify Apps
A practical, opinionated email journey for Shopify and e‑commerce app teams to systematically re‑engage cold contacts, reactivate merchants who still care, and gracefully sunset the rest so list health, deliverability, and lifetime value improve on autopilot.
Industry
Niche
Pattern
Loading sequence...
CartWizard’s weekly “growth tips” email went out to 22,000 Shopify merchants.
3,100 opened it.
412 clicked.
The rest? Nothing, for months.
When their founder finally pulled a list of “no opens in 60+ days,” it was over half the audience. A lot of those merchants had once installed the app, even paid for it, then quietly slipped away. The team was paying to email people who hadn’t shown a pulse in ages, and any new broadcast risked more spam complaints than signups.
This article is about what happens next.
The sequence at the top of this page is the whole journey, end to end. It’s a simple, opinionated pattern: identify genuinely cold contacts, run a short, high‑signal reactivation series, then gracefully sunset anyone who still doesn’t respond.
For e‑commerce app developers like CartWizard or ShopMetrics, this is where a lot of lifetime value quietly dies. You keep acquiring installs, but old users accumulate in your list as dead weight. They drag down deliverability, muddy your analytics, and distract you from merchants who are actually paying attention.
Let’s fix that once, in automation, so it runs every day without adding work to your already stretched team.
Why cold contacts are more expensive than they look
If you’re building a Shopify or e‑commerce app, your funnel usually looks like:
Visitor → Install / Trial → Activated user → Paying subscriber → Power user → Quietly disengaged → Churned
Most of your tooling is focused on the left half of that funnel. The “quietly disengaged” slice sits in your email platform, growing every month.
The costs are subtle:
You keep paying your ESP for contacts who never open.
Cold segments drag down open and click rates, which nudges inbox providers to treat all your mail more suspiciously.
When you finally push a big launch email, these folks are more likely to mark it as spam than to re‑engage.
On the other side, there’s hidden upside:
Some of those merchants just got busy. A simple “is this still useful?” email nudges them back to trying your feature, especially if your product has improved since they last logged in.
Others are no longer a fit. Removing them improves list health and gives you a cleaner baseline for App Store optimization, lifecycle reporting, and future experiments.
That’s the job of this journey: systematically separate the “revivable” from the “done” and treat each deliberately.
The shape of the journey you’re looking at
Before we go node by node, zoom out.
The journey in the sequence at the top of this page is a Journey, not a Campaign. It runs continuously and enrolls contacts whenever they become cold, instead of only when you press send. If you’re new to this distinction in Spreeflo, the overview of how to build a journey is worth a skim later.
The pattern has four phases:
Trigger on “quiet for 60 days” using a Criteria Match trigger based on email and product activity.
Three escalating Send Email steps with time‑based pacing and “is this still useful?” framing.
Branch after each email: if the contact re‑engages, exit early and tag them as reactivated.
Sunset non‑responders by downgrading their marketing status after the final email.
It’s intentionally short. The goal is clarity, not squeezing one more click out of people who are trying to leave.
Trigger: catching contacts right when they go cold
This journey starts with a Criteria Match trigger.
Why Criteria Match instead of Join Segment or Cyclic?
You want the journey to fire the moment someone crosses your cold threshold, not in a weekly batch.
The criteria are specific to this journey and don’t need to live as a reusable segment (you can always export them later into a saved segment if it proves useful elsewhere).
Inside the Criteria Match trigger, you’ll use Spreeflo’s segment builder to define “cold contact” in your context. For a Shopify or e‑commerce app, a solid starting definition is:
Email Subscription Status is “Subscribed”.
Email Activity: has not opened any marketing email in the last 60 days.
Optional: Custom event
feature_usedhas not triggered in the last 30 days.Optional: Total visits to your app or site less than 1 in the last 30 days.
That gives you a behavior‑based definition of “cold,” not just “hasn’t opened this one newsletter.”
Critical configuration detail: turn Re‑enrollment on for this trigger.
You want contacts to be able to:
Enter the journey when they first go cold.
Re‑enter months later if they re‑engage for a while, then go dark again.
Spreeflo prevents parallel enrollments, so a contact won’t be processed twice at once. They must fully exit the journey before being re‑enrolled.
Email 1: a low‑pressure “still interested?” check‑in
From the Criteria Match trigger, the first node is a Send Email action.
This is your softest touch: a simple, honest question like:
“Still want updates on CartWizard?”
“Have we outgrown your store?”
“Quick check: is ShopMetrics still worth your inbox?”
Structure and intent:
Acknowledge the gap (“We noticed you haven’t opened our emails in a while”).
Lead with value (“Since you last installed us, we’ve shipped X, Y, Z improvements”).
Offer a clear choice:
Button or link to “See what’s new” or “Log back in”.
Secondary link or short sentence describing how to reduce email frequency or opt out entirely.
Use the email builder to keep this clean and mobile‑friendly; this isn’t a design showcase, but it needs to feel like a real note, not a billboard.
Leave “Send only once” toggled on for this node. Even if the contact re‑enters the journey a year later, you probably don’t want them to see the exact same email again.
Time Delay: give space before you escalate
Right after Email 1, insert a Time Delay of 3 days.
No back‑to‑back email sends. You want to:
Respect your contact’s attention.
Give inboxes time to register opens and clicks.
Allow product activity (logins, feature use) to catch up if someone re‑engages.
Three days is a good default for SaaS and Shopify apps: long enough to not be nagging, short enough that the first email is still familiar when the second arrives.
If/Else: branch reactivated vs still cold
After that 3‑day delay, you add an If/Else process node.
The condition uses the segment builder again, this time to answer a simple question:
“Has this contact shown any sign of life since Email 1?”
For many apps, you can define “re‑engaged” as:
Email Activity: opened at least one marketing email in the last 3 days OR
Custom Event:
feature_usedtriggered at least once in the last 3 days.
Those custom events come from your app via the Spreeflo API or the JavaScript SDK. Many Shopify app developers already track events like app_installed, plan_upgraded, or order_tagged; feature_used is just another in that family.
If the condition is true (the “then” branch), the contact is considered reactivated:
Use an Add Tag action to apply something like
reactivated_from_cold.Optionally use Remove Tag to clear any
at_riskorcoldtags you use elsewhere.Then end the path there. No more reactivation emails for this run.
If the condition is false (the “else” branch), the contact is still cold. They move on to Email 2.
Notice what we didn’t do: we didn’t merge branches back together. Reactivated contacts exit cleanly; the rest keep going through the escalation path. That keeps your graph and your reporting simpler.
Email 2: make the value case concrete
On the “else” branch from that first If/Else, the next node is another Send Email.
Email 2 should be more specific and benefit‑driven:
For CartWizard, this might highlight “stores like yours recovered an extra $X/month using these three flows.”
For ShopMetrics, it could show one or two dashboards that merchants typically love once they’re set up, with a short video or GIF.
The framing is still respectful. You’re not guilt‑tripping them; you’re reminding them what they’re missing.
Again, leave “Send only once” on so contacts do not get duplicates on future re‑entries.
Immediately after Email 2, add a Time Delay of 5 days. We space this one slightly longer because the ask is bigger: log in, try a feature, maybe reconnect a data source.
After the delay, use another If/Else node with a similar re‑engagement condition, this time looking at activity in the last 5 days.
“Yes” branch: tag as reactivated and exit.
“No” branch: continue to Email 3.
Email 3: the honest break‑up email
The final email in the series, sent on the “still cold” path, is where you’re explicit.
Structure for Email 3:
Subject: “Should we stop emailing you about CartWizard?” or “Last note from ShopMetrics (unless you say otherwise).”
Body:
Acknowledge again that they haven’t been engaging.
Offer one last chance to stay: a link to “Keep getting updates” or “Show me what’s new”.
Make the default respectful: “If we don’t hear from you in a week, we’ll stop sending these updates.”
Send this as a Send Email node, then insert a Time Delay of 7 days. This gives them a full week to click, reply, or log back in.
After that delay, a final If/Else checks for recent engagement, typically:
Email Activity: opened at least one marketing email in the last 7 days OR
Custom Event:
feature_usedtriggered at least once in the last 7 days.
If yes: treat them as reactivated and exit. They responded to the ultimatum.
If not: time to sunset.
Sunset: keep them in the database, not in your marketing
On the “still cold” branch after that last If/Else, add two actions:
Update Email Subscription Status
Set status to “Non‑subscribed” or “Unsubscribed,” depending on how hard you want to cut off marketing messages.
- “Non‑subscribed” is a softer state if you still send critical transactional emails from your app via another channel.
- “Unsubscribed” is clearer if this list is the main communication channel.Add Tag
Tag them assunset_coldor similar, so you can:
- Exclude them from future broadcasts and campaigns.
- Still analyze their historical value (App Store installs, MRR, support tickets) without skewing current engagement metrics.
If you have a small number of high‑MRR merchants, you can optionally branch earlier in the flow with a Multi‑way Split based on plan or revenue, and route VIP accounts to a Send Internal Email node instead of automatic sunsetting. That lets a human decide whether to reach out one‑to‑one.
The nice bit: Spreeflo’s pricing lets you keep these sunset contacts as non‑marketing records without paying extra for them. The detailed breakdown of how marketing contacts are billed lives in the guide about Spreeflo pricing plans, but the gist is you don’t have to delete anyone to keep costs sane.
Keeping the list clean over time (without thinking about it)
Once this journey is live, you don’t touch it much. The Criteria Match trigger watches your audience; the rest runs automatically.
A few tweaks you might make over the first month:
Adjust the “cold” threshold: some apps do better with 90 days instead of 60, especially if their communication cadence is lower.
Tighten or loosen the pauses between emails depending on unsubscribe feedback.
Refine the re‑engagement condition: maybe product usage alone is a strong enough signal, even if they still ignore your emails.
To understand whether it’s working, track three practical metrics:
Reactivation rate
Over a period (say 30 days), what percentage of contacts who enter the journey end up in the “reactivated” branches? You can create a saved segment forreactivated_from_coldand compare its size against the segment matching your cold criteria over the same window.List health
Watch:
- Overall open and click rates on your main broadcasts.
- The ratio of “Subscribed” to “Non‑subscribed/Unsubscribed/Cleaned” in your audience.
A good reactivation journey slowly shrinks the “never opens anything” grey zone and clarifies which merchants are genuinely paying attention.Complaint and unsubscribe patterns
While Spreeflo doesn’t glamorize complaints, you’ll see signals through unsubscribes and “Cleaned” statuses. If those spike on Email 2 or Email 3, soften the tone or extend your delays.
Because this is built as a Journey using the same visual editor you use for campaigns, all of this is easy to tweak. You don’t rewrite logic in code; you drag, update a condition in the campaign and journey automation UI, and you’re done.
Adapting this pattern to your app
The skeleton is universal. The details should fit your Shopify or e‑commerce app:
If your value is analytics (like ShopMetrics), highlight specific insights merchants get when they come back: cohort charts, product profitability, or LTV by channel.
If your app handles operations (fulfilment, shipping rules, tagging orders), focus reactivation emails on “save X minutes per day” and “avoid Y error” outcomes.
If you offer marketing automation or popups to merchants, show before/after revenue for similar stores, with links to case studies.
You can also add richer segmentation into the If/Else conditions:
Different copy paths for merchants on high‑tier plans.
A gentler sunset for users with recent support tickets, since they might be in transition.
A parallel path where anyone who revisits your pricing page (tracked via Page Visited rules in the segment builder) gets a slightly more sales‑oriented version of Email 2.
All of that is built from the same node set: Criteria Match, Send Email, Time Delay, If/Else, Add Tag, Update Email Subscription Status.
The quiet fix for a loud leak
Most Shopify app teams obsess over acquisition. App Store rankings, install rate, CAC. Meanwhile, the right side of the funnel quietly leaks: merchants lose interest, stop opening, drift away, yet stay on your list for years.
This cold contact re‑engagement journey plugs one of the simplest holes:
It gives genuinely interested merchants a clear path back in.
It cleans everyone else out of your marketing flows without drama or manual CSV work.
It improves the signal‑to‑noise ratio on every future launch, feature announcement, and upsell.
You design it once, in an afternoon. The system runs it forever.
That’s the kind of automation founder‑led businesses need: not flashy sequences, but quiet, intelligent routines that stop lifetime value from leaking away because you weren’t talking to the right people at the right time.