Every license optimization engagement has a moment where the numbers land and the client exhales. Ours came about five weeks into the telemetry window: $72,000 a month before remediation, $40,000 after. Thirty-two thousand dollars a month, a 44% reduction, on an environment that had already been discounted to the bone.

Then we showed them the security model that produced it, and they said no.

This is a case study about that no. What caused it, why the client was right, and what we're doing differently as a result. It's also, unavoidably, a case study about the limits of a playbook we've used successfully for years.

The client, and the pricing wrinkle

The client is a large, mission-driven organization, the kind that sits in an unusual seam of Microsoft's licensing programs, qualifying on paper for both educational and nonprofit pricing. That gave them something most organizations never get: a genuine choice of price tier.

We modeled both. Educational won, delivering a 70% discount and bringing the cost per seat down to a level that would make most CFOs stop asking questions. On a smaller estate, the analysis might have stopped there.

But scale changes the arithmetic. This organization has 964 users requiring licenses, and their Microsoft assessment demanded the full spectrum of SKUs: Commerce, Finance, Supply Chain Management, and Project Operations. Seventy percent off a very large number is still a very large number.

Why this was one of the hardest environments we've analyzed

Almost nobody at this organization logs into D365 the way you'd picture it. Their work happens in Power Apps and adjacent front ends; those applications connect through integration points into Finance & Supply Chain, where the transactions are actually created. The people need active, licensed accounts in D365, but they'll never see a D365 form.

Diagram: 964 users who rarely open D365 work through external Power Apps and portals, which connect through an integration point into D365 F&SC, where the license is actually consumed even though the human never sees the screen.
The thin-client problem. The license is consumed in D365; the human is somewhere else entirely.

This thin-client pattern is consistently the most difficult scenario in license analysis, and here it applied to nearly the entire user base, with transactions spread across many modules. The security configuration reflected that complexity precisely.

Of the 51 roles assigned to users, 37 required more than one license. The integration roles were the worst offenders: at least ten of them demanded all four SKUs. When license requirements are mixed that heavily, one of two things is true: users hold access they never exercise, or the security design itself has drifted. In this environment, both were true.

The snowball

We also found a handful of privileges carrying mixed license requirements, a single privilege demanding, say, both Supply Chain and Project Operations. This matters far more than the count suggests, because license requirements only ever roll upward.

Diagram showing a single privilege requiring 2 SKUs rolling up to a duty requiring 2 SKUs, to a role requiring 4 SKUs, to a user billed for 4 SKUs, with the caption that nothing is ever dropped on the way up.
A single mixed privilege propagates from duty to role to user. Nothing is ever dropped on the way up.

A privilege demanding two SKUs hands both to its duty. The duty hands them to the role. The role, now sitting alongside other privileges with their own demands, hands four to the user, and Microsoft bills for four. Two badly-scoped privileges can inflate the license footprint of hundreds of people.

Two badly-scoped privileges is exactly what we found. The snowball is real. The savings from fixing it were not: the mechanism was present, the mass was not.

Three of our four levers were dead ends

Our standard cost-reduction sequence starts with the easy wins. This time, the easy wins weren't there.

This is the part of the engagement that consulting write-ups usually omit. We opened with the inactive-user sweep that normally reclaims 5 to 10% of an estate and found nine accounts, all of them holding unlicensed system-administration or service roles. We looked for device users assigned Supply Chain roles when an Operations Activity license would do. We looked for over-provisioned external and partner accounts. Nothing.

By the end of the configuration review, our proven playbook had produced almost no money at all.

Telemetry did all the work

We had roughly five weeks of telemetry, and it turned out to be enough.

Our working rule in integration-heavy environments is that anything supporting an integration point is assumed to be fully utilized. Real utilization of integrations is often impossible to observe reliably, so we don't touch that access; the downside risk of breaking a running interface dwarfs the license saving. Everything reached through the user interface, however, can be measured directly.

Two heatmaps of users by privileges: granted access is dense and covers nearly everything, while actually-used access measured by telemetry is sparse, showing a large gap between what was granted and what was exercised.
Illustrative. Granted access is dense; exercised access is sparse. The white space between them is the budget.

The gap was enormous. Users held access across modules they hadn't touched once in five weeks. Roles demanded Project Operations from people whose telemetry showed nothing but Supply Chain and Finance activity. Strip the license requirement back to what the evidence supports, and the monthly bill falls from $72,000 to $40,000.

