Affinity vs Requirements: How Licenses Are Chosen
When more than one license could cover an install, the engine has to choose. It uses two different mechanisms — requirements and affinity — and they work in very different ways.
Understanding the difference matters because it explains why the engine sometimes picks a license you would not have picked yourself, and what to do about it when that happens.
Requirements
A requirement is a rule that must be satisfied. If a license fails a requirement, it cannot be used to cover the consumption — the engine excludes it from consideration entirely.
The built-in requirement is location:
Requirement: Consumption.LocationID within License.LocationID
The consumption's location must be within (or equal to) the license's location.
| Consumption Location | License Location | Result |
|---|---|---|
| London Floor 2 | London Floor 2 | Eligible (exact match) |
| London Floor 2 | London | Eligible (within hierarchy) |
| Bath | London | Excluded |
| (any) | (no location set) | Eligible (no requirement when license is unscoped) |
Requirements are how you enforce policies that say "Adobe licenses purchased by the London office can only cover London assets." A license in London simply will not be considered for a Bath asset, regardless of what else is true.
Affinity
Affinity rules do not exclude — they score. Each rule that matches a license-consumption pair adds points to a total. The engine computes the total for every eligible license and picks the highest score. If the chosen license is at capacity, the engine moves down the list.
The default affinity rules and their weights:
| Rule | Exact Match | Hierarchy Match |
|---|---|---|
| Department | +3000 | +1500 |
| Location | +800 | +400 |
| Cost Centre | +300 | +200 |
| Custodian | +1000 | n/a |
| CPU Cores exact match | +1500 | n/a |
| Big server prefers Processor license | +1000 | n/a |
| Small server prefers Core license | +1000 | n/a |
"Hierarchy match" means the consumption's value is a child of the license's value (e.g., "London Floor 2" is within "London"). Exact match always beats hierarchy match.
A Worked Example
A consumption needing a license:
- Asset: DONNA-PC
- Department: Accounts Payable Dept (child of Accounts Dept)
- Location: Bath
- Cost Centre: Accounts Payable
- Custodian: Donna Hambly
Two candidate licenses, both eligible (no location requirement broken):
License A — Location: Bath, Department: Accounts Payable Dept, Cost Centre: Accounts Payable, Custodian: Donna Hambly
| Rule | Match | Points |
|---|---|---|
| Department exact | ✓ | +3000 |
| Department hierarchy | ✓ | +1500 |
| Location exact | ✓ | +800 |
| Cost Centre exact | ✓ | +300 |
| Cost Centre hierarchy | ✓ | +200 |
| Custodian exact | ✓ | +1000 |
| Total | 6800 |
License B — same as License A but no Custodian assigned
| Rule | Match | Points |
|---|---|---|
| Department exact | ✓ | +3000 |
| Department hierarchy | ✓ | +1500 |
| Location exact | ✓ | +800 |
| Cost Centre exact | ✓ | +300 |
| Cost Centre hierarchy | ✓ | +200 |
| Custodian exact | ✗ | 0 |
| Total | 5800 |
License A wins by 1000 points (the custodian rule broke the tie).
Tie-Breaking
If two licenses score identically, the lower AssetID wins. In practice this means the license that was created first wins ties. The behaviour is deterministic — recalculations produce the same result every time.
Capacity Always Applies
Affinity decides which licence to prefer; capacity decides whether the engine can actually grant. If the highest-scoring license is at capacity, the engine moves to the next-highest. If no license has capacity, the consumption is left in deficit — it appears in the position as an outstanding requirement.
Why This Matters
Two practical consequences:
You may see allocations you would not have made manually. If a Bath asset has no Bath license available but a London license has free seats, the engine grants from London (assuming no location requirement is broken). That is correct — you bought the right; the asset needs it; the engine does its job. Affinity nudges toward the "right" license but never excludes a feasible one.
You can change the behavior. Both the rules and their weights are editable through the Calculate → Configure dialog. See Customizing the Calculation. Common changes: making department a hard requirement for specific publishers (Adobe), boosting the weight on cost centre, adding new affinity dimensions.
Direct Assignment Overrides Affinity
If you want to force an allocation regardless of affinity scoring, you can directly assign a license to a computer. Direct assignments are processed first, before affinity-based allocation runs. See Allocation: Direct Assignment.
Related Reading
- Customizing the Calculation — how to change the rules
- Direct Assignment — overriding affinity
- Multi-License Coverage — when one consumption needs more than one license