Live build
Exit
Home

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

Stored

67

live RSS + seeded history

Qualified companies

Stored

27

scored 60 or above

Drafts pending review

Live

54

nothing auto-sends

Approval rate

By hand

100%

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 hand

The independence wedge is a harvest window, not a permanent signal. Every day it narrows.

Displacement signals captured

Stored

3

companies on the wedge

Avg score vs funding

Stored

79 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

Stored

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

Funding rounds stream in from RSS. Competitor complaints are added by hand or through the live trigger. Both are deduped.

TechCrunch RSSmanual + live trigger

Step 2

Score

Claude scores each signal against the ICP with a rubric matched to its type.

Fit × Timing × Access × Intentpost-raise, pre-CFOBrex-displacement wedge

Step 3

Draft

Two personas drafted per qualifying company, sign-off guaranteed in code.

Founder / CEOFinance lead60+ threshold

Step 4

Review

Every draft lands pending. A human approves or rejects before anything sends.

approverejectnothing auto-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

Funding round64 · 96%
Competitor displacement3 · 4%

Draft outcomes

right now, by review status

Pending54 · 96%
Approved2 · 4%
Rejected0 · 0%