How the pipeline works
Five services, each shipped separately, that together form the inbound revenue pipeline. Mainline does not replace any of them — it watches a single lead cross all five and records what happened.
1. Inkwellcapture
Accepts the form submission, scores it for spam, and fans it out to configured destinations.
What breaks here: Inbound capture is where spam and malformed submissions enter. A capture layer that forwards everything downstream makes every later hop pay for the noise.
2. Webhook Relaydeliver
HMAC-signed delivery with idempotency keys, exponential-backoff retries, and a dead-letter queue.
What breaks here: Delivery is where silent loss happens. Without per-attempt records and a DLQ, a failed handoff looks identical to one that never occurred.
3. Switchyardroute
Normalises the payload, enriches and scores it, and routes it into the tool sales actually works in.
What breaks here: Routing is where speed-to-lead is won or lost, and where "assigned" quietly gets mistaken for "touched".
4. Distilldedup
Embedding-based duplicate detection with a human review queue and reversible merges.
What breaks here: Rule-based matching misses the duplicates that matter — same person, three email forms; same company, four spellings.
5. Splitstreamvariant exposure
Sticky assignment with calibrated decision rules and sample-ratio-mismatch detection.
What breaks here: Naive experiment stopping rules produce false positives under continuous peeking. Calibration is the difference between a result and a coincidence.
Why two different CRMs
Inkwell and Distill target HubSpot. Switchyard targets ClickUp. That is deliberate, not an oversight: sales operations at smaller shops runs in the tool the work already lives in, and a pipeline that only speaks to one CRM is a pipeline that only works for one kind of buyer. Two destinations in the same trace is the proof the stack is CRM-agnostic.
Bridged and direct hops
Reading the five services’ source turned up something more interesting than the console: they cannot actually talk to each other. Inkwell’s webhook destinations send a fixed header set with no Authorization support, and Webhook Relay’s event ingest requires both a credential and an envelope Inkwell cannot produce. One hop later, Webhook Relay signs deliveries with one HMAC scheme and Switchyard verifies a different one.
So Mainline stands in the middle for those two handoffs. Traces label them bridged, and because every bridged hop is a child of the root span, the waterfall renders flat. That flat shape is the honest picture of five services that were never designed to interoperate.
The fix is a shared contract — W3C trace context, one webhook signing standard, one idempotency semantic — adopted by all five. Once a handoff is real, its hop is labelled direct and parents to the hop before it, so the waterfall nests instead. Nothing in the view changes; the shape changes because the system did.
A service whose adoption is deliberately deferred keeps its bridge, and the trace keeps saying so. Bridged is a durable state, not a placeholder.
Look at a trace