Back to Playbooks

The “Last Chance” Email That Protects Your List (And Your Deliverability)

Free

This playbook walks Shopify and e‑commerce app teams through building a Spreeflo “last‑chance before sunset” journey that emails dormant subscribers once, rescues anyone who re‑engages, and automatically unsubscribes the rest to protect deliverability and list quality.

Industry

Niche

Pattern

Loading sequence...

A founder of a Shopify app once sent me a screenshot from their ESP: 120,000 “subscribers.” Average open rate: 5%. Clicks: basically flat.

“We’re spending real money emailing ghosts,” they said. “But I’m scared to prune the list. What if we cut someone who would’ve converted?”

If you’re running an e‑commerce app on Shopify or another platform, this probably feels familiar. You acquire installs, you run onboarding and re‑engagement, and still a big slice of your list never opens a thing. Meanwhile, every campaign to that dead weight chips away at your sender reputation.

That’s the tension this pattern solves.

The sequence at the top of this page is the whole journey, end to end. It’s a “last‑chance before sunset” flow: one final, respectful email asking inactive contacts if they still want to hear from you, followed by automatic suppression if they don’t respond.

In this article, we’ll walk through that journey node by node in Spreeflo, using a fictional Shopify app business, CartWizard, as our example:

  • CartWizard: cart recovery + upsell app

  • ~$100k MRR, 4‑person team

  • Using Spreeflo for lifecycle email and web tracking

  • Open rates sliding because 25–30% of their list hasn’t opened an email in 90 days, even after a re‑engagement series

CartWizard doesn’t have the time to manually clean their audience. They need automation that quietly protects deliverability and keeps lifetime value from leaking away.

Let’s build it.

Why e‑commerce apps need a hard sunset decision

As a Shopify or e‑commerce app developer, your installs often come in waves: App Store SEO, content hits, partnership promos. It’s easy to stack up tens of thousands of contacts over a couple of years.

But your real revenue comes from a much smaller group:

  • merchants who complete activation,

  • regularly use key features (like “abandoned cart campaigns live”), and

  • occasionally upgrade or buy add‑ons.

Sending every newsletter, launch, and promo to everyone who has ever installed your app is a recipe for:

  • Depressed open and click rates

  • Higher spam‑complaint risk

  • ESPs down‑ranking your domain, so even engaged users stop seeing you

Most teams know they should “clean the list,” but they either:

  • Do an occasional blunt purge (“anyone inactive for 180 days”), or

  • Avoid the decision entirely and hope nothing breaks

The better pattern is intentional and automated:

  1. Run a structured re‑engagement series (multiple touches).

  2. For those who still don’t respond, send a final “do you still want to hear from us?” email.

  3. If they ignore it, automatically unsubscribe and stop counting them as marketing contacts.

That’s exactly what the journey in the visual sequence implements using Spreeflo’s campaign and journey automation.

What this journey does in plain English

Before we get into nodes, here’s the behavior CartWizard wants:

  • When a contact has:\n- Been subscribed for a while,\n- Not opened any emails in 90 days, and\n- Already been through CartWizard’s standard re‑engagement series without responding,

  • Then:\n- Send a single “Still want updates from CartWizard?” email.\n- Give them 7 days to open or click.\n- If they engage in that window, keep them on the list and mark them as “rescued.”\n- If they don’t, automatically mark them as unsubscribed and treat them as non‑marketing going forward.

The journey type is a continuously running journey, not a one‑off campaign. Once you build this journey and turn it on, every future contact who drifts into “dead but still subscribed” territory will be handled the same way.

Now let’s go node by node.

Trigger: Criteria Match on truly dormant subscribers

Node: Criteria Match trigger\nTrigger family: Profile State\nRe‑enrollment: false

We start the journey with a Criteria Match trigger instead of Add to Audience or Join Segment because we care about current profile state combined with behavior, not a one‑time event.

In Spreeflo’s segment builder, CartWizard defines criteria roughly like:

  • Email subscription status is “Subscribed”

  • Email activity: has not opened any marketing email in the last 90 days

  • Tag contains reengagement_series_completed (set by their previous re‑engagement journey)

  • Tag does not contain sunset_last_chance_sent (safety check if they ever rerun logic later)

You don’t have to mirror that exactly, but two principles matter:

  1. Be precise about inactivity. Use Email Activity filters in the Segment Builder with a clear time window (e.g. “opened 0 emails in the last 90 days”). You want “no signal,” not just “opened less often.”

  2. Make sure re‑engagement has already failed. Either check for a tag your re‑engagement journey adds (like reengagement_series_completed) or segment membership indicating “failed re‑engagement.”

Set Re‑enrollment to false. This is a one‑time decision per contact: they either get rescued here or they’re sunset.

