Plays · No. 4

Closed-lost reactivation.

Every deal you lost 6 to 18 months ago was lost for a reason, and most of those reasons expire. Budget gets found. The person who said "not now" gets replaced. The competitor's contract comes up. This play goes back through closed-lost, finds the one change that answers the reason you lost, and emails only those.

For: B2B software companies with 50 or more closed-lost deals in the CRMStack: HubSpot free, n8n, a research step (Apollo AI Research or Claygent), SmartleadCost: free to test, about $90/month to runBuild time: one afternoon, plus a day cleaning loss reasons

The play

Closed-lost is the only list in your CRM where every record already knows your product, already took a call, and already told you why they said no. It is also the list nobody touches, because "checking in" with someone who said no is the lowest-status email in sales and reps know it.

The reason they said no is the whole play. "Budget" is answered by funding or expansion. "Not the right time" is answered by a new ops leader or new locations. "Went with a competitor" is answered by a leadership change or a contract coming up. "Our champion left" is answered by whoever replaced them. "No decision" is answered by any of those. A change that doesn't answer the loss reason is trivia, and you don't send trivia.

So the system is a weekly loop: pull the deals in the window, research each account for what changed since the close date, grade the change against the loss reason, and write the opener from the pair. Most weeks it sends a handful of emails. They are the best handful you will send.

Who it's for

  • You have at least 50 deals marked closed-lost in the last 18 months. Below that, do it by hand on a Friday.
  • Your closed-lost deals have a loss reason, or you're willing to spend a day backfilling one from the notes. Without it the play has nothing to grade against.
  • Your sales cycle is 30 days or longer, so a lost deal was a real conversation, not a bounced demo request.
  • The reps who lost the deals are still around, or the emails come from a founder or marketing leader. "We talked in June" needs a we.

The build

1. PullClosed-lost deals 6 to 18 months old, with loss reason, contact, and close date
2. SkipAnything touched in the last 90 days, and contacts who left with no replacement found
3. ResearchOne prompt per account, shaped by the loss reason: what changed since the close date, with a source
4. GradeMaterial if the change answers the loss reason, else logged and skipped
5. Write and sendOne opener per (reason, change) pair, three-step sequence, reply reopens the deal

Stack

Pull and logHubSpot free. Deals filtered by stage, close date, and a loss-reason property. A "reactivation" pipeline stage for replies.
Schedule and routen8n, self-hosted (free) or cloud. One workflow, runs Monday morning. The mock below runs the same logic in Python so you can read it.
ResearchApollo's AI Research (new in October 2026, free plan has a small credit allowance; Basic is about $49 a seat a month) or Claygent in Clay. Either way, the prompt is per loss reason and must return a source URL or nothing.
GradeA table: loss reason to the change types that answer it. In the mock it's a dict. In the real build it's the instructions for an LLM step that reads the research and returns one of the change types or "none."
SendSmartlead ($39/month), one campaign, three steps, the opener as a custom field. Replies post back to HubSpot and move the deal.
  1. Fix the loss reasons first. Five values: budget, timing, competitor, champion left, no decision. Backfill from deal notes where the field is empty. This is the unglamorous day, and the play is worth exactly as much as this field.
  2. Pull the window. Closed-lost, close date between 6 and 18 months ago. Under 6 months it's too soon and they remember the no. Over 18 the contact has probably moved and the conversation is cold enough to be a new deal.
  3. Skip the recently touched. Any contact with activity in the last 90 days is in someone's hands already. Dedupe on company so two lost deals at one account don't become two emails.
  4. Check the contact is still there. If they left, search for whoever holds the title now. Found: that's your new contact, and the loss reason is effectively "champion left" whatever the CRM says. Not found: skip until next week.
  5. Research by loss reason, not by company. Lost on budget: look for funding, an acquisition, new locations. Lost to a competitor: a leadership change, or when their contract started. Champion left: who replaced them. Every finding needs a date and a URL. No URL, no finding.
  6. Grade against the table. New website, an award, a hiring post for a receptionist: not material, logged, skipped. The grade is a lookup, not a judgment call, which is what makes it safe to run unattended.
  7. Write from the pair. Ten openers, one per (reason, change) combination that passes. The opener names the month you talked, the reason they gave, and the change, in that order. Your product is in the second paragraph.
  8. Send small, reopen on reply. One send per account per quarter, three steps over two weeks. A reply moves the deal to a "reactivated" stage with the old deal linked, so the rep sees the history. Monthly, report reactivation rate by loss reason; after a quarter you'll know which reasons are worth chasing and which to drop.

