9 — Licensing

Licensing

The Licensing tab answers two related questions:

  1. What are we paying for? — inventory of licences, what's provisioned vs used, how much it costs.

  2. Are we actually using what we pay for? — who logs in, who works, who just sits there.

It has three sub-tabs: Licenses, Profiles, DML. The DML sub-tab is the bridge to the DML analysis.

The license inventory (Licenses sub-tab)

Each row is one Salesforce licence type (UserLicense + PermissionSetLicense). Columns:

Column

What it is

License

Display name. The yearly-login entitlement (for community-login licences) is shown inline.

Provisioned

Total seats available on this licence.

Used (%)

Seats actually assigned to a user. The percentage is Used / Provisioned.

Available

Provisioned − Used.

Unit price

Per-seat per-year cost. Editable in-place — click to enter your contracted price. The default is 0 (we don't presume to know your contract).

Provisioned $

Provisioned × Unit price. Yearly committed spend.

Assigned $

Used × Unit price. Yearly actual cost based on current assignments.

Add-on licences (PermissionSetLicense — Einstein, CPQ, Salesforce Mobile, etc.) appear below the core list with the same columns.

Pricing entered here drives every dollar figure in the rest of the panel. There's no global price list — you tell the app what you pay for what.

Profiles sub-tab

Each row is one profile within a licence. Profiles roll up under their licence; licences roll up under their bucket.

The three buckets

Stood Flows classifies every licence into one of three buckets:

The classification is opinionated and lives in the codebase — it matches how most orgs actually budget. You can see which bucket a licence ended up in next to its name.

Why the buckets matter:

Profile columns

Column

What it is

Users

Provisioned users on this profile.

Logins (30d)

Users on this profile that logged in within the last 30 days of the analysis period (anchored to analyzedAt, not real-now, so historical numbers stay frozen).

Actors

Users on this profile that appear as creator or modifier of a backbone record in the usage analysis window. See below.

Assigned

Pro-rated cost (Named) or pro-rated entitled logins (Community Login).

Unlogged

Cost (or login-share) attributable to users that didn't log in at all.

Actor $

Cost attributable to users that are also Actors.

Non-actor $

Cost attributable to users that logged in but aren't Actors.

(business processes)

Click the count next to a profile name to see which business processes the profile is involved in (via its RT visibilities).

A note on the Actor $ split:

The Actors column

Actors comes from usage-actors.json (written by the Analyze Usage button). The file records, per (object, recordTypeId), the user IDs that created or modified at least one record in the analysis window:

{
"actors": [
{
"objectType": "Opportunity",
"recordTypeId": "012XXX…",
"modifierIds": ["005XXX…", "005YYY…"],
"creatorIds": ["005ZZZ…"]
},
]
}

The panel takes the union of modifier and creator IDs across all (object, RT) entries, intersects them with the user list per profile, and counts.

Actors are usually a strict subset of Logins — a logged-in user doesn't necessarily do anything. If you see "Actors > Logins" for a profile, you've found a profile where API-only integration accounts produce DML without showing up in interactive login logs. That's a useful flag.

Reading the panel

Two patterns:

"Are we over-licensed?"

Sort the Licenses sub-tab by Available desc. The licences with the biggest gap between Provisioned and Used are your renegotiation targets.

Then on the Profiles tab, expand a high-cost profile and look at:

"Who actually works in this org?"

Sort the Profiles tab by Actor $ descending within the Named bucket. The top 5-10 profiles are doing the real work. Everything below the long tail is, charitably, optional.

For Community Login orgs, sort by Logins (30d) descending — actors don't apply the same way since community users may interact via portal in ways that don't hit Salesforce DML directly. Logins is the better signal there.

Where the numbers come from

Source

What it feeds

UserLicense + PermissionSetLicense describes

Inventory rows

Profile + User describes

Profile membership, user counts

Login activity on User.LastLoginDate (frozen at analyzedAt)

Logins (30d)

Pro-rated loginCountByLicense from licensing analysis

Community Login "Assigned"

usage-actors.json (Analyze Usage output)

Actors

User-entered Unit price

All $ columns

All of it is computed at render time from licensingAnalysis in the version JSON + the usage-actors.json file. Nothing's hard-coded.

Going deeper — the DML sub-tab

Once you've identified profiles that look suspicious in the Profile sub-tab, the DML sub-tab classifies their users into activity buckets based on Event Log Files. That's its own document — see DML analysis and ELF.

Published with Nuclino