One Journey, Many Intents: Source‑Aware Nurture for Shopify Apps
A detailed walkthrough of building a single, source-aware nurture journey in Spreeflo for Shopify and e‑commerce apps, routing new leads by acquisition source so each path gets tailored emails, tags, and measurement from click to trial or install.
Industry
Niche
Pattern
Loading sequence...
CartWizard is spending $6–$9 per click on LinkedIn to get Shopify merchants onto a landing page for their cart recovery app. Those clicks turn into email leads. Then every one of those leads gets… the same three‑email “welcome to our newsletter” sequence that blog subscribers see.
Two weeks later, LinkedIn is “not working.” Trial starts are low, installs are lower, and the founder is about to pause the only channel that was actually bringing in net-new merchants.
The problem isn’t the ads. It’s that a founder who just clicked an ad about “recovering abandoned carts in under 24 hours” does not want a generic newsletter intro. They want help with the exact problem they just raised their hand for.
The sequence at the top of this page is the whole journey, end to end. It takes every new lead and immediately routes them into a nurture path that matches the source and intent that brought them in, so a paid LinkedIn lead sees something very different from an organic blog subscriber.
This article walks through that journey node by node, why it’s wired the way it is in Spreeflo, and how to adapt it to your own Shopify or e‑commerce app.
Why treating every lead the same quietly kills paid channels
If you sell a B2B tool through the Shopify App Store or your own site, your “leads” are not a single blob:
People who clicked a LinkedIn ad saw a very specific promise.
Visitors who discovered you through a technical blog post are curious and skeptical, not ready to buy.
Merchants who come from a partner’s integration page already believe the category; they just need to know why you’re the right pick.
When all of those people get the same onboarding or “newsletter welcome,” a few things happen:
Paid channels look bad because you’re not matching the promise they saw in the ad.
High-intent leads overheat: they’re ready for a demo or install, but you drip them generic education instead.
Organic leads feel pushed: they came to learn, not to be sold like a retargeting click.
Under the hood, your attribution is also lying. You see that “Source: LinkedIn” has low trial conversion, so you cut it, but in reality those leads simply never got the right follow‑up.
Source‑aware nurture fixes this by making acquisition source the first split in your lifecycle, not an afterthought in a report.
The core pattern: source as the first branching decision
The journey you see in the visual sequence does one simple but powerful thing:
It triggers as soon as a new contact is added to your audience.
It uses a Multi-way Split to route each lead into a path based on normalized source (LinkedIn paid, content/blog, partnership, everything else).
Each branch sends 2–3 emails tuned to that source’s intent, with clear pacing and exit conditions.
At the end of each branch, it tags the contact for downstream reporting and other automations, then exits.
You’re not building three or four totally separate automations. You’re designing one journey that captures detail on every lead up front, then speaks to them differently based on how they found you.
Let’s break that down from the first data point to the last tag.
Step 1: Capture clean source data on every signup
None of this works if “source” is a mess of half‑filled UTM parameters and free‑text fields in your CRM.
For a Shopify app or e‑commerce tool, you usually have a few key top‑of‑funnel channels:
Paid social (e.g., LinkedIn campaigns around a specific problem).
Search and content (blog posts, documentation, case studies).
Partner pages or app directories.
You want a single, normalized attribute on the contact like acquisition_source with values such as:
linkedin_paidcontent_blogpartner_referralother
Here’s how you get there with Spreeflo:
On your marketing site, install the Spreeflo SDK using the setup from the web tracking and analytics help doc. This lets you track page views, UTMs, and custom events from the browser.
When someone fills your lead form, call
Spreeflo.identify(email, attributes)and include a cleanedacquisition_sourceattribute. You can derive it from the UTM source/medium or referrer logic in your own code, then just pass the normalized string.If leads arrive via backend processes (e.g., Stripe events, internal tools), use the Spreeflo API to create or update contacts with the same
acquisition_sourcefield.
You’ve now captured the “why I’m here” story in a structured way for every contact. The rest of the journey is about putting that to work.
Step 2: A single trigger for all new leads
In Spreeflo, this is built as a Journey under the campaigns and journeys view. You choose the Add to Audience trigger as the starting node.
Trigger: Add to Audience
What it does: Fires whenever a new contact is added to your workspace.
Configuration: Re-enrollment off. You want each lead to pass through this nurture once at the moment they enter your world, not every time they appear in another list.
Why this trigger and not something more exotic?
Because for a Shopify app developer, leads arrive from multiple paths: app store installs, form fills, CSV imports from events, maybe even a manual add for a high‑touch deal. The Add to Audience trigger catches them all. As long as you’re setting acquisition_source when the contact is created, you’re good.
Optional safety filter: If/Else to skip current customers
Right after the trigger, the sequence at the top of this page uses an If/Else process:
Condition: “Contact Tags contains
customer” or “Plan attribute is not blank” using the segment builder.Then branch: existing customers → exit or tag as “skip_nurture.”
Else branch: everyone else → continue into the source split.
You include this if your audience import mixes leads and active users, and you don’t want to send a “welcome, here’s what we do” series to someone already paying.
Step 3: Multi-way Split by acquisition source
Next comes the heart of the pattern: a Multi-way Split process node.
Multi-way Split: Source routing
You define three or four branches with conditions that check acquisition_source:
Branch “linkedin_paid”: Contact Attribute
acquisition_source is linkedin_paid.Branch “content_blog”: Contact Attribute
acquisition_source is content_blog.Branch “partner_referral”: Contact Attribute
acquisition_source is partner_referral.Else branch: everyone else.
Order matters: branches are evaluated top to bottom. Because these values are mutually exclusive, any order will work, but it’s still good practice to put your most important paid sources first for clarity.
Why a Multi-way Split and not several If/Else nodes?
It keeps the canvas (and your mental model) clean. One routing decision, four paths.
It makes it obvious what’s missing. When you add a new acquisition source later, you just add another branch instead of hunting for scattered conditions.
From here, each branch is its own short nurture. Let’s look at what they actually do.
Step 4: The LinkedIn paid branch – align to the ad promise
These leads are expensive. They clicked an ad that probably mentioned a concrete outcome: “recover 15% more revenue,” “cut refund requests,” “raise AOV.”
The LinkedIn branch in the journey follows this pattern:
Add Tag:
src_linkedin_paidFirst node in the branch is an Add Tag action. You apply a tag likesrc_linkedin_paidwith Force Tag Trigger off.
Why? Tags make it trivial to build later segments like “LinkedIn leads who started trial” or to trigger additional journeys off the same source without re‑implementing attribute logic.Send Email: “Direct answer to the ad’s promise” Use the email builder to create a template named something like “LI – Pain‑specific welcome.”
Content focus:
- Acknowledge the promise from the ad (“You clicked because abandoned carts are bleeding revenue…”).
- One short case study from a similar store.
- Single CTA: “Install the app” or “Start your trial,” nothing else.Time Delay: 1 day A Time Delay action set to 1 day ensures you’re not hitting them twice in the first hour. It also gives them time to act on the first email.
Send Email: “Objection handling + social proof” Second Send Email node, different template:
- Open with the most common reason Shopify merchants hesitate (“We’re already running an email sequence” or “We don’t want to annoy customers”).
- Show how stores like theirs integrated your app without conflict.
- Single CTA again, ideally to a “getting started” page or a short video.Time Delay: 2 days
If/Else: “Have they started a trial or installed?” Use an If/Else process node with a condition like:
- Custom Eventtrial_startedtriggered at least 1 time over all time, or
- Tagactive_useris present, if you sync that from your app.
In the “yes” branch:
- Add Tag:linkedin_converted.
- Optionally Send Internal Email to a founder inbox with context on the account.
In the “else” branch:
- Add Tag:linkedin_nurture_completeso you can suppress them from future top‑of‑funnel pushes or enroll them in a slower, generic newsletter.
Both branches then exit this journey. Any long‑term onboarding or product education can live in a separate journey triggered by tags like linkedin_converted or by app events.
Notice what’s absent: there’s no “newsletter welcome” here. Paid leads get a short, focused series that either converts them or cleanly hands them off to slower‑burn programs.
Step 5: The content/blog branch – educate first, then pitch
Organic content leads are cheaper and often colder. Someone who arrived via a technical blog post about “How to structure post‑purchase offers” usually wants to learn before being sold.
This branch reuses the same structure but shifts the emphasis.
Add Tag:
src_content_blogSend Email: “Extend the article they just read” Pull through the topic of the post they came from if you store it as an attribute or event property; otherwise, reference the general theme.
- Recap one key idea from the content.
- Show how your app operationalizes that idea automatically.
- CTA: “See this in action inside CartWizard” rather than a hard trial close.Time Delay: 2 days
Send Email: “Mini playbook tailored to their store type” Here’s where Spreeflo’s personalization and segments shine. Use contact attributes like industry segment or store size (if you have them) to tweak examples inside the email.
Even without deep data, you can send:
- A 3‑step checklist for implementing what they learned.
- Screenshots of your app doing each step.
- CTA: “Start a free trial and we’ll apply this setup for you.”Time Delay: 3 days
If/Else: “Engaged enough to move into sales motion?” Your condition might be:
- Email Activity: opened at least 2 emails in the last 7 days, or
- Custom Eventpricing_page_visitedat least once in the last 7 days (using your web tracking and analytics data).
Yes branch:
- Add Tag:content_mql.
- Optionally push to a CRM via a Webhook if you’re on the Professional plan.
Else branch:
- Add Tag:content_nurture_complete.
Again, both exit. Later, you can build a separate “newsletter and product updates” journey that’s triggered when a contact joins a “Nurtured leads” segment or when they have any of the *_nurture_complete tags.
Step 6: Partner or “everything else” branches – keep them lean
The partner_referral branch often needs even fewer touches. Those merchants heard about you from someone they trust, or they clicked from a marketplace listing where they already believed in the category.
A simple version:
Add Tag:
src_partner_referral.Send Email: “Welcome from Partner X” with context and a clear install CTA.
Time Delay: 1–2 days.
Send Email: “How merchants like you use this integration” with 2–3 concrete patterns.
Add Tag:
partner_nurture_complete.
The else branch can be a very lightweight generic series, or you can simply tag and exit if you’d rather not over‑communicate with unknown sources.
Measuring whether this earns its keep
You’re a developer; you care if the extra complexity actually produces lift. Spreeflo’s data model makes it straightforward to answer three key questions:
Source‑to‑MQL rate
- Build a segment “LinkedIn MQLs” where tags containlinkedin_convertedorcontent_mqland source tags match the relevant channel.
- Build a second segment “All LinkedIn leads” where tags containsrc_linkedin_paid.
- Compare counts, or export both and compute the ratio. That’s your source‑to‑MQL rate for LinkedIn.CTA conversion rate inside each branch
- Use Email Activity filters in the segment builder to find “LinkedIn branch email 1 clicked at least 1 time in the last 30 days” and “LinkedIn branch email 1 sent at least 1 time.”
- Same for email 2.
- Now you can see where clicks fall off and test new copy or timing by swapping templates in the relevant Send Email nodes.Source‑tagged conversion to trial or install
- Because you tagged leads on entry (src_*) and on conversion (*_converted), and you’re tracking atrial_startedcustom event from your app via the Spreeflo API, you can slice conversions by both behavior and source without ever touching a spreadsheet if you don’t want to.
The point is not to chase perfect attribution. It’s to make each source accountable on its own terms, and to know which nurture stream is actually doing work.
Why this pattern favors founder‑led teams
Most Shopify app developers don’t have a marketing department. You might have one marketer, or it might just be you and a co‑founder trying to grow MRR between support tickets.
A single source‑aware journey like this hits two of the levers that matter most for a small team:
You capture detail on every customer so you can speak to each uniquely. The normalized
acquisition_sourceattribute and consistent tags mean you never have to guess why a merchant is on your list. Every email they see can honor how they arrived, not just what plan they’re on.You get multiplying gains from one setup. You build this journey once, and you can keep refining copy or adding sources without rebuilding everything. That’s the kind of compounding system the line “founder-led businesses win on leverage, not headcount” is really about.
If CartWizard had this in place, they wouldn’t be arguing about whether LinkedIn “works.” They’d be looking at a clear source‑to‑trial curve and iterating where it actually moves the needle: on the journey that sits between a click and an install.
You can start small: two branches, a handful of emails, one clear metric. As you see the gaps close—fewer cold paid leads, more trials that feel “pre‑sold”—it becomes very hard to go back to a single generic welcome sequence.
And that’s the quiet shift this pattern creates: acquisition stops being a series of disconnected experiments, and starts feeding a system that treats every new lead like the specific, intent‑rich human they already are.