Back to Playbooks

Turning Old “No” Into New MRR: A Quarterly Lost‑Deal Reactivation Journey for Shopify Apps

Free

A detailed, node‑by‑node Spreeflo journey for Shopify app teams to reactivate closed‑lost or uninstalled merchants on a quarterly cadence, using cyclic triggers, behavioral branching, and lightweight sales handoffs to convert old “no” into new MRR.

Industry

Niche

Pattern

Loading sequence...

Six months after a prospect tells you “not right now,” their world has changed.

Their store might have doubled in revenue. Their tech stack might be creaking. The “we’ll revisit this later” ticket you logged in your CRM? It quietly aged out of your attention while you chased new installs and fresh trials.

For most Shopify apps and e‑commerce tools, the largest pool of warm pipeline is buried in “Closed Lost.”

The sequence at the top of this page is the whole journey, end to end. It’s built for exactly that problem: a quarterly automation that reactivates old lost deals with fresh context, new features, and updated pricing, without you manually combing through stale opportunities.

We’ll walk through it node by node, but first, let’s ground it in a real business.

The leak hiding in CartWizard’s CRM

CartWizard is a four‑person Shopify app team doing $90k MRR from a $49/mo cart recovery product. Installs look good. Trials look fine. Churn is reasonable.

But when co‑founder Mia pulled a report from their CRM, she found 1,800 contacts in a “Closed Lost” bucket:

  • Merchants who uninstalled during trial.

  • Stores that got a demo and said “maybe later.”

  • Trials that expired right when Q4 peak season hit.

  • Prospects who bounced because CartWizard was missing one critical feature.

All of them had context when they said no. That context is now out of date.

What Mia’s team didn’t have was a system that:

  1. Waited a meaningful amount of time (6+ months).

  2. Reached back out with a “we’ve grown since you last looked” story.

  3. Escalated engaged replies straight to a human.

  4. Did it every quarter, without anyone remembering to run a list export.

That’s what this Spreeflo journey does.

Why old “no” is your cheapest pipeline

Before we get tactical, it’s worth stating the obvious: if you’re only marketing to net‑new trials and App Store traffic, you’re leaving lifetime value on the table.

For e‑commerce apps, that leak is magnified:

  • Stores grow into your pricing.

  • Shopify’s own features evolve, creating new gaps your app now covers.

  • Your own roadmap ships the exact thing the prospect complained about a year ago.

Most teams accept “Closed Lost” as a graveyard. In practice, it’s a delayed win‑back segment. You already paid the CAC. You already did the education. You just stopped nurturing.

This pattern fixes that, with a Cyclic trigger that runs on a schedule and treats closed‑lost deals as a long‑tail asset instead of a dead list.

The high‑level structure of the journey

Here’s the logic you see in the sequence above:

  1. A Cyclic trigger runs every quarter, pulling in contacts who were marked closed‑lost more than six months ago and are still email‑subscribed.

  2. An Add Tag (and optional Update Contact Attribute) marks that they’ve entered this reactivation wave.

  3. A single, thoughtful Send Email step reaches out with new features, pricing, or case studies.

  4. After a Time Delay, a Check Email Activity node splits contacts into three paths: clicked, opened only, and completely unresponsive.

  5. Each branch uses Send Internal Email, Send Email, and more tags to either:
    - Escalate high‑intent replies to a human.
    - Nurture warm interest with a softer follow‑up.
    - Quietly park the coldest contacts for another day.

Let’s break down why each node is there and how to configure it in Spreeflo.

Step 1: A Cyclic trigger that only touches 6+ month‑old deals

At the very top of the journey, you’ll use a Cyclic trigger rather than a behavior‑based trigger. This is a date‑based pattern: we want to run on a calendar, not on a specific click or pageview.

Configuration choices that matter:

  • Repeat interval: every 3 months. That’s your quarterly cadence.

  • Time of day / timezone: pick a time that matches when you want emails to land (for example, 9:00 AM in your primary market’s timezone).

  • Re‑enrollment: set isReEnrollment to true. This is critical. You want eligible contacts to flow through this journey every quarter, not only once in their lifetime.

The most important part is the criteria block, which uses Spreeflo’s segment builder:

  • Custom Events: deal_closed_lost
    - Rule 1: event deal_closed_lost has triggered at least 1 time over all time.
    - Rule 2: event deal_closed_lost has not triggered in the last 180 days.

  • Email Subscription Status: is Subscribed.

  • Segment Membership (optional but recommended): is member of a saved segment like “Not a current customer” so you don’t accidentally hit folks who did come back some other way.

