Stop Letting Inactive Emails Tank Your Shopify App Deliverability
This playbook walks Shopify app teams through building a Spreeflo sunset journey that detects chronically inactive email subscribers, gives them two respectful re-engagement chances, then suppresses non-responders to boost deliverability and revenue per active profile.
Industry
Niche
Pattern
Loading sequence...
Six months into scaling CartWizard, a cart recovery app for Shopify, the founders noticed something uncomfortable.
Their list of 30,000 merchants kept growing. Their weekly “growth tips” newsletter still went out on schedule. But open rates had slid from 32% to 11%, click rates were barely above 1%, and Gmail started dropping sends into Promotions or worse, spam.
The team’s instinct was “send better content.” The real problem was quieter: half their list hadn’t opened an email in over six months. Those ghosts were dragging down engagement averages, and with them, sender reputation. The merchants who did care about CartWizard were becoming collateral damage.
The sequence at the top of this page is the whole journey, end to end. It’s a multi-step sunset policy that gives your coldest subscribers two honest chances to re-engage before you quietly suppress them to protect your sender reputation and your revenue per active profile.
In this playbook, we’ll walk that journey node by node, tuned for e‑commerce apps and Shopify extensions. You’ll see how a lean team can set this up once, then let it run in the background while you focus on building the product.
Why clinging to every email address is costing you real money
For SaaS and app developers, it’s easy to treat your email list like a trophy cabinet. More contacts must mean more opportunity, right?
In practice:
Inbox providers watch engagement at the domain and IP level. If most of your recipients ignore you, even the interested ones see more messages land in spam or Promotions.
Low open and click rates make it harder to trust any A/B test, onboard sequence, or launch campaign you run.
You pay (directly or indirectly) to keep marketing to people who never respond.
For a Shopify app with 10–50k merchants, that turns into meaningful drag. CartWizard’s fix was a sunset policy: a standing rule that says “after X months of silence and two failed re-engagement attempts, we stop marketing to you.”
That’s what this Spreeflo journey implements:
It identifies chronic inactives based on real engagement history, not guesswork.
It gives them value-first re-engagement opportunities.
It suppresses only the ones who stay cold, improving deliverability and your revenue per active profile.
Let’s start where this all hangs together: the Criteria Match trigger.
Step 1: Define “chronically inactive” with Criteria Match
The journey starts with a Criteria Match trigger, which fires the moment a contact newly matches a set of conditions you define through Spreeflo’s segment builder.
For a Shopify app sending weekly or bi-weekly email, a solid starting definition is:
Email Subscription Status is “Subscribed”.
Email Activity “sent” at least 5 times in the last 180 days.
Email Activity “did not open” any email in the last 180 days.
Contact is not tagged with “vip” or “sunset_exempt”.
Why it’s built this way:
“Sent at least 5 times” ensures new signups and low-frequency recipients don’t get caught before they’ve had a fair chance to engage.
“Did not open in the last 180 days” defines the core inactivity window. Six months works well for most B2B SaaS cadences; adjust if you email daily or monthly.
Excluding VIPs or high-value customers (using tags) keeps power users and big accounts out of the sunset, even if they ignore marketing emails but are very active in-app.
In the Criteria Match trigger’s configuration:
Set those rules with an AND group in the segment builder UI.
Turn Re-enrollment on.
Re-enrollment matters here. You want someone who re-engages, stays active for a while, and then goes cold again a year later to re-enter this journey and repeat the sunset cycle. Spreeflo prevents duplicate enrollments while they’re mid-journey, so you won’t double-process anyone.
From this trigger, everyone flows into the first action: tagging them as a sunset candidate.
Step 2: Tag contacts as “sunset candidates” for visibility
The next node is an Add Tag action that applies a tag like sunset-candidate to every contact who enters.
This looks minor, but it pays off:
You can easily report on how many contacts are in the sunset funnel at any time.
It gives you an escape hatch: if you manually want to protect a specific merchant, you can also add a
sunset_exempttag, which your trigger criteria exclude.Other journeys can use this tag to avoid sending “bonus” campaigns to people already in the sunset process.
Configuration:
Node: Add Tag.
Tags:
sunset-candidate.Force Tag Trigger: off (you don’t need to fire Added Tag triggers here).
If you’re not yet using tags systematically, this is a good excuse to standardize them. The guide on using tags is worth a skim before you wire up more journeys.
Now the contact is marked. Time to try to win them back.
Step 3: First re-engagement email – useful, not needy
Your first Send Email node is a gentle re-engagement.
The goal is not to guilt them into staying. The goal is to remind them why your app is valuable and give them a clear, low-friction way to raise their hand as “still interested.”
Some patterns that work well for Shopify apps:
“3 quick wins you can still get from CartWizard this week” with a link to an updated playbook.
A short case study from a similar store (“How a mid-sized apparel brand recovered $18k last month using our app”).
A “what you’ve missed” module: a list of major feature releases since they last engaged.
In Spreeflo:
Node: Send Email.
Use a clear internal template name like “Sunset – Re-engage 1”.
Pick the sender identity you normally use for marketing.
Keep “Send only once” on, so a contact who re-enters this node via re-enrollment later won’t get the same email multiple times.
You can build the content quickly in our email builder, and if you’re short on time, use AI-generated copy as a starting point, then tweak it with your specific examples and numbers.
Crucially, include at least one link that indicates intentional engagement: a “Yes, keep me subscribed” button, a “See what’s new” link, or a “Log in now” CTA. You’ll use this in the next step.
Step 4: Wait a week, then inspect behavior with Check Email Activity
After sending the first re-engagement email, you add a Time Delay:
Node: Time Delay.
Configuration: 7 days, in days.
This respects pacing and gives inbox providers time to see a burst of engagement from those who still care.
Next comes a Check Email Activity process node, configured against that same “Sunset – Re-engage 1” template:
Marketing email: select “Sunset – Re-engage 1”.
Activities to branch on:
- Branch A: “clicked”.
- Branch B: “opened”.Else branch: auto-created for everyone who did neither.
Why this split:
Clickers are your most engaged rescuers. They’re clearly back.
Openers might skim the email without clicking, but they still send a positive signal to Gmail and friends.
Non-openers after a full week and at least one send are your true at-risk contacts.
From here, the “clicked” and “opened” branches converge into a Merge node, while the silent group get one more chance.
Step 5: Merge and clean up for reactivated contacts
Both engaged branches connect to a Merge node. This keeps your canvas clean and respects the “one incoming edge per node” rule for everything downstream.
From the Merge, you run a couple of housekeeping actions:
Add Tag: apply something like
sunset-saved.Remove Tag: remove
sunset-candidate.
These two nodes mean:
You can later build a segment of “people the sunset journey saved” for analysis.
Contacts no longer look like they’re mid-sunset if you inspect a profile.
At this point, they exit the journey. They stay subscribed, continue receiving your normal campaigns and onboarding flows, and might re-enter the sunset journey again in the future if they go cold long enough to match the criteria again.
Now let’s look at the quiet ones.
Step 6: Second-chance email for the truly silent
Contacts in the else branch of Check Email Activity (no open, no click) are your chronic non-responders. You still give them a final, respectful nudge.
Node: Send Email, with a template like “Sunset – Final Call”.
The tone here should be straightforward:
Acknowledge the silence: “We’ve noticed you haven’t opened emails from us in a while.”
Offer a choice: “If you still want Shopify growth tactics and product updates from CartWizard, click below.”
Set expectations: “If we don’t hear from you, we’ll unsubscribe you from our list so we’re not cluttering your inbox.”
Again, keep “Send only once” on.
Immediately after this node, add another Time Delay:
7 days is a good baseline.
Heavy senders might shorten it to 3–4 days; low-frequency senders might extend to 10–14.
This gives recipients time to see and act on the message across different time zones and work patterns.
Step 7: Final If/Else to decide who gets suppressed
After the delay, you need one more decision point: did they show any sign of life after that last email?
An If/Else process node does this, using the segment builder inline:
Condition:
- Email Activity “opened” at least 1 time in the last 7 days.
You can keep it broad (“any email”) instead of tying it to the specific final-call template. If someone re-engages through another campaign or flow in that week, they are obviously still interested, and you should treat them as saved.
Branching:
Then branch (“engaged late”): send them to the same Merge node used earlier for reactivated contacts. They’ll get tagged as
sunset-saved, havesunset-candidateremoved, and exit.Else branch (“still silent”): they move on to suppression.
Because Merge nodes are explicitly allowed to have multiple incoming paths, routing all “rescued” contacts through that same Merge is both clean and valid.
Step 8: Suppress ghosts and reduce your bill
Contacts who reach this else branch have:
Been sent multiple campaigns over at least six months.
Ignored two dedicated re-engagement attempts.
Stayed silent even after a clear “we’ll unsubscribe you” warning.
Keeping them on your marketing list hurts you more than it helps.
Here’s how the final suppression looks inside the journey:
Update Email Subscription Status:
- Status: Email unsubscribed.
This takes them out of future marketing sends. Even if they still exist in your audience, they won’t receive broadcasts or journeys that respect subscription state.Update Contact Attribute (Marketing status):
- Attribute: Marketing status.
- Update type: Update.
- Value: Non-marketing.
Marking them as non-marketing means they don’t count toward your billable marketing contacts. If you want a refresher on how this works, the detailed pricing-plan explainer walks through it.Add Tag:
- Tag:sunset-suppressed.
This tag gives you an easy way to audit suppression rate over time or to exclude these contacts from any “edge case” automations that might ignore subscription status.
After this, the path ends. Because the Criteria Match trigger only includes Email Subscription Status “Subscribed”, these contacts won’t re-enter the journey, even if they somehow met the other conditions.
You can still communicate with them via system-critical messages using transactional email sent through your app’s API calls, but marketing automation leaves them alone.
Shopify app nuances: who you should never sunset
For e-commerce apps, there’s one extra nuance many teams miss: some of your best customers barely open marketing emails but are very active inside the app.
To avoid sunsetting people who are paying you every month:
Add a Custom Events exclusion to your Criteria Match condition:
- “Custom eventfeature_usedtriggered at least 1 time in the last 30 days”, OR
- “Custom eventsubscription_upgradedtriggered at least 1 time in the last 90 days”.Wrap this in a subgroup and invert it appropriately so truly active users are excluded from the chronic inactivity criteria.
You can also maintain a
viporhigh-mrrtag and add that tag-based exclusion to your trigger condition. For many Shopify apps, 10–20% of stores drive the majority of ARR. Those are the people you’re willing to keep emailing longer, even if they’re not especially responsive.
The nice part: once these conditions are defined in the Criteria Match trigger, the rest of the journey doesn’t change. You’re still running the same re-engagement and suppression logic, just on a smarter subset of your audience.
Reading the results: what good looks like
Once this journey has been running for a couple of months, three numbers matter most:
Suppression rate
What percentage of your list gets thesunset-suppressedtag over a 6–12 month period?
For a growing Shopify app with decent onboarding, seeing 10–25% of your historical list suppressed in the first run, then a much lower ongoing rate, is normal. The initial wave cleans legacy ghosts; after that, it becomes maintenance.Deliverability and engagement lift
Track open and click rates before and after for your main campaigns:
- Average open rate across all marketing emails.
- Placement warnings or bounce rates from your ESP.
When CartWizard implemented this pattern, their weekly newsletter open rate climbed from 11% back up to 24% over three months, even though they were sending to 7,000 fewer contacts. Clicks per send increased, and more importantly, Gmail stopped shuffling everything into Promotions.Revenue per active profile
Look at total email-attributed revenue over 30 or 60 days divided by the number of contacts who are still eligible for marketing (not unsubscribed or non-marketing). That revenue-per-active-contact metric usually goes up after a sunset policy, even if absolute list size shrinks.
For a lean team, this is the number that matters. You’d rather have 8,000 merchants who open, click, and buy than 30,000 who mostly ignore you.
This is retention work, even though it deletes contacts
On the surface, a sunset policy looks like “list hygiene.” In reality, it’s retention work.
By cutting out chronically inactive contacts, you:
Give inbox providers a cleaner, more engaged signal, so the customers who do care about your app see more of what you send.
Free up your own attention, so you can design journeys and campaigns for people who still convert, not for a dead-weight average.
Stop paying, in both cash and reputation, for contacts who are never going to come back through email.
For founder-led product teams, this is exactly the kind of system that compounds. You use the journey canvas to build a journey once, wire in your criteria through the segment builder, and let it run quietly in the background while you ship features.
Most Shopify apps and e-commerce tools are already leaking lifetime value by not nurturing engagement. Letting inactive emails pile up is a quieter version of the same problem. You’re still talking; your customers just aren’t hearing you.
A thoughtful sunset journey fixes that. You protect your sender reputation, you focus on the merchants who actually move your MRR, and you give every dormant contact a fair chance to come back before you let them go.