phase 2 · listen
Detectors
Go deeper
A detector is a rule that watches one place for one moment: where to look, what to match, how strong a match has to be, and how fresh. This page defines the detector as an object, lists every detector in the library for all 24 triggers, and covers the sources they read and how to test one before you trust it.
moment · the kind of event → detector · the rule that watches → signal · one person caught → lead · signals merged by person
anatomy
Seven fields decide what counts as a match.
Write a detector down in this shape before you build or run it. If you can't fill a field, the detector isn't ready: usually the match is too vague or nobody has checked the source by hand.
Moment — The trigger event it watches for. One detector serves exactly one moment; one moment can have several detectors.
Source — The one place it reads: a subreddit, a search, a launch site, a job board, your own Stripe account.
Kind — Phrase, threshold, event, change or your own data. The kind decides how it's built (below).
Match — What has to be true: phrases in the buyer's own words, a field crossing a number, or a dated record appearing.
Strength — How sure a single match makes you. Strong means the match shows the moment directly; weak means it needs a second signal.
Freshness — How old a match can be before it's useless. The buying window closes; a three-week-old "any recommendations?" has already been answered.
Exclude — What throws a match out: the ICP's "not if" lines, competitors and their staff, vendors fishing for clicks, your existing customers.
DETECTOR · EXAMPLE — VIBEDRAFT
- Moment
- Tried it and it failed
- Source
- Small launch sites (Uneed, PeerPush)
- Kind
threshold
on a
- Match
- a launch listing dated in the last 7 days with
upvotes < 10 - Strength
- strong
- Freshness
- 7 days
- Exclude
- agencies, template sellers, anything that isn't software, makers already in a campaign
each match becomes a signal
link to the listing · date · maker's name and handle · the matched fields (4 upvotes, Oct 14)
five kinds
How a detector decides it found something.
Most moments can be caught more than one way. Two detectors of different kinds on the same person is the strongest evidence you'll get.
phrase
Words in a post or comment, in the buyer's own language. Cheapest to build, noisiest to run.
"any tool for" + {job}
threshold
A number on a public record crosses a line. Little noise, but only where the number is public.
MRR = $0 and customers > 0
event
A dated record appears: a launch, a job post, a funding announcement. The date tells you the window is open.
new job post · title = {role}
change
A page you watch changes: a competitor's pricing, changelog or status page. Catches the moment for many people at once.
{competitor}/pricing differs from yesterday
your data
An event in your own analytics, app or Stripe. The most reliable kind, and the only one with no scraping or terms to check.
invoice.payment_failed
the detector object
Every detector is one record with the same fields.
This is the shape a detector takes in the library and in code. One detector watches one source for one trigger. A source can hold many detectors; a trigger can have many detectors; a playbook can be fed by many triggers.
| Field | Type | What it holds |
|---|---|---|
id | string | Stable, readable: det.<trigger>.<source>. Every signal it emits carries it. |
version | integer | Bumped whenever the match, strength, freshness or exclusions change, and stamped on every signal. |
trigger | trigger id | Exactly one of the 24 triggers on the map. |
side | cold | warm | Strangers in public, or people already touching your product. |
source | source id | One entry in the source directory below, with its access rules and terms. |
kind | phrase | threshold | event | change | owned | How it decides it found something. |
match | rule | The phrases, the field and number, or the dated record that must appear. Braces are filled from the brief. |
strength | strong | medium | weak | How sure one match makes you. |
fresh_for | duration | How old a match can be and still count. |
exclude | rule list | What throws a match out, plus the ICP's "not if" lines and the lead rules, always. |
emits | field list | The signal it writes for each match: always its own id, a link or record and a date, plus what this kind can read. |
feeds | playbook ids | The playbooks its leads go to. |
status | live | flagged | by hand | |
yield_target | per month | 20 or more real matches makes it a channel; tested by hand before it's automated. |
one detector, as data
{
"id": "det.tried-it-and-it-failed.uneed",
"version": 1,
"trigger": "Tried it and it failed",
"side": "cold",
"source": "uneed",
"kind": "threshold",
"match": "launched in the last 7 days with upvotes < 10; a paid Spotlight slot makes it stronger",
"strength": "strong",
"fresh_for": "7 days",
"exclude": [
"agencies, templates, non-software listings",
"ICP not-if lines",
"lead rules: never customers, competitors"
],
"emits": [
"detector_id",
"link",
"date",
"owner",
"field_values"
],
"feeds": [
"signal-based-outbound",
"lead-to-waitlist queue"
],
"yield_target": "20+ a month"
}the library
Every detector, as an object.
Placeholders in braces come from the brief and ICP: {job} is what the product does, {category} is what buyers call it, {competitor} comes from the competitive analysis, {role} is whoever does the job by hand.
Communities and search
Reddit — posts, comments · 8 detectors
Asking for a recommendation
phrase — strong · fresh for 7 days
- match
"what do you use for" {job}·"best tool for" {job}·"any recommendations" + {category}r/SaaS: "any tool that finds people asking for what I built?"
- exclude
- vendors answering their own threads; listicle bait; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply
Comparing options
phrase — strong · fresh for 14 days
- match
"{competitor} vs"·"alternative to {competitor}"·"{competitor} or {competitor}"- exclude
- affiliate posts; the competitors' own staff; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
comparison-interception,comparison-pages
Unhappy with their current tool
phrase — strong · fresh for 7 days
- match
"cancelling {competitor}"·"switching from {competitor}"·"{competitor} is too expensive"- exclude
- venting with no plan to switch; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
comparison-interception,signal-based-outbound
Competitor shake-up
phrase — medium · fresh for 3 days
- match
- a spike of posts naming
{competitor}with angry words, after one of the above - exclude
- the spike fades in days; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
comparison-pages,offer-post-reply-loop
Tried it and it failed
phrase — strong · fresh for 7 days
- match
- the same phrases in founder subreddits
- exclude
- retrospective war stories; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
signal-based-outbound, lead-to-waitlist queue
Venting about the problem
phrase — weak · fresh for 14 days
- match
pain phrases in the buyer's own words, from audience research
"building is the easy part. getting anyone to care is impossible"
- exclude
- jokes, memes, no budget; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply
Doing it by hand
phrase — strong · fresh for 14 days
- match
"template for" {job}·"spreadsheet"or"google sheet"+ {job} ·"I built a script""I track leads in a Google Sheet and DM everyone myself"
- exclude
- people selling templates; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply,free-tools-as-search-pages
Taking stock
phrase — medium · fresh for 7 days
- match
- the same posts in founder subreddits
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
signal-based-outbound
X — posts · 12 detectors
Asking for a recommendation
phrase — medium · fresh for 3 days
- match
"recommend" {category}·"what do you use for" {job}, with a product link in the author's bio- exclude
- engagement-bait polls; replies already full of vendors; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply
Comparing options
phrase — medium · fresh for 7 days
- match
the same comparisons, plus
"switching to""Typefully or Hypefury if I post every day?"
- exclude
- sponsored comparisons; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
comparison-interception,comparison-pages
Unhappy with their current tool
phrase — medium · fresh for 3 days
- match
the same phrases on X
"cancelling my scheduler. $29 a month to post things nobody sees"
- exclude
- jokes and quote-posts; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
comparison-interception,signal-based-outbound
Tried it and it failed
phrase — strong · fresh for 7 days
- match
"launched"+"crickets"/"0 signups"/"no sales""launched last week, crickets"
- exclude
- humble-brags that did fine; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
signal-based-outbound, lead-to-waitlist queue
Trying again
phrase — medium · fresh for 7 days
- match
"relaunching"·"launching again"·"v2 is live"- exclude
- big companies' version launches; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
signal-based-outbound
Venting about the problem
phrase — weak · fresh for 7 days
- match
- the same phrases on X
- exclude
- very common, very vague; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply
Doing it by hand
phrase — medium · fresh for 7 days
- match
- the same phrases on X
- exclude
- template sellers; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply,free-tools-as-search-pages
Crossed a threshold
phrase — medium · fresh for 14 days
- match
"just crossed"·"just hit"+ users, customers or revenue ·"we raised"- exclude
- growth bragging with no new problem; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
signal-based-outbound
Hiring for the job you do
phrase — medium · fresh for 14 days
- match
"hiring a" {role}·"looking for a VA""hiring a part-time social media manager for my SaaS"
- exclude
- recruiters reposting; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
signal-based-outbound
New in the role
phrase — medium · fresh for 30 days
- match
"quit my job to go full-time"·"just opened my practice"·"day 1 at""quit my job last month to go full-time on my SaaS"
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
signal-based-outbound
Taking stock
phrase — medium · fresh for 7 days
- match
"month 1"·"MRR update"·"year in review"with numbers"month 1: 212 visitors, 9 signups, $0"
- exclude
- people whose numbers are fine; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
signal-based-outbound
Outgrowing their plan
phrase — medium · fresh for 14 days
- match
the customer announces a second product or location
launched a second product
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
- Second product
Threads — posts · 2 detectors
Asking for a recommendation
phrase — medium · fresh for 3 days
- match
- the same asks on Threads
- exclude
- engagement bait; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply
Venting about the problem
phrase — weak · fresh for 7 days
- match
- the same phrases on Threads
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply
Hacker News — posts, comments, Show HN · 3 detectors
Asking for a recommendation
phrase — strong · fresh for 7 days
- match
- Ask HN titles with
{category}+ "recommend" or "what do you use" - exclude
- threads about big-company tooling; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply
Tried it and it failed
threshold — medium · fresh for 7 days
- match
- a Show HN in the last 7 days with
points < 5and no comments - exclude
- weekend projects with nothing to sell; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
signal-based-outbound, lead-to-waitlist queue
Hiring for the job you do
event — medium · fresh for 30 days
- match
- the monthly "Who is hiring?" thread, filtered for
{role} - exclude
- the ICP's not-if lines and lead rules
- emits
detector_idlinkevent_dateowner- feeds
signal-based-outbound
Indie Hackers — posts · 3 detectors
Asking for a recommendation
phrase — strong · fresh for 7 days
- match
- forum posts asking which tool to use for
{job} - exclude
- vendors answering their own threads; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply
Doing it by hand
phrase — medium · fresh for 14 days
- match
- posts sharing a homemade workflow for
{job} - exclude
- the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply,free-tools-as-search-pages
Taking stock
phrase — medium · fresh for 7 days
- match
- milestone posts with flat or zero numbers
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
signal-based-outbound
Discord, Slack and Skool — messages, posts · 3 detectors
Asking for a recommendation
phrase — strong · fresh for 7 days
- match
- the same questions in member communities
- exclude
- rules that forbid answering with a link; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply
Venting about the problem
phrase — medium · fresh for 14 days
- match
- the same phrases in member communities
- exclude
- rules on replying with a product; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply
Doing it by hand
phrase — strong · fresh for 14 days
- match
- template and spreadsheet requests
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
listen-and-reply,free-tools-as-search-pages
LinkedIn — posts, profiles · 1 detector
New in the role
event — strong · fresh for 60 days
- match
- job change into
{role}, or a new company page - exclude
- titles that don't match the work; the ICP's not-if lines and lead rules
- emits
detector_idlinkevent_dateowner- feeds
signal-based-outbound
Google Alerts — web pages · 1 detector
Comparing options
phrase — weak · fresh for 30 days
- match
"{competitor} alternative"- exclude
- finds articles, not people: use them for comparison pages; the ICP's not-if lines and lead rules
- emits
detector_idlinkposted_atauthormatched_text- feeds
comparison-interception,comparison-pages
Launch sites
Product Hunt — launches · 2 detectors
Tried it and it failed
threshold — medium · fresh for 7 days
- match
- launched in the last 7 days, low votes and no comments
- exclude
- launches never meant to win; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
signal-based-outbound, lead-to-waitlist queue
Trying again
event — strong · fresh for 14 days
- match
- the same product or domain launching a second time
- exclude
- planned version launches that went well; the ICP's not-if lines and lead rules
- emits
detector_idlinkevent_dateowner- feeds
signal-based-outbound
Uneed — launches · 1 detector
Tried it and it failed
threshold — strong · fresh for 7 days
- match
launched in the last 7 days with
upvotes < 10; a paid Spotlight slot makes it strongerAcme Notes, Oct 14, 4 upvotes
- exclude
- agencies, templates, non-software listings; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
signal-based-outbound, lead-to-waitlist queue
PeerPush — launches · 1 detector
Tried it and it failed
threshold — strong · fresh for 7 days
- match
publishedAtin the last 7 days and low votes- exclude
- agencies, templates; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
signal-based-outbound, lead-to-waitlist queue
BetaList — launches · 1 detector
Tried it and it failed
event — medium · fresh for 14 days
- match
- listed in the last 14 days, read with a post about no traction
- exclude
- pre-product ideas; the ICP's not-if lines and lead rules
- emits
detector_idlinkevent_dateowner- feeds
signal-based-outbound, lead-to-waitlist queue
Other launch sites — launches · 2 detectors
Tried it and it failed
threshold — strong · fresh for 7 days
- match
- a paid or featured slot with single-digit upvotes (Smol Launch, Fazier)
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
signal-based-outbound, lead-to-waitlist queue
Trying again
event — strong · fresh for 14 days
- match
- the same domain listed twice across launch sites
- exclude
- name collisions: match on the domain; the ICP's not-if lines and lead rules
- emits
detector_idlinkevent_dateowner- feeds
signal-based-outbound
Review sites
G2 — reviews · 2 detectors
Comparing options
event — weak · fresh for 30 days
- match
- a new review on a
{competitor}page that names an alternative it was compared with - exclude
- usually no reachable person: feeds comparison pages; the ICP's not-if lines and lead rules
- emits
detector_idlinkevent_dateowner- feeds
comparison-interception,comparison-pages
Unhappy with their current tool
threshold — strong · fresh for 30 days
- match
- new review of
{competitor}withrating ≤ 3 - exclude
- often no reachable person; the complaint feeds comparison pages; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
comparison-interception,signal-based-outbound
Capterra — reviews · 1 detector
Unhappy with their current tool
threshold — strong · fresh for 30 days
- match
- new review of
{competitor}withrating ≤ 3; note role, industry and company size - exclude
- rarely named: research more than outreach; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
comparison-interception,signal-based-outbound
Trustpilot — reviews · 1 detector
Unhappy with their current tool
threshold — medium · fresh for 30 days
- match
- new review of
{competitor}withrating ≤ 2 - exclude
- consumer complaints outside the ICP; first names only; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
comparison-interception,signal-based-outbound
App stores
Apple App Store — reviews, listings · 2 detectors
Unhappy with their current tool
threshold — medium · fresh for 30 days
- match
rating ≤ 2on{competitor}'s app- exclude
- reviewer is a nickname; use the complaint, rarely the person; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
comparison-interception,signal-based-outbound
Set up, but no results
threshold — medium · fresh for 30 days
- match
- an app live 6+ months with very few ratings and a recent update
- exclude
- abandoned apps; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
signal-based-outbound, lead-to-waitlist queue
Google Play — reviews, listings · 1 detector
Unhappy with their current tool
threshold — medium · fresh for 30 days
- match
rating ≤ 2on{competitor}'s app- exclude
- reviewer is a display name; use the complaint, rarely the person; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
comparison-interception,signal-based-outbound
Shopify App Store — reviews, listings · 2 detectors
Unhappy with their current tool
threshold — strong · fresh for 30 days
- match
rating ≤ 2on a competing app; the review names the store- exclude
- stores outside the ICP's size range; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
comparison-interception,signal-based-outbound
Set up, but no results
threshold — medium · fresh for 30 days
- match
- a listing live 6+ months with 0 or 1 reviews
- exclude
- side projects; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
signal-based-outbound, lead-to-waitlist queue
Chrome Web Store — reviews, listings · 1 detector
Unhappy with their current tool
threshold — medium · fresh for 30 days
- match
rating ≤ 2on a competing extension- exclude
- one-line rants with no detail; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
comparison-interception,signal-based-outbound
Records
Revenue boards — records · 3 detectors
Set up, but no results
threshold — strong · fresh for 30 days
- match
customers > 0andMRR = $0, or flat for 3+ monthsAcme Notes, 12 customers, $0 MRR
- exclude
- free products listed for the badge; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
signal-based-outbound, lead-to-waitlist queue
Crossed a threshold
threshold — medium · fresh for 30 days
- match
- MRR crosses a line that matters, like $1k or $10k
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
signal-based-outbound
Taking stock
event — weak · fresh for 30 days
- match
- a new revenue-board listing
- exclude
- needs a second signal; the ICP's not-if lines and lead rules
- emits
detector_idlinkevent_dateowner- feeds
signal-based-outbound
Job boards — job posts · 1 detector
Hiring for the job you do
event — strong · fresh for 30 days
- match
- a new post titled
{role}at a company in the ICP's size range - exclude
- agencies hiring for clients; big companies; the ICP's not-if lines and lead rules
- emits
detector_idlinkevent_dateowner- feeds
signal-based-outbound
News and funding — articles · 2 detectors
Competitor shake-up
event — strong · fresh for 7 days
- match
- acquisition or shutdown news naming
{competitor} - exclude
- rumours; the ICP's not-if lines and lead rules
- emits
detector_idlinkevent_dateowner- feeds
comparison-pages,offer-post-reply-loop
Crossed a threshold
event — strong · fresh for 30 days
- match
- funding for a company in the ICP's size range
- exclude
- rounds too big for a self-serve product; the ICP's not-if lines and lead rules
- emits
detector_idlinkevent_dateowner- feeds
signal-based-outbound
Meta Ad Library — ads · 2 detectors
Tried it and it failed
threshold — medium · fresh for 30 days
- match
- ads running 60+ days for a store with few reviews
- exclude
- big brands; the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
signal-based-outbound, lead-to-waitlist queue
Set up, but no results
threshold — medium · fresh for 30 days
- match
- ads running 60+ days for a store with very few reviews
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idlinkdateownerfield_values- feeds
signal-based-outbound, lead-to-waitlist queue
Competitor pages — pages · 2 detectors
Competitor shake-up
change — strong · fresh for 3 days
- match
{competitor}/pricingor changelog changes: a price rise, a removed plan, an end-of-life notice- exclude
- layout-only changes; watch prices and plan names; the ICP's not-if lines and lead rules
- emits
detector_idpagebeforeafterseen_at- feeds
comparison-pages,offer-post-reply-loop
Competitor shake-up
event — medium · fresh for 1 day
- match
- the status page reports a major outage
- exclude
- short outages nobody noticed; the ICP's not-if lines and lead rules
- emits
detector_idlinkevent_dateowner- feeds
comparison-pages,offer-post-reply-loop
Your own data
Replies and mentions — your posts · 3 detectors
Engaged with your content
your data — medium · fresh for 3 days
- match
a reply, mention or comment from someone who isn't a lead yet
- exclude
- bots, friends, other vendors; the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
offer-post-reply-loop
Hand-raise
your data — strong · fresh for 2 days
- match
a reply under your offer post that contains a URL or asks for the offer
replied with acmenotes.example under a comment-to-get post
- exclude
- people after exposure, not help; deliver privately; the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
comment-a-keyword
Just had a win
your data — strong · fresh for 7 days
- match
- a happy reply, mention or survey score of 9 or 10
- exclude
- politeness; the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
customer-proof-amplified
Forms and email list — submissions · 2 detectors
Engaged with your content
your data — weak · fresh for 7 days
- match
- a new newsletter subscriber
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
offer-post-reply-loop
Hand-raise
your data — strong · fresh for 2 days
- match
- a lead-magnet submission, or answers to waitlist survey questions
- exclude
- fake emails; the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
comment-a-keyword
Site analytics — page views · 1 detector
Checked your pricing
your data — strong · fresh for 3 days
- match
- an identified visitor views
/pricingtwice in 7 days - exclude
- anonymous visitors: countable, not reachable; the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
- Activation nudge
Your app — product events · 5 detectors
Signed up, didn't start
your data — strong · fresh for 1 day
- match
signed_upand no activation event within 24 hoursconnected X, never generated a draft
- exclude
- test accounts; your own team; the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
- Activation nudge
Went quiet
your data — medium · fresh for 30 days
- match
- no login or key action for 30 days after some use
- exclude
- seasonal products; the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
- Bring back quiet signups
Using it less
your data — medium · fresh for 7 days
- match
- key actions down by half or more over 4 weeks against the 4 before
- exclude
- holidays, seasonal businesses; the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
- A personal check-in
Outgrowing their plan
your data — strong · fresh for 7 days
- match
- hits a plan limit, or adds a second product, location or teammate
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
- Second product
Just had a win
your data — medium · fresh for 7 days
- match
- a milestone event: first result, first payment caught
- exclude
- the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
customer-proof-amplified
Stripe — webhooks · 3 detectors
Trial ending, not converted
your data — strong · fresh for 3 days
- match
customer.subscription.trial_will_end(3 days before the end) with low usage- exclude
- trials already using it with a card on file; the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
- Stalled-trial rescue
Payment failed
your data — strong · fresh for 1 day
- match
invoice.payment_failedcard expired on renewal
- exclude
- none: always real; the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
- Failed payment
Cancelled
your data — strong · fresh for 60 days
- match
customer.subscription.deleted, with the reason fromcancellation_detailsif your cancel flow asks"didn't sound like me"
- exclude
- win-back only once the reason is fixed; the ICP's not-if lines and lead rules
- emits
detector_idperson_or_accounteventat- feeds
Win-back
source directory
Where detectors read, and how you're allowed to.
Access changes, so check each source's current terms before automating it. "By hand" means a person reads it on a schedule; that's often the right start anyway, because it's how you learn what a real match looks like.
| Source | Kind | How to read it | Cost and terms | Detectors |
|---|---|---|---|---|
| Communities and search | ||||
| posts, comments | public RSS feeds per subreddit and per user; the Data API for automation | API is rate-limited and commercial use needs Reddit's approval. Follow each subreddit's rules. Reddit ends RSS feeds on Nov 13, 2026 and closes public API access in March 2027 (PPC Land). | 8 detectors | |
| X | posts | X's search by hand; the API for automation | API access is paid, priced by usage tier. | 12 detectors |
| Threads | posts | keyword search through Meta's API | Needs Meta's app review for accounts outside the app's testers. | 2 detectors |
| Hacker News | posts, comments, Show HN | the free HN Search API (Algolia): Ask HN, Show HN, monthly "Who is hiring?" | Free and public. Self-promotion is frowned on in comments. | 3 detectors |
| Indie Hackers | posts | the public forum and milestone posts, read by hand | Public. Follow the community's self-promotion norms. | 3 detectors |
| Discord, Slack and Skool | messages, posts | by hand, as a member | Member-only. Never scrape; ask the admins before anything automated. | 3 detectors |
| posts, profiles | by hand; Sales Navigator alerts for job changes | No public API for this. Sales Navigator is paid. | 1 detector | |
| Google Alerts | web pages | an alert per phrase, by email or RSS | Free. Finds articles and pages more than people. | 1 detector |
| Launch sites | ||||
| Product Hunt | launches | the public Atom feed; the API with a token | The API's docs say it must not be used for commercial purposes; use the feed. | 2 detectors |
| Uneed | launches | daily pages and a sitemap with lastmod; prints an explicit launch date | Check the site's terms before automating. | 1 detector |
| PeerPush | launches | a documented launch API with a free key | Rate-limited key; follow the API terms. | 1 detector |
| BetaList | launches | HTML only, day headings on the index | Check the site's terms before automating. | 1 detector |
| Other launch sites | launches | Smol Launch, Fazier, TinyLaunch and similar; launchdirectories.com lists 100+ | Check each site's terms before automating. | 2 detectors |
| Review sites | ||||
| G2 | reviews | product and category pages, by hand | No open review search for non-vendors. G2 sells buyer-intent data to vendors with a listing. | 2 detectors |
| Capterra | reviews | product pages, by hand | No open review search. Reviewers show a role, industry and company size, rarely a name. | 1 detector |
| Trustpilot | reviews | company review pages, newest first | Public pages; check the terms before collecting. Reviewers often use a first name only. | 1 detector |
| App stores | ||||
| Apple App Store | reviews, listings | app pages and their newest reviews | Public pages; no review search API for apps you don't own. | 2 detectors |
| Google Play | reviews, listings | app pages and their newest reviews | Public pages; the review API covers only your own apps. | 1 detector |
| Shopify App Store | reviews, listings | app pages; reviews name the reviewing store | Public pages; no review API. | 2 detectors |
| Chrome Web Store | reviews, listings | extension pages and their reviews | Public pages; no review API. | 1 detector |
| Records | ||||
| Revenue boards | records | TrustMRR and open-startup pages: verified revenue | Public pages; check terms before collecting. | 3 detectors |
| Job boards | job posts | LinkedIn Jobs, Indeed, Wellfound; saved searches and site: searches | Most have no open search API. Saved-search emails work. | 1 detector |
| News and funding | articles | tech news RSS; Crunchbase for funding | RSS is free; Crunchbase's API is paid. | 2 detectors |
| Meta Ad Library | ads | search the library's website by advertiser | Free to search. The API covers political and issue ads, and ads shown in the EU. | 2 detectors |
| Competitor pages | pages | pricing page, changelog, status page; a page-change monitor or their RSS | Public pages. Many status pages offer RSS or Atom feeds. | 2 detectors |
| Your own data | ||||
| Replies and mentions | your posts | replies, mentions, comments and DMs on your own accounts | Your own account's data. | 3 detectors |
| Forms and email list | submissions | waitlist, lead-magnet and newsletter sign-ups | Your own data. Only email people who gave you the address. | 2 detectors |
| Site analytics | page views | Plausible, GA4 and similar | Per-person events only for visitors who are logged in or identified. | 1 detector |
| Your app | product events | your database or product analytics | Your own data. | 5 detectors |
| Stripe | webhooks | webhook events sent to your server | Your own data. | 3 detectors |
before you trust it
Test every detector by hand first.
A detector that hasn't been tested on real data is a guess. Four steps, about an hour each, before it runs on its own.
step 1 — Search it yourself · Run the match by hand on the source for the last 30 days. Use the site's own search or a site: search.
step 2 — Count the real matches · Twenty or more a month makes it a channel. Fewer than that, and each person gets sold to by hand, which is fine but doesn't need automating.
step 3 — Read 20 of them · Mark each one: right person, in the moment, fits the ICP. If fewer than half pass, tighten the match or add exclusions before going further. (A rule of thumb, not a standard.)
step 4 — Write down the misses · Every false match you saw becomes an exclusion. Every real person you found another way, which it missed, becomes a new phrase.
Strength, in plain terms
| strong | The match shows the moment directly. A launch with 4 upvotes; a failed payment; "what do you use for invoice reminders?" |
| medium | Probably the moment, but check the person against the ICP before acting. |
| weak | Only useful alongside a second signal on the same person. On its own, it's material for a post, not a message. |
After it's running
| weekly | Read a sample of what it caught. Add the new false matches as exclusions. |
| monthly | Check which of its signals became leads, and which leads paid. Detectors whose signals paid get trusted more and ranked higher. |
| retire | A detector whose signals never turn into a reply or a visit after a fair run (decide the number before you start) gets switched off. |