The One Email Your Shopify App Should Send Every Year (But Probably Doesn’t)
Shows how to build an annual email preferences review journey for Shopify apps and e‑commerce SaaS in Spreeflo, refreshing consent, sharpening targeting, and turning engagement into a reusable lifecycle signal that compounds over time.
Industry
Niche
Pattern
Loading sequence...
The unsubscribe came from one of CartWizard’s best customers.
They’d been paying $149/month for three years. Their cart recovery app was a key part of the merchant’s stack. But the note attached to the unsubscribe stung:
“Love the app, but I’m getting emails that don’t feel relevant anymore.”
Nothing dramatic. No rage. Just quiet fatigue.
CartWizard’s founders dug into their list and realised something uncomfortable: most of their contacts had never been asked what they actually wanted to receive. The only way to change preferences was a tiny footer link, buried in templates that had been cloned since 2021.
The result: noisy inbox presence, decaying engagement, and zero fresh consent data.
The sequence at the top of this page is the whole journey, end to end. It’s an annual “email preferences review” for a Shopify app or e‑commerce SaaS: one automated flow that keeps consent fresh, sharpens your targeting, and gives you a clean engagement signal for scoring.
Let’s walk through how it works and how to adapt it to your own app.
Why an annual preferences check is free LTV for your app
If you sell an e‑commerce app, your growth story lives on three curves: installs, activation, and retention.
Email helps every one of those. Onboarding nudges, upgrade pitches, product announcements, case studies. But over time, the list bloats:
Merchants churn but stay subscribed.
People change roles inside the brand.
Teams sign up with shared inboxes that no one really checks.
Everyone’s tolerance for irrelevant updates keeps dropping.
You start to see:
Falling open and click rates.
Higher spam complaints and unsubscribes.
“Zombie” contacts who never interact but still count against your marketing contact limits.
Under the surface, something even more expensive is happening. You’re treating all these merchants the same. The high-intent brands who want deep product updates receive the same stream as the overwhelmed solo store owner who only wants billing notices.
An annual preferences review journey fixes three of those problems at once:
It refreshes consent in a clear, auditable way.
It captures more detail on each merchant so you can speak to them uniquely.
It gives you a powerful engagement signal: who bothered to click and update, and who ignored the prompt.
For a team of 2–10 people, this is exactly the kind of “build once, let it run forever” automation that compounds. You set it up once, and each year it quietly improves list quality instead of letting it decay.
High‑level tour of the journey
Before we dissect each node, here’s what the flow at the top of this page actually does:
A Cyclic trigger runs once a year and pulls in all contacts who should receive the review.
It sends a single preferences‑review email with a clear call to action.
After a Time Delay, a Check Email Activity process node looks at who clicked the email.
Engaged merchants (those who click) go down one path: they’re tagged, lightly scored, and their “last preference review” metadata is updated.
Everyone else gets a gentle follow‑up reminder after another delay, and then the journey leaves them alone.
All along, the journey writes simple tags and numeric signals you can reuse in other segments and journeys later.
You can build a journey like this in a single canvas. The rest of this article walks node by node through why each piece is configured the way it is, and what you might change for your own app.
Step 1: The Cyclic trigger — once a year, for the right people
This pattern starts with a Cyclic trigger.
Configuration:
Repeat interval: every 1 year.
Time of day: choose a quiet time for your merchants (for example, 09:00 in your main timezone).
Re‑enrollment: turned ON.
The criteria for the trigger uses the same segment builder you use for your other audiences. A simple starting point:
Email Subscription Status is “Subscribed”.
Marketing Status is “Marketing”.
(Optional) Contact is not tagged with
do-not-email.(Optional) Plan attribute is not “Churned”.
This ensures you’re only emailing contacts who are currently eligible for marketing. Because this is a compliance‑flavoured flow, it’s worth keeping the criteria tight.
Why re‑enrollment must be on
If you leave re‑enrollment off, each contact would only ever pass through this journey once in their lifetime. For an annual review, that’s pointless. Turning re‑enrollment on tells Spreeflo:
“Every time this yearly tick happens, if the contact matches the criteria and isn’t currently mid‑journey, enroll them again.”
That gives you a clean rhythm: each year, every active, subscribed merchant gets one chance to review their preferences.
Step 2: The preferences email — design it like a product, not a chore
The first action node after the trigger is a Send Email.
Two key configuration decisions here:
Use a dedicated marketing email template for “Preferences review 2026” (or similar).
Turn OFF the “Send only once” toggle so that this same node can send again next year when the Cyclic trigger fires.
You can build the email in Spreeflo’s email builder. The content matters more than usual, because this email is about consent and control rather than a shiny feature.
A pattern that works well for Shopify apps:
Subject: plain and direct. Examples:
- “Help us send you fewer, better emails”
- “Quick check: still want CartWizard updates?”Above the fold:
- One sentence on why they’re getting this (“We’re reviewing email preferences for all CartWizard users so we only send what’s useful.”)
- One primary button: “Review my email preferences”.Below the fold:
- Short explanation of what they can expect: product updates, tactical playbooks, outage notices, billing alerts.
- Clear line about how often you send, and that they can opt down or out completely.
Make that button the only prominent link. That way, when we later use Check Email Activity to look for a click, we can safely interpret “clicked” as “engaged with the preferences request.”
Optional but useful: immediately after the Send Email node, add an Update Contact Attribute node to set a timestamp attribute like last_pref_prompt_sent_at to “Set to now”. This gives you an auditable trace of when each merchant was last invited to review preferences.
Step 3: Give them breathing room with a Time Delay
Right after the preferences email, add a Time Delay node.
Configuration:
Delay value: 7
Unit: days
You could go as low as 3 days, but a week is usually enough for busy merchants who batch‑process their inbox. The delay matters for two reasons:
It avoids the spammy feeling of a quick “Did you see this?” follow‑up.
It gives a meaningful window to measure engagement with the first email.
Every path through this journey respects pacing: no back‑to‑back marketing emails without at least one Time Delay in between.
Step 4: Check Email Activity — turning a click into a signal
After the delay, drop in a Check Email Activity process node that targets the preferences email template you just sent.
Configuration:
Marketing email: your “Preferences review” template.
Activities to branch on: select only “Link Clicked”.
This creates:
- One branch for “clicked”.
- An automatic “else” branch for everyone who didn’t click.
Why only branch on clicks? Because it’s the cleanest engagement signal here. Opens are noisy (auto‑opens, privacy features), and for a consent‑oriented journey we care most about those who took positive action.
Contacts who click go down the “engaged” path. Everyone else goes down the “no‑click” path.
This is where the pattern shifts from “checkbox compliance” into something strategically useful. You’re not just sending a legalistic notice. You’re measuring who values the relationship enough to invest 10 seconds in adjusting it.
Step 5: Engaged path — tag, score, and capture better preference data
On the “clicked” branch, we’re going to turn that micro‑moment into a durable signal.
A practical chain of actions:
Add Tag
- Tags:prefs_review_engaged, and optionally a year‑specific tag likeprefs_review_2026.
- Purpose: lets you create segments like “has ever engaged with a preferences review” vs “never has”.Update Contact Attribute — engagement scoring
- Attribute: a numeric custom attribute likeengagement_score.
- Update type: Increment.
- Value: 10 (or whatever fits your internal scale).
Over time, you can bump this score for a variety of actions: app logins, key feature usage, event attendance, replies, and preference updates like this. BecauseIncrementuses the literal you configure as an operand, you get consistent scoring without any runtime complexity.Optional: Update Contact Attribute — last confirmed
If your preference centre writes a specificlast_preferences_updated_attimestamp whenever a merchant submits the form, rely on that. But if you don’t have that wired up yet, you can use this step to at least track a “soft” confirmation:
- Attribute:last_prefs_review_interaction_at.
- Update type: Set to now.
How do you actually update their topical / frequency preferences?
The journey itself shouldn’t try to parse form submissions. Instead:
- Host a simple preferences page inside your app or marketing site.
- When a merchant submits it, have your backend call the Spreeflo API withidentifyto set boolean or text attributes such as:
-pref_product_updates= true/false
-pref_case_studies= true/false
-pref_frequency=weekly/monthly/launches_only
Those attributes then become first‑class filterable fields in the segment builder. This is how you eventually send “case study only” content to those who actually asked for it, and reduce noise for everyone else.Optional: If/Else + Send Internal Email for high‑value stores
Inside the engaged path, you can add an If/Else node to spot merchants with a high MRR or on an enterprise plan attribute. For those, send a Send Internal Email to the founder or CSM:
- “Brand X just reviewed their email preferences and stayed subscribed. Maybe time for a quick check‑in?”
This is where a small team can act like a larger one — the system surfaces the right accounts without anyone constantly watching a dashboard.
Step 6: No‑click path — gentle reminder without punishment
Everyone who didn’t click the first email lands in the else branch from Check Email Activity.
That doesn’t mean they don’t care. They may simply be busy.
Here’s a sensible sequence:
Time Delay
- Delay value: 7 days.
- Unit: days.Send Email — final reminder
- Subject: again, plain and respectful. For example:
- “Last call: do you still want CartWizard emails?”
- Body: shorter than the first one:
- One sentence about not wanting to crowd their inbox.
- The same primary button to review preferences.
- A clear note that if they do nothing, nothing drastic happens; they’ll simply keep getting the current mix of emails (or, if you choose, you can say they’ll move to fewer updates).
Make sure there’s no marketing email between the first and second prompt other than the delays we’ve added.
At this point, the journey can simply end. Unsubscribes from either email are handled by the normal subscription logic, so you don’t need extra Update Email Subscription Status steps unless you want something more aggressive, like automatically moving “no‑response for 2+ years” contacts to Non‑subscribed.
If you do choose to eventually prune aggressively, you can add that logic in a separate journey that watches for combinations of tags like prefs_review_2025 + prefs_review_2026 + “never clicked”.
Step 7: Reusing the signals across your lifecycle
Once this journey has run for a cycle, you’ll have much richer data than “Subscribed yes/no.”
Some examples of how to put it to work:
Onboarding: build a segment of “new customers who engaged with the preferences review” and prioritise them for feature‑education sequences. These are the folks who already demonstrated they value communication.
Churn‑risk: in a win‑back journey triggered on
app_uninstalled, give extra weight to merchants with highengagement_scoreandprefs_review_engagedtag — they’re more likely to respond to a tailored offer.Campaign targeting: create segments like “pref_product_updates = true AND prefs_review_engaged has tag” for release notes, versus “pref_case_studies = true” for story‑driven content.
Because all of this lives on the same contact record you use for audiences, you’re not bolting on some external “consent database.” You’re deepening the profile that already powers your nurture.
If you’re thinking about contact limits while you clean up your list, it’s worth skimming the guide on Spreeflo pricing plans. Marketing contacts are what count, so quietly letting truly dormant folks flow to a Non‑marketing status over time will save money.
Measuring whether this journey is worth its slot
Three metrics tell you whether your preferences review is doing its job:
Preference‑update rate
- Numerator: contacts who clicked the preferences email or actually updated any preference attributes within, say, 14 days of the prompt.
- Denominator: total delivered preferences emails.
- Interpretation: if this is under 5%, your email might feel like legal boilerplate. Aim higher by tightening copy and making the benefit of updating obvious.Opt‑out rate
- Unsubscribes from this journey divided by delivered emails.
- A bump here isn’t always bad. Losing unengaged subscribers who were never going to convert or upgrade can improve deliverability and make your metrics more honest.Downstream engagement lift
- Compare open/click rates on a few subsequent campaigns between:
- Merchants with theprefs_review_engagedtag.
- Merchants without it.
- When this pattern is working, the engaged group should outperform, often quite dramatically. That’s both a validation of the journey and a hint that you should treat that cohort as your core relationship audience.
Over a couple years, this single journey quietly fixes one of the biggest leaks in most e‑commerce app businesses: sending the same generic stream to everyone, forever.
Bringing it back to why this matters
For a Shopify app or e‑commerce SaaS, the temptation is always to chase more installs, more traffic, more impressions. But your deepest revenue comes from the merchants who stick around, adopt more of your features, and keep seeing value.
Those relationships live and die on how precisely you speak to them.
An annual email preferences review looks like admin work at first glance. In practice, it’s the opposite. It’s a structured way to:
Capture more nuance on every customer so you can speak to them uniquely.
Stop leaking lifetime value by quietly fatiguing your best merchants with the wrong messages.
Give a small team a durable, repeatable signal they can reuse across onboarding, expansion, and win‑back flows.
Set this journey up once. Let it run. Watch how much clearer your list — and your decisions — become.
And the next time someone unsubscribes from your app’s emails, it’ll be because they genuinely don’t need to hear from you, not because you never asked what they wanted in the first place.