Signal engine · GTM home
A startup announces a funding round, and sixty seconds 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. Anyone on the GTM team extends it in plain English — no engineer, no ticket.
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
48
live RSS + seeded history
Qualified companies
22
scored 60 or above
Drafts pending review
44
nothing auto-sends
Approval rate
100%
2 drafts decided
Live operational counts, not closed-won pipeline.
Extend it without an engineer
a rep describes what they want in plain English, and the system builds it
Displacement window · the Brex harvest
Capital One closed the Brex acquisition
April 7, 2026
The independence wedge is a harvest window, not a permanent signal. Every day it narrows.
Displacement signals captured
3
companies on the wedge
Avg score vs funding
79 vs 52
displacement runs hotter
Qualified + drafts approved
3 · 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
Public funding signals and displacement complaints, streamed in and 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