Back to Playbooks

Turn Every Closed-Won Into a 30-Second Team Win (Automatically)

Free

This playbook shows how to wire a `deal_won` event into Spreeflo so every new or upgraded customer automatically triggers internal celebration emails, lightweight ops tags, and optional webhooks, turning revenue events into real-time team wins.

Industry

Niche

Pattern

Loading sequence...

The Stripe email lands: “New payment received.”\nYou clock the MRR bump, maybe paste a screenshot into Slack if you’re not in the middle of debugging something, and then… back to work.

By the time the rest of the team hears about the customer who just upgraded from trial to $149/mo, it’s buried in a Friday recap or a monthly MRR chart. The win happened, but nobody really felt it.

For a small, mostly-remote team building a Shopify app or e‑commerce tool, that lack of “live” wins is expensive. It eats at motivation, it makes growth feel abstract, and it quietly pushes your marketing and product work into grind mode instead of game mode.

The sequence at the top of this page is the whole journey, end to end: every time your billing or CRM system fires a deal_won event, Spreeflo instantly sends a light internal celebration email so the team feels the win in real time.

In this article, we’ll walk through how that journey is put together, why each node is there, and how to adapt it to your own e‑commerce app.

To make it concrete, we’ll use a fictional example:

CartWizard is a four-person team building a cart recovery app for Shopify stores. They’re at ~$90k MRR, growing steadily. Deals come in through Stripe, upgrades happen in-app, and most of the team only learns “we had a good week” when the founder posts a screenshot at the end of the month.

They want a way for every closed-won deal to trigger a friendly, contextual email into their internal inbox so everyone gets a tiny hit of “we’re winning” while they work.

That’s exactly what this journey does.

Why automate something that doesn’t touch customers?

On the surface, an internal “we just closed a deal” email feels like a nice-to-have. But for founder-led SaaS and Shopify app teams, it hits a core principle:

Founder-led businesses win on leverage, not headcount.

You already automate external messages: onboarding drips, trial nudges, churn saves. Internal comms often lag behind, run on manual copy/paste, and quietly chew up founder time.

A tiny journey like this:

  • Removes one more piece of manual admin from your plate.

  • Gives the team real-time visibility into what’s working (which segments, which plans, which channels).

  • Keeps morale and momentum up during long product cycles.

And once you’ve wired deal_won into Spreeflo, you’ve also created a powerful input for other automations down the line: expansion campaigns, win-back flows, and customer marketing built around who has actually paid you.

Let’s break down how to build this journey node by node.

Step 1: Catch the win with a Custom Event trigger

The entry point is a Custom Event trigger listening for a deal_won event.

You’ll send this event from your backend whenever a store starts paying you or upgrades their plan. That can be through the Spreeflo API or via the JavaScript SDK if the action happens on the web.

At minimum, the event should include:

  • The customer’s email (so Spreeflo can map it to a contact).

  • Key properties you care about: plan name, MRR, storefront URL, maybe the sales channel (Shopify App Store, partner referral, etc.).

In the Custom Event trigger node:

  • Event name: deal_won

  • Property conditions: left off in the simplest version (we’ll branch on attributes later).

  • Re-enrollment: turned on.

That last toggle matters.

Re-enrollment being on means:

  • If the same store upgrades again later (say, from $49 → $149), the journey will run again and you’ll get another celebration email.

  • Each time deal_won fires for a contact who has already gone through the journey, they re-enter once they’re out of the previous run.

If you left re-enrollment off, CartWizard’s team would only ever hear about the first win per store. Upgrades and expansions would be silent.

Because this journey is short and has no waits by default, the “mid-journey lock” is basically a non-issue: it’s extremely unlikely two deal_won events will collide while the contact is still moving through the flow.

Step 2: Stamp the contact with simple deal metadata

Once the trigger fires, we do two small bookkeeping steps with Update Contact Attribute nodes:

  1. Increment a deal_count attribute.

  2. Set a last_deal_won_at timestamp.

  • Attribute: deal_count (NUMBER).

  • Update type: INCREMENT.

  • Value: 1.

This gives you a running count of how many times this store has paid or upgraded over its lifetime. Later, you can build segments like “customers with at least 3 deals” for power-user programs.

  • Attribute: last_deal_won_at (TIMESTAMP).

  • Update type: SET_NOW.

