Signal engine · GTM home
A startup announces a funding round, and minutes later an AE has a researched, personalized outbound email waiting for review.
That is the whole system. Funding rounds and Brex-displacement complaints are captured, scored against the ICP, and drafted for a human to approve. Describe an agent or a monitor in plain English and it is saved as a configuration; the scorer and drafter are what run today.
Business banks already sell on signals. A Stripe Atlas formation partnership puts an account in a founder's hands at incorporation, before the EIN arrives. This is the same motion one stage later, at the raise, when the money actually lands.
What the machine is producing
Signal records
Stored67
live RSS + seeded history
Qualified companies
Stored27
scored 60 or above
Drafts pending review
Live54
nothing auto-sends
Approval rate
By hand100%
2 drafts decided
Operational counts from the database, not closed-won pipeline. Model spend has a daily ceiling across every visitor, so a public link cannot run up a bill. Configured
Extend it in plain English
a rep describes what they want in plain English, and the system saves it as a configuration
Displacement window · the Brex harvest
Capital One closed the Brex acquisition
April 7, 2026
By handThe independence wedge is a harvest window, not a permanent signal. Every day it narrows.
Displacement signals captured
Stored3
companies on the wedge
Avg score vs funding
Stored79 vs 50
displacement scores higher, on 3 signals, and partly by design: naming Brex sets Intent to 25 while a funding round caps Intent at 18
Qualified + drafts approved
Stored3 · 1
scored 60+ · approved to send
Displacement signals score on Intent: naming Brex maxes the axis at 25/25.
How it works · listen → score → draft → review
Step 1
Listen
Funding rounds stream in from RSS. Competitor complaints are added by hand or through the live trigger. Both are deduped.
Step 2
Score
Claude scores each signal against the ICP with a rubric matched to its type.
Step 3
Draft
Two personas drafted per qualifying company, sign-off guaranteed in code.
Step 4
Review
Every draft lands pending. A human approves or rejects before anything sends.
Engineering decisions · the hard parts, handled
the questions a platform lead asks in the first ten minutes
Two signal types, one engine
Funding rounds and competitor-displacement complaints share the same enrich/draft pipeline, each with its own scoring rubric and email framing.
Structured outputs enforce shape, not content
The JSON schema guarantees the response parses. It doesn't guarantee the model follows every prose rule. The sign-off line is enforced with a deterministic code fallback, not trusted to the prompt alone.
Idempotent by construction
A signal claimed by the live-trigger route is excluded from the batch sweep, so a cron landing mid-request can't double-enrich it and insert a duplicate company.
RSS ingest degrades gracefully
Per-feed timeout plus parallel fetch, so one slow feed can't stall the whole ingest run. It just gets logged as failed and the rest continue.
Ownership, not locking
The Hetzner monitor and the live-trigger route never contend for the same row: each only touches signals it's allowed to, so there's no lock to forget.
One gate, every surface
A single access layer covers the dashboard, database mutations, and paid model calls, while preserving the separate cron-secret path for scheduled ingestion.
Signal mix
right now, by signal type
Draft outcomes
right now, by review status