Call Detail Record (CDR) Interpreter

Since there are many free tools available, may I kindly ask if any team member knows a CDR tool that are available for free to interpret MSISDN call detail records?

Free tools that read and explain call detail records

:telephone_receiver: Drop the records in, get answers out β€” free programs and methods for MSISDN call detail records, zero setup first.

:eye: Instant view (nothing to install)

:broom: Messy files first

:package: The dedicated free tools

:compass: Twin and shape tools

:open_book: Read the meaning

:unlocked: Binary and odd formats

:world_map: Towers become maps

:mobile_phone: Your own records

:graduation_cap: Practice first

:high_voltage: Start: drop the file into Call Log Explorer tonight.

Yes β€” for mobile-operator CDRs containing MSISDN, start with a local/offline tool rather than uploading subscriber data to a random website.

Free options

Python CDR Analyzer β€” best starting point

β†’ Open-source GitHub project
β†’ Imports CSV files
β†’ Searches frequent callers and contacts
β†’ Supports IMEI, dates, coordinates, cell locations, call type, and inbound/outbound analysis
β†’ Expected fields include PartyA, PartyB, IMSI, IMEI, LogDate, LAT, LNG, ADDR, and call type
β†’ Runs locally with Python, so it does not require a cloud upload.

git clone https://github.com/Vega-4n6/CDR_Analyzer.gitcd CDR_Analyzerpip install -r requirements.txtpython CDRAnalyzer.py

No-code option β€” Excel or LibreOffice

For a small or medium CSV:

  1. Import the file.
  2. Keep MSISDN columns as text, not numbers.
  3. Convert date/time into one proper timestamp column.
  4. Create pivot tables for:
    • Most frequent contacts
    • Total calls by day/hour
    • Incoming vs outgoing calls
    • Total duration by MSISDN
    • Calls by cell ID or location
    • IMEI changes over time

Excel can filter structured CDR files and use pivot tables/charts for call-pattern analysis; LibreOffice Calc can handle the same basic workflow for free.

Larger data sets β€” CDR-Stats

CDR-Stats is open-source and provides browser-based reports, mediation, rating, alarms, fraud-pattern analysis, and multi-source processing. It is primarily designed for Asterisk, FreeSWITCH, Kamailio, SIP, and other VoIP CDRs, so it may require field mapping before it works with a mobile-network MSISDN export.

Important distinction

Mobile CDR       β†’ MSISDN, IMSI, IMEI, cell ID, tower, SMS, locationVoIP CDR         β†’ SIP user, caller ID, destination, codec, MOS, packet loss

CDR-Stats is strong for VoIP. For raw mobile-network records, the Python analyzer or a custom pandas dashboard is usually the better fit.

Minimum useful column mapping

CDR meaning Common column names
Main subscriber MSISDN, PartyA, Calling_Number
Other party PartyB, Called_Number, B_Number
Date/time Call_Start, LogDate, Call_Originating_Time
Duration Duration, Duration_Seconds
Direction IN, OUT, Inbound, Outbound
Device IMEI
Subscriber identity IMSI
Tower/site Cell_ID, CGI, LAC, Site_ID
Location LAT, LNG, ADDR
Event type CALL_TYPE, SMS, DATA

My pick

  • Under 100,000 rows: Excel or LibreOffice
  • 100,000–5 million rows: Python + pandas
  • Large recurring telecom imports: CDR-Stats or a custom PostgreSQL dashboard
  • Need maps and investigation timelines: a local CDR analyzer with cell-site coordinates

Only process CDRs you are authorized to handle, and keep real MSISDN, IMSI, IMEI, and location data offline. Use dummy numbers when testing or asking for technical help.

Ze380y’s list covers the dedicated tools really well β€” I’ll add a workflow note from the AI side, since that’s where I do my first pass.

When I get a carrier CSV export, I do three things before asking any model anything: (1) normalize the timestamps to one format β€” mixed timestamp formats are the number one reason model summaries come back wrong; (2) split files over the upload limit into chunks by date range (Claude takes around 30 MB, Gemini around 100 MB) so nothing gets silently truncated mid-file; (3) strip or hash the actual phone numbers if the data is real and sensitive β€” cloud models are great for analysis, but I don’t upload raw PII to them.

Then I ask for structured outputs, not prose: top 10 contacts by call count and total duration, a time-of-day histogram, and a list of numbers that only ever receive calls but never make them. Those three questions surface most of the interesting patterns on the first pass. And I always spot-check the model’s numbers against a quick manual filter in the spreadsheet β€” models occasionally miscount when the CSV has quoted commas or multi-line fields.

For repeat work, I save the prompt that worked as a template and reuse it. The dedicated tools are better for maps and timelines, but for β€œwhat’s the story in this file” the chatbot pass saves me the most time.

:headphone: Your call log is a piece of music, a constellation, and a diary

@Wantok β€” @Grace2077’s three questions are the right ones, and @Indianapolis already handed you the local parser. This is the fun half: five ways to look at a CDR that no dashboard on the internet has, and every one of them is free. :bullseye:

:headphone: Hear the pattern instead of reading it

Timestamps are time, and time is rhythm. Map the hour to a note and the duration to its length, and a call log becomes music:

  • TwoTone β€” built with the Google News Initiative: load a CSV, choose which column becomes pitch, hit play. You hear the day
  • DataSonifyer β€” the same idea with a different scale, no account
  • Sonic Pi’s sonification cookbook β€” when you want to compose it yourself, with the normalise function ready to copy

A number that calls every nine minutes sounds wrong instantly. On a table of 4,000 rows, you would never see it.

:milky_way: Draw it without writing a line of code

  • RAWGraphs β€” 30 chart models, drag your columns onto the axes, export SVG. Your data never leaves the browser, which matters when every row is a phone number
  • OpenRefine β€” the quiet hero: cluster +92 300…, 0300… and +92300… into one person before you analyse anything

:hole: The one nobody thinks of: the silence

The gaps between calls are the interesting part. A phone that goes quiet for nine hours was off, asleep, or somewhere else. Plot the gap length and you get a diary:

SELECT timestamp,
       timestamp - LAG(timestamp) OVER (PARTITION BY msisdn ORDER BY timestamp) AS silent_for
FROM cdr ORDER BY silent_for DESC LIMIT 20;

The longest silences are the nights. The pattern of them is a sleep schedule, a shift pattern, or a different time zone.

:robot: The bot radar

Calls with zero duration in both directions are a machine. Count them per number, then look at who they dialled β€” robocallers, IVR systems and auto-diallers all have the same signature, and it takes one query to separate them from people.

:world_map: And the map that started this

Cell IDs become coordinates through OpenCelliD or beaconDB, then kepler.gl animates the trail. One month of records becomes a movement video. :world_map:

:test_tube: The join worth keeping

SELECT a.msisdn, b.msisdn, a.cell_id, a.timestamp
FROM cdr a JOIN cdr b ON a.cell_id = b.cell_id AND a.msisdn < b.msisdn
 AND ABS(strftime('%s', a.timestamp) - strftime('%s', b.timestamp)) < 300;

Same cell, five minutes apart β€” the query behind β€œwere these two people actually together”.

The two habits that make any of this trustworthy

Normalise every timestamp into one column, one format, one time zone. Keep MSISDN and IMSI as text so the leading zeros survive the import.

Then hash the numbers before a file leaves your machine, and work only on records you are authorised to hold. Same analysis, and the rest of the file stays useful.