Back to Playbooks

Stop Letting High‑Intent Carts Die: A 3‑Email Recovery Journey for Shopify Apps

Free

A detailed, node-by-node walkthrough of a three-email (plus optional web push) cart-abandonment recovery journey for Shopify apps in Spreeflo, showing how to trigger events, branch on behavior, tag outcomes, and measure recovered carts and revenue.

Industry

Niche

Pattern

Loading sequence...

Cart abandonments hurt more when you’re the one who built the cart.

You’ve obsessed over your onboarding, tuned the pricing page, shaved seconds off page loads. A merchant clicks "Start free trial," connects their store, lands on your checkout…and then closes the tab.

You see it in your logs: cart_abandoned firing all day. Installers who never become paying customers. Merchants who almost upgraded to a higher tier, then vanished. You know those are your highest‑intent users, yet most of them never hear from you again.

For CartWizard, a fictional Shopify app doing $90k MRR, this was the quiet leak. About 420 merchants each month started an upgrade or paid install but didn’t complete checkout. Only 8–10 percent came back on their own. Everything else was lost revenue.

The sequence at the top of this page is the whole journey, end to end. It’s the cart‑abandonment recovery playbook CartWizard wired into Spreeflo: a classic three‑email sequence (plus optional web push) that branches based on whether the merchant returns or completes the purchase.

This article walks through that journey node by node: why each step exists, how it’s configured in Spreeflo, and how to adapt it to your own app or headless stack.

Why cart abandonment is a lifetime‑value leak for e‑commerce apps

For typical consumer brands, cart abandonment is painful but expected. For your Shopify app or e‑commerce platform, it’s worse:

  • Installers and upgraders are already convinced you’re worth trying.

  • You have more behavioral data than a normal SaaS: store size, revenue band, features they’ve enabled, which Shopify theme, etc.

  • Checkout is usually one short step away from recurring revenue.

Letting those people disappear without a systematic follow‑up is the textbook version of “leaving lifetime value on the table.” They’re not cold leads. They’re merchants who raised their hand, then got distracted or slightly confused.

A good recovery journey does three things:

  1. Catches every abandonment event automatically.

  2. Responds quickly without being spammy.

  3. Adjusts tone and intensity based on what the merchant does next.

That’s exactly what this Spreeflo journey is built to do.

Step 0: Wire up cart_abandoned as a Custom Event trigger

Everything starts with a Custom Event trigger.

On your app’s checkout or upgrade step, you already know when a merchant bails: the browser unloads, the session expires, or your own app logic flags an incomplete Stripe session. That’s where you fire a cart_abandoned event into Spreeflo via the JavaScript SDK or the Spreeflo API.

In the journey editor, the first node is:

  • Trigger: Custom Event

  • Event name: cart_abandoned

  • Re‑enrollment: on

Two important design decisions here:

  1. Re‑enrollment turned on. A merchant might abandon more than once: first when trying your Pro plan, later when considering an add‑on. With isReEnrollment=true, every new cart_abandoned event can start the journey again once they’ve exited a previous run. Spreeflo still prevents duplicates mid‑journey (it won’t enroll them twice at the same time), but you won’t miss future abandonments.

  2. Property conditions for quality. CartWizard filters out tiny carts so the journey only targets meaningful revenue. In the trigger’s property conditions, they add:

  • Event property cart_value greater than 20

  • Optional: property plan_type is not free

Those property filters come from the same engine behind Spreeflo’s segment builder, so you can get as specific as you like (currency, number of SKUs, upgrade vs new install, etc.).

Result: every time a qualifying cart_abandoned event fires, that merchant drops into the journey at a clear, high‑intent starting point.

Step 1: A short pause, then an optional web push nudge

Right after abandonment you don’t want to shout. You want to catch them while the context is fresh but still give them a chance to complete checkout by themselves.

So the next node is:

  • Time Delay

  • Value: 1

  • Unit: Hour(s)

This one‑hour buffer does two things:

  • Avoids pinging people who finish the flow a few minutes later.

  • Sets up a natural moment for a web push notification before email.

For teams on Spreeflo’s Professional plan, CartWizard adds:

  • Send Web Push
    - Content: “Still planning to install CartWizard? Your configuration is saved and ready when you are.”
    - Click URL: direct back into the checkout or install page
    - Send only once: on

If you’ve enabled web push for your app or marketing site (see the web push setup guide), this is a low‑friction way to recover carts from merchants who are still near their browser.