This records when the last win happened for this contact. Because SET_NOW writes the actual current timestamp at execution, you don’t have to pipe any date from the event payload.

Both attributes are static from the journey’s perspective — the only dynamic part is the “now” timestamp. If you also track live MRR or plan name, those should be updated from your backend using the contacts API, not from this node. Then the journey can _use_ those attributes without trying to write them.

These two tiny updates are about compounding leverage: every future automation or report can now reason about “how often and how recently does this store give us money?” without anyone pulling data dumps.

Step 3: Branch high-value vs regular deals with If/Else

Next, we decide how loud the celebration should be.

CartWizard has a custom NUMBER attribute on contacts called mrr that their billing system maintains. After each subscription change, they call the API to upsert the latest MRR onto the contact.

We use an If/Else process node with a condition built in the segment builder:

  • Condition group: AND

  • Rule:

  • Type: attr

  • Attribute: mrr (NUMBER)

  • Operator: GREATER_THAN

  • Value: 100 (or whatever your “big deal” line is).

Contacts with mrr > 100 flow down the “Yes” branch: these are big wins worth a louder shout. Everyone else goes down the “Else” branch for a lighter touch.

You could also branch on:

  • Plan name (e.g., Pro vs Starter).

  • Region (for routing alerts to regional leads).

  • Segment membership (e.g., “big brand” vs “long tail”).

The point is the same: treat a $29 install and a $499 enterprise upgrade as different internal events, without writing if/else logic in your app. You define it once, visually, inside Spreeflo.

Step 4: High-value path – the big-win internal email

On the high-value branch, we drop a Send Internal Email action node.

Configuration here does the real work:

  • Pick or create a template with a clear label, e.g., “Big win alert.”

  • Use our email builder to structure the message cleanly for your team.

  • Include personalization tokens for:

  • Store name or company.

  • MRR.

  • Plan.

  • Source channel.

A sample subject line:

“Big win: {store_name} just upgraded to {plan_name} (${mrr}/mo)”

In the body, you might include:

  • A one-line summary: “Store {store_name} on {platform} just became a {plan_name} customer at ${mrr}/mo.”

  • A quick context block: last 30-day visit count, key feature they used in trial, or their install date (all from contact attributes or events).

  • A call-out for follow-up: “@CS, check in within 24 hours to see if they need help setting up feature X.”

Two important settings:

  • Send only once: turn this off for this node.

By default, internal emails are configured to only send once to avoid accidental duplicates. In this journey, you want a new internal email every time deal_won fires, even if it’s the same store upgrading. Turning off “send only once” ensures expansions also get celebrated.

  • Recipients: set this to whatever internal list or address makes sense. Some teams send big wins to the whole company, others to a “revenue-updates” alias. The node takes care of the mechanics; you choose the list.

Now, everyone sees big deals as they happen. Engineers get a real-time sense of which features and plans actually drive revenue. Marketing sees which campaigns or channels correlate with upgrades. You no longer have to be the human routing layer.

Step 5: Regular path – lightweight “cha-ching” updates

On the Else branch, we add another Send Internal Email node with a toned-down template.

Configuration:

  • Different template name, e.g., “New customer alert.”

  • Shorter subject: “New {plan_name} customer: {store_name} (${mrr}/mo).”

  • Body that’s just the essentials:

  • Who they are.

  • What plan they’re on.

  • How much they’re paying.

  • Optional: a link into your admin panel.

Again, toggle “send only once” off so repeat upgrades still notify you.

Common pattern here:

  • Regular deals go to a smaller operations or success list.

  • Big deals (from the If/Else yes-branch) go to the broader team.

You could also use this path for operational routing — for example, adding a “needs-onboarding” tag or pinging a specific CSM — but the core job is the same: give the team a steady trickle of “we’re still winning” without creating notification fatigue.

Step 6: Merge and (optionally) fan out beyond email

Both branches then feed into a Merge process node. Merge exists for exactly this use case: recombining multiple paths into a single unified path without creating illegal graph fan-in.

