To export user activity in Microsoft Teams, download the Teams User Activity report with Get-MgReportTeamUserActivityUserDetail and write it to CSV. It gives each person's chat messages, calls and meetings over 7, 30, 90 or 180 days and their last activity date, runs a day or more behind, and names no one while your tenant conceals names in usage reports.
| Method | Best fit |
|---|---|
| PowerShell | A CSV of each person's Teams messages, calls and meetings, least recently active first. |
| Admin centre | A look at Microsoft's report, or a one-off CSV of every column. |
| Altivane | Recommended for licence and adoption reviews, with days inactive worked out and a workbook to keep. |
Before you start
Use an account that can view usage reports, such as Reports Reader or Teams Administrator. Usage Summary Reports Reader sees no user details. The PowerShell example requests Reports.; your organisation may require administrator consent.
Know what the report covers. Microsoft says usage reports typically become available within 24 to 72 hours and can take several days. The counts include what people do in the Teams client, not posts made by apps or emails sent into a channel. Microsoft deletes a deleted user's usage data within 30 days. The examples read and export; they change no account or setting.
Option 1
Export Teams user activity with PowerShell
Install the modules once, then connect and download the report. It arrives as a CSV file, so the script reads it, keeps the main columns and exports it least recently active first.
# Install once, if the modules are not already installed.
Install-Module Microsoft.Graph.Authentication, Microsoft.Graph.Reports -Scope CurrentUser$ErrorActionPreference = 'Stop'
Connect-MgGraph -Scopes 'Reports.Read.All' -NoWelcome
try {
$download = Join-Path $PWD 'teams-activity-download.csv'
Get-MgReportTeamUserActivityUserDetail -Period D30 -OutFile $download
$rows = @(Import-Csv -Path $download)
Remove-Item -Path $download
$report = @(foreach ($row in $rows) {
if ($row.'Is Deleted' -eq 'True') { continue }
[pscustomobject]@{
User = $row.'User Principal Name'
LastActivity = $row.'Last Activity Date'
TeamChatMessages = [int64]$row.'Team Chat Message Count'
PrivateChatMessages = [int64]$row.'Private Chat Message Count'
Calls = [int64]$row.'Call Count'
Meetings = [int64]$row.'Meeting Count'
MeetingsOrganised = [int64]$row.'Meetings Organized Count'
Licensed = $row.'Is Licensed'
ReportRefreshed = $row.'Report Refresh Date'
}
})
if ($report.Count -eq 0) {
Write-Output 'The Teams User Activity report returned no users.'
} else {
$report | Sort-Object LastActivity, User |
Export-Csv -Path './teams-user-activity.csv' -NoTypeInformation -Encoding utf8
Write-Output "$($report.Count) users exported."
}
} finally {
Disconnect-MgGraph | Out-Null
}The CSV has 1 row for each person, those with no activity first because their last activity date is blank. -Period D30 sets the window for the counts; D7, D90 and D180 also work. The last activity date is the latest day the person did anything in Teams, whatever the period. The script leaves out deleted users; remove the Is Deleted line to keep them.
Check a single person
The report has no per-person filter, so read 1 person from the CSV.
# Reads the CSV the export wrote. Replace the example account.
Import-Csv -Path './teams-user-activity.csv' |
Where-Object { $_.User -eq 'person@example.com' } |
Select-Object User, LastActivity, TeamChatMessages, Calls, MeetingsOption 2
Export the Teams User Activity report from the admin centre
- Sign in to the Microsoft 365 admin centre for the correct tenant.
- Go to Reports > Usage. If Reports is missing, select Show all first.
- Under Reports, select Microsoft Teams, then the User activity tab.
- Select Choose columns to add or remove columns, then Export to download every user's data as a CSV file.
This suits a quick look or a one-off file. It does not suit a regular review: you sort the file and work out days inactive yourself each time, and audio, video and screen share time come in ISO 8601 duration format, such as PT1H30M, rather than as minutes.
Option 3 ยท Recommended for licence and adoption reviews
Run Altivane's Teams User Activity report
- Open Altivane and choose the tenant.
- Run the Teams User Activity report for Teams.
- Open the Excel workbook and read the table of the same name, least recently active first: User, Last Activity, Days Inactive, Team Chat Messages, Private Chat Messages, Calls, Meetings, Meetings Organised and Licensed.
- Run the Team Inventory report next for the same picture team by team.
Altivane reads the same report over 30 days, leaves out deleted users and works out each person's days since their last activity, which the other 2 methods leave to you. While the tenant hides names in usage reports, each user shows as Hidden, and the counts are still there.
Contact usCommon questions
Why does the report show strings of letters and numbers instead of names?
Microsoft hides user, group and site names in usage reports by default, and the setting applies to Microsoft Graph too. A Global Administrator can turn it off in the Microsoft 365 admin centre: Settings > Org settings, the Services tab, Reports, then clear Conceal user, group, and site names in all reports. Microsoft logs showing names in the Purview audit log, so check your privacy rules first.
Why does a person who used Teams today show no activity?
The report runs behind. Microsoft says data typically becomes available within 24 to 72 hours, so today's activity appears in a later download.
Does no Teams activity mean the person is inactive?
Not on its own: they may use mail or files and not Teams. Check their sign-in activity too; see how to find inactive users in Microsoft Entra ID.
Microsoft references
Technical references checked on 7 November 2026. The example scripts have been reviewed and syntax checked; they have not been run against a live tenant.