A duplicate license assignment is a user receiving the same SKU from more than one source: directly and through a group, or through two overlapping groups. Duplicates do not consume extra seats for the same SKU, but they hide the real dependency structure and make cost recovery risky.
Where duplicates come from#
The classic pattern is migration debt. A tenant starts with direct assignments, later adopts group-based licensing, and never cleans up the direct grants. Years later, nobody knows whether removing the direct assignment is safe, because nobody can see whether the group path still covers the user.
The second pattern is organic overlap: two teams each maintain a licensed group, and some users sit in both, often through nesting rather than direct membership.
The manual sweep#
Per user, license details name the assigning sources. Doing this across a tenant means iterating every licensed user and classifying each assignment:
Connect-MgGraph -Scopes "User.Read.All"
$details = Get-MgUserLicenseDetail -UserId user@contoso.com
# GroupAssignments vs direct: inspect assignedByGroup on each entry
$details | Select-Object SkuPartNumber -ExpandProperty ServicePlans | Format-TableVisualizerEngine
How VisualizerEngine answers it
Duplicate detection is one of the built-in license analyses: overlapping assignments are tracked per user across direct and group sources, with the hierarchy path to each granting group. Removal impact analysis then shows what a cleanup actually changes before you run it, which is what makes cost recovery safe instead of hopeful.
Frequently asked questions
Do duplicate assignments waste money directly?
For the same SKU, no: one seat is consumed. The waste is indirect: unused seats sit unnoticed, and cleanups stall because nobody can prove which assignments are load bearing.