Because web push is more interruptive than email, the journey places another spacing node right after:

  • Time Delay

  • Value: 1

  • Unit: Hour(s)

Now anyone who will receive the first email is at least two hours past their abandonment event and at least one hour past any push notification.

Step 2: Don’t email people who already converted

By this point, some merchants will have come back and completed checkout on their own. You definitely don’t want to remind them about an “abandoned” cart.

Before sending any email, the journey checks:

  • If/Else
    - Condition:
    - Custom Events → order_completed
    - Operator: AT_LEAST 1
    - Time window: in the last 1 day

Branch behavior:

  • Yes branch (has ordered):
    CartWizard uses an Add Tag action to apply converted_after_abandonment and ends the path. That tag feeds their analytics and a separate onboarding journey, but this recovery flow is done.

  • Else branch (no order):
    Proceeds to the first Send Email node.

You could collapse this logic into a Wait Condition, but making the “already bought” check explicit right before your first email is safer and easier to reason about.

Step 3: Email #1 — simple reminder with saved context

On the Else branch, the next node is:

  • Send Email
    - Template: “Abandoned cart reminder 1”
    - Send only once: on

The content is deliberately light:

  • Subject along the lines of: “You were almost set up with CartWizard”

  • Body:

  • Brief reminder of what they were doing (“You started installing CartWizard for your store X”)

  • Key value prop in one or two sentences

  • A single primary button back to the checkout URL

  • Optional small print listing the plan and main add‑ons they had selected

This is where our email builder pays off. CartWizard uses dynamic variables to drop in the merchant’s store name, the plan they picked, and a short summary of benefits based on that plan. For example, abandoned carts with their “Growth” tier mention automated A/B tests, while “Starter” carts emphasize simple recoveries.

Once Email #1 goes out, the journey adds breathing room:

  • Time Delay
    - Value: 1
    - Unit: Day(s)

That 24‑hour pause is long enough for people to come back organically, but short enough that the context is still alive.

Step 4: Branch on “returned vs purchased vs silent” before Email #2

After the day‑long delay, CartWizard doesn’t send Email #2 blindly. Instead, they split behaviorally using a Multi‑way Split node with three branches:

  1. Purchased
    - Condition group:
    - Custom Events → order_completed
    - Operator: AT_LEAST 1
    - Time window: in the last 1 day

  2. Returned, no purchase
    - Condition group:
    - Page Visited → URL contains /checkout
    - Operator: AT_LEAST 1
    - Time window: in the last 1 day
    - AND Custom Events → order_completed
    - Operator: HAS_NOT_TRIGGERED
    - Time window: in the last 1 day

  3. Else branch (“no activity”)
    - No condition; catches everyone who hasn’t visited checkout again and hasn’t purchased.

In Spreeflo’s UI this logic uses the same controls as the segment builder, but lives inside the Multi‑way Split node.

Each branch gets its own treatment:

Branch A: Purchased

These merchants clearly don’t need a second reminder.

  • Add Tag
    - Tags: recovered_cart_email1

  • End of path.

You’re explicitly recording that Email #1 influenced the recovery without sending anything more from this journey. Lifetime value from here will come from better onboarding, not more nudging.

Branch B: Returned but stuck

Here the merchant returned to checkout but still didn’t get through payment. Different problem, different email:

  • Send Email
    - Template: “Need a hand finishing your setup?”
    - Send only once: on

This message leans toward support:

  • “We saw you were back in your CartWizard setup but didn’t quite finish.”

  • Short checklist of common blockers (billing issues, permissions on Shopify, unclear pricing).

  • Direct links:
    - Help doc for installation
    - “Reply to this email if you’d like us to walk through it with you”

  • No discount yet; the assumption is friction, not price.

Then:

  • Time Delay
    - Value: 2
    - Unit: Day(s)

After two days, an If/Else checks again for order_completed in the last two days. If yes, tag and end. If not, the Else path leads into a Merge node that funnels them toward Email #3 (we’ll come back to that).

Branch C: No activity at all

For merchants who never returned to checkout, CartWizard uses a more assertive second email:

  • Send Email
    - Template: “Your CartWizard install is still waiting”
    - Send only once: on

