The Push vs Email Showdown Your Shopify App Should Actually Run
This playbook walks Shopify and e‑commerce apps through building a Spreeflo journey that A/B tests email versus web push for stalled onboarding, so you can stop guessing channels and run a reusable, always‑on experiment that reveals what truly converts.
Industry
Niche
Pattern
Loading sequence...
The argument usually starts in Slack.
“Everyone opens email, we should double down there.”
“Yeah, but our users live in their browser tabs. Push is instant. Email feels slow.”
Meanwhile your trial users install the app, poke around once, then disappear. You’re debating channels while revenue quietly leaks out.
For a Shopify or e‑commerce app, that channel decision is not an academic exercise. It decides how many stalled trials wake back up, how many borderline accounts upgrade, and how quickly your tiny team can react without hand‑crafting every nudge.
The sequence at the top of this page is the whole journey, end to end. It’s a simple but serious test: same audience, same moment in their lifecycle, randomly split into two paths. One gets an email, one gets a web push notification. Then you track which side actually converts more people.
In this article we’ll walk through that journey node by node, using a fictional Shopify app called CartWizard: a cart recovery and upsell app doing ~$100k MRR. They’ve added browser notifications to their stack, but they’re not sure whether email or push will produce more “trial → active” conversions for merchants who stall after install.
The goal is very specific:
Measure per‑channel conversion to “activated” or “upgraded”
See cost‑per‑conversion and opt‑out pain for each channel
Turn those learnings into a repeatable pattern your team can reuse
And crucially: do it once in Spreeflo, then let it run for every new stalled user without more headcount.
Why this experiment beats arguing about channels
When you’re a 3–5 person product‑heavy team, “what channel should we use” usually comes down to opinions and anecdotes.
Someone remembers a huge launch email that crushed.
Someone else tried web push during BFCM and saw a spike in clicks.
Nobody is tracking which channel quietly drives more upgrades over a quarter.
That’s a bad trade. You’re investing engineering effort to instrument events, writing copy, and paying for tools. The cost of being wrong about the primary nudge channel compounds every day.
Instead, you want a small, always‑on experiment that:
Targets a clear, high‑value moment (e.g. installed but not activated).
Randomly assigns people to email or push, so you’re not sampling two different audiences.
Tracks downstream conversion and opt‑out signals without you touching it.
That’s what the journey at the top of this page does. Once you’ve set it up in the journey editor, it quietly pulls data in the background while you ship product.
Founder‑led businesses win on leverage, not headcount. This is exactly the kind of system that buys you that leverage.
Pick one high-intent moment and make it your trigger
The experiment lives or dies on where you start it.
For CartWizard, the key leak is merchants who install the app, land in the dashboard, then never complete the first recovery campaign. So they instrument a custom event called onboarding_stalled that fires 24 hours after install if the merchant hasn’t finished the setup wizard.
You capture that using the Spreeflo SDK or server‑side via the Spreeflo API. Once the event is flowing, you anchor the journey with a Custom Event trigger:
Event name:
onboarding_stalledProperty conditions: optional (e.g. only stores over a certain revenue band), but keep the audience as broad as makes sense for your test.
Re‑enrollment: off, so each merchant only enters the experiment once even if they stall again later.
Why that setting matters:
With re‑enrollment off, results are clean. Each contact provides one data point.
If you do want to retest channel performance after a year, you can always clone the journey and run v2.
You could run this test on a different behavioral trigger — “visited pricing page 3+ times,” “hit usage cap,” “trial expiring,” etc. The pattern is the same: pick a moment where a timely nudge has a clear, measurable outcome.
Split the stream fairly: Random Split as your referee
Next in the sequence is a Random Split process node.
Configuration:
A branch (email arm) vs B branch (push arm)
Percentage weight: 0.5 (50% to each)
Random Split is doing the heavy lifting here. It guarantees that:
Both arms draw from the same underlying audience.
Assignment is automatic and unbiased.
You don’t accidentally bias the test by, say, sending email to older accounts and push to newer ones.
If you wanted, you could tilt the split (e.g. 70% email / 30% push) once you’re convinced email is safer, but for the first clean reading you want an even 50/50.
From this node, you have two outgoing paths. Before you send anything, you silently mark which arm a contact fell into.
Mark the arms: Add Tag before you talk to anyone
On each branch, the first thing after the Random Split is an Add Tag action.
Email branch: Add Tag →
channel-test-email-armPush branch: Add Tag →
channel-test-push-arm
Tags are cheap and powerful. They give you:
A permanent record of which experiment and arm a contact belonged to.
Clean segments later, long after the journey has finished for that contact.
The ability to intersect “arm membership” with any outcome (converted, unsubscribed, downgrade, etc.), all inside the segment builder.
This is your version of an experiment ID column in a database. Once you have it, analysis gets much easier.
Design the email arm: one clear nudge, then watch
Now the email branch can start doing its job.
Send Email
Wait Condition
If/Else
Outcome tagging
Build or select a marketing template that does one thing: get the merchant to finish setup or upgrade.
Inside the node:
Choose the right sender identity (usually your main product address).
Use a focused subject and a single CTA back into the app (e.g. “Finish your first recovery flow”).
Keep “Send only once” on. Nobody should get this experiment email twice.
This is where Spreeflo’s email builder and AI personalization help. You can tailor copy using what you know about the store: order volume, industry, or which features they’ve already touched.
Immediately after the email goes out, add a Wait Condition:
Condition: custom event
activation_completed(orfirst_campaign_live) triggered at least 1 time in the last 3 days.Timeout: 3 days.
You’re essentially saying: “Wait up to three days to see if this merchant activates. If they do, move on right away. If not, proceed when the timer runs out.”
The Wait Condition doesn’t remember which side “won” (condition vs timeout), so you follow it with an If/Else process node that rechecks the same condition over that window:
Condition group:
Custom Events →activation_completed→ triggered at least 1 time in the last 3 days.Then branch: “Converted after email”
Else branch: “Did not convert after email”
On the “Converted” path:
Add Tag:
channel-test-email-converted
On the “Did not convert” path:
Add Tag:
channel-test-email-no-conversion
You could add more actions (like a follow‑up nurture email for non‑converters), but if you do, keep them symmetrical with the push arm. You’re testing channels, not totally different sequences.
Design the push arm: mirror the experience on the right
The push arm needs to be as close a mirror of the email arm as the channels allow.
Before you can use it, make sure you’ve finished the web push setup in your account: service worker on your app’s domain, opt‑in prompts configured, subscriptions flowing in. Web push lives on the Professional plan, so this is also where you validate if that upgrade is justified.
Send Web Push
Wait Condition
If/Else
Outcome tagging
Drop in a Send Web Push node:
Title: concise benefit (“Recover more revenue today”).
Body: a short hook and promise (“Finish your CartWizard setup in 2 minutes to start recovering abandoned carts.”).
Click URL: deep link back into your app’s onboarding or key feature.
“Send only once” on.
The creative should echo the email as much as possible: same value prop, same destination, same time window.
Just like the email arm, add a Wait Condition:
Condition:
activation_completed(or your chosen conversion event) triggered at least 1 time in the last 3 days.Timeout: 3 days.
Add an If/Else node with the same condition:
Then branch: “Converted after push”
Else branch: “Did not convert after push”
On the “Converted” path:
Add Tag:
channel-test-push-converted
On the “Did not convert” path:
Add Tag:
channel-test-push-no-conversion
At this point, each contact has:
One arm tag (
*-email-armor*-push-arm)One outcome tag (
*-convertedor*-no-conversion)
The journey has done its job. No back‑to‑back messages, no channel crossover, and you’ve kept the touch pattern symmetrical.
Turning tags into answers: segments, metrics, and opt-outs
With the journey live, your job shifts from setup to reading the data.
Build analysis segments
Using the segment builder, create a few key segments:
Email arm participants
Push arm participants
Email arm converters
Push arm converters
Email arm opt‑outs
Push arm opt‑outs
Contact Tags → contact is tagged with channel-test-email-arm
Contact Tags → contact is tagged with channel-test-push-arm
Tags contain channel-test-email-arm
AND Tags contain channel-test-email-converted
Tags contain channel-test-push-arm
AND Tags contain channel-test-push-converted
Tags contain channel-test-email-arm
AND Email Subscription Status is Unsubscribed
Tags contain channel-test-push-arm
AND Web Push Activity → dismissed or did not deliver at least once in the last 30 days (depending on how you want to define push “fatigue”).
From there, simple math gives you:
Conversion rate (email) = converters / participants for email arm.
Conversion rate (push) = converters / participants for push arm.
Email opt‑out rate = email opt‑outs / email arm participants.
Push “rejection” rate = high dismissals or manual unsubscribes / push arm participants.
You can also layer in revenue data if you pipe MRR or plan into contact attributes. That lets you see not just which channel converts more, but which one tends to convert higher‑value stores.
Fold in analytics behavior
If you’re using web tracking and analytics, you can go further:
Compare Total Visits and Time on Site for each arm after the nudge.
See whether one channel tends to bring merchants back into your app multiple times, not just for a single activation.
That level of detail matters if you sell a deeper analytics or optimization tool like ShopMetrics. For something like CartWizard, the first activation may be enough.
Estimating cost-per-conversion
You know:
Your plan cost.
Rough monthly send volume in each channel.
How many conversions each arm produced.
Even a back‑of‑the‑envelope cost‑per‑conversion is enough to say, “Push got us more activations per dollar, but email produced bigger accounts,” or vice versa.
Make it a system, not a one-off test
The best part: once this journey is live, it doesn’t need you.
Every time a new merchant hits that onboarding_stalled state, the Custom Event trigger catches it, the Random Split assigns a channel, and the path runs. You check in monthly or quarterly, not daily.
That’s what leverage looks like for a founder‑led app business:
One afternoon to build a journey.
Ongoing, statistically useful data about which channel performs better.
A ready‑made pattern you can clone for other lifecycle moments: pricing‑page lurkers, feature re‑activation, upgrade nudges, seasonal offers.
When you see a clear winner in a given context, you can:
Shift that lifecycle moment to be “email‑first” or “push‑first.”
Reuse the winning template elsewhere.
Tighten or loosen frequency, knowing which channel burns goodwill faster.
None of this requires hiring a growth team. It’s automation doing the unglamorous, compound work in the background while you keep building.
The real win: your time goes where humans matter
Running a push vs email test won’t double your MRR by itself. What it does is remove one more guess from your marketing stack.
Instead of arguing on Slack, your team has a shared answer:
“For stalled onboarding, push beats email on conversion but generates more opt‑outs. For upgrade nudges, email clearly wins.”
From there, your effort goes into:
Crafting better copy for the winner.
Instrumenting the next high‑value trigger.
Having actual conversations with your highest‑value stores.
Spreeflo’s job is to keep running the experiments and routing the right message through the right channel. Your job is to decide what’s worth saying.
For a Shopify or e‑commerce app where every activated store adds years of LTV, that’s a trade well worth making.