Skip to content

App & activation reports

Which Microsoft 365 apps people use, and where Office licenses are assigned but not activated.

flowchart LR
    A["get_m365_app_user_counts"] --> A1["Active users per app, per day"]
    B["get_office365_activation_counts"] --> B1["Installs activated, by platform"]
    C["get_office365_activations_user_counts"] --> C1["Assigned vs activated users"]

Microsoft 365 apps

Active users per application (Outlook, Word, Excel, PowerPoint, OneNote, Teams, and Copilot when licensed) for the latest day, with the peak over the period.

rows = client.reports.get_m365_app_user_counts("D30").execute_query().csv_rows()
apps = [c for c in rows[0] if c not in ("Report Refresh Date", "Report Period", "Report Date")]

Office activations

Activated Office installs per product and platform, and the assigned-vs-activated gap per product — the reclaimable-license signal.

counts = client.reports.get_office365_activation_counts().execute_query().csv_rows()
users = client.reports.get_office365_activations_user_counts().execute_query().csv_rows()

get_office365_activation_counts() takes no period; the activation reports are snapshots. Tenants without Office installs return no rows and the script says so.

Both scripts need the Reports.Read.All application permission.