Signal engine
Fit gets you on the list. Signal gets you emailed.
A signal is something verifiably true about one specific company, right now. Not a persona, not a probability — a URL you can open, the exact text we matched, and the date we found it.
The definition
Four tests, and most “intent data” fails them
If a claim can't survive being pasted into an email in front of the person it's about, it isn't a signal. We hold everything to that.
- True of one named company, not of a category
- Backed by a public page anyone can open and read
- Dated — and the date is part of the claim
- Implies the exact problem your product removes
- “They're a marketing agency” — that's firmographic fit
- “They're probably struggling with reporting” — that's an inference
- “Someone there downloaded a report in 2024” — stale, and not public
- “Their sector is growing 14% a year” — a market fact, not a company fact
Signal types
Four things a company can't hide
Three of the four detectors are pure rule matching — no model, no per-prospect cost. That's what makes scanning thousands of companies every week affordable.
Tech-stack detection
A competitor's script, widget or pixel running on their site right now.
We fetch the prospect's public pages and match detector rules against script sources, DOM selectors, response headers and JavaScript globals. No login, no scraping of anything private — if a browser can see it, so can the detector.
Strongest when the script belongs to a competitor you can name.
Hiring signals
A public job posting that describes the pain in the company's own words.
Greenhouse, Lever and Ashby boards, matched against the trigger keywords in your segment definition. A job description is a company admitting a gap in writing, on a page it published deliberately.
Dated by construction, and rarely more than a few weeks old.
Review signals
They publicly reviewed one of your competitors.
The prospect's own domain turns up as the author of a review found during pain mining. The highest-intent signal available: they have already said the thing out loud, in public, with a rating attached.
Rare, and worth reordering a whole batch around.
Funding & news
A raise, a launch, or a change at the top.
Useful as timing rather than as an argument — it tells you the budget and the mandate just changed, not what they hate. We score it lower and never let it carry an email on its own.
Weakest of the four alone; good as a second citation.
Worked example
One detected signal, end to end
A twelve-person agency in Bristol, found on a Wednesday. This is the whole journey from a rule match to a sentence you'd be comfortable defending.
Detector · shipped with the agency library
{
"key": "semrush_reporting_widget",
"kind": "tech",
"label": "SEMrush reporting widget",
"rule": { "type": "script_src", "pattern": "semrush\.com" },
"strength": 0.90
}Stored signal · reproducible by anyone
signals ├─ prospect_id northbeam-digital.co.uk ├─ detector_id semrush_reporting_widget ├─ kind tech ├─ evidence_url https://northbeamdigital.co.uk/reports ├─ evidence_text <script src="static.semrush.com/embed/widget.js"> ├─ detected_at 2026-07-22 └─ strength 0.90
- 01
The detector fires
Deterministic and cheap — a rule match, not a model. Northbeam Digital's /reports page loads a competitor's embed script.
- 02
Evidence is captured
The URL, the matched text and the timestamp are written in the same insert as the signal. There is no code path that stores one without the others.
- 03
It's turned into one citable sentence
The only paid step in the scan, and it runs once per match rather than once per company scanned: “Northbeam Digital embeds SEMrush's reporting widget on its public /reports page.”
- 04
It's scored
Detector strength × recency decay. Found six days ago, so it keeps nearly all of its weight and pushes the prospect to the top of the segment.
- 05
It licenses exactly one opening line
“You're still running SEMrush's widget on /reports — and 41 people in your market publicly said those reports are unreadable to clients.” Both halves are clickable.
The evidence contract
Three columns that make a claim checkable
Every signal stores all three, or it isn't written at all. Both fields are NOT NULL and the evidence text carries a check constraint against empty strings — a signal with nothing to cite is not a signal.
evidence_url
Where we saw it
The exact public page, not the homepage. Click it and read the same thing the detector read. If the page has changed since, the timestamp tells you when it didn't.
evidence_text
What we matched
The literal script tag, selector hit, job-post line or review sentence. Never a paraphrase, so nothing can drift between what was found and what gets cited.
detected_at
When we found it
Timestamped on insert. Re-scans are unique per prospect, detector and day, so a weekly cadence builds a history rather than a pile of duplicates.
This is why the drafting stage can be strict later: a draft's citation is a foreign key to one of these rows, so the fact behind every email survives long enough to be argued about.
Recency decay
A trigger is only worth what it's still true
Signals age. Scoring weights them down as they do, so a fresh weak trigger beats a stale strong one — and a six-month-old find scores near zero rather than quietly propping up a prospect that has moved on.
Illustrative curve. The exact weights are tuned per detector kind — a review stays useful longer than a funding announcement.
The library
Detectors you're given, and detectors you write
Every category ships with seed detectors so the first scan finds something on day one. When your market has a tell nobody else would think to look for, you add it yourself.
Shipped per category
Global detectors, maintained by us, available to every workspace.
- AnalyticsGA4, Plausible, Matomo, Fathom
- Support widgetsIntercom, Crisp, Zendesk, Drift
- Review toolsTrustpilot, Reviews.io, Yotpo embeds
- SEO suitesSEMrush, Ahrefs badges and embeds
- Accessibility overlaysAccessiBe, UserWay, EqualWeb
- CMS & paymentsWordPress, Webflow, Shopify, Stripe
Custom detectors
Five rule shapes, scoped to your workspace and never visible to anyone else. Give it a pattern and a strength; it joins the next weekly scan.
script_srca pattern in any loaded script URLdom_selectoran element that only that product rendershttp_headera header the vendor sets on responsesjs_globala global object the widget attaches to windowurl_patterna path that only exists on that platform
Segments re-scan on a cadence, so a detector you add today reopens prospects that were dormant last week.
The ranking rule
Why the smaller agency goes first
Fit and signal are separate scores and they are not interchangeable. Fit decides whether a company belongs in the segment at all. Signal decides whether there's anything worth saying to them this week.
Drafted this batch
12 staff · BristolNorthbeam Digital
Half the headcount you'd have asked for, and an imperfect firmographic match. But six days ago they added a competitor's reporting widget to a public page — and that is a thing you can open a conversation with.
fit_score
41
signal_score
88
On the list, not in the batch
200 staff · LondonMeridian Search Partners
A textbook match on every firmographic you defined. Nothing has changed on their site, their board or their reviews in seven months, so there is no honest first line — and a generic one would burn the account.
fit_score
92
signal_score
0
Meridian isn't discarded — they're waiting for a reason. The moment a scan finds one, they surface at the top of the next batch with the evidence already attached.
Start with the dossier.
Tell us your product and we'll mine your market's public complaints — ranked, quoted and sourced. Useful whether or not you ever send an email.
Free · no card · yours to keep