Outbound call accounting is the easy half. Inbound reporting on Asterisk is where the numbers quietly go wrong — and the failure mode is not an obvious error, it is a dashboard that looks healthy while your customers wait. Here are the four mistakes that produce confidently wrong inbound metrics, and what each one should be measured against instead.
1. Service level measured per leg is always about 100%
This is the big one. A single inbound call is not one CDR row. It arrives on a trunk, hits an IVR, moves to a queue or ring group, rings several extensions and is finally answered by a person. Each hop writes its own record.
If you calculate "answered within 15 seconds" against individual legs, the IVR answers instantly, every time. Your service level tile reports 99–100% permanently, no matter how long real callers actually waited, and it never moves — which is the tell. A service level that never changes is not a good score, it is a broken measurement.
The correct unit is the call chain, not the leg. Group all the legs belonging to one call, take the caller's arrival as the earliest timestamp in that chain, and take the answer as the moment a human picked up — not the moment the IVR did. On Asterisk the human answer is the latest answer point across the chain's answered legs, precisely because the automated leg answers at almost exactly the arrival time. Measure arrival to that, and the number starts reflecting what callers experienced.
The same correction applies to average hold time, and it needs one extra guard: restrict the population to inbound chains. If outbound chains leak into a hold-time average, you can end up with a tile reporting more samples than your total inbound count on the same screen.
2. Ring groups make inbound calls disappear entirely
When a call arrives via a ring group, the PBX writes CDR records whose destination is the ring
group number — 600, say — rather than an extension. Reporting that identifies the extension
only from the source field silently skips every one of those calls. Not "counts them wrong":
skips them. Sites have looked at an inbound report showing zero calls for their busiest team
and assumed the feature was broken.
Handling it takes two passes: check the original destination for calls that went straight to an
extension, and parse the destination channel — SIP/206-00008671 yields extension 206 — for
ring group calls that were answered. Attribute only the answered leg, or every extension
that merely rang gets credited with a missed call, and your missed-call league table fills up
with people who did nothing wrong.
While you are there, make sure the ring group number itself cannot appear as a "missed
extension". Joining against your extension mapping keeps 600 out of a list that is supposed to
name people.
3. Counting rows instead of counting calls
Once chains are grouped correctly, one more habit inflates everything: counting CDR rows.
A three-leg call counted by row is three events. Counted properly, it is one call — and, if it was answered, one answered call rather than one answered plus two missed. Count distinct call identifiers rather than rows, and apply the same chain definition everywhere: dashboard tiles, hourly charts and the full reports. If your summary tile and your detail report use different grouping, they will disagree, and you will not know which one to believe.
4. Missed and abandoned are not the same metric
Most inbound reporting collapses these two into one number, and loses the actionable half.
- Missed means nobody picked up.
- Abandoned means the caller gave up while waiting and never reached a person.
They point at different problems. A high missed count with low abandonment suggests calls arriving outside staffed hours. High abandonment means people are queueing and giving up — a staffing or routing problem happening right now.
Abandonment is only useful if you exclude misdials. Someone who hangs up after two seconds dialled the wrong number; they are not a lost customer. Splitting abandoned calls by how long they waited separates the noise from the loss: under 5 seconds is a misdial, 5 to 30 seconds is a brief wait, and beyond 30 seconds is genuine lost business — the segment worth acting on.
One more measurement note: report the median wait rather than the mean, and publish the 90th percentile next to it. Averages hide the tail, and the tail is where your worst caller experiences live.
The metric that actually drives behaviour
Miss rate tells you what went wrong. Recovery rate — how many missed callers rang back and got through — tells you what it cost you. A team can have an uncomfortable miss rate and a healthy recovery rate, or a tidy miss rate and almost no recovery, and those are completely different conversations. It is also the one inbound number that reliably gets managers to act, because it converts directly into calls nobody ever called back.
How Q5000 reports this
Q5000's Inbound Dashboard is built on the corrected definitions above: chain-based service level measured from arrival to human answer, average hold time restricted to inbound chains, abandonment excluding misdials, median and 90th-percentile wait, a wait-time breakdown split into misdials, brief waits and lost business, and recovery rate as a first-class tile alongside total inbound, total missed and miss rate. Busy-hour and missed-call-by-hour charts use the same chain grouping, so tiles and charts agree by construction. Top missed extensions and top inbound callers come with per-row lookup for identifying unknown numbers.
Setting it up is the same SSH connection as everything else — connecting Q5000 to Asterisk or FreePBX covers that end to end.
Frequently asked questions
Why does my Asterisk service level report almost 100% all the time? Because it is being measured per CDR leg. The IVR answers instantly, so every call looks answered within seconds. Service level must be measured per call chain, from the caller's arrival to the moment a human answered.
Why do inbound calls to a ring group show as zero in my reports? Ring group calls write CDR records whose destination is the ring group number rather than an extension. Reporting that only reads the source field skips them entirely. The extension has to be recovered from the original destination or parsed from the destination channel, attributing only the answered leg.
What is the difference between a missed call and an abandoned call? Missed means nobody picked up. Abandoned means the caller hung up while waiting and never reached a person. They indicate different problems — missed often points to staffing hours, abandonment to queue wait times — so they should be reported separately.
How should I measure inbound wait times on Asterisk? Use the median rather than the mean, and publish the 90th percentile alongside it. Averages hide the long tail, which is where the worst caller experiences are. Exclude hang-ups under about five seconds as misdials so they don't flatter or distort the figure.