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.
"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.
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.
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.
- Microsoft Teams user activity report — the Has Other Action definition, the meeting metric names, and the audio duration caveat.
- getTeamsUserActivityUserDetail — the full CSV column list, D7 to D180 periods, and the note that the organized-meeting columns don't sum.
- getOffice365ActiveUserDetail — Has Teams License, Teams Last Activity Date and Teams License Assign Date in one row.
- getTeamsTeamActivityDetail — the per-team columns, including Last Activity Date, Guests and Active External Users.
- Microsoft Teams team usage report — panel actions, the 48-hour data delay, the cross-post rule and the integration exclusion.
Teams activity, licensed-but-never-active users and dead teams per tenant — kept as history, not as a screenshot.
See your Teams adoption →