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.

This sample's CDRs, by billing outcome
Billed successfully
3/5
Unbillable (incomplete)
2/5

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.