Microsoft 365 Copilot seat licences
Connect a Microsoft 365 tenant with read-only admin consent to see which Copilot seats are used, what the unused ones cost, and which seats to reclaim.
Microsoft 365 Copilot is billed per seat, whether or not the person holding the seat uses it. The AI Gateway cannot see this spend, because Copilot requests never pass through it. AI Seat Licences reads your tenant’s licence and usage reports and shows which seats are used, which are not, and what the unused ones cost each month.

AI Estate → AI Gateway → Seat licences: purchased, assigned, and active seats, with what the unused and idle ones cost each month.
Before you start
- ZopNight permission:
cloud-account:createto connect the tenant. The built-in Admin role has it. Disconnecting needscloud-account:delete. A role can hold one without the other. - To see per-person rows: the Update member details permission (
user:update), Admin by default. See Who can see it. - A Microsoft admin in your tenant who can grant tenant-wide admin consent to application permissions.
- Microsoft 365 Copilot licences in the tenant. Seats appear only for people holding a Copilot licence.
- Optional: a per-seat monthly price in USD. Microsoft reports no charge for a full billing cycle after purchase, so have your contracted price ready if the tenant has not been invoiced yet.
- Optional: Microsoft’s concealed-names setting turned off, if you want usage per seat. See Concealed names.
How it works
What you see
Open Seat licences on AI Estate → AI Gateway, or on Costs → Reports → AI Spend. Both show the same view:
- Seats purchased, assigned, and active
- Time since each seat was last active
- Which Copilot surfaces each seat uses
- What each gap costs per month
Reporting delay
Microsoft typically publishes a day’s Copilot activity within 48 hours of the day ending (UTC), so the most recent days fill in late. A figure Microsoft has not reported shows as not reported, never as zero. When a figure is missing, the panel says why: a permission was not granted, Microsoft has no data yet, or the read failed.
Microsoft does not expose token counts or Copilot credit usage through its reporting API, so ZopNight does not show them.
Unused-seat recommendation
When a seat has gone unused long enough, ZopNight raises an Idle recommendation to reclaim it. All four conditions must hold:
- At least 3 consecutive calendar months in which the holder was active on fewer than a quarter of days
- No use of any of the twelve Copilot surfaces
- The licence has been held for at least 90 days
- The last recorded Copilot activity is more than 60 days old, or the seat has never been used
ZopNight does not raise it if:
- The holder used Copilot in the last 14 days
- Microsoft’s usage report is more than 7 days out of date
- There is no recent Microsoft 365 activity record for the holder. Without one, ZopNight cannot tell an unused seat from a person on leave, so it does not recommend reclaiming.
The saving is the seat’s monthly price: the licence’s monthly cost divided by the number of seats purchased, or the price you set. This figure is an approximation and can understate the contracted price by up to 4%. A seat with no price gets no recommendation.
See the rule catalogue.
What is read and stored
ZopNight reads three per-person sources. Nothing else in this feature touches a person.
| Source | What is read | What is stored |
|---|---|---|
| Copilot usage report | Per licensed user: last-activity date overall and for each of twelve Copilot surfaces, prompts submitted, and active days | Numbers only: days since last activity (overall and per surface), prompts submitted, active days |
| Microsoft 365 activity report | Per user: last-activity dates for Exchange, OneDrive, SharePoint, Skype for Business, Yammer, and Teams, and whether the user is deleted | One number: days since the latest activity across those services |
| Directory | Holders of a Copilot licence: Entra object ID, user principal name, display name, and the state of the licence assignment | A seat named by the holder’s Entra object ID, the licence and assignment state, and the display name kept separately |
The twelve Copilot surfaces are Word, Excel, PowerPoint, Outlook, OneNote, Loop, Teams, Edge, the Microsoft 365 Copilot app, Copilot Agent, Copilot Chat (work), and Copilot Chat (web).
ZopNight stores no activity dates and no user principal names. The user principal name is used only in memory, to match a report row to a seat, and is discarded after each sync. Usage history ages out six months after it was recorded. When a holder leaves the directory, their seat stops being shown that day.
ZopNight also stores the tenant’s daily adoption totals (enabled users, active users, prompts submitted) from Microsoft’s trend report, which carries no per-person rows.
Concealed names
Microsoft’s concealed names setting is on by default. With it on, usage rows arrive anonymised and cannot be matched to a seat. You still see seats and holders from the directory, and tenant-wide adoption totals, but no per-seat usage. ZopNight reads this setting and never changes it.
Turning it off in the Microsoft 365 admin center starts per-seat usage from the next sync. Earlier periods are not backfilled.
Connect a tenant
Open AI Seat Licences
Go to Settings → Integrations → AI Seat Licences and choose Microsoft 365 Copilot.
Grant admin consent
Your Microsoft admin signs in and grants admin consent to four read-only application permissions. See Microsoft permissions for what each one reads.
Check the connection
The tenant appears on Settings → Cloud Accounts as a cloud account, and seat data starts arriving on the next sync.
ZopNight holds no secret for your tenant. Consent lives in your Microsoft Entra tenant as the ZopNight enterprise application, and your admins can revoke it from the Enterprise applications blade at any time.

