When Sales Goes Quiet: A Stalled‑Deal Re‑Pitch Sequence for Shopify Apps
This playbook shows how Shopify and e‑commerce app teams can automate follow-up on stalled or lost deals in Spreeflo, using cyclic and criteria triggers, nurture emails, and precise sales handoffs to revive quiet opportunities.
Industry
Niche
Pattern
Loading sequence...
The worst part of a sales pipeline isn’t the clear “no.” It’s the column of maybes that looked promising, went quiet, and now sit in your CRM like ghosts.
For a lot of Shopify app teams, that ghost column is big. Stores book a demo, install the app, maybe even start a trial. Then the founder gets pulled into Q4 planning, a promo goes sideways, or their dev goes on leave. Your app falls off the list. No one explicitly says “we’re out,” but nothing moves for weeks.
CartWizard, a fictional cart recovery app doing $120k MRR with a four-person team, lived in that world. Their founder could see dozens of 30–60 day-old “open” opportunities in HubSpot. Sales hated chasing them. Marketing didn’t know when to step in. And every quarter, they’d look at the pipeline and think, “There’s money dying in here.”
The sequence at the top of this page is the whole journey, end to end. It’s the playbook CartWizard adopted: when a deal stalls for a few weeks, marketing automation takes over with a targeted nurture, then hands the account back to sales the moment there’s a sign of life.
This article walks through that journey node by node in Spreeflo, and how to adapt it to your own Shopify or e‑commerce app.
Why stalled deals are a marketing problem, not just sales clean‑up
When a deal has gone dark for four weeks, your sales team only has bad options:
Keep pinging and feel increasingly ignored.
Close it out as lost (even though the merchant never actually said “no”).
Let it rot in the “stalled” column.
But look at it from the merchant’s side. They were interested enough to:
Install your app or book a demo.
Share data or invite you into their store.
Ask pricing or implementation questions.
That intent doesn’t just vanish. It decays.
This is a perfect job for automation:
Sales owns the high-intent, back-and-forth part.
When things stall, a marketing-led nurture keeps context warm.
The instant there’s engagement again, sales gets a tight, well-timed handoff.
Spreeflo is built for exactly this kind of behavior-driven handoff. It gives you detailed contact attributes, events, and segments so you can speak to each merchant uniquely. And because it runs 24/7 in the background, a tiny team gets the kind of follow-up discipline that usually takes an SDR pod.
Journey overview: two entry points, one outcome
Before we zoom into individual nodes, here’s the shape of the sequence at the top of this page:
Entry A – stalled deals (Cyclic trigger):\nEvery morning, a Cyclic trigger looks for deals that have been “open” with no sales activity for X days. Those contacts enter a structured marketing nurture sequence.
Inside the nurture:\nThe journey sends a small series of emails, each followed by a wait-and-check cycle. If the contact engages (email opens/clicks, pricing-page visits, key events), the journey stops the nurture and routes the contact back to sales with an internal email.
Entry B – later “signs of life” (Criteria Match trigger):\nSeparately, a Criteria Match trigger watches your whole audience for “this old deal just woke up again” signals. When it fires, it doesn’t start a nurture. It immediately raises a hand to sales.
Everything you see in the diagram is built with standard campaign and journey automation plus the segment builder. No hacks, no custom code in the middle.
Let’s build it.
Step 1: Capture the sales fields you’ll need
This pattern lives or dies on data. You need to know which contacts are in an active deal and when sales last touched them.
For each opportunity owner or account, make sure these exist as contact attributes or tags in Spreeflo:
deal_stage(TEXT): e.g.open,won,lost.last_sales_touch_at(TIMESTAMP): last meeting, call, or meaningful 1:1 email.owner_email(TEXT): who should get the internal alert.Optional, but useful:
store_mrr,shopify_plan,primary_use_case.
You can sync these from your CRM or backend using the Spreeflo API, or have your app write directly to contacts when events like app_installed, app_uninstalled, or subscription_upgraded occur.
This is brand message #1 in action: the richer your contact record, the more precisely you can time and tailor the nurture.
Step 2: Cyclic trigger – “find me stalled deals every morning”
Create a new journey and add a Cyclic trigger as the first node.
Configure it like this:
Repeat interval: Every 1 day.
Time of day: 09:00 in your team’s primary timezone.
Re-enrollment: On (true).\nYou want the same merchant to be eligible again if they come back into your world a year later with a new project.
Now define the trigger’s criteria using the segment builder. A solid starting definition:
deal_stage is "open"last_sales_touch_at is before 21 days agoEmail subscription status is SubscribedContact is not tagged with
stalled_nurture_active
That last condition matters. As soon as we enroll someone into this nurture, we’ll attach that tag so the Cyclic trigger doesn’t keep scooping them up on subsequent days.
Every merchant that matches this snapshot at 9am enters the journey from this node.
Step 3: Tag that marketing owns the stall
First action node after the trigger: Add Tag.
Tags:
stalled_nurture_active,stalled_nurture_started.Force tag trigger: off (you’re not relying on tag-based triggers here).
This does three useful things:
It prevents the Cyclic trigger from re-enrolling them while they’re mid-journey.
It gives you a simple way to build reports on “contacts who have ever been through this flow.”
It lets your sales team filter their CRM/Spreeflo view to “stalled, in nurture” vs “stalled, untouched.”
Right after that, add a Send Internal Email node that goes to owner_email or a shared inbox.
Use it for a short note:
Subject:
CartWizard will take it from here for {{contact.company_name}}.Body: “No sales activity for 21+ days. Contact has entered the marketing-led stalled deal sequence. You’ll get another alert if they re-engage.”
Turn “Send only once” on so a contact owner doesn’t get duplicate alerts if the merchant cycles through this journey again years later.
Step 4: First nurture email – value, not pressure
Before the first customer-facing email, insert a Time Delay of 1 hour. That spacing avoids “we just tagged you as stalled, here’s an email” whiplash.
Then add your first Send Email node.
This is where Spreeflo’s email builder and personalize with AI variables shine. A good first message for a Shopify app might:
Acknowledge reality: “stores get busy, priorities shift.”
Reframe your app’s value in the merchant’s language (e.g. “recovering abandoned carts during Q4” instead of “conversion uplift”).
Offer a very low-friction next step: watch a 3-minute loom, clone a prebuilt automation, or hop into a pre-recorded walkthrough.
Use dynamic fields like app name, store name, and primary use case so it reads like it was written for them, not pulled from a generic template.
Step 5: Wait for a signal of life (without spamming)
After the first email, add a Wait Condition node.
Configure the condition as:
Email Activity: opened at least 1 email from this journey in the last 3 days\nOR
Page visited: URL contains
/pricingat least 1 time in the last 3 days\nORCustom event:
app_installedorfeature_usedtriggered at least 1 time in the last 3 days.
Set the timeout to 3 days.
Here’s what happens:
If the merchant opens/clicks the email, visits key pages, or uses the app again, the condition will become true and the Wait Condition will release them early.
If nothing happens, they’ll sit in that node until the 3 days are up.
On its own, the Wait Condition doesn’t branch, it just pauses. To decide what to do next, follow it immediately with an If/Else process node using the same condition you just defined.
“Yes” branch: condition is true → they re-engaged.
“Else” branch: condition is false → they’re still cold.
This Wait + If/Else combo is the backbone of the whole re-pitch.
Step 6: For re-engagers, route straight back to sales
On the “Yes” branch of that If/Else:
Remove Tag:
stalled_nurture_active.\nThis says “marketing is done owning this stall; sales can take back over.”Add Tag:
reactivated_deal,sales_followup_needed.Send Internal Email to
owner_email:\nInclude context pulled right from the contact record:\n- Which email they opened or link they clicked.\n- Last known plan or cart size.\n- Any key custom events (“viewed integration docs,” “started onboarding step 1”).
Turn “Send only once” on so you don’t double-alert on the same reactivation.
Optionally, after a short Time Delay (1 day), you can send a second Send Email from marketing, written in a very salesperson-like tone: “Saw you were checking out CartWizard again. Want to finish what we started?” That gives the merchant a canned reply option even if they ignore the rep’s manual outreach.
Because you’ve had a Wait Condition and a Time Delay on this path, you’re still respecting the no-back-to-back-email rule.
At this point, the contact can exit the journey. Sales has the ball.
Step 7: For the still-cold, keep a light cadence then let go
On the “Else” branch of that same If/Else (no engagement after 3 days), you’ll send a second, then optionally a third nurture email.
Example path:
Send Email #2 – a strong case study\nTalk about a similar store that waited months to act, then turned things around with your app. Again, personalized to their use case and plan.
Wait Condition #2 + If/Else #2 – same pattern\nCheck for any engagement in the 5 days after email #2.\n\n- Yes → hand back to sales (same as above).\n- No → move to a final touch.
Send Email #3 – graceful close\nAcknowledge that now might not be the right time and invite them to stay on the list for future ideas. You can even let them opt out of sales outreach while remaining on product update emails.
Cleanup actions:\n- Remove
stalled_nurture_active.\n- Addstalled_nurture_complete.
This way, you’re not infinitely pestering cold accounts. You’re giving them a thoughtful, time-bound set of chances to re-engage, then backing off.
Step 8: Criteria Match trigger – reviving long‑dead deals
That handles the “went quiet a few weeks ago” problem.
There’s a second, equally important case: contacts whose deals you closed as lost months ago, but who suddenly start behaving like prospects again.
To catch those, add a separate Criteria Match trigger to the same journey. This will start a second, independent arm.
Configure its criteria with the segment builder roughly as:
deal_stage is "lost" OR deal_stage is "closed_no_decision"Email Activity: opened any marketing email at least once in the last 7 days\nOR
Page visited: URL contains
/pricingat least 1 time in the last 7 days\nOR\nCustom event:app_installedortrial_startedtriggered at least 1 time in the last 7 days
Set Re-enrollment to on. It’s fine if someone cycles through this reactivation arm more than once over a long period; your internal alerts and tags will give sales enough context.
From this trigger:
Add Tag:
reactivated_deal,sales_followup_needed.Send Internal Email to
owner_emailor a queue inbox:\n“Closed-lost account is active again. Here’s what they did.”After a 1-hour Time Delay, an optional Send Email from marketing nudging them towards a call or installation.
You don’t need a full nurture here. The goal is to give sales a clear, timely signal and a warmer context than “saw you clicked something in a random campaign.”
Step 9: How this earns its spot in your stack
For a Shopify app team, this journey does three very high-leverage things:
Turns messy pipeline data into precise timing.\nBy tracking
deal_stage,last_sales_touch_at, and web/app events, you stop guessing which deals “might be worth another email.” Spreeflo’s audiences and attributes become the source of truth for who is stalled, who is warming up, and who is actually gone.Gives a tiny team sales coverage it couldn’t staff by hand.\nYou build this once, and every morning the Cyclic trigger quietly triages your ghost column. Founder-led businesses win on leverage, not headcount. This is what that looks like in practice.
Improves both close rate and team morale.\nStalled-deal reactivation rate goes up because the merchant hears from you in a helpful, context-aware way instead of a random “just bumping this up.” Marketing-influenced close rate goes up because more of those reactivations flow through your nurture before hitting sales. And your reps spend more time talking to people who have actually shown new interest.
If you want this to be measurable, agree with sales on three tags to instrument:
stalled_nurture_started– how many contacts enter the flow.reactivated_deal– how many show signs of life again.stalled_nurture_closed_won– how many go on to purchase after this journey.
Those three numbers alone will tell you whether the sequence is paying for itself. Given Spreeflo’s pricing, it usually doesn’t take many revived Shopify stores to cover a year of the tool.
Closing thought: stop treating silence as a dead end
A stalled deal isn’t the same thing as a lost deal. For e‑commerce apps, it’s often a symptom of timing and bandwidth, not intent.
Most teams “solve” that by asking sales to work harder. Call more. Email more. Remember the zombies in their pipeline. The smarter play is to turn your data into behavior-driven automation that quietly does that work for them.
Use Spreeflo to capture the right details on every prospect, define exactly what “stalled” and “sign of life” mean for your app, and let the journey at the top of this page run.
You’ll spend less energy chasing ghosts and more time closing the merchants who are finally ready to say yes.