Back to Playbooks

Turn Your Shopify App Into a Course: How to Build a Gated Educational Drip in Spreeflo

Free

This playbook walks through building a behavior-gated, multi-lesson onboarding course for your Shopify app in Spreeflo, using CartWizard as an example, so you can turn scattered docs into a continuous journey that improves activation, conversions, and churn.

Industry

Niche

Pattern

Loading sequence...

CartWizard’s founder knew the pattern by heart.

Install spike after a new App Store feature, a steady flow of trials, then… silence. Half of those merchants never turned on a single recovery flow. Churn showed up 30 days later, right on schedule.

They’d tried everything: docs, Loom videos, in‑app nudges. The only thing that moved the needle was a small experiment: a manual “7‑day Cart Recovery Bootcamp” sent over email to a handful of new installs. Step‑by‑step, one concept per day. Trial‑to‑paid jumped from 18% to 29%.

The problem: that bootcamp lived in someone’s Gmail drafts folder.

The sequence at the top of this page is the whole journey, end to end. It’s the automated version of that bootcamp: a multi‑lesson email course where each lesson is gated on whether the merchant actually engaged with the last one. No more blasting Lesson 4 to someone who never opened Lesson 1.

In this article, we’ll walk through that journey node by node, using a fictional Shopify app (CartWizard, $98k MRR, stack: Shopify, Stripe, Intercom, Google Analytics, and Spreeflo) as the running example. You’ll see how to turn your onboarding into a real course, how to gate each lesson on behavior, and how to adapt the pattern to your own app without starting from zero.

Why an educational drip beats a “welcome dump”

Most Shopify apps ship the same onboarding:

  • One generic welcome email.

  • Maybe a checklist.

  • A “Your trial is ending” reminder 13 days later.

For a store owner juggling suppliers, ads, and support, that blob of information disappears. They never see the “aha” moment your app is capable of, so they churn for “lack of value” instead of lack of potential.

A gated educational drip fixes three core problems:

  1. It sequences the learning. One small, achievable step per lesson instead of a wall of instructions.

  2. It respects attention. You only move them to the next step once they’ve engaged with the current one (or after a reasonable timeout).

  3. It reveals where you’re leaking lifetime value. You can see exactly which lesson loses people, instead of just seeing “churned after 30 days.”

This pattern leans hard on two ideas Spreeflo is built around:

  • Capture detail on every customer so you can speak to each of them uniquely.

  • Most of your revenue leak is from people who never get properly engaged.

The journey we’re building uses Spreeflo’s Journeys feature to build a journey that runs continuously for every new cohort of learners, with behavior‑based gating at each step.

Step 1: Choose a clear trigger—who actually enters this course?

CartWizard doesn’t want every contact in their audience to get the bootcamp. They only want merchants who have:

  • Installed the app.

  • Not yet created their first recovery flow.

  • Explicitly opted into the bootcamp (clicked a “Teach me how to 2x my recovered revenue” button in‑app).

They handle that with a tag in Spreeflo called cart-bootcamp.

Inside Spreeflo, that maps to an Added Tag trigger at the very start of the journey:

  • Trigger: Added Tag

  • Tag: cart-bootcamp

  • Re-enrollment: off

Re‑enrollment is off because a merchant should only go through this bootcamp once. If they uninstall and reinstall the app later, they’ll get a fresh tag and you can choose to run a different “re‑activation” journey.

You could also run a second version of this same journey for “newsletter subscribers who haven’t installed yet” using an Add to Audience trigger instead. In that case, you’d create a separate journey with its own trigger, so you keep the bootcamp tight for active installers.

The important design choice: make the trigger reflect an intentional “start course” moment, not just “contact exists.”

Step 2: Lesson 1 as a fast win (and a data foundation)

From the Added Tag trigger, the journey’s first action is a Send Email node for Lesson 1.

CartWizard’s Lesson 1 promise: “In 10 minutes, turn on your first recovery flow.”

Using Spreeflo’s email builder, they create a lesson template that:

  • Recaps the benefit in one sentence.

  • Shows a 3‑step setup with screenshots.

  • Links directly to the in‑app screen to create a recovery flow.

Because they already capture store size and vertical as contact attributes (via their backend hitting the Spreeflo API when the app is installed), they use AI personalization in the subject line and body. The subject that goes out might look like:

  • “For a 7‑figure fashion store like yours, these 3 flows matter most”

That’s done with AI variables in the template rather than hardcoding variants; the mechanics are covered in the docs on personalizing with AI variables.

Immediately after the Lesson 1 Send Email, CartWizard adds two small bookkeeping steps:

  • Add Tag: course-lesson1-sent

  • Update Contact Attribute: bootcamp_stage = "lesson_1"

