Work · System · Aug 2026–now
Signal Machine
A zero-click outbound engine: discover hiring and CI signals, score them, fail-closed DNC suppress, enrich, then a HubSpot task for AE review.
Two keys
The method- First key
- The pipeline discovers hiring and CI signals, scores them, suppresses existing customers and enriches the rest.
- Second key
- An AE reviews the HubSpot task before anyone is contacted.
Built withExa, Firecrawl, Apify, DataForSEO, ATS APIs, Claude Code, Codex, Clay, Apollo, FullEnrich, MillionVerifier, HubSpot, Supabase, GitHub Actions, n8n, Slack
- 29hot HubSpot tasks in 72 hours, from a baseline of about 1 in 8 daysOn the record
- 31/37stuck hot rows rescued with verified contactsOn the record
The problem
A hiring signal or a competitor page change is public for a short window. By the time someone copies it into a sheet, scores it, checks whether the company is already a customer and finds a contact, the window is gone.
A pipeline that emails on its own holds both keys. The same job that found the lead also decides they should hear from us, so a current customer or a thin match can land in a sequence.
The system
Signal Machine is a zero-click outbound engine for Visualping GTM. I built and iterate it with Claude Code and Codex. When enrichment stalls, a second agent joins to recover the row.
It runs as a TypeScript pipeline on GitHub Actions crons, with a Next.js dashboard and state in Supabase. Discovery, scoring, suppression and enrichment are automatic. Outreach is not.
Every row moves through five steps:
- Discover buying, hiring and CI signals from Exa websets, ATS boards such as Greenhouse and Ashby, LinkedIn via Apify, Firecrawl and Google Jobs.
- Score each candidate.
- Fail-closed DNC: suppress existing customers before anything reaches sales. If the check can’t confirm they are new, the row stops.
- Enrich the rest through Clay and Apollo or FullEnrich.
- Open a HubSpot task for an AE when the score is hot.
An earlier Instantly email path sent without that second key. I retired it. The HubSpot-task path is the one that ships.
The sessions that build and recover Signal Machine share the agent hub. Signal Machine itself is not open source.
The two keys
The first key is the pipeline. It discovers the signal, scores it, suppresses existing customers, enriches the rest and opens the task.
The second key is an AE. A hot score writes a HubSpot task, not a send. The AE reads the signal and decides whether anyone is contacted.
Fail-closed DNC sits in front of that review. A suppression miss is worse than a missed lead, so a failed or uncertain check stops the row.
What it produced
The useful output is a scored HubSpot task an AE can stand behind. Signals reach that queue in days, not weeks.
After the August 2026 handoff window, the improved path produced 175 signals in 72 hours. Twenty-nine of them scored 70 or above and became HubSpot tasks. The baseline before that path was about one hot lead in eight days. Those figures are documented internal handoff metrics, not an audited public benchmark.
On August 20, 2026, enrichment stalled on 37 hot rows. Claude Code and Codex recovered 31 of them with verified contacts.
I do not credit Signal Machine with a change in pipeline or revenue. This page reports the handoff deltas only.
What I’d change
Review is the constraint. Twenty-nine hot tasks in three days only help if an AE can clear them.
I’d make the AE’s HubSpot queue the only inbox for these leads, with a stale-task rule so a task that sits too long comes back rather than disappearing.
I’d also keep the second agent off the row until enrichment is stuck, the same skip rule the agent hub uses for small work.