After the Merge, you have a clean place to put any follow-up actions that should happen for _every_ deal_won, regardless of size. Two common options:

  1. Add a tag for later segmentation

  2. Fire a Webhook to Slack or another ops tool

  • Add Tag action node.

  • Tag: paying_customer or recent_win.

This is useful if you want simple filters in other journeys (e.g., “only send this upsell to paying customers”) without redefining logic everywhere.

  • Webhook action node (Professional plan).

  • Webhook URL: your own API endpoint or a Slack incoming webhook.

  • Payload: all contact attributes, or a subset (store name, MRR, plan, tags).

This pushes the same win information into systems your team already lives in, like Slack or a custom internal dashboard. Spreeflo makes the HTTP call; your receiving system takes it from there.

Webhook is a Pro-plan feature, so if you’re curious how that fits into your budget, it’s worth checking Spreeflo’s pricing. The core email-based pattern works on every plan; webhooks are an optional upgrade for teams that want deeper operational wiring.

Variations worth considering

Once the basic journey is working, most e‑commerce SaaS teams end up with at least one of these variations:

  1. Segmented celebrations by region or app category

  2. Quiet mode for very small deals

  3. Safety net for attribute sync

Swap the single If/Else for a Multi-way Split and branch on:

  • Region (US, EU, APAC).

  • App vertical (dropshipping, subscriptions, analytics).

  • Channel (Shopify App Store search vs partner referral).

Each branch sends its own internal email, maybe to a regional lead or a specific product squad.

Instead of emailing on every $9/mo win, you can:

  • Keep deal_won as the master trigger.

  • Add an If/Else at the very top that routes very small MRR into a path that just increments attributes and tags, with no internal email.

That keeps noise down if you have a huge long tail of micro-merchants.

If you’re not fully confident your billing system will have updated mrr on the contact when the event arrives, you can insert a Wait Condition node between the trigger and the If/Else:

  • Condition: contact attribute mrr is not blank.

  • Timeout: 1 hour.

The journey will move on as soon as mrr exists, but will not wait forever if something goes wrong. For most setups where attribute updates and event sending happen in the same request, you won’t need this — it’s an optional guardrail.

Is it actually doing anything? How to tell

You can’t put “team morale” on a dashboard as neatly as MRR, but you can still tell whether this pattern is earning its keep.

A few signals CartWizard would watch:

  • Internal awareness lag shrinks.\nAsk the team, informally, “When a big deal closes, how quickly do you usually hear about it?” Before this journey, the answer might be “end of the week” or “only when I ask.” After, it should be “within a few minutes.”

  • Qualitative energy shifts.\nLook at your #random or #wins channel history. Are more people commenting on customer logos and use cases? Are devs volunteering ideas tied to new segments or plans? That’s a sign they’re actually seeing wins in context.

  • Follow-up gets tighter.\nSuccess or support can reply in-thread to the internal email with, “I’ve booked an onboarding call,” or “They’re using feature X heavily; I’ll send a quick tip.” That’s behavior change driven by automation.

  • Founder time freed up.\nIf you’re no longer manually screenshotting Stripe and pasting it into Slack or email, that’s time you just gave back to yourself. Even five minutes per day is material over a year — especially when you compound it across multiple small automations.

This is the heart of the second brand message: founder-led businesses win on leverage, not headcount. A 30–60 minute setup session in the campaign and journey automation UI buys you a permanent, always-on feedback loop about new revenue, without adding anyone to payroll.

A tiny journey that changes how wins feel

On paper, this pattern is simple: a Custom Event trigger, a couple of attribute updates, an If/Else, two internal emails, and a merge. No complex nurture logic, no AI copy generation, no multi-step sequences.

But in practice, it changes the texture of building a Shopify app or e‑commerce SaaS:

  • Wins stop being abstract numbers in a Stripe chart and become concrete stories about real stores.

  • The whole team sees which customers are buying which plans, and when.

  • You remove one more piece of glue work from your own to-do list and let the system do it instead.

Once you treat internal events like deal_won as first-class citizens in your marketing automation — not just external behaviors like “visit pricing page” or “start trial” — you start to see far more surfaces where a small journey quietly improves how your business runs.

And that’s the real payoff: a stack of low-friction automations, each doing one job well, compounding into a company where a lean, founder-led team can play at a much bigger scale.