Why this matters: treating cold subscribers differently from the rest of your audience is a direct fix for the quiet lifetime‑value leak most SaaS and e‑commerce apps suffer. Hammering disengaged contacts with the same cadence as power users makes everyone worse off.

Step 1: Tag the cohort as they enter

Node: Add Tag (sunset_last_chance_entered)

Immediately after the trigger, CartWizard adds a tag like sunset_last_chance_entered.

Why bother?

  • Analytics: you can easily build a segment of “everyone we’ve ever put through a sunset decision” later.

  • Safety: if you ever change logic or clone this journey, you have a clear marker of who has been processed.

Configuration:

  • Tags: sunset_last_chance_entered

  • Force tag trigger: off (no need to fire Added Tag triggers elsewhere)

No messaging yet; this is pure bookkeeping.

Step 2: Send the last‑chance email

Node: Send Email (template “Last chance: stay on the CartWizard list?”)

This is the only marketing email in the journey. It must carry the weight:

  • Subject: crystal clear and honest\n“Do you still want CartWizard tips and updates?”\nAvoid trick subjects here. You want an informed choice.

  • Body copy:\n- Acknowledge the reality: “Looks like you haven’t opened our emails in a while.”\n- Explain why you email: product improvements, revenue ideas, real examples from top merchants.\n- State the consequence: “If we don’t hear from you, we’ll stop sending marketing emails to this address.”\n- Clear call‑to‑action:\n - A link or button: “Yes, keep me subscribed.”\n - Soft option: “No action needed if you’d rather not receive these.”

Use Spreeflo’s email builder to keep this simple: logo, a short paragraph, one button, and a plain unsubscribe link in the footer.

In the node configuration:

  • From (email account): whichever identity you use for lifecycle email

  • Send only once: keep this on. Even if a contact somehow re‑enters the journey, they won’t be hit with this email twice.

  • Template: create a dedicated “sunset last chance” template so you can measure it separately.

Notice in the visual sequence that there’s no other Send Email node directly before or after this. You never want back‑to‑back marketing sends in a flow like this. It should feel like a clear, single decision point, not a campaign.

Step 3: Wait for engagement, but not forever

Node: Wait Condition\nCondition: “Engaged with the last‑chance email”\nTimeout: 7 days

As soon as the email goes out, CartWizard gives each contact time to respond. That response could be:

  • Opening the email,

  • Clicking any link in it (especially the “keep me subscribed” button), or

  • Performing some other high‑intent action you track, like visiting the app dashboard.

In the Wait Condition node:

  • Condition: use the Segment Builder to express “Email Activity: opened or clicked this specific marketing email in the last 7 days” (you’ll pick the exact email template in the builder).

  • Timeout: 7 days.

This node will do two things:

  1. If the contact engages quickly, it will release them as soon as the condition is met.

  2. If they ignore you, it will hold them for up to 7 days, then release them when the timeout expires.

Crucially, Wait Condition is not a branch. Everyone goes to the same next node; we just delay until the condition or timeout happens.

Step 4: Branch based on whether they raised a hand

Node: If/Else\nCondition: same “engaged with last‑chance email” logic as above

Immediately after the Wait Condition, we add an If/Else process node.

  • “Then” branch: contacts who have engaged with the last‑chance email.

  • “Else” branch: contacts who haven’t.

In the condition, re‑use the same logic as the Wait Condition: Email Activity rules pointing at this specific marketing email.

This might feel redundant, but it’s deliberate:

  1. Wait Condition controls when the contact moves on.

  2. If/Else controls what happens next based on whether they met the condition.

You need both.

From here, the journey splits into two clear outcomes.

Yes branch: keep them, mark them as rescued

Branch: If/Else “then” path\nNodes: Add Tag, optional cleanup

In the “yes” branch, the contact showed any sign of life during the 7‑day window.

CartWizard keeps this simple:

  1. Add Tag: sunset_rescued\nThis makes it easy to:\n- Measure how many people the sunset flow saves, and\n- Exclude them from future sunset criteria if you decide they deserve more lenient rules.

  2. (Optional) Remove Tag: reengagement_series_completed, sunset_last_chance_entered\nCleaning up these tags can keep your audience logic readable. Use a Remove Tag node if you want to do this automatically.

They do not send another email here. Remember that the Wait Condition might release a contact seconds after they click the last‑chance email. Following up instantly with another marketing email is exactly the kind of spammy behavior we’re trying to avoid.

Once the Add Tag (and optional Remove Tag) nodes run, the path ends. These contacts stay subscribed and continue to receive your normal campaigns and product updates.

No branch: unsubscribe and move them out of your marketing audience

