A call detail record is a real financial instrument
A Call Detail Record (CDR), a caller, a duration, a rate, isn't just a log line, it's the raw material a billing system turns into an actual invoice line. When a CDR is missing a field, the call still happened, the customer still used the network, and the money for it doesn't automatically show up anywhere else. It just doesn't get billed.
graph LR
A[Call Happens] --> B[CDR Generated]
B --> C{Complete?}
C -->|Yes| D[Billing Mediation]
D --> E[Invoiced, Revenue Captured]
C -->|Missing duration<br/>or rate code| F[Cannot Be Rated]
F --> G[Silently Unbilled]
Five real CDRs, two with a real, common gap
cdrs = pd.DataFrame([
{"call_id": "CDR001", "duration_sec": 180, "rate_per_min": 0.05},
{"call_id": "CDR002", "duration_sec": None, "rate_per_min": 0.05}, # duration lost in transit
{"call_id": "CDR003", "duration_sec": 340, "rate_per_min": None}, # rate code missing
{"call_id": "CDR004", "duration_sec": 95, "rate_per_min": 0.05},
{"call_id": "CDR005", "duration_sec": 610, "rate_per_min": 0.05},
])
A missing duration, a missing rate code, exactly the kind of thing that happens during real transmission at real scale: a dropped packet, a mediation step that didn't fully process a record, a rate table lookup that failed silently for one call type.
Trying to actually bill them
def compute_charge(row):
if pd.isna(row["duration_sec"]) or pd.isna(row["rate_per_min"]):
return None
return round((row["duration_sec"] / 60) * row["rate_per_min"], 4)
cdrs["charge"] = cdrs.apply(compute_charge, axis=1)
call_id duration_sec rate_per_min charge
0 CDR001 180.0 0.05 0.1500
1 CDR002 NaN 0.05 NaN
2 CDR003 340.0 NaN NaN
3 CDR004 95.0 0.05 0.0792
4 CDR005 610.0 0.05 0.5083
2 of 5 real CDRs are incomplete and cannot be billed as-is
real revenue successfully captured: $0.74
Two of five real calls in this sample, real network usage that genuinely happened, come back with no charge at all, not because the call was free, but because the record needed to bill it is incomplete. Nothing about the missing field makes the underlying call any less real or any less billable in principle; it just makes it invisible to a billing system that can't compute a charge from a missing number.
Why this is a genuine, documented industry problem, not a small-sample fluke
At real carrier scale, petabytes of CDR and telemetry data flowing continuously, this exact mechanism, a missing field making an otherwise-real call unbillable, is a documented, industry-recognized source of what the industry itself calls revenue leakage. Incomplete CDRs are named directly as a persistent, real problem for telecom billing, and errors or gaps in CDR processing are linked directly to real revenue leakage, billing disputes, and regulatory exposure, not a hypothetical risk (Medium, EarnBill). The five-record example above shows the exact mechanism at a scale small enough to see directly; the same gap, at real production volume, is what that revenue leakage actually looks like from the inside.
Why this specifically evades normal monitoring
A CDR pipeline that's dropping 2% of records to incompleteness doesn't look broken from the outside. Call volumes look roughly right, the pipeline reports success, and the missing revenue doesn't announce itself anywhere, it's simply money that was never billed, with no natural alert distinguishing "this call was free" from "this call couldn't be rated." Finding it requires deliberately measuring completeness, the fraction of real CDRs with every field needed to compute a charge, as its own tracked number, not inferring it from whether the pipeline technically ran.
The takeaway
An incomplete CDR isn't a rounding error, it's a real call that already happened, that a business has already delivered the service for, quietly failing to turn into revenue because one field didn't make it through cleanly. Measuring CDR completeness directly, the same check demonstrated on five records above, scaled to real volume, is what turns invisible, ongoing revenue leakage into a specific, trackable number someone can actually act on.
Comments
Loading comments...