Last-click attribution tells you content does not work, right when it is starting to. Here is the lagged, assisted content attribution model we run instead.

Six hours was killing our conversion rate
For a long time our median first-response time to an inbound lead was about six hours. A form came in, it landed in an inbox, and eventually a human noticed it, looked the person up, decided who should own it, and replied. By then the prospect had often filled out two competitors' forms and talked to whoever answered first.
We rebuilt the whole path in n8n. Median response is now 90 seconds, measured from form submit to the first human-quality touch. Here is exactly how the workflow runs and where the time goes.
The five stages and what each one costs in time
The workflow has five stages: capture, enrich, score, assign, alert. The total budget is 90 seconds, and most of that is spent waiting on one external API.
Capture (under 1 second)
The form posts to an n8n webhook node rather than straight into a CRM. The webhook is the entry point because it lets us normalize before anything downstream sees the data. We dedup immediately: we hash the email and check it against existing leads and existing clients. If this person is already a client or an active deal, the workflow routes to a different branch entirely so we never cold-pitch a current relationship. That relationship check is the same five-way gate we use on the cold-email side.
We also drop the obvious junk here: role addresses like info@ and sales@, free-mail domains for a B2B form, and known competitor domains. Roughly 18 percent of raw submissions get filtered at this gate, which keeps the expensive enrichment step from burning credits on garbage.
Enrich (10 to 45 seconds)
This is where the time actually goes. We call an enrichment provider to match the person and their company: title, headcount, industry, tech stack, recent funding. This is a network call to a third party, so it is the slow part of the budget and the part with the most variance. A clean match returns in around 10 seconds. A cold lookup that has to fall back to a site-scrape heuristic can take 40 or more.
We wrap this call in the same dispatch helper we use for every outbound integration, which adds a Bearer header, retries on 429 and 5xx, and carries an idempotency key so a retry never double-charges us. If enrichment fully fails, the workflow does not stall. It continues with whatever the form gave us and tags the lead as unenriched so a human knows the score is provisional.
Score (under 1 second)
Scoring is deterministic rather than an LLM call, because we want it fast and explainable. We run a weighted rule set over the enriched fields. Headcount in our target band adds points. A title with buying authority adds points. A matching industry adds points. A free-mail domain or a tiny company subtracts. The output is a 0 to 100 score and a tier: hot, warm, or nurture.
Keeping this as plain rules means it runs in a couple of milliseconds and any operator can read the score and know why it came out that way. We tried an LLM scorer early on and dropped it; it added two seconds and a black box for no measurable lift over the rule set.
Assign (under 1 second)
Assignment is a routing table. Hot leads above 70 go to a named account executive by round-robin, balanced on current open-lead count so nobody gets buried. Warm leads route to a BDR for qualification. Nurture leads go straight into a drip sequence and never page a human. Territory and segment can override the round-robin: an enterprise-sized company always routes to the senior rep regardless of whose turn it is.
The assignment writes a row into the sales pipeline with the source, the score, and the enrichment payload attached, so the owner opens it with full context instead of a bare email address.
Alert (1 to 3 seconds)
The owner gets pinged in chat with the lead, the score, the reason for the score, and a one-line suggested opener the enrichment data makes possible. For hot leads we also fire an SMS, because a chat ping can sit unseen and the whole point is speed. The alert includes a deep link to the pipeline row so the rep is one tap from replying.
A real lead through the pipe
Last month a head of growth at a 60-person SaaS company filled out our contact form at what turned out to be 9:14 and 02 seconds.
By 9:14:03 the webhook had captured and deduped her. She was a new contact on a business domain with no competitor match, so she passed the gate. By 9:14:31 enrichment had matched her: VP-level title, 60 employees, martech stack that overlaps ours, Series A six months ago. Scoring put her at 84, hot. Assignment round-robined her to an AE who had the fewest open leads, wrote the pipeline row, and by 9:14:33 the AE had a chat ping and an SMS that read: VP Growth, 60-person SaaS, recently funded, score 84, opener referencing their funding round. The AE replied at 9:15:40. Total elapsed: 98 seconds, of which 28 was the enrichment API.
She booked a call that afternoon and told the AE she had filled out three forms that morning and we were the only one who replied before lunch.
The branches we built for the cases that break naive routing
A happy-path workflow demos well and dies in production the first week, because real inbound is messy. Three branches carry most of the mess.
The duplicate-form branch handles people who submit twice in a short window, which happens constantly when someone is not sure the first submit worked. We debounce on the email hash for 10 minutes, so a second submission within that window updates the existing pipeline row instead of creating a new one and paging a second rep. Before this, two reps would race to reply to the same person and one of them looked foolish.
The existing-relationship branch is the one that protects revenue. If the email matches a current client, an open deal, or a prior positive reply, the lead never enters the cold routing at all. It pings the existing account owner instead, with a note that their contact filled out a form, which is usually an expansion signal worth more than a new logo. Cold-pitching your own customer is the kind of mistake that ends relationships, and the dedup gate at capture is what prevents it.
The out-of-hours branch decides what to do at 3am. Hot leads still fire the SMS, because a genuinely hot lead at 3am is worth waking up for and the rep can choose to ignore it. Warm and nurture leads queue and assign at the start of business hours, so nobody gets a buzz at dawn over a lead that can wait. The branch reads the rep's local timezone rather than the server's, so a distributed team gets sane behavior.
What made it reliable as well as fast
Speed is easy to demo and hard to keep. Three things keep this workflow honest in production.
Every external call goes through a retry-and-idempotency wrapper, so a flaky enrichment provider degrades the lead to unenriched instead of crashing the run. The whole workflow is wrapped so that if a run hangs past a stale window, it gets marked and an alert fires rather than silently dying. And we log every stage timing, so when median creeps up we can see immediately whether it was the enrichment provider or our own scoring that slowed down. It is almost always the provider.
What we measure to know it is still working
Fast on the day you launch means nothing if it quietly degrades. We track four numbers on a rolling basis. Median time-to-first-touch, which is the headline 90 seconds and the one we alert on if it crosses three minutes. Enrichment match rate, because a falling match rate means more leads scored on thin data and routed wrong. Misroute rate, measured by how often a rep manually reassigns a lead, which tells us the scoring rules need a tune. And SMS opt-out rate on the hot-lead alerts, because over-alerting a rep is just as much a failure as under-alerting, and a rising opt-out rate means the hot threshold is set too low.
Those four numbers live on a dashboard the sales lead checks weekly. When misroute rate climbed one month, we traced it to a new industry the client had started selling into that our scoring rules did not recognize, added the industry weighting, and it dropped back. The workflow is not set-and-forget. It is a system with a feedback loop, and the loop is what keeps the 90 seconds honest three months later instead of just on launch day.
Six hours to 90 seconds was not one clever trick. It was moving the human from the front of the line, where they were the bottleneck, to the end, where they do the one thing automation cannot: have the conversation. More on how we wire workflows like this at arthea.ai.




Architecture Notes
Occasional insights on infrastructure, conversion systems, retention architecture, and AI deployment, shared when they’re worth reading.




