listen · buying moments
Cold triggers
Strangers showing a buying moment in public.
In Buying moments
Cold triggers: strangers showing a buying moment in public.
A cold trigger is a trigger event seen in someone who has never touched your product: a post, a review, a launch listing, a job ad. Thirteen of them, in five families, each with the detectors that catch it, how long the window stays open, and the play that answers it.
Buying Moments Map → Cold triggers → Detector kinds → Signal catalog → Playbook Library
Public, so check the terms — Read only public data and respect each source and community's rules.
A person finds them, a person sends — A detector finds the moment. The founder sends the first message. Nothing goes to a stranger automatically.
Earn the second message — The first touch is a useful reply where they spoke. The offer comes later, if ever.
what it is
A change in a stranger's situation that opens a buying window.
Industry terms: trigger event or buying signal; the people are cold because they have never heard of you. The job of this layer is timing: the same person is a waste of a message in March and the perfect lead in October, the week their launch flops. Families are ordered by heat, a prior for how close the moment usually is to buying.
Shopping — Looking for a fix right now. · · 2 triggers · 10 detectors
Switching — Have a fix, want out of it. · · 2 triggers · 13 detectors
Burned — Tried something and it didn't work. · · 2 triggers · 12 detectors
Struggling — Feel the pain, not shopping yet. · · 3 triggers · 12 detectors
Changing — Something in their world just shifted. · · 4 triggers · 12 detectors
how it works
From a moment to a message.
- Public moment — post · review · listing
- Detector — phrase, threshold, event
- Judge — really the trigger?
- Signal — person, trigger, age
- Lead — fit + intent, tiered
- Play — reply, DM, page
- posted_at — fresh_for ends (3 to 60 days by trigger) stale: material for a post, not a message Two detectors of different kinds on the same person (a low-vote launch AND a "crickets" post) is the strongest cold evidence there is.
step 1 — Screen the 13 · For this ICP, mark each trigger start, on, later or off, with a reason. Most products start with 3.
step 2 — Fill the placeholders · {job}, {category}, {competitor}, {role} come from the brief and competitor research.
step 3 — Turn on detectors · One per source, tested by hand first (see Testing a detector).
step 4 — Answer inside the window · Signals older than fresh_for drop to research material.
the object
Every trigger is one record.
Triggers are the stable layer. Detectors come and go; the trigger they serve, and the play that answers it, stay put. The sample is the Tried it and it failed trigger as VibeDraft would store it.
| Field | Type | What it holds |
|---|---|---|
trigger_id | string | Stable slug, e.g. trg.tried-it-and-it-failed. Every signal and lead carries it. |
name / aka | string | The guide's plain name and the industry term (e.g. competitor dissatisfaction). |
side | cold | warm | Strangers in public, or people already in your funnel. |
family | enum | One of nine families: shopping, switching, burned, struggling, changing, noticing, trying, paying, left. |
heat | 1 to 5 | How close the family usually is to buying. A prior, replaced by measured reply and payment rates. |
status | start | on | later | off | The screening decision for this product's ICP, with the reason, stamped with the ICP version. |
where_it_shows | text | The sources and phrases where the moment becomes visible. |
detectors | detector ids | The monitoring rules that catch it (see Detector catalog). |
fresh_for | duration | How long a caught signal still counts. Starts as a guess; fitted from the reply-by-age curve. |
feeds | playbook ids | The plays that answer it. |
permission | rule | Warm only: what the person has allowed (they spoke first, gave an email, are a customer). |
version | integer | Bumped when status, window or feeds change. |
one trigger, as data
{
"trigger_id": "trg.tried-it-and-it-failed",
"name": "Tried it and it failed",
"aka": null,
"side": "cold",
"family": "burned",
"heat": 3,
"status": {
"value": "start",
"reason": "VibeDraft priority #1: founders who launched to silence",
"icp_version": "icp.vibedraft.v3 (example)"
},
"where_it_shows": "dated attempts with bad results: launch listings, tried X, didn't work",
"detectors": [
"det.tried-it-and-it-failed.uneed",
"det.tried-it-and-it-failed.peerpush",
"det.tried-it-and-it-failed.ph",
"det.tried-it-and-it-failed.hn",
"det.tried-it-and-it-failed.betalist",
"det.tried-it-and-it-failed.launch",
"det.tried-it-and-it-failed.x",
"det.tried-it-and-it-failed.reddit",
"det.tried-it-and-it-failed.ads"
],
"fresh_for": "7 to 30 days",
"feeds": [
"signal-based-outbound",
"lead-to-waitlist queue"
],
"permission": null,
"version": 1
}the catalog
All 13 cold triggers, with what catches them.
Each card: what the moment is, three example buyers, where it shows, the first move, the play that answers it, triggers it stacks with, and every detector that catches it. Placeholders in braces come from the brief: {job}, {category}, {competitor}, {role}.
Shopping · Looking for a fix right now.
Shopping — · window 3 to 7 days
Asking for a recommendation
industry term: recommendation request
They publicly ask what to use.
- where it shows
- Reddit, X, forums: "what do you use for", "best tool for", "any recommendations"
- first move
- Answer the question in the thread first, honestly, naming two or three options including yours. Link only if the community allows it.
- answered by
listen-and-reply· community answers- stacks with
- Unhappy with their current tool, Doing it by hand
VibeDraft
"any tool that writes X posts that don't sound like AI? tried 3, all slop"
Accountants (invoicing tool)
"What do you use to track which clients have paid? Excel isn't cutting it." (r/Bookkeeping)
Shopify stores (cart app)
"Best abandoned-cart app that isn't $300 a month?" (r/shopify)
detectors that catch it (6)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| phrase | "what do you use for" {job} · "best tool for" {job} · "any recommendations" + {category} | strong 7 days | vendors answering their own threads; listicle bait | |
| X | phrase | "recommend" {category} · "what do you use for" {job}, with a product link in the author's bio | medium 3 days | engagement-bait polls; replies already full of vendors |
| Threads | phrase | the same asks on Threads | medium 3 days | engagement bait |
| Hacker News | phrase | Ask HN titles with {category} + "recommend" or "what do you use" | strong 7 days | threads about big-company tooling |
| Indie Hackers | phrase | forum posts asking which tool to use for {job} | strong 7 days | vendors answering their own threads |
| Discord, Slack and Skool | phrase | the same questions in member communities | strong 7 days | rules that forbid answering with a link |
Shopping — · window 7 to 30 days
Comparing options
industry term: active evaluation
They've narrowed it to two or three and are weighing them.
- where it shows
- "X vs Y", "alternatives to X", comparison threads, review-site comparisons
- first move
- Reply with the one difference that matters for their case, and offer the comparison page. Never trash the other tool.
- answered by
comparison-interceptioncomparison-pages· comparison pages, community answers- stacks with
- Asking for a recommendation, Competitor shake-up
VibeDraft
"Typefully or Hypefury if I post every day?"
Accountants (invoicing tool)
"TaxDome or Karbon for a 3-person firm?"
Shopify stores (cart app)
"Klaviyo vs Omnisend for a store doing $10k a month?"
detectors that catch it (4)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| phrase | "{competitor} vs" · "alternative to {competitor}" · "{competitor} or {competitor}" | strong 14 days | affiliate posts; the competitors' own staff | |
| X | phrase | the same comparisons, plus "switching to" | medium 7 days | sponsored comparisons |
| G2 | event | a new review on a {competitor} page that names an alternative it was compared with | weak 30 days | usually no reachable person: feeds comparison pages |
| Google Alerts | phrase | "{competitor} alternative" | weak 30 days | finds articles, not people: use them for comparison pages |
Switching · Have a fix, want out of it.
Switching — · VibeDraft priority #2 · window 3 to 30 days
Unhappy with their current tool
industry term: competitor dissatisfaction
They pay for something and it's letting them down.
- where it shows
- complaints, low-star reviews, "cancelling", "switching from"
- first move
- Acknowledge the exact complaint, say what you do differently on that one point, and offer to help them move.
- answered by
comparison-interceptionsignal-based-outbound· comparison pages, founder-led outbound- stacks with
- Comparing options, Competitor shake-up
VibeDraft
"cancelling my scheduler. $29 a month to post things nobody sees"
Accountants (invoicing tool)
2-star review: "powerful, but my clients can't figure out the portal"
Shopify stores (cart app)
"my email tool doubled my bill when my list hit 15k"
detectors that catch it (9)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| G2 | threshold | new review of {competitor} with rating ≤ 3 | strong 30 days | often no reachable person; the complaint feeds comparison pages |
| Capterra | threshold | new review of {competitor} with rating ≤ 3; note role, industry and company size | strong 30 days | rarely named: research more than outreach |
| Trustpilot | threshold | new review of {competitor} with rating ≤ 2 | medium 30 days | consumer complaints outside the ICP; first names only |
| Apple App Store | threshold | rating ≤ 2 on {competitor}'s app | medium 30 days | reviewer is a nickname; use the complaint, rarely the person |
| Google Play | threshold | rating ≤ 2 on {competitor}'s app | medium 30 days | reviewer is a display name; use the complaint, rarely the person |
| Shopify App Store | threshold | rating ≤ 2 on a competing app; the review names the store | strong 30 days | stores outside the ICP's size range |
| Chrome Web Store | threshold | rating ≤ 2 on a competing extension | medium 30 days | one-line rants with no detail |
| phrase | "cancelling {competitor}" · "switching from {competitor}" · "{competitor} is too expensive" | strong 7 days | venting with no plan to switch | |
| X | phrase | the same phrases on X | medium 3 days | jokes and quote-posts |
Switching — · window 1 to 7 days
Competitor shake-up
industry term: competitor event
A price rise, shutdown, acquisition or outage pushes many users to look at once.
- where it shows
- competitor pricing pages, changelogs, news, a spike in angry threads
- first move
- Publish the honest comparison page within 48 hours, then answer the angry threads with it.
- answered by
comparison-pagesoffer-post-reply-loop· offer post, comparison pages- stacks with
- Unhappy with their current tool
VibeDraft
a popular scheduler raises prices or loses API access
Accountants (invoicing tool)
a practice-management tool announces a big price increase
Shopify stores (cart app)
a review app is acquired and ends its free plan
detectors that catch it (4)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| Competitor pages | change | {competitor}/pricing or changelog changes: a price rise, a removed plan, an end-of-life notice | strong 3 days | layout-only changes; watch prices and plan names |
| Competitor pages | event | the status page reports a major outage | medium 1 day | short outages nobody noticed |
| News and funding | event | acquisition or shutdown news naming {competitor} | strong 7 days | rumours |
| phrase | a spike of posts naming {competitor} with angry words, after one of the above | medium 3 days | the spike fades in days |
Burned · Tried something and it didn't work.
Burned — · VibeDraft priority #1 · window 7 to 30 days
Tried it and it failed
They did the obvious thing and got nothing.
- where it shows
- dated attempts with bad results: launch listings, "tried X, didn't work"
- first move
- Reply to their post with one specific diagnosis of why it flopped. The offer comes in the second message, if at all.
- answered by
signal-based-outboundlead-to-waitlist queue· founder-led outbound- stacks with
- Set up, but no results, Taking stock
VibeDraft
Uneed listing, 4 upvotes, then a tweet: "launched, crickets"
Accountants (invoicing tool)
"set up automatic reminders in QuickBooks. clients ignore them anyway"
Shopify stores (cart app)
"spent $2k on Meta ads last month, 3 sales"
detectors that catch it (9)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| Uneed | threshold | launched in the last 7 days with upvotes < 10; a paid Spotlight slot makes it stronger | strong 7 days | agencies, templates, non-software listings |
| PeerPush | threshold | publishedAt in the last 7 days and low votes | strong 7 days | agencies, templates |
| Product Hunt | threshold | launched in the last 7 days, low votes and no comments | medium 7 days | launches never meant to win |
| Hacker News | threshold | a Show HN in the last 7 days with points < 5 and no comments | medium 7 days | weekend projects with nothing to sell |
| BetaList | event | listed in the last 14 days, read with a post about no traction | medium 14 days | pre-product ideas |
| Other launch sites | threshold | a paid or featured slot with single-digit upvotes (Smol Launch, Fazier) | strong 7 days | |
| X | phrase | "launched" + "crickets" / "0 signups" / "no sales" | strong 7 days | humble-brags that did fine |
| phrase | the same phrases in founder subreddits | strong 7 days | retrospective war stories | |
| Meta Ad Library | threshold | ads running 60+ days for a store with few reviews | medium 30 days | big brands |
Burned — · VibeDraft priority #7 · window 7 to 14 days
Trying again
industry term: relaunch
Back for another go after the first one flopped.
- where it shows
- the same product or domain showing up twice; "relaunching", "v2"
- first move
- Congratulate the relaunch, ask what changed this time, and offer one concrete thing for launch week.
- answered by
signal-based-outbound· launch week, founder-led outbound- stacks with
- Tried it and it failed
VibeDraft
the same domain on Product Hunt in March and again in October
Accountants (invoicing tool)
"third practice-management tool in two years"
Shopify stores (cart app)
"relaunching my store under a new brand after a slow first year"
detectors that catch it (3)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| Product Hunt | event | the same product or domain launching a second time | strong 14 days | planned version launches that went well |
| Other launch sites | event | the same domain listed twice across launch sites | strong 14 days | name collisions: match on the domain |
| X | phrase | "relaunching" · "launching again" · "v2 is live" | medium 7 days | big companies' version launches |
Struggling · Feel the pain, not shopping yet.
Struggling — · window 7 to 14 days
Venting about the problem
Frustrated, but haven't named a tool or a fix.
- where it shows
- pain phrases in the buyer's own words
- first move
- Add something useful to the thread. Weak on its own: wait for a second signal before any direct message.
- answered by
listen-and-reply· community answers- stacks with
- Doing it by hand, Taking stock
VibeDraft
"building is the easy part. getting anyone to care is impossible"
Accountants (invoicing tool)
"chasing clients for payment is the worst part of this job"
Shopify stores (cart app)
"half my week goes to 'where is my order' emails"
detectors that catch it (4)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| phrase | pain phrases in the buyer's own words, from audience research | weak 14 days | jokes, memes, no budget | |
| X | phrase | the same phrases on X | weak 7 days | very common, very vague |
| Threads | phrase | the same phrases on Threads | weak 7 days | |
| Discord, Slack and Skool | phrase | the same phrases in member communities | medium 14 days | rules on replying with a product |
Struggling — · VibeDraft priority #5 · window 7 to 14 days
Doing it by hand
industry term: manual workaround
A spreadsheet, a script, or a ritual they resent.
- where it shows
- "spreadsheet", "I built a script", template requests
- first move
- Share a better version of their workaround (a template, a script) with your product as the optional next step.
- answered by
listen-and-replyfree-tools-as-search-pages· community answers, offer post- stacks with
- Venting about the problem, Hiring for the job you do
VibeDraft
"I track leads in a Google Sheet and DM everyone myself"
Accountants (invoicing tool)
"anyone have an Excel template for tracking client invoices?"
Shopify stores (cart app)
"I copy every order into a spreadsheet to know when to restock"
detectors that catch it (4)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| phrase | "template for" {job} · "spreadsheet" or "google sheet" + {job} · "I built a script" | strong 14 days | people selling templates | |
| X | phrase | the same phrases on X | medium 7 days | template sellers |
| Indie Hackers | phrase | posts sharing a homemade workflow for {job} | medium 14 days | |
| Discord, Slack and Skool | phrase | template and spreadsheet requests | strong 14 days |
Struggling — · VibeDraft priority #3 · window 30 days
Set up, but no results
All the setup is done and nothing is coming out the other end.
- where it shows
- public records where setup exists and the result is zero
- first move
- Point at the gap their own numbers show, and offer a short teardown.
- answered by
signal-based-outboundlead-to-waitlist queue· founder-led outbound, offer post- stacks with
- Tried it and it failed, Taking stock
VibeDraft
TrustMRR: payments connected, customers above zero, MRR $0
Accountants (invoicing tool)
usually invisible for this buyer
Shopify stores (cart app)
store live 6 months, 0 reviews, ads still running
detectors that catch it (4)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| Revenue boards | threshold | customers > 0 and MRR = $0, or flat for 3+ months | strong 30 days | free products listed for the badge |
| Shopify App Store | threshold | a listing live 6+ months with 0 or 1 reviews | medium 30 days | side projects |
| Apple App Store | threshold | an app live 6+ months with very few ratings and a recent update | medium 30 days | abandoned apps |
| Meta Ad Library | threshold | ads running 60+ days for a store with very few reviews | medium 30 days |
Changing · Something in their world just shifted.
Changing — · VibeDraft priority #6 · window 14 to 30 days
Crossed a threshold
industry term: growth milestone, funding event
Grew past a limit, raised money, or hit a cap.
- where it shows
- announcements, plan-limit complaints, funding news
- first move
- Congratulate them, then name the problem that usually shows up at this size.
- answered by
signal-based-outbound· founder-led outbound- stacks with
- Hiring for the job you do
VibeDraft
"just passed 100 users, can't keep up with replying to everyone"
Accountants (invoicing tool)
"just signed our 50th client"
Shopify stores (cart app)
"crossed $1M in sales, time to get serious about ops"
detectors that catch it (3)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| X | phrase | "just crossed" · "just hit" + users, customers or revenue · "we raised" | medium 14 days | growth bragging with no new problem |
| News and funding | event | funding for a company in the ICP's size range | strong 30 days | rounds too big for a self-serve product |
| Revenue boards | threshold | MRR crosses a line that matters, like $1k or $10k | medium 30 days |
Changing — · window 14 to 30 days
Hiring for the job you do
industry term: hiring signal
About to solve it with a person instead of software.
- where it shows
- job boards, "we're hiring" posts
- first move
- Show what the hire would spend their first month on, and what software can take off their plate.
- answered by
signal-based-outbound· founder-led outbound- stacks with
- Crossed a threshold, Doing it by hand
VibeDraft
"hiring a part-time social media manager for my SaaS"
Accountants (invoicing tool)
job post: "billing coordinator, small CPA firm"
Shopify stores (cart app)
"looking for a VA to answer customer emails"
detectors that catch it (3)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| Job boards | event | a new post titled {role} at a company in the ICP's size range | strong 30 days | agencies hiring for clients; big companies |
| Hacker News | event | the monthly "Who is hiring?" thread, filtered for {role} | medium 30 days | |
| X | phrase | "hiring a" {role} · "looking for a VA" | medium 14 days | recruiters reposting |
Changing — · window 30 to 60 days
New in the role
industry term: job change, new business
Just started the business or took over the job. New owners change tools.
- where it shows
- "just quit to go full-time", "just opened my firm", job changes
- first move
- A welcome note with one resource for their first 90 days. New owners change tools, so stay helpful and patient.
- answered by
signal-based-outbound· weekly long-form, founder-led outbound- stacks with
- Asking for a recommendation
VibeDraft
"quit my job last month to go full-time on my SaaS"
Accountants (invoicing tool)
"just left Big 4 to open my own practice"
Shopify stores (cart app)
"just took over marketing at a DTC brand"
detectors that catch it (2)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| event | job change into {role}, or a new company page | strong 60 days | titles that don't match the work | |
| X | phrase | "quit my job to go full-time" · "just opened my practice" · "day 1 at" | medium 30 days |
Changing — · VibeDraft priority #4 · window 7 to 30 days
Taking stock
They posted their own numbers and want to know what they mean.
- where it shows
- "month one", "year in review", open-startup pages
- first move
- Reply to the numbers with one observation and one question about what they're trying next.
- answered by
signal-based-outbound· founder-led outbound- stacks with
- Set up, but no results, Tried it and it failed
VibeDraft
"month 1: 212 visitors, 9 signups, $0"
Accountants (invoicing tool)
usually invisible for this buyer
Shopify stores (cart app)
"my store's first year, in numbers"
detectors that catch it (4)
| Source | Kind | Match | Strength · fresh | Throw out |
|---|---|---|---|---|
| X | phrase | "month 1" · "MRR update" · "year in review" with numbers | medium 7 days | people whose numbers are fine |
| phrase | the same posts in founder subreddits | medium 7 days | ||
| Indie Hackers | phrase | milestone posts with flat or zero numbers | medium 7 days | |
| Revenue boards | event | a new revenue-board listing | weak 30 days | needs a second signal |
failure modes
How cold triggers go wrong.
| Failure | What it looks like | How to catch it |
|---|---|---|
| Vendors in disguise | Founders answering their own threads, affiliate comparisons, listicle bait. | Exclusions on every phrase detector; the judge checks the author's bio and posting history. |
| Humble-brags | "launched, crickets" from someone who did fine. | Require the number (upvotes, MRR) or a second signal before acting. |
| Stale moments | A 40-day-old recommendation thread that's long been answered. | fresh_for per detector; record posted_at, not just captured_at. |
| Unreachable people | App-store and review-site authors with nicknames. | Use the complaint for comparison pages, not outreach. Mark these detectors research-only. |
| Wrong ICP | Big companies, agencies, people with no budget. | The ICP's not-if lines and lead rules run on every signal, always. |
| Over-reaching | Several plays or several founders hitting the same thread. | Contact policy: one touch per person per trigger, logged. |
| Terms and community rules | Automating a source that forbids it, or posting links where links are banned. | The source directory's terms column; by hand until checked. |
data to capture
Record it so the windows can be learned.
Following the guide's data rules: log the decision, version it, freeze the inputs, keep the negatives.
record
- each trigger's screening decision (start, on, later, off) and the reason, with the ICP version
- trigger_id on every signal
- the source post's own posted_at beside captured_at
- which detectors fired on the same person, and in what order
label
- reply within 7 days, per trigger and by signal age
- waitlist join or payment, traced back by trigger
- founder real or not on a sample of matches
trains
- a ranking of triggers by value per founder hour
- a fitted fresh_for per trigger from the reply-by-age curve
- stacking weights: how much a second trigger adds
test
- which triggers are on (start 3 vs 5) by lead cohort
- freshness window 24 hours vs 72 hours on one trigger
- offline first: replay the decay curve before changing a window