The Shopify app welcome series that turns installs into income
A step-by-step Shopify app welcome email journey for tools like CartSpark, showing how to turn new installs into activated, retained merchants using Spreeflo journeys, tags, and behavioral triggers so fewer trials quietly churn and more trials convert.
Industry
Niche
Pattern
Loading sequence...
The install notification hits Slack at 2:13 p.m.
“New install: Aurora Lamps (Shopify Plus) – Pro plan trial.”
You smile, check the live dashboard, then go back to whatever fire you were putting out. Five days later, Stripe never saw a charge. The app is still “installed,” technically, but usage is flat and the store owner hasn’t touched your settings screen since the first login.
On paper, you got what you wanted: a new contact, a new trial, another notch in your Shopify App Store graph. In reality, you just watched another potential $2–3k LTV slide quietly toward churn because nobody showed up in their inbox when it mattered.
The sequence at the top of this page is the whole journey, end to end. It’s a welcome series tuned for Shopify apps and e‑commerce tools: triggered the moment a merchant joins your audience, three to four emails deep, each one with a job. Our example company is CartSpark, a cart-recovery and upsell app doing $80k MRR, charging $29–$99/mo, with 1,600 active merchants and a 14‑day trial. They use the Spreeflo SDK on their marketing site, send trial and install events into the Spreeflo API, and run all their lifecycle messaging through journeys.
If your “welcome” today is an auto-generated “confirm your email” from Stripe and whatever newsletter you remember to send once a month, this pattern will feel like cheating. Because it is. Founder‑led teams win on leverage, and a good welcome series is some of the highest ROI automation you can ship.
Why your default welcome flow is leaking LTV
Most Shopify app developers still treat “new contact” like a checkbox:
They add the email to Mailchimp or Klaviyo.
Maybe they send a template welcome that talks mostly about them.
Then they wait for the merchant to “figure it out.”
The problem is that install doesn’t equal activation. For CartSpark, a “good” user isn’t someone who clicked “Add app” in the App Store. It’s someone who:
Connected the app to their theme or checkout.
Turned on at least one recovery flow.
Saw it recover an order.
Until those three things happen, your install is just a delayed uninstall.
The job of a welcome series isn’t to say hello. It’s to compress time to the first meaningful win and to prove, quickly, that you’re worth keeping around. That’s where this journey comes in.
Start trigger: every new contact gets a real welcome
The journey starts with an Add to Audience trigger.
Any time a contact is added to your workspace — through a Shopify install, a lead magnet on your marketing site, or a pricing‑page signup — they enter the flow. For CartSpark, that means:
New merchants who install the app and accept permissions.
Store owners who download a trial checklist from the website.
Partners who sign up for their affiliate program and get added as contacts.
Configuration choices that matter:
Re-enrollment stays off. For a welcome series, you want a clean, “once per contact” experience. If they uninstall and reinstall months later, that’s a different journey with its own logic.
You might define upstream who counts as “marketing.” Spreeflo’s pricing model lets you keep unlimited non‑marketing contacts. Only mark people as marketing contacts when you want journeys like this to run.
Why this trigger and not, say, a Join Segment? Because you don’t want to wait for behavior. You want to greet every new relationship at the door.
Tag early so the rest of your system steps back
First node after the trigger: Add Tag.
CartSpark adds a tag like welcome-series-active. This is the “do not shout over them” flag. Other campaigns, especially promos or feature announcements, should be built to either:
Exclude contacts with
welcome-series-active, orSee it and delay their own sends.
Configuration details:
Add Tag with one tag ID:
welcome-series-active.Leave “Force tag trigger” off. You’re not trying to fire other tag-based journeys here.
This tiny step prevents a mess: nothing kills trust faster than the new user who gets three different emails from you on day one, all asking them to do different things.
If you’re not yet using tags consistently, the primer in getting started with tags is worth a skim before you build this.
Email 1 (Day 0): orient them and give one quick win
Immediately after tagging, CartSpark sends the first email.
This isn’t a feature tour. It’s context plus an easy yes:
Line one: “You just installed CartSpark — here’s what happens next.”
A single, clear promise: “We’ll recover your first abandoned order in under 24 hours if you do this one step.”
One CTA: deep-link to the exact in‑app screen where they turn on the default recovery flow.
Configuration in the journey:
Send Email node with a “Welcome – Step 1” template.
From: a real person (e.g. “Lena from CartSpark”), not “no-reply.”
“Send only once” on, so if you ever rewire branches, nobody gets duplicate welcomes.
Why send immediately, instead of waiting a few hours? For app installs, the motivation spike is highest right after they click “Add app” in Shopify. Waiting kills that energy. The merchant is often still at their desk with your settings page open. This email is less “welcome to our brand” and more “here’s the direct path through our product.”
What choosing differently would cost: if Email 1 is generic “Thanks for joining our list,” you’ve wasted a scarce moment of attention without moving them closer to activation.
Insert a small delay before you ask for more
After Email 1, add a Time Delay.
For CartSpark, they wait 1 day. That gives merchants space to follow the first CTA and see an order or two recovered. It also spaces out messages so your next touch doesn’t feel like a barrage.
Configuration:
Time Delay: 1 day, using the Time Delay node (Spreeflo supports hours or days, min 1 hour).
No branching yet; this is a blanket pause.
You might be tempted to use hours here (“wait 3 hours then send Email 2”). With merchants around the world and Shopify stores that run at odd hours, a one‑day rhythm is more forgiving and still fast enough.
Email 2 (Day 1): prove value with real stories
Now you’ve earned the right to talk about outcomes.
Email 2 focuses on social proof and a slightly bigger ask:
Start with a short win story: “Last week, a store like yours recovered $417 in 24 hours after turning on CartSpark’s default flow.”
Then, one concrete action to deepen engagement: connect their email service or enable onsite widgets, depending on your app.
This is where you can mention metrics CartSpark cares about: install rate, recovery revenue, average ROI per merchant. You’re tying their behavior (“turn this on”) to outcomes other merchants already see.
Configuration:
Second Send Email node, template “Welcome – Social proof + Step 2.”
“Send only once” on.
If your product has distinct personas (e.g. small stores vs Plus merchants), you can insert a Multi-way Split before this email. Use the segment builder to branch on plan size or order volume, then send slightly different examples to each branch.
Why this node here: merchants don’t stick around because you “welcome” them. They stick because they believe staying installed produces money or saves time. Email 2 carries that belief.
Watch for activation before pushing harder
At this point, some merchants will be off to the races; others will ignore you. You don’t want to treat them the same.
Drop in a Wait Condition node after Email 2. The condition you care about is activation behavior, not just email opens:
For CartSpark, that might be a custom event like
flow_enabledorfirst_recovery_senttracked via the SDK or backend.You set the Wait Condition to watch for that event for up to, say, 3 days.
Configuration:
Condition: Custom Event
flow_enabledtriggered at least 1 time in the last 3 days.Timeout: 3 days, in the Wait Condition node.
Right after, add an If/Else:
If yes (they activated): they exit the heavy onboarding path and move into light nurturing.
If no: they get a more direct, “let’s get you unstuck” message.
This pairing matters. The Wait Condition ensures you don’t blast an “are you stuck?” email to someone who just did the work an hour ago.
Path A: activated users get next‑level value
On the “yes, activated” branch of the If/Else, you want to educate, not nag.
A simple pattern for CartSpark:
Remove
welcome-series-activetag with a Remove Tag node.Add Tag
activated-userso other journeys can pick them up.Optional: a short Send Email that:
- Congratulates them on getting set up.
- Shows how to squeeze more value (A/B testing subject lines, adding an upsell step, syncing with Klaviyo, etc.).
- Links to one or two of your best tutorials.
Configuration details:
Remove Tag node with
welcome-series-active.Add Tag node with
activated-user.A final Send Email that you may want to send only once, since this branch should only happen once anyway.
This is where you start transitioning them into your broader content cadence or feature‑adoption flows. The welcome job is done; nurturing now takes over.
Path B: stalled users need friction removed
On the “no activation yet” branch, you assume something is in the way.
This is Email 3, and it has a very specific job: surface and remove the blocker.
For Shopify apps, common blockers are:
“I’m not sure how this plays with my current theme or stack.”
“I don’t want to break checkout.”
“I’m not sure if this is worth the subscription yet.”
Good Email 3 structure:
Short acknowledgment: “Most stores that install CartSpark mean to finish setup the same day… then orders, staff, and life get in the way.”
Two or three bullets addressing the most common fears (“Safe to test on a duplicate theme,” “We don’t modify checkout without your explicit step,” “Typical stores see X% recovery in week one.”).
Two paths:
- One‑click to finish setup (back to the settings screen).
- A link to a 10‑minute Loom or a slot on your calendar for higher‑value stores.
Configuration:
Send Email node labeled “Welcome – Need help?”.
“Send only once” on, obviously.
After the email, another Wait Condition watching for
flow_enabledfor, say, 3 more days.
You’re not yelling. You’re being helpful and direct. The whole point is to turn a quiet uninstall into a conversation, or at least into a second look.
Clean exits and unsubscribes: respect the inbox
Not everyone wants to be nurtured, and that’s fine. Your welcome series should have clear endpoints:
Any point where a contact unsubscribes from your marketing email, they naturally stop receiving these sends because the Update Email Subscription Status happens elsewhere (for instance, linked from your email footer).
To keep your data clean, you might add an If/Else at the very end that checks Email Subscription Status via the segment builder. If they’re still “Subscribed” but never activated, Add Tag
at-risk-trialfor win‑back later.In all paths, once they finish the series (activated or not), use a Remove Tag node to clear
welcome-series-active.
You don’t need to over‑complicate this. The core is simple: no one should be stuck in your “new contact” series forever, and your tags should make it obvious who had which experience.
Why this entire sequence is worth the work
For CartSpark, the metrics this journey moved were:
Welcome‑series open rate: Email 1 reliably gets 60–70% opens because it’s tied to a recent install, not a cold list.
Time to first meaningful click: deep‑link CTAs in Email 1 cut “time from install to flow_enabled” from days to hours.
First conversion rate: more trials reach the point where they see revenue recovered, which is the moment most merchants mentally “lock in” keeping the app.
Unsubscribes: a clear, value‑driven series means low spam complaints and a clean list.
Under the hood, what changed wasn’t magic copy. It was the data model. You’re capturing detail on every customer — who installed, who turned on a flow, who recovered their first order — and using that to speak to each one uniquely. The merchant who already activated gets advanced tips. The one who stalled gets help removing friction. The one who unsubscribed gets left alone.
Most apps lose lifetime value not because the product is bad, but because they never nurture that fragile first week. A welcome series like this plugs that leak:
It makes sure every new contact gets a guided path, not a random drip.
It slots neatly into the rest of your automation, using tags and segments instead of ad‑hoc hacks.
It runs every day without you remembering to follow up.
If you want to see how this fits into your broader automation strategy, the overview of campaigns vs journeys and the editor live in the campaigns & journeys platform page. Pair that with the email builder, and you have everything you need to ship this in an afternoon.
You built an app so merchants could stop doing things manually. Your onboarding deserves the same treatment. Build this once, let it run, and watch that quiet trickle of “ghost installs” start turning into real, retained revenue.