Put every signal in one table
Every source for this client writes into the same place: one signal table where each row is linked to one company. On top of it sits a routing step and a human approval before anything sends.
Works ifYou run more than one signal source and want one view per account.
The system
Registries
Certs, targets, charters
Reports
Published PDFs
Competitors
Customers + engagers
Intent
Visits + profile views
Once, at ingestion
One company per row
Human in the loop
Draft + context, a person sends
The signal
Everything that happened to an account, from any source, in one place.
Why it predicts a purchase
One signal is a hint. Three signals on the same company in the same month is a reason. You only see that if every source lands in the same table.
How it works
Stage raw, then bridge
Every source keeps its own raw table. A bridge step resolves each row to a company and writes one normalised signal: type, company, source URL, date.
Resolve once, audit always
Matching runs domain, LinkedIn, exact name, cleaned name, fuzzy, then an AI check, and every match stores which tier matched and why. You can always answer why a row landed on that company.
Route to a rep
Each account is routed to the pipeline a rep actually works, with every signal and its source in the note.
Pick the runtime for the job
Built in no-code first, moved to Python when a node silently returned zero rows, then to TypeScript jobs. Scheduled fan-out work earned the orchestrator. Scripts run by hand did not.
Build notes
- Two reasons to move: a no-code node silently returned zero rows, and the hosted bill.
- A migration claimed all flows were running. Only one of 14 had actually been triggered. Every flow was then run and checked by hand before merging.
- Human approval stayed on purpose. The system drafts and explains, a person decides what goes out.
- The profile-visit feed was mixing the agency owner's own LinkedIn visitors into the client's intent data. 18 of 41 signals were removed before they skewed anything.
Questions
What fields does every signal need?
Type, company, source URL and date. Everything else can live in an attributes column.
When is an orchestrator like Trigger.dev worth it?
For scheduled fan-out work with retries and dashboards. A script you run by hand does not need one.
More builds
All builds →Turn a vertical database into a 3-touch outbound engine
A vertical database already lists your buyers with contacts, and a founder will make the closing calls.
Turn website visitors into qualified leads
You already identify companies visiting your site.
Build lists from data you already own
You have a CRM or database you have never fully worked.
The next step