Microsoft Teams reporting

How to export user activity in Microsoft Teams

Export each person's Teams messages, calls and meetings with Microsoft Graph PowerShell, download the User activity report from the admin centre, or run Altivane's Teams User Activity report.

By the Published

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.

Choose the method that fits the job
MethodBest fit
PowerShellA CSV of each person's Teams messages, calls and meetings, least recently active first.
Admin centreA look at Microsoft's report, or a one-off CSV of every column.
AltivaneRecommended 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.Read.All; 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.

PowerShell
# Install once, if the modules are not already installed.
Install-Module Microsoft.Graph.Authentication, Microsoft.Graph.Reports -Scope CurrentUser
PowerShell
$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.

PowerShell
# 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, Meetings

Option 2

Export the Teams User Activity report from the admin centre

  1. Sign in to the Microsoft 365 admin centre for the correct tenant.
  2. Go to Reports > Usage. If Reports is missing, select Show all first.
  3. Under Reports, select Microsoft Teams, then the User activity tab.
  4. 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.

Common 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.

Talk to us about Altivane

Questions, or pricing? Get in touch.

Contact us