Every call matched to the rep who took it — automation case study

A multi-brand B2B retailer takes a large share of its orders by phone. Its call tracking knew where each call came from, and its phone system knew who answered. We connected the two with a low-cost automation that tags every answered call, across all six of its brands, with the name of the rep who took it.

4,000 calls processed · 1 error · ~390 automation operations a day · 6 brands covered

The campaigns were measured. The reps weren’t.

For a lot of B2B sellers, the website isn’t where the sale closes. A buyer finds a product online, has a question about lead times, volume pricing or delivery, and picks up the phone. That call is often the most valuable moment in the whole journey.

This retailer had done the hard part of measuring it. Every brand’s website used call tracking, so each inbound call was tied to the campaign, ad or search that produced it. Leadership could see which channels drove calls, and how many.

What they couldn’t see was what happened next. Once a call reached the sales floor, the trail went cold. There was no reliable way to say which rep answered a given call, and that left two practical problems unsolved:

  • Workload. Without knowing who handled which calls, there was no way to see whether calls were spread fairly across the team or piling up on a few people.
  • Commission. When a phone order closed, there was no record to settle who had taken the call that started it.

Before this project, answering either question wasn’t possible at all. The data simply didn’t exist in one place.

The Challenge: two systems, each holding half the answer

The information they needed already existed. It was just split across two systems that had never been introduced to each other.

  • CallRail knew the marketing source of every call: the campaign, keyword and landing page behind it.
  • Zoom Phone knew who answered it: the extension, the rep and the call’s path through the phone system.

On paper, that sounds like a simple join. In practice, three things made it hard:

  1. No shared call ID. CallRail and Zoom Phone each assign their own identifier to a call. Neither system knows the other’s, so there’s no key to match records on directly.
  2. Different clocks. The two systems record call times differently and across time zones, so “same time” isn’t reliable on its own.
  3. Ring groups. Many calls ring several people at once, or roll from one line to the next, before anyone picks up. The line that rang first isn’t necessarily the person who answered.

Matching on “the line that rang” would have quietly credited the wrong rep on a meaningful share of calls. For commission questions in particular, a report that’s confidently wrong is worse than no report at all.

Our Approach

Rather than build a data warehouse or a new reporting tool, we built a small, two-scenario pipeline on Make.com. It uses CallRail webhooks, Zoom Phone’s call history and call routing data, and a Make data store to hold calls until they can be matched. It covers all six brands from a single setup.

1. Capture

The moment a tracked call comes in, CallRail sends a webhook to Make. The call is written to a queue in the data store with the details needed later: caller number, time and tracking source. Nothing is matched yet; the goal at this stage is simply to never miss a call.

2. Match

Every four hours, a second scenario works through the queue. For each call, it looks up Zoom Phone’s call history for the same caller number within a 30-minute window. The caller’s number is the one thing both systems reliably record, and the time window absorbs clock differences without letting unrelated calls slip in.

3. Identify

A matching call in Zoom isn’t enough on its own, because of ring groups. So for each match, the automation reads the call’s routing path in Zoom Phone, the record of every extension it rang and who actually picked up. That’s what identifies the rep who answered, not just the line that rang first.

4. Write back

The rep’s name is written back onto the call in CallRail as a tag. Calls that can’t be matched, such as ones that were never answered, are retried on later runs and then exit cleanly after 24 hours. Nothing sits in the queue forever, and nobody has to clean it up by hand.

The Part That Was Harder Than It Looked

The build itself took only a few hours. The hard part was finding the approach.

The tempting fix for two systems with no shared ID is a cleverer join: fuzzy matching, more fields, more rules. That usually makes the logic harder to trust, not easier. The answer here was a stricter rule instead:

Join systems on what they reliably share, and give every record a clean exit.

Caller number and a tight time window are reliable in both systems. The routing path settles who actually picked up. And a 24-hour exit means every record ends in one of two states, matched or expired, so the data store stays clean without anyone babysitting it. Once that rule was clear, the implementation was straightforward.

That principle is also why the automation is cheap to run. It does a small, predictable amount of work on a schedule instead of polling constantly, which keeps it to roughly 390 operations a day.

The Impact

  • Every answered call has a name. Each answered call from a tracked source, across all six brands, now carries the rep who took it, typically within hours on business days.
  • Staffing decisions are based on real call volume. Leadership can see how calls are spread across the team and staff the phones accordingly.
  • Commission questions have an answer. When a phone order closes, there’s a record of who took the call, so attribution is settled with data instead of memory.
  • Answers in the tools they already use. Rep names land directly in CallRail, so the call reports the team already relies on show campaign and rep side by side. There was no new dashboard to adopt.
  • Low cost, low maintenance. About 390 operations a day and one error across the first four months, with no manual lookups between systems.

Key Outcomes

  • 4,000 calls processed in the first four months
  • 1 error in the same period
  • All 6 brands covered by one automation
  • Rep attribution on every answered call from a tracked source
  • Built in a few hours once the matching approach was clear
  • Now used to guide staffing and commission attribution

The Takeaway

Most reporting gaps don’t come from missing data. They come from tools that each hold half the answer. Marketing knows the source; operations knows the outcome; nobody owns the join.

You don’t always need a warehouse, a CDP or a new platform to close that gap. Sometimes a small, well-designed automation that joins two systems on what they reliably share, and gives every record a clean exit, is enough. It costs little to run, it’s easy to explain, and the answer shows up where people already look.

Built with: CallRail · Zoom Phone API · Make.com · Webhooks · REST APIs

Common Questions

Can CallRail and Zoom Phone be integrated directly?

They don’t share a call ID, so there’s no simple one-to-one link between their records. In this project we matched calls on caller number within a time window, then used Zoom’s call routing data to identify who answered.

Why tag the rep in CallRail instead of building a dashboard?

Because the team already lived in CallRail’s reports. Putting the rep’s name there meant the answer showed up in a tool they trusted, with nothing new to adopt.

Does this work for calls that ring several reps?

Yes. That’s the reason for reading the routing path. It shows who actually picked up, not just which line rang first.

How long does something like this take to build?

Here, a few hours once the matching approach was clear. Most of the work is figuring out what the two systems reliably share; the automation itself is small.

Is Make.com reliable enough for this?

For this volume, yes: about 390 operations a day with one error in four months. Queuing calls first and matching on a schedule keeps it predictable and inexpensive.

Two Systems That Don’t Talk to Each Other?

If your call tracking, CRM or phone system each hold half the story, let’s talk about whether they can be connected.

Client identity anonymized.