This version:

  • Recaps the value prop and likely revenue impact (“Stores their size recover $X/mo on average with CartWizard”).

  • Calls out that their configuration is saved.

  • May tease a limited‑time incentive without fully revealing it (that comes in Email #3).

Then the same:

  • Time Delay
    - Value: 2
    - Unit: Day(s)

  • If/Else on order_completed (last two days):
    - Yes → tag + exit.
    - Else → into the same Merge node as Branch B.

Using separate If/Else nodes on each branch, then recombining via Merge, respects Spreeflo’s “one incoming edge per node” rule while still giving you one shared path to the final message.

Step 5: Email #3 — final nudge with a clear offer

Everyone who reaches the Merge node has:

  • Abandoned a meaningful cart.

  • Ignored a reminder.

  • Either tried again and stalled, or never came back.

  • Still not purchased after two more days.

These are exactly the people for whom a stronger offer makes sense.

From the Merge, the path goes to:

  • Send Email
    - Template: “Last reminder — and a little boost to get started”
    - Send only once: on

Typical content:

  • Acknowledge the sequence: “We’ve reached out a couple of times about completing your CartWizard install.”

  • Offer:
    - A clear incentive with a boundary (e.g., “Get 30% off your first three months when you finish checkout in the next 72 hours.”)
    - Or, if you dislike discounts, an onboarding bonus: priority setup, one‑on‑one configuration for their store, extended trial.

  • Strong, singular call‑to‑action to the checkout URL.

Then, one last safety check:

  • Time Delay
    - Value: 3
    - Unit: Day(s)

  • If/Else on order_completed in the last three days:
    - Yes branch:
    - Add Tag recovered_cart_email3
    - Optional Send Internal Email to your team summarizing what they bought and suggesting a quick personal welcome.
    - Else branch:
    - Add Tag abandoned_after_3_emails
    - End of journey.

Those tags later power reporting and suppression: you might decide that anyone with abandoned_after_3_emails should be excluded from future high‑pressure promos for a while.

Measuring recovered carts and tuning the journey

This pattern exists to plug a revenue leak, so CartWizard tracks four simple metrics:

  1. Recovered carts
    - Count of order_completed events where the most recent cart_abandoned triggered this journey and the order happened after entering it.
    - Implemented as a saved segment (“Has cart_abandoned AND order_completed after that date AND tag converted_after_abandonment/recovered_cart_*”).

  2. Order rate from abandoned carts
    - Recovered carts ÷ total cart_abandoned events that entered the journey.

  3. Recovered revenue
    - Sum of cart_value properties on recovered carts.
    - CartWizard pipes purchase amounts into a numeric contact attribute via the API, then uses Spreeflo’s reporting plus their own BI to calculate totals.

  4. Time to conversion
    - Median time between cart_abandoned and order_completed for recovered carts.
    - Useful to see which email is doing most of the work; often Email #1 and #3 drive different slices.

Because Spreeflo separates journeys from one‑off campaigns, this recovery sequence runs continuously. You set it up once, let it run, and tweak delays or copy as data comes in. If you outgrow your current ESP’s pricing, the math is straightforward: a handful of recovered carts each month usually covers Spreeflo’s pricing several times over.

Adapting this to your own app or headless stack

The same skeleton works whether you’re:

  • A Shopify app with in‑dashboard checkout.

  • A headless platform with a React/Next storefront.

  • A SaaS that uses “cart” as a bundle of add‑ons or seats.

The key is to:

  1. Emit a clear cart_abandoned custom event with useful properties from your frontend or backend, using the web tracking and analytics guide as your implementation map.

  2. Use a Custom Event trigger with re‑enrollment on.

  3. Add spaced Send Email and (optionally) Send Web Push actions.

  4. Insert If/Else and Multi‑way Split nodes wherever user behavior should change the script.

  5. Tag outcomes aggressively so you can iterate.

If you’re already collecting all this behavior data for your customers, you can also adopt this exact pattern inside your own product as a white‑label or “recommended playbook,” powered by Spreeflo under the hood. Founder‑led businesses win on leverage, not headcount; automations like this are how a 5‑person team ships retention wins at the scale of a 50‑person marketing org.

Most e‑commerce apps work hard on acquisition: App Store SEO, partner integrations, content. Cart abandonment is the quiet stage where that effort silently leaks away.

A three‑email recovery journey, built carefully around behavior and timing rather than brute‑force reminders, turns those leaks into an asset. Each abandoned cart becomes a structured opportunity to re‑engage, learn, and convert.

Build this once with Spreeflo’s campaigns and journeys, let it run for a month, and watch what happens to recovered carts and recovered revenue. The lift won’t just show up in this month’s MRR; it compounds every time another “almost customer” quietly makes it over the line.