Home / Guides / Find inactive Azure DevOps users
Guide · Azure DevOps cost

How to find inactive users in Azure DevOps

Inactive and never-accessed paid users are the single clearest source of Azure DevOps overspend. The good news: Azure DevOps already tracks the one data point you need — a last-access date per user. Here's exactly where to find it, how to read it, and how to decide who to revoke.

Why inactive users cost real money

Azure DevOps bills per user, per access level. Two levels carry a charge: Basic at about $6/user/month and Basic + Test Plans at about $52/user/month. Stakeholder access is free, and users covered by a Visual Studio subscription get Basic-level access without consuming a paid seat.

An inactive user on a paid seat is money leaving every month for nothing. One forgotten Basic seat is ~$72/year; a forgotten Basic + Test Plans seat is ~$624/year. Across a real org, dozens of these accumulate — people who left the company, moved teams, or were provisioned "just in case" and never onboarded. Nobody is watching the meter, so the seats quietly renew.

Where Azure DevOps keeps the last-access date

The record you need lives under Member Entitlement Management. In the portal, open Organization settings → Users. The Users grid lists every member, their access level (Stakeholder, Basic, or Basic + Test Plans), and a Last access date — the last time each person actually used the org.

Two patterns matter most here:

How to read the dates: the three buckets

Sort your paid users by last-access date and sort them into three buckets. Two are firm; one needs a quick human check.

Inactivity buckets · paid seats only
Last accessBucketRecommended action
6+ months, or neverFirm wasteRevoke or downgrade
3–6 monthsTrending staleReview this quarter
< 3 monthsActiveKeep

The 6-plus-months and never-accessed bucket is where you act first. There's no scenario where a paid seat that hasn't been used in half a year is earning its cost. The 3-to-6-month bucket is an early warning — those seats are drifting toward firm waste, and catching them now saves another two quarters of spend.

Revoke or keep? A simple decision

Not every inactive user should be deleted. The right move depends on whether the person still needs any relationship with the org:

Crucially, none of these actions is destructive. Removing or downgrading an access level does not delete a user's work items, commits, or history. It only changes what they can do going forward — which is why acting on the firm-waste bucket is genuinely low-risk.

Doing it by API vs. doing it automatically

You can pull this data yourself. The Member Entitlement Management API returns every user's entitlement, access level, and last-access date, so you can script a quarterly export and reconcile it in a spreadsheet: flag anyone over six months, cross-check who's on Basic + Test Plans, and confirm who has a Visual Studio subscription. It works — but it's a recurring chore, and the reconciliation (especially spotting VS-subscriber double-charges) is where manual reviews tend to slip.

The alternative is to point a tool at the org and get the whole picture in a few minutes: every paid seat, its tier, its months of inactivity, whether it's a never-accessed seat, and a recovery estimate — refreshed whenever you want to check. That turns a quarterly spreadsheet marathon into a glance.

Find your inactive Azure DevOps users — free

HALA (Helix ADO License Auditor) scans your Azure DevOps org with a read-only token and names every inactive, never-accessed, and over-tiered seat — with the recoverable spend attached. The headline scan is free.

Run a free audit →

Frequently asked questions

Where does Azure DevOps show a user's last-access date?

Azure DevOps records a last-access date for every user under Member Entitlement Management, in the Users view of Organization settings. You can read the same data programmatically through the Member Entitlement Management API.

What counts as an inactive Azure DevOps user?

For license purposes, a paid user — Basic or Basic + Test Plans — with no access for six months or more, or who has never accessed the org, is firm recoverable spend. Three-to-six-month inactivity is trending stale and worth reviewing before it becomes firm waste.

Should I revoke an inactive user or just downgrade them?

Revoke a paid seat when the person has clearly left or no longer needs access. Downgrade to the free Stakeholder level when they still need visibility into work items and dashboards but no longer do paid work. Either way you stop paying for a Basic or Basic + Test Plans seat that is not being used.

Will removing an inactive user delete their work?

No. Removing or downgrading a user's access level does not delete their work items, commits, or history. It only changes what they can do going forward, which is why revoking inactive paid seats is low-risk.