GTM Signal Pipeline

Inbox-first ingest → atomic claim → fit×intent scoring → routed with reasons. Reapers sweep every 5 min. Running on Workers + D1 + Queues.

Fire a test signal
curl -X POST https://gtm-pipeline.shanefirek.com/signal \
  -H "content-type: application/json" \
  -d '{"source":"form_fill","company":"Acme","domain":"acme.com","title":"VP of IT","employee_count":900,"page":"/pricing","action":"demo_request"}'

Watch it walk pending → in_flight → routed below. Identical payloads dedup (409). Junk signals route to archive with the reason spelled out.

0 pending
0 in flight
4 routed
0 failed
0 reaper rescues

Signals (latest 25)

idtracesourcestatusfitintentscored byreaped
22 a5c0f68e form_fill routed 100 100 deterministic
21 46de8da7 form_fill routed 100 100 deterministic
20 676f7fa1 website_visit routed 70 50 deterministic
19 c114fd50 website_visit routed 10 15 deterministic

Routed actions (latest 25)

signaltieractionreason
22 hot alert_rep fit 100 ≥ 70 AND intent 100 ≥ 70: fit[headcount 900 (enterprise band); senior title "VP of IT"; resolvable domain; named company] intent[pricing page visit (/pricing); direct action: demo_request; hand-raised via form]
21 hot alert_rep fit 100 ≥ 70 AND intent 100 ≥ 70: fit[headcount 900 (enterprise band); senior title "VP <img src=x onerror=alert(1)>"; resolvable domain; named company] intent[pricing page visit (/pricing); direct action: demo_request; hand-raised via form]
20 warm nurture one dimension above 40 (fit 70, intent 50): fit[headcount 900 (enterprise band); resolvable domain; named company] intent[pricing page visit (/pricing); source: website_visit]
19 archive archive both dimensions below 40 (fit 10, intent 15)