Settings → Integrations: the Microsoft 365 Copilot tile under AI Seat Licences, where you connect and disconnect a tenant.
Set a seat price
Enter a per-seat monthly figure in USD on the Seat licences tab. It must be greater than zero and at most 100,000. A new price applies from today and does not change past days. If the tenant holds more than one Copilot product, you can price one product or all of them. You can set a price only after the first sync has found the tenant’s licences.
Reference
Microsoft permissions
| Permission | What ZopNight reads with it |
|---|---|
Organization.Read.All | Purchased licence SKUs and subscriptions |
User.Read.All | Who holds a Copilot seat. Without it, you get SKU counts but no per-person detail. |
Reports.Read.All | Copilot usage and Microsoft 365 activity reports |
ReportSettings.Read.All | Whether your tenant conceals names in usage reports |
ZopNight permissions
| Action | Permission |
|---|---|
| Connect a tenant | cloud-account:create (Admin by default) |
| Disconnect a tenant | cloud-account:delete |
| See per-person seat rows | user:update, shown as Update member details (Admin by default) |
Who can see it
| Role | What they see |
|---|---|
Has Update member details (user:update), Admin by default | Every seat, with per-person usage |
Viewer, or any role without user:update | No per-person rows; the panel says the seats are withheld. The same limit applies to the metrics behind the report. |
| Role scoped to specific resources | No seat data. A seat is a person, not a cloud resource, so there is nothing to scope it to. |
Availability
AI Seat Licences has no feature flag of its own. Seat data starts flowing as soon as a tenant is connected and stops when it is disconnected.
Disconnect
Disconnect from the Microsoft 365 Copilot tile’s actions menu on Settings → Integrations, or from the tenant’s entry on Settings → Cloud Accounts. This needs cloud-account:delete. If you have connected more than one tenant, the menu names each one.
Disconnecting stops every read and removes ZopNight’s copy of the tenant ID.
Troubleshooting
Seats show but there is no per-person detail
User.Read.All was not granted. Without it, ZopNight sees SKU counts only. Ask your Microsoft admin to grant admin consent again with all four permissions.
Seats and holders show, but no per-seat usage
Microsoft’s concealed-names setting is on, so usage rows arrive anonymised. Turn it off in the Microsoft 365 admin center; per-seat usage starts from the next sync, with no backfill. See Concealed names.
Recent days show as not reported
Microsoft typically publishes a day’s activity within 48 hours of the day ending (UTC). The panel says whether the gap is a missing permission, no data from Microsoft yet, or a failed read.
A teammate sees the seats are withheld
Per-person rows need Update member details (user:update). Viewers and resource-scoped roles do not see them. See Who can see it.
The seat price will not save
The price must be greater than zero and at most 100,000 USD per seat per month, and it can be set only after the first sync has found the tenant’s licences.