The mock

Same made-up company as the first two plays: Zebrawood, scheduling software for multi-location businesses. Sixty fake closed-lost deals across dental groups, vet groups, freight brokers, staffing firms, and the like, with loss reasons spread across the five values, plus a file of what the research step "found" at 34 of them. Run through the real script.

The grading table

Lost onAnswered byNot answered by
BudgetFunding, acquisition, new locationsNew leader, new website, hiring
TimingNew locations, new ops leaderFunding, award, hiring
CompetitorNew ops leader, their contract coming upFunding, new locations, hiring
Champion leftA named replacement in the roleAnything else, because there's nobody to write to
No decisionNew leader, new locations, fundingNew website, award, hiring

Two accounts, one email

Juniper Ridge Staffing · lost January 2026 on budget · research found: took a growth investment to add 10 branches · material
When we talked in January 2026, budget was the blocker. Since then you took a growth investment to add 10 branches over two years, which usually changes that conversation.
Greystone Veterinary Group · lost October 2025 on no decision · research found: posted a job for a front-desk coordinator · not material
No email. Logged, checked again next week.

Out of 60 fake deals, 23 got an email. Eight had a change that didn't answer the loss reason, eight were too recent, seven had been touched in the last 90 days, seven had no change found, six were too old, and one had a contact who'd left with no replacement found yet. Twenty-three of sixty is high because the fake research file is generous. On a real book, a third of accounts having a material change inside a year would be a very good quarter; one in six is normal.

The files:

  • deals.csv, 60 fake closed-lost deals as they'd come out of the CRM
  • changes.csv, what the research step found, with a source for each
  • reactivate.py, the window, the skips, the grading table, the ten openers
python3 reactivate.py 2026-10-27
# 60 closed-lost deals, 23 get an email
# skipped: 8 change not material to the loss reason, 8 too recent,
#          7 touched in the last 90 days, 7 no change found, 6 too old,
#          1 contact gone, no replacement found

-> Juniper Ridge Staffing  lost 2026-01-15 (budget), owner Dana, to Nora Alvarez
   change: funding on 2026-10-09  [https://news.example/juniper-ridge-growth-round]
   "When we talked in January 2026, budget was the blocker. Since then you took a
    growth investment to add 10 branches over two years, which usually changes
    that conversation."

-> Foxglove Fitness  lost 2026-03-01 (champion left), owner Dana, to Hannah Osei
   change: new_person_in_role on 2026-10-06  [https://people.example/foxglove-regional-manager]
   "Your predecessor and I talked about scheduling in March 2026, before they left.
    Nothing was decided. Worth 20 minutes to show you where it ended up?"
...

What breaks

The loss reason is a lie. Reps pick "timing" when they mean "they didn't like me" and "budget" when they mean "I never found the decision maker." The play can't fix that, but the monthly report by loss reason exposes it: a reason that never reactivates is a reason that was never real. Rename or retire it.

The research invents a change. Any step that asks a model "what changed at this company" will, some weeks, get a confident answer about nothing. The rule is a source URL or no finding, and the grading step drops anything without one. The mock's changes file has a source column for this reason; in production, a human spot-checks ten a week.

The contact left and you wrote to them anyway. An email to someone who left eight months ago, about a conversation they had before they left, forwarded to their replacement with "lol," is the worst outcome on this page. Step 4 exists to prevent it, and the mock skips the one account where it couldn't find a replacement.

Credits. Research costs money per account. The window, the 90-day skip, and the dedupe all run before the research step, and the research only runs on what's left. Sixty deals became 39 research calls in the mock, not 60.

Too many emails. If the loop sends more than 10 percent of the window in a week, something in the grading is too loose. Cap it at one send per account per quarter and read the first month's output yourself.

Copy it

Take the three files, export your own closed-lost deals in the same columns, and run the script with an empty changes file to see how many accounts even make the window. Then wire the research step to Apollo or Clay with one prompt per loss reason, and move the script into n8n on a Monday schedule. If you'd rather have the whole thing built, with the sequences and the HubSpot stages, it fits inside the Outbound Engine install as the second campaign.

One play like this, every week.

The email gets the build files and the mock before they go on the site. No pitch in it.

Get the weekly play →