How do you tie a phone call to a job when the two systems share no ID?
You match on the caller's number plus a time window. Take the call's normalized number, look for customer or job records created or updated shortly after the call, and rank candidates by how close they are in time. Most calls resolve cleanly. The rest — shared numbers, callbacks, jobs booked days later — should be reported as unmatched rather than forced into the nearest guess.
The basic join, and why it works most of the time
Office staff create the job while the customer is on the phone or immediately after. That behavior gives you a strong temporal signal: a customer record created within a short window of an inbound call from the same number is almost certainly that call.
Normalize both numbers to a canonical digit format first, because the phone platform and the field service platform will disagree on formatting. Then search for records whose creation timestamp falls inside a window that starts at the call and extends a modest amount of time past it. Score candidates by proximity and take the best.
The cases that need more than proximity
- Delayed booking. The customer calls Tuesday and books Thursday. Widen the window and you gain those matches but invite false positives. Handle them as a second pass with a lower confidence label rather than by loosening the primary rule.
- Shared numbers. Property managers, landlords and offices whose single line appears on dozens of records. Detect high-frequency numbers and exclude them from automatic matching entirely.
- Callbacks. Multiple calls about the same job. Only the first should be credited as the originating contact; the rest are service calls and should be labeled as such.
- Number changed at intake. The customer calls from a mobile and gives a home number for the record. No timestamp trick fixes this; the only remedy is capturing the calling number into the record automatically.
Design the unmatched bucket on purpose
Every matching system needs a stated confidence and a visible unmatched rate. A pipeline that silently attributes every call to the nearest job produces a report that always sums neatly and is quietly wrong. One that reports a match rate lets a reader weigh the conclusion.
In practice, publish the number: this period, a stated share of inbound calls resolved to a job at high confidence, a share at low confidence, and a share not at all. When the high-confidence share drops, something changed — a new tracking number went live untracked, or an intake process moved. That early warning is worth more than the extra percentage points a looser rule would buy. This discipline runs through our call intelligence and marketing intelligence work.
The better long-term fix
Matching after the fact is a workaround for a missing identifier. Where the platforms allow it, write the call identifier into a field on the customer or job at creation time — many field service systems accept a custom field through their API — and the join becomes exact.
That takes coordination between the phone platform, the intake workflow and the field service system, which is ordinary integration work. It is worth doing once rather than maintaining probabilistic matching forever.
Topics: call tracking · matching · attribution · integration
Have a version of this question about your own business?
The useful answer usually depends on which systems you run and how they're connected. That's a conversation, not a blog post.