Branch: If/Else “else” path\nNodes: Add Tag → Update Email Subscription Status → (optional) Update Contact Attribute

In the “no” branch, the contact went a full 7 days without opening or clicking the last‑chance message.

This is where the sunset actually happens.

  1. Add Tag: sunset_unsubscribed\nTagging here has three advantages:\n- Gives you a clear denominator for your “suppression rate” metric.\n- Lets you revisit these contacts later for non‑email experiments if you want (e.g. in‑app messaging, customer research).\n- Documents why they’re unsubscribed (a teammate can see it on the contact record).

  2. Update Email Subscription Status: set to “Email unsubscribed”\n\nThis is the decisive step. Using the Update Email Subscription Status action node, CartWizard sets:\n- Status: Email unsubscribed\n\nPer Spreeflo’s model, these contacts will no longer receive marketing email. They can still get transactional messages if you send those via the transactional email API, but they’re out of your marketing automations.

  3. (Optional) Update Contact Attribute: Marketing status → Non‑marketing\n\nIf you want these contacts to stop counting as billable marketing contacts, add an Update Contact Attribute node right after:\n- Attribute: Marketing status\n- Update type: Update\n- Value: Non-marketing\n\nThis doesn’t change deliverability, but it tightens up your list economics. When you later review the pricing‑plan explainer, you’ll see how keeping cold contacts in the “Non‑marketing” bucket keeps costs down.

After these nodes, the “no” branch ends. The contact is suppressed from future marketing sends, and the journey has done its job.

Measuring if this journey is working

Three metrics matter for this pattern:

  1. Reactivation rate\n\nOf everyone who enters the journey, how many end up on the “rescued” branch?\n\n- Numerator: contacts tagged sunset_rescued\n- Denominator: contacts tagged sunset_last_chance_entered\n\nFor CartWizard, even a 3–5% rescue rate is valuable. Each saved merchant still has a chance to upgrade, buy add‑ons, or refer others.

  2. Suppression rate\n\nThis is the counterpart:\n\n- Numerator: contacts tagged sunset_unsubscribed\n- Denominator: same as above\n\nA high suppression rate is not failure. It’s clarity. You’re no longer pretending those contacts are part of your reachable market.

  3. Deliverability impact\n\nOver a couple of months, you should see:\n\n- Higher average open rates across regular campaigns\n- More consistent click‑through rates\n- Fewer spam complaints and bounces (especially if you also cull hard bounces elsewhere)\n\nBecause you’re emailing fewer people, raw open counts might dip. That’s fine. The real win is that more of your engaged users actually see what you send.

If you use Spreeflo’s audiences, segments, and tags view to track these tags, you’ll quickly see how this small, quiet journey improves the health of your whole list.

Adapting the pattern to your app

The exact numbers and signals will vary by product, but the structure holds.

Here are the levers you can tune:

  • Inactivity window\nCartWizard used “no opens in 90 days.”\nIf you send weekly, 90 days is reasonable. If you email once a month, consider 180 days instead.

  • Re‑engagement prerequisite\nIf you don’t have a re‑engagement series yet, build that first. This last‑chance pattern is for after a more thoughtful attempt to bring people back.

  • Wait window\nSeven days is a decent default. If your audience is small and you email infrequently, you could stretch it to 14 days without hurting list hygiene.

  • Signals that count as “engaged”\nFor some apps, a dashboard visit or in‑app custom event (tracked with Spreeflo.track) might be a better indicator than an email open. The If/Else and Wait Condition nodes can use Custom Event criteria too.

The core idea stays the same: you’re designing a fair, automated decision about who stays in your marketing universe and who doesn’t.

Stopping the quiet LTV leak

Most SaaS and e‑commerce apps leak lifetime value in two directions at once:

  • They under‑communicate with users who could become high‑value customers, because they’re afraid of “sending too many emails.”

  • They over‑communicate with people who have clearly checked out, until deliverability erodes and even the engaged users stop seeing messages.

A well‑designed sunset journey is how you escape that trap. You’re not giving up on people casually; you’re:

  • Capturing clear engagement signals over time,

  • Making one final, respectful ask, and

  • Then enforcing a decision in a way that runs without manual cleanup.

For a founder‑led team building an app in the Shopify ecosystem, that kind of system is exactly where you win. You don’t have a retention team or a deliverability specialist. You have a few hours to set this up once, then it quietly protects your sender reputation and your list quality while you go back to shipping product.

That’s the deeper point behind this pattern: automation isn’t just about squeezing a few extra upgrades out of your list. It’s about building guardrails so your best customers actually hear from you, month after month.

The “last‑chance before sunset” journey is one of those guardrails. Put it in place, and every other campaign you run gets a little sharper, a little more profitable, and a lot more sustainable.