This assumes that whenever you mark a deal as closed‑lost in your app or CRM, you also send a deal_closed_lost custom event to Spreeflo via the Spreeflo API. That’s a one‑time instrumentation task per pipeline change.

Why this setup works:

  • The Cyclic trigger gives you the “every quarter” heartbeat.

  • The custom event criteria ensures you only touch contacts whose last “closed‑lost” moment is at least 6 months old.

  • The subscription filter keeps you compliant with opt‑outs.

Any contact who matches that combination enters the journey at this point.

Step 2: Tag the wave and (optionally) count attempts

Right after the trigger, the journey moves into book‑keeping.

First node: Add Tag

  • Tag something like reactivation-wave or lost-deal-reactivation.

  • Leave “Force tag trigger” off; you don’t need to fire Added Tag triggers elsewhere.

Why tag at all:

  • You can quickly slice reports later: “How many reactivated deals originated in a reactivation wave?”

  • You can exclude these contacts from other one‑off campaigns while they’re in this journey.

Optional next node: Update Contact Attribute

If you maintain a numeric custom attribute such as reactivation_attempts, this is a good place to increment it:

  • Attribute: reactivation_attempts (NUMBER type).

  • Update type: INCREMENT.

  • Value: 1.

This gives you a ceiling. For example, your Cyclic criteria could later add a rule “reactivation_attempts is less than 4” so someone doesn’t get this outreach for the 8th time in four years.

This step doesn’t talk to the contact at all; it just quietly updates your data model so you can treat reactivated leads differently going forward.

Step 3: The reactivation email that earns a reply

Now the actual outreach: a Send Email node.

This is not a spray‑and‑pray marketing blast. It’s a personal‑feeling check‑in that assumes:

  • They once had enough interest to talk to you.

  • You’ve improved the product since then.

  • Their business likely changed.

In Spreeflo:

  • Pick or create a reactivation template in the email builder.

  • Choose the sender identity that matches your usual sales or founder outreach.

  • Turn “Send only once” off. Because the Cyclic trigger has re‑enrollment enabled, you want this email to go out again in future waves, provided they’re still closed‑lost and under your attempts ceiling.

Content‑wise, a strong reactivation email for a Shopify app often hits three notes:

  1. “You looked at us when you were at X stage; here’s what’s changed about your store ecosystem since then.”

  2. “Since we last spoke, we’ve shipped A, B, and C features that directly answer the objections you had.”

  3. “If it’s still not a fit, reply with a single line and I’ll stop nudging.”

You’re not trying to close in this email. You’re trying to surface who’s open to a conversation now.

Step 4: Wait long enough to see engagement

After sending that email, every path flows into a Time Delay node.

  • Configure it as “Wait 5 days.”

Why 5 days:

  • It gives merchants across timezones plenty of time to open and click.

  • It avoids coming across as overeager with follow‑ups.

  • It keeps the whole journey comfortably shorter than your 3‑month Cyclic interval, so no one is still mid‑journey when the next wave fires (remember, Spreeflo won’t re‑enroll contacts who are currently inside a journey).

You could pick 7 days if your audience skews enterprise and slower to respond, but the important part is: give your first email breathing room before you start reacting to it.

Step 5: Branch on behavior with Check Email Activity

Now comes the intelligence.

You add a Check Email Activity process node, pointing at the reactivation email template you just sent.

In configuration:

  • Marketing email: select the reactivation template.

  • Activities to branch on:
    - One branch for clicked.
    - One branch for opened.
    - One branch for unopened.

Spreeflo automatically creates an “Else” branch for edge cases; in this pattern you can route that to the same path as “unopened.”

Why these three:

  • Clicked: strongest signal of renewed interest. They cared enough to explore.

  • Opened only: they were curious but not yet compelled.

  • Unopened: either the email got buried, or they really don’t care right now.

Each of these branches now gets its own mini‑flow.

Step 6: For clickers, escalate and follow up with intent

For contacts on the clicked branch, think “hand‑raiser,” not “newsletter subscriber.”

First action: Add Tag

  • Tag something like reactivation-hot.

Second action: Send Internal Email

  • This goes to your sales alias, founder email, or whoever handles high‑intent conversations.

  • The internal template should include key context: merchant name, app plan they previously considered, original closed‑lost reason if you store it as an attribute, and a link to their Shopify store.

Configuration details:

  • Use Send Internal Email, select your sender identity, and choose or create a template that pulls in those contact attributes.

Third action: Send Email (external, to the contact)

Because your initial reactivation email went out 5 days ago, it’s safe to send a second touch here without feeling spammy.

