Leads were entering through three channels — and disappearing through all three.
Inbound calls hit a phone system that didn't talk to the CRM. Web form submissions created contacts but didn't always link to existing deals. Door-knocking entries were typed into a notes app at the end of the day, then re-keyed Monday morning.
The CRM showed clean data on the surface. Underneath, sales reps were guessing which of the three open deals on a contact a new inbound call referred to — or just creating a fourth.
"We knew leads were falling through. We didn't know which leads, or why, until someone got a complaint call.
Map the system before changing it. Find the one decision that mattered.
Two weeks of audit instead of building. Watched how leads actually moved. Read the CRM data, the call logs, the manual spreadsheets that filled the gaps. Interviewed the reps doing the reconciliation work.
The pattern emerged: most inbound events could be auto-logged safely. A small subset — the ones where a contact had two or more open deals — needed a human to disambiguate. The system didn't need to be smarter than people. It needed to know when to ask one.
A four-step routing workflow with one decision that mattered.
Built on the tools they already owned. Six weeks of build, test, document, deploy.
// Step 03: count open deals on contact const openDeals = deals.filter(d => d.stage !== 'closed'); if (openDeals.length <= 1) { // Safe to auto-log. No ambiguity. return autoLog(event, openDeals[0]); } // 2+ open deals → don't guess. Ask a human. return createDisambiguationTask({ event, contact, openDeals, owner: openDeals[0].owner });
The system isn't trying to be smart. It's trying to be honest — auto-logging only what it can verify, escalating what it can't. Reps stopped guessing. Reports started getting trusted. The Monday-morning reconciliation meeting got cancelled, then forgotten.
"It feels like the CRM is finally telling us the truth. We trust it now.