Teams adoption metrics

19 Aug 2026

Teams adoption metrics that actually mean something

Every Teams rollout is declared a success on the same evidence: the active user count went up. It went up because the number counts things nobody would call adoption. Below are the numbers that come out of the Microsoft reports in real tenants, and what each one turned out to mean once you read the definition underneath it.

D180
longest window the report offers
48 h
before a day's activity appears
30 days
how far back a single day can be queried
1 flag
turns a status change into an active user

"Active" is a generous word

The Teams user activity export ships a column called Has Other Action, and Microsoft's own definition of it is the whole problem: the user is active but performed activities other than messaging, calling or meeting — their examples being changing the Teams status or the status message, or opening a channel post without replying.

That row has a Last Activity Date. It counts toward your active user total. It represents someone who left Teams running in the background, which is what happens by default on a Windows machine. Nothing about it is wrong — it is a presence signal and it is labelled as one. It only becomes a lie when it is summed into a headline and shown to the person who paid for the rollout.

The team-side report has its own version. Active channels are channels with at least one panel action, defined as any action taken by the user in the panel — reading included. A team can report active users and active channels for a period in which nobody wrote a word.

The pattern
Presence metrics and contribution metrics live in the same table, in adjacent columns, with no visual difference between them. Adoption reporting that doesn't separate the two measures whether the app is installed.

Licensed and active are two different tables

The Teams report only knows about people who did something. To find the people who did nothing you need the other report: getOffice365ActiveUserDetail, which returns Has Teams License, Teams Last Activity Date and — the column almost nobody uses — Teams License Assign Date, side by side per user.

Those three fields answer the question the rollout was actually about. A licence assigned in March with an empty last activity date is a user who never started. A last activity date six weeks after the assign date is a user who started late, which is a training problem, not a licensing one. The same join is what turns a dormant account from a hunch into a line item.

ONE ROW, FOUR VERY DIFFERENT PEOPLE Has Teams License one licensed user Never started Last Activity Date empty Present only Has Other Action, 0 messages Meeting-only Meetings Attended > 0, 0 posts Contributing Post or Reply Messages > 0 licence to reclaim counted as active anyway Teams is their phone the rollout worked here

Meetings and chat are not one number

The user detail CSV carries eleven meeting-related columns, and they do not add up. Microsoft states plainly that Meetings Organized Count might not be the sum of the ad hoc, one-time and recurring columns, because unclassified meetings are excluded from the export. Meeting Count is being phased out in favour of Meetings Attended Count, and the two currently share a definition — a chart built on the old column will one day flatline for reasons that have nothing to do with your users.

Duration is the other trap. Audio duration counts the entire meeting or call if the user sent or received audio, not the time they spent speaking or unmuted. It is a measure of time in the room, and a non-optimised VDI client can post minutes with no audio use at all.

The question The report The column that answers it
Who never started? getOffice365ActiveUserDetail Teams License Assign Date vs Teams Last Activity Date
Who is present but silent? getTeamsUserActivityUserDetail Has Other Action, with Post and Reply Messages at zero
Which teams are dead? getTeamsTeamActivityDetail Last Activity Date, per team, against Active Users
Is anyone outside using it? getTeamsTeamActivityDetail Guests and Active External Users

Dead teams don't announce themselves

The per-team export has no inactive flag. What it has is Last Activity Date — the latest date any member committed an action — next to Active Users, Active Channels, Posts and Replies. A team with a last activity date from eleven months ago and zero posts is the artefact of a project that ended, still holding its channels, its files and its membership.

Two counting rules matter when you rank them. Posts counts only messages originally created in a channel, so a cross-posted message is attributed to its origin and never to the channels that received it — a team that mostly receives announcements will look quieter than it is. And metric counts cover the Teams client's built-in features only: posts made by an app or an email into a channel don't appear. An integration-driven team can read as abandoned while a bot fills it daily.

Three numbers that survive scrutiny

Licensed and never active, as a count and a percentage, with the assign date so the age of the failure is visible. Contributing users, defined as Post or Reply Messages above zero, tracked over D30 rather than D7 so a holiday week doesn't move it. And teams with no activity in 90 days, listed by name, because that one comes with an action attached.

None of these are hard to compute. They are hard to keep: 180 days is the longest window the API offers, a single day can only be queried for the past 30, and the report you exported last quarter is the only copy of last quarter that will ever exist. GraphPaaS pulls the Teams reports per tenant on a schedule and stores them, so adoption becomes a trend line instead of a screenshot — the same reason the numbers behind right-sizing licences are only useful once you have more than one month of them.

Sources
GraphPaaS

Teams activity, licensed-but-never-active users and dead teams per tenant — kept as history, not as a screenshot.

See your Teams adoption →

Newsletter

Get the next article by email

Practical M365 & Azure cost pieces like this one. No spam, unsubscribe anytime.