AI Adoption GuideITProvision
License assignment optimizer
ML matches user activity patterns to license tiers and automatically reassigns or downgrades underused seats to reduce spend.
IT processPlanSelectDeployProvisionSupportUpgradeReplaceRetire
By Don, DoneThat’s AI coach · updated
Seat tier should follow activity, not purchase history
A license assignment optimizer compares what people actually use against the tier on their seat, then recommends a better fit: downgrade an underused premium seat, move someone to a pooled tier, or flag a seat for reclamation when activity has gone cold. The outcome is cost control through tighter alignment, not a blanket purge.
The optimizer produces recommendations with evidence attached. Each proposed reassignment cites the usage signal vintage (when activity was last observed) and the current seat tier. If usage data is missing or stale beyond your policy window, the recommendation field stays empty. Software Asset Management (SAM) still owns every change. Nothing auto-downgrades on a score alone.
This page is for software asset or FinOps leads who already run entitlement records in tools such as Flexera or ServiceNow, pull usage from vendor consoles or identity-linked telemetry (Microsoft, Adobe, and similar publishers), and need a disciplined way to shrink tier mismatch without inventing savings numbers.
Load usage and entitlements before any match
Start with two grounded datasets and refuse to blend them until both pass basic quality checks.
Entitlement truth is what SAM asserts someone is allowed to hold: product, SKU or tier, assignment date, cost center, and contract line if you track it. Pull this from your SAM system of record. Gaps here poison every downstream recommendation.
Usage signals describe what the account did in the product: last login, feature touches, API calls, or admin-reported inactive flags, depending on what the publisher exposes. Note the collection method and the as-of timestamp for each row. A seat with no telemetry is not the same as a seat with zero activity; treat missing signal as unknown, not as proof of disuse.
Join on a stable identity key (corporate email, employee ID, or federated object ID). Where the join fails, leave the recommendation blank and route the row to data hygiene instead of guessing.
Cross-check totals against entitlement anomaly detection before you optimize. Assigning tiers against duplicate entitlements or shadow purchases creates churn SAM will have to unwind later.
How the matcher ranks tier fit and attaches cites
The model (rules plus ML, or ML alone where you have enough labeled history) scores each seat against tier definitions you maintain: which features or usage bands qualify for E3 versus E1, named user versus shared, or creative cloud all apps versus a single-app plan.
A valid recommendation includes at minimum:
- Current tier from entitlement data
- Suggested tier or action (downgrade, reassign pool, no change)
- Usage cite: signal type, last observed activity date, and data vintage (when the feed was refreshed)
- Confidence or rule path so SAM can audit why the suggestion appeared
When usage is present but below the threshold for the assigned tier, the optimizer proposes a downgrade and shows the cite. When usage supports the current tier, it recommends no change. When usage is absent, the suggestion column stays empty. Do not backfill with assumptions.
Rank output by estimated contractual impact only where you have list price or internal rate card loaded. If you lack unit cost for a SKU, show tier delta without a dollar figure. Inventing savings is a failure mode that finance will reject and auditors will remember.
Pair heavy downgrade candidates with license reclamation detector when activity has been flat for multiple periods. Reclamation handles removal; the optimizer handles right-sizing seats you intend to keep assigned.
SAM executes; the optimizer never closes the loop alone
Treat optimizer output as a work queue, not a executed change log.
SAM reviews each line: confirm the employee is not in a role exception (legal hold, contractor clause, migration window), verify the cite still holds at execution time, then perform downgrade or reassignment in the publisher admin console or through your approved integration. Record the ticket ID, actor, and effective date back to entitlement records.
Workflow guardrails worth encoding in procedure:
- No cite, no downgrade. If usage vintage is blank or past your staleness SLA, skip the row or request a fresh pull.
- Recommendation is not execution. Dashboard status "suggested" must not trigger billing changes without human or approved workflow step.
- Communicate before seat loss where policy requires notice, especially for creative or dev tools where downgrade removes project assets.
New hires and role changes should flow through onboarding package auto-builder so tier defaults match job profile before the optimizer spends cycles fixing day-one over-provisioning.
Illustrated pass: four seats, mixed signal quality
Imagine a product engineering group with four Adobe-named seats on a full creative tier, entitlements sourced from ServiceNow, usage from the publisher's last-90-day export refreshed Monday.
| Seat holder | Entitled tier | Last creative app use (cite) | Optimizer output | |-------------|---------------|------------------------------|------------------| | Ana | Full creative | 2026-08-28, export vintage 2026-09-01 | Suggest single-app photography tier; cite shown | | Ben | Full creative | No row in usage feed | Empty; SAM requests identity mapping fix | | Cal | Full creative | 2026-03-02, export vintage 2026-09-01 | Suggest downgrade; cite shows stale pattern; SAM checks project need | | Dee | Full creative | 2026-09-01, export vintage 2026-09-01 | No change; activity supports tier |
SAM acts on Ana and Cal after quick manager ping; opens a data task for Ben; closes Dee with no action. Finance sees tier movement tied to cites, not a rounded "we saved $X" slide unless your rate card was loaded and the contract allows true-down.
Use demand and capacity forecast when several downgrades free pooled capacity you will reassign next quarter, so procurement does not rebuy seats you already own.
Failure modes that quietly undo the program
Downgrade without usage cite. A rule fires on title or department alone and strips a tier. Publisher audits and angry escalations follow. Every downgrade line must carry signal vintage or remain blank.
Treating recommendation as executed. Automated emails to employees saying "your license was reduced" when SAM never clicked create support debt and false compliance records. Separate systems for suggest versus done.
Inventing savings. Multiplying seat count by a list price you do not hold, or assuming all downgrades renew at lower tiers at next true-up, produces numbers leadership will budget against. Report tier deltas and cite coverage percent until finance signs off on monetization rules.
Stale feeds masquerading as fresh. A Monday vintage on a Friday pull looks current but missed a launch week spike. Define staleness per publisher and block cites that violate it.
Ignoring reclamation overlap. Downgrading a seat nobody uses wastes SAM time; reclamation should fire first when activity is zero across periods. Coordinate queues so SAM gets one actionable ticket per seat.
Skipping anomaly cleanup. Optimizing while entitlements are duplicated across Flexera and a spreadsheet rebuilds the same mismatch next month. Fix record quality, then optimize.
When cites are reliable and SAM owns execution, the optimizer becomes a repeatable finOps lever: fewer premium seats idle on spreadsheets, clearer evidence for true-up conversations, and no automated tier cuts that cannot stand in an audit trail.
Is this worth automating for you?
Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other.
DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.
Measure the baseline first