note

Graph call records: abandonment is something you infer, not a field you read

Lessons from building Teams call reporting on the Microsoft Graph callRecords API.

· Vernon Juelich

Microsoft GraphTeams PhoneReportingPowerShell

I built a daily call-reporting pipeline on communications/callRecords. These are the things I wish I’d known on day one.

There is no “abandoned” field

An abandoned queue call is a queue-routing session with no follow-on agent session. You have to infer it from the shape of the record. The same goes for “answered”, “transferred” and “voicemail”.

Classify structurally, never by name

It’s tempting to recognise queues by name, like “Sales CQ”. That breaks the moment you deploy to a second customer. Instead, classify by:

  • user-agent role, for queues and auto attendants
  • directory resolution, for real people
  • app ID, for third-party contact-centre services, kept in a shared registry

Call records arrive late

Records can take 25+ minutes to appear, and Microsoft documents up to 150. Don’t poll live. Run reports the next morning.

Not everything that looks like a call reached a queue

Some calls only reach a vendor’s IVR or greeting. Graph records them in the same shape as real queue calls, so you need the vendor’s own call-level export to separate them. That one detail explained most of the gap between two reporting systems that “disagreed”.

All writing Talk about this