Dormant accounts: licensed users who haven't signed in for 90+ days

19 Jul 2026

Dormant accounts: licensed users who haven't signed in for 90+ days

Somewhere in your tenant there is an account that last signed in months ago and still carries a paid licence. Often it belongs to someone who left the company. The account was disabled — or worse, it wasn't — and the licence stayed assigned, renewing quietly ever since. Nobody notices, because no admin center puts "licence assigned" and "last sign-in" on the same screen.

90 days
the dormancy threshold
€32/mo
each dormant E3 seat
1 field
signInActivity has the answer
2 screens
that never meet in the admin center

How accounts go dormant

Dormant licensed accounts are almost never negligence — they are the predictable residue of normal company events that each end halfway:

Event What happened What was forgotten
Someone left IT disabled sign-in, converted the mailbox, wished them well. The licence. Offboarding checklists say "disable", rarely "reclaim".
A project ended Contractors and temp accounts stopped being used in a single week. Everything. Nobody owns accounts that belong to a finished project.
A role changed The user got a new account, a new UPN, or moved to another entity. The old identity — still licensed, still in groups, never touched again.
A "just in case" account A shared, service or test account was created with a full licence. That most of these need no licence at all — or a free one.
The pattern
Dormancy is a process gap, not a people problem. Every one of these events had an owner for the first half (disable, wrap up, migrate) and no owner for the second half (reclaim the licence). Fixing it means putting the second half on a report someone actually reads.

Where the data lives: signInActivity

Entra ID records exactly what you need in one property: signInActivity on the user object, which carries lastSignInDateTime (interactive) and lastNonInteractiveSignInDateTime. Cross it with assignedLicenses and accountEnabled and the whole report falls out. Three details matter:

  • Use the later of the two timestamps. A user whose apps refresh tokens daily is not dormant, even if they never see a login page. Judging on interactive sign-ins alone flags active people.
  • An empty value means never. Users with a licence and no sign-in activity at all never used the seat once — the safest reclaims on the list.
  • The log only goes back so far. Sign-in logs retain 30 days on Entra ID P1; the signInActivity property persists beyond that, which is why the report should read the property, not the logs.
TRIAGE: EVERY LICENSED USER LANDS IN ONE BUCKET All licensed users disabled, or never signed in no sign-in for 90+ days active in the last 90 days reclaim now review with HR keep

Triage: three buckets, three actions

Reclaim now. Disabled accounts still holding a paid SKU, and accounts that never signed in at all. There is no user to upset — the person is gone or never arrived. Reclaim the licence, keep the identity if retention policy needs the mailbox data. This bucket is pure savings and usually the largest.

Review with HR. Enabled accounts with no sign-in for 90+ days. This list needs human context before you act: parental leave, long sick leave and sabbaticals are legitimate dormancy; the contractor whose engagement ended in the spring is not. Send the list to whoever knows, once a month, and act on the answers.

Keep — but check the size. Active users are out of scope for this report, with one asterisk: activity proves the seat is needed, not that the SKU is right. That is a separate audit — the broader sweep is covered in our licence waste audit guide.

Not just money
A dormant enabled account is also an attack surface: valid credentials, standing group memberships, and an owner who will never notice a compromise. Password-spray campaigns love accounts nobody watches. Reclaiming the licence and disabling the account close both holes at once.

Make it a report, not a project

The audit is a one-time win; the process gap that created it is still there, refilling the list at the rate people leave. The durable fix is a standing report — licensed users × account state × last sign-in — reviewed monthly. GraphPaaS keeps exactly that view per tenant, refreshed automatically: dormant and never-signed-in users are already flagged with their SKUs when you log in, so the monthly review is reading a list, not building one. For MSPs, the same report exists for every tenant you manage, side by side.

GraphPaaS

See every licensed-but-dormant account in your tenant — flagged automatically, refreshed on every sync.

Find your dormant accounts →

Newsletter

Get the next article by email

Practical M365 & Azure cost pieces like this one. No spam, unsubscribe anytime.