Waterfall chart from $72,000 baseline: inactive users, device over-licensing, and external accounts each show no saving, mixed privileges save $1,000, telemetry-driven access reduction saves $31,000, ending at $40,000 remediated.
Where the savings came from, and where they conspicuously did not.

Read that chart carefully, because the flat bars are the story. Everything we normally rely on contributed nothing. The single lever that worked was the one that required five weeks of patience and a willingness to trust behavioral evidence over configuration documents.

The optimal answer, and why the client rejected it

We designed and presented the remediated security model using our standard technique: split every multi-license role by SKU. Each fragment inherits all menu items belonging to its SKU, plus everything already covered beneath it, Operations Activity items, Team Members items, and items requiring no license at all. A Supply Chain fragment holds everything the Supply Chain SKU covers, and nothing that it doesn't.

It's a clean technique. It's defensible. And with three dozen multi-SKU roles, ten of them demanding all four, it produced roughly one hundred roles.

A fork diagram: 51 assigned roles, 37 requiring multiple SKUs, splitting into two paths. Split every role by SKU, the standard playbook, produces about 100 roles and was rejected as unmaintainable. Cluster on telemetry produces far fewer, activity-based roles.
The fork. Both branches deliver the savings. Only one of them can be operated on a Monday morning.

The client's response was immediate and, in hindsight, obviously correct: a hundred-role model is unmaintainable, untestable, and unintelligible to the administrators who have to live with it. A security design that no one can reason about isn't a security design; it's a liability with a spreadsheet attached.

They didn't dispute the savings. They disputed the shape of the thing that delivered them.

The rebuild: security as a role-mining problem

What they asked for instead is more ambitious. Rather than reshaping the roles that exist, start from what people demonstrably do, at the privilege level, not the menu-item level, and construct a role structure around the most common combinations of tasks, minimizing the number of roles each user carries.

Each user is described by two things:

In the room, we called this a clustering problem, and as plain language that holds up: group similar users, and the groups become the roles. Formally it's something sharper. We have a binary user-by-privilege matrix, and we're decomposing it into a user-by-role matrix and a role-by-privilege matrix, minimizing the number of roles subject to a hard coverage constraint: every user must retain every privilege the evidence says they need.

That problem has a name in the literature: the Role Mining Problem. It's a Boolean matrix decomposition, it's equivalent to set cover, and it's NP-complete. The distinction isn't academic. Ordinary clustering optimizes for similarity and has no concept of "must cover": a centroid will happily grant a privilege three people need to all ten in the cluster, or drop one that two people depend on. Naming the problem correctly is what steers you toward integer programming and set-cover heuristics rather than a k-means call that quietly breaks somebody's month end.

What we expect to go wrong

We're early in this rebuild, and we'd rather set expectations honestly than discover them in production.

What we'd tell the next client

Standard leverResultWhat we found
Inactive users Failed Only 9 found, all held unlicensed admin or service roles.
Device over-licensing Failed No device users carrying needlessly expensive SKUs.
External / partner accounts Failed None of the usual over-provisioning patterns present.
Permission inconsistencies Marginal Update/create/delete granted without read; two mixed-SKU privileges.
Telemetry-driven access reduction Worked Five weeks of data exposed the entire $32K/month opportunity.
✓ Would this apply to your tenant?

This case is the exception, not the rule: it only plays out this way if your estate is genuinely thin-client and integration-heavy, most of your users touch D365 indirectly, and your roles were built around integrations rather than people. If that's you, expect the standard inactive-user and device-licensing sweeps to come up empty, and expect telemetry, not configuration review, to carry the engagement. If it's not you, the standard role-split approach is usually the right one; see our companion case study for what that looks like.

The deepest change here isn't technical. Our traditional model preserves the business role and trims its access: a purchasing agent with three SKUs becomes a purchasing agent with one. The new model abandons that comfort entirely. Roles will be defined by the operations people perform against the database, not by the part they play in the organization.

A third engagement in this series shows the other end of the remediation problem: see our case study on a fully automated D365 security migration for what it takes to move an optimal design into production without anyone building a role by hand, once the underlying security is already unremarkable rather than a hundred-role tangle like this one. A fourth shows the same discipline applied before any of this became necessary: see our case study on a greenfield security design, caught a day before UAT instead of years into production.

Whether administrators can live in that world is the real question this project will answer. It did, and not the way our first attempt at it predicted: see our report on the mining rebuild's first, unshippable draft and what the client actually chose to pay for once they saw the real trade-off.