This follow‑up can be short and very direct:

  • “Saw you revisited our page – worth a quick 10‑minute chat to see if the new bundle/feature pricing is a fit?”

  • Offer either a one‑click “book a call” link or a simple “hit reply with a yes.”

This second Send Email node is configured like the first, with “Send only once” still off if you plan to re‑use it in future waves. The pacing rules are satisfied because there is a 5‑day Time Delay between the two marketing emails.

The net effect: you treat clickers like live opportunities, not anonymous list members, and your internal team gets notified fast enough to act.

Step 7: For open‑only contacts, nurture with a softer ask

On the opened but didn’t click branch, the story is different. They’re curious, but not enough to dive back in.

Here the mini‑flow is:

  1. Add Tag: reactivation-warm.

  2. Time Delay: wait another 2 days.

  3. Send Email: low‑friction follow‑up.

In that email, avoid asking for a hard commitment. Instead, aim for a tiny step:

  • Share a quick loom or GIF of the key feature they were missing before.

  • Offer a short story: “Since we spoke, stores like X and Y have used Feature Z to recover an extra $X/month.”

  • Ask a binary question: “Has anything changed on your side since we last talked?” that they can answer with one line.

That keeps your brand in their mind without over‑investing your sales time. Over a few quarters, this group often quietly converts as their needs catch up to your offering.

Step 8: For non‑responders, protect the relationship

On the unopened (and else) branch, restraint matters.

The default flow here is intentionally light:

  1. Add Tag: reactivation-cold.

  2. End the journey for this wave.

You don’t send a second email in this cycle. They’ll be eligible again the next time the Cyclic trigger runs, as long as they still meet your criteria and haven’t hit your reactivation_attempts ceiling.

Why so conservative:

  • If someone ignores you quarter after quarter, more volume won’t fix it.

  • Spamming closed‑lost contacts makes it harder to get their attention if they do come back and re‑install through the App Store later.

  • From a brand perspective, it preserves goodwill: “they check in once in a while, but they’re not relentless.”

If you want to get more advanced, you can later build a separate “final goodbye” journey that triggers when reactivation_attempts reaches a limit, and sends one last “we’ll stop emailing you about this” note. That’s optional and outside the core pattern.

Metrics to watch and how to read them

This journey is aimed squarely at the leak most teams ignore: long‑dormant opportunities and uninstalled trials that never hear from you again.

Three metrics tell you whether it’s earning its keep:

  1. Reopened opportunity rate

    Among contacts who enter the journey in a given quarter, what percentage move back into an active pipeline stage (however you define that: app_installed event, new trial, or CRM opportunity reopened)?

    You can track this by combining your tags (reactivation-hot, reactivation-warm) with a segment that checks for a recent app_installed or subscription_created custom event in the segment builder.

  2. Pipeline reactivation

    Look at incremental MRR from merchants whose first meaningful touch in the last year was a reactivation email. Because Spreeflo lets you build a journey specifically for this pattern, you can attribute those conversions back to this automation rather than guessing.

  3. Response rate

    Plain old reply rate to your reactivation emails is a good early signal. Even “no, still not a fit” replies help you clean your list and refine your messaging.

If you see click and open rates healthy but little pipeline movement, that’s a content or offer problem. If engagement is low, revisit who you’re including and whether your “6+ months” window matches your actual sales cycle.

Adapting the pattern for app uninstalls

Everything above talks in “deals” and CRM language. For many Shopify apps, the practical “closed‑lost” moment is an app_uninstalled event.

You can adapt the criteria accordingly:

  • In your Cyclic trigger criteria, replace deal_closed_lost with app_uninstalled.

  • Add a rule that app_installed has not triggered in the last 90 days, so you don’t ping active customers who churned and came back on their own.

  • Keep the same subscription and attempts filters.

The rest of the journey stays identical. You’re simply reactivating uninstalled stores instead of CRM deals.

Why this matters more for founder‑led teams

Large SaaS companies can afford dedicated outbound teams to babysit “closed‑lost” pipelines. If you’re running a 2–10 person Shopify app business, you don’t have that luxury.

That’s exactly where automation excels.

You build this journey once inside Spreeflo’s campaign and journey automation, instrument a couple of custom events through the Spreeflo API, and it quietly works in the background:

  • Every quarter, it re‑evaluates who might be ready to talk again.

  • It respects opt‑outs and pacing.

  • It routes the tiny fraction who are ready straight to a human, where your judgment and context still matter.

Most businesses leak lifetime value because they stop nurturing as soon as someone says “no.” This pattern plugs that hole with a system that keeps old conversations alive just enough that, when the timing is right, you’re still the obvious choice.

You don’t need more headcount to do that. You need one thoughtful journey that’s allowed to run for years.