The tag makes it easy to build ad‑hoc segments later (“who started the course but didn’t finish”). The attribute fuels reporting in other tools if they push data out via Webhooks later.

Message pacing is preserved here: you’ve only sent one email so far. Tags and attribute updates don’t touch the merchant.

Step 3: Gate Lesson 2 on “opened Lesson 1” with a Wait Condition

This is where a course becomes a course instead of a timed blast.

From Lesson 1, CartWizard wants to send Lesson 2 only when either:

  • The merchant has opened Lesson 1, or

  • Three days have passed without an open (in which case they’ll take a different tack).

They use a Wait Condition node for this gate.

Configuration:

  • Condition: Email Activity
    - Marketing email: “Cart Recovery Bootcamp – Lesson 1”
    - Operator: opened
    - Frequency: at least 1 time
    - Time window: in the last 3 days

  • Timeout duration: 3 days

What actually happens:

  • If the merchant opens Lesson 1 any time in those 3 days, the Wait Condition is satisfied immediately and they move on.

  • If they never open it, they sit in that Wait Condition until the 3‑day timeout hits, then they move on anyway.

Either way, at least 3 days elapse between Lesson 1 and whatever comes next. That keeps your cadence reasonable and respects inbox fatigue.

To branch behavior based on whether they did open or not, we follow the Wait Condition with an If/Else process node that uses the same condition:

  • Condition group (built with the segment builder):
    - Email Activity: marketing email “Lesson 1” opened at least 1 time in the last 3 days.

Contacts who match go down the “Yes” branch. Everyone else goes down “Else.”

Now you’ve implicitly defined two learner types:

  • Engaged: they opened Lesson 1 promptly.

  • At‑risk: they ignored Lesson 1, but you don’t want to leave them behind.

Step 4: Two different paths into Lesson 2

On the If/Else “Yes” branch (they opened Lesson 1), CartWizard adds:

  1. Send Email – “Lesson 2: Turn casual browsers into recovered orders”
    - This assumes they at least saw Lesson 1, so you can build on that context.

  2. Add Tagcourse-lesson2-sent

On the “Else” branch (they never opened Lesson 1), CartWizard takes a lighter touch:

  1. Send Email – “Missed Lesson 1? Here’s the 2‑minute version”
    - Shorter, punchier, stripped down to one video and a “Watch in app” button.

  2. Add Tagcourse-lesson1-reminder-sent

Notice two design details:

  • You still observe message spacing. Because of the Wait Condition, these emails always land at least 3 days after Lesson 1.

  • You don’t assume the same context in both branches. The at‑risk group gets a reset instead of being dumped into Lesson 2 as if nothing happened.

After those branch‑specific emails, both paths connect into a Merge node. From here, every merchant is back on a single track again, irrespective of how they got there.

You repeat this pattern for each major lesson:

  • Send a lesson email.

  • Wait (with a Wait Condition) for engagement or a timeout.

  • If/Else branch based on that engagement.

  • Adjust the next message accordingly.

  • Merge paths back together.

It’s a rhythm, not a one‑off trick.

Step 5: Mix in product usage, not just email engagement

Email opens are helpful, but your real goal is product behavior.

For CartWizard, Lesson 2 asks the merchant to actually create their first recovery flow. That’s a feature_used moment, not just an “I read about it” moment.

They’re already sending a flow_created custom event from their app backend into Spreeflo via the API whenever a merchant creates a new automation. So after the Lesson 2 emails, they introduce a second type of gate:

  • Wait Condition:
    - Condition group: Custom event flow_created triggered at least 1 time in the last 7 days for this contact.
    - Timeout: 7 days.

This time, the condition is not about email activity. It’s about a custom event that reflects actual setup.

After that Wait Condition:

  • If the event has fired (they created a flow), an If/Else node’s “then” branch leads to a congratulatory Lesson 3:
    - “Nice work. Now let’s add one‑click upsells to that flow.”

  • If the event hasn’t fired by the 7‑day timeout, the “else” branch runs a different path:
    - A more urgent “You’re leaving money in abandoned carts” email.
    - Possibly a calendar link if you have capacity for 1:1 help for high‑value stores.

Again, both branches eventually funnel through a Merge node back into the next part of the curriculum.

This is where “capture detail on every customer so you can speak to each uniquely” stops being a slogan and becomes visible. You’re not sending the same “upsell” lesson to someone who hasn’t even turned on the core recovery feature. You’re responding to real behavior.

Step 6: Closing the loop—marking completion and making the ask

After three or four lessons, you want two things:

  1. A clean signal that they’ve “finished” the course.

  2. A conversion event tied to that finish (upgrade, annual plan, or adoption of an advanced feature).

CartWizard’s bootcamp ends with Lesson 4: “Optimize your flows before Black Friday.” From the last Send Email, they:

  1. Use a Wait Condition to give the merchant up to 10 days to either:
    - Trigger the flow_created event at least 3 times (multiple flows), or
    - Visit the pricing page at least once (Page Visited rule in the Segment Builder).

  2. Push into a Multi-way Split process with three branches:
    - Branch A: Power users
    - Condition: Custom event flow_created at least 3 times in the last 10 days.
    - Branch B: On‑the‑fence
    - Condition: Page visited URL contains /pricing at least once in the last 10 days AND custom event flow_created has not triggered in that same window.
    - Else branch: Dormant

Each branch gets its own final email:

  • Power users: invite them to share results or join an advanced beta; maybe float an annual upgrade.

  • On‑the‑fence: a direct “Upgrade before your trial ends” message showcasing ROI numbers from similar stores.

  • Dormant: a softer “Not the right time? Here’s a 3‑item checklist to save for later” and then they’re exited from the journey.

Every branch ends with two common actions:

  • Update Contact Attributebootcamp_completed_at set to now (Timestamp, update type “Set to now”).

  • Add Tagcourse-completed

Those markers are what you’ll use to calculate your course completion rate and compare cohorts over time.

Step 7: Measuring if your “course” actually works

Because this entire experience lives in a single journey, your metrics become straightforward:

  • Completion rate: contacts with tag course-completed divided by contacts with tag cart-bootcamp.

  • Lesson‑to‑lesson CTR: for each lesson’s Send Email node, you can look at email analytics in Spreeflo to see open and click rates. If Lesson 2 has strong opens but weak clicks, the content or CTA is off. If Lesson 1 already has low opens, your subject line or trigger timing is wrong.

  • Conversion at end of course: build a segment of contacts who have tag course-completed AND are on a paid plan (you can sync plan as a contact attribute via your backend and the Spreeflo API). Compare their trial‑to‑paid conversion vs. a control cohort that never received the course.

Because everything is wired through the same contact record—tags, attributes, custom events—you can slice this however you want. For example:

  • “Completion rate for stores over $50k/mo GMV.”

  • “Lesson 3 engagement for merchants who opened a support ticket during trial.”

  • “Upgrade rate within 7 days of bootcamp_completed_at.”

This is where founder‑led teams win on leverage instead of headcount. You build this once; it runs for every new install, educates them, and gives you clear data on where to improve.

Step 8: Adapting the pattern to your own Shopify app

The exact nodes in the sequence at the top of this page mirror CartWizard’s world, but the pattern is general:

  1. A trigger that signals “this person wants the course” (usually an Added Tag or Add to Audience entry).

  2. A repeating unit:
    - Send Email (the lesson)
    - Bookkeeping (Add Tag, Update Contact Attribute)
    - Wait Condition for engagement (email open, click, or product event)
    - If/Else branch based on that engagement
    - Branch‑specific Send Email
    - Merge back to the main path

  3. A closing section:
    - One last lesson
    - Wait for key behavior
    - Multi-way Split by power user / on‑the‑fence / dormant
    - Tailored final emails
    - Completion markers

To adapt it without rewriting everything:

  • Swap the custom events. If you’re ShopMetrics instead of CartWizard, your key events might be report_created or dashboard_viewed instead of flow_created. Those events all flow through from your backend via the same API interface.

  • Adjust the Wait Condition windows to match your usage pattern. Daily‑use apps might gate on 1‑day windows; weekly analytics tools might prefer 5‑7 days.

  • Tune re‑enrollment. For some educational series (e.g., a seasonal “Q4 optimization course”), turning re‑enrollment on and re‑triggering via a new tag each year might make sense.

If you prefer a lighter‑weight version, you can cut the product‑event gates and only gate on email engagement. The structure of the journey is identical; you just use Email Activity rules in your Wait Conditions instead of Custom Events.

And if you’d rather start from something prebuilt, you can pull patterns like this directly from Spreeflo’s template library and then tweak the details for your app.

The real win: turning docs into durable revenue

The content in this course probably already exists in some form.

It’s scattered across your docs, support replies, GitHub issues, or that one Loom your co‑founder always pastes into chats. Until you wire it into a journey, though, it doesn’t behave like a system. It doesn’t close the lifecycle leaks between install, activation, and expansion.

A gated educational drip does two things at once:

  • It teaches each merchant exactly what they need next, based on what they’ve already done.

  • It gives you a clear map of where they’re dropping off, so you can keep improving the product and the messaging.

That’s what nurturing engagement looks like when it’s done well. It isn’t a newsletter. It’s a curriculum tailored by behavior.

If you’re already tracking events from your Shopify app, you have everything you need to build this in Spreeflo. Turn your onboarding into a course once, and let it keep paying back in conversions and lower churn for every new install that comes through.