Salesforce License Optimization

Salesforce License Optimization
Without Spreadsheets

Do you really use the Salesforce licenses you pay for? SpendReady reads your org read-only and produces a named list of estimated-inactive seats, over-assigned licenses, and idle permission set licenses — the renewal evidence you can't build by hand in a spreadsheet.

Read-only OAuthLightweight Connected AppNo ApexNo write access

Read-only OAuth · Lightweight Connected App · No Apex · No write access

Beyond the count

License optimization is more than license counts

Most license “optimization” stops at purchased vs assigned totals. That tells you the size of the bill — not where the waste is. Real optimization happens one user and one license-assignment at a time.

Counts don't tell you who

Knowing you bought 450 seats and assigned 438 is a start — but it doesn't tell you which assigned users haven't logged in, which permission set licenses are sitting idle, or which seats are really automation accounts. Optimization happens at the user and license-assignment level, by name.

Assignment is not utilization

An assigned license is a cost; a used license is value. SpendReady cross-references each user's license and permission-set assignments against interactive login history to separate the two — so you optimize against estimated activity, not just the assignment ledger.

Optimization needs evidence, not gut feel

Reclaiming a seat is a conversation with a department head. That conversation goes better with a named, login-derived list than with a round number. SpendReady produces the named findings so the optimization is defensible.

For the full background, see our Salesforce Optimizer alternative guide and the breakdown of Salesforce cost per user in 2026.

Step 1

Inactive seats, estimated from login activity

SpendReady reads LoginHistory and separates interactive human logins from API/integration activity. Any assigned user with no interactive login in your window — 90 days by default — is flagged as estimated-inactive. It's login-derived evidence, not absolute proof, so new hires, approved leave, and dormant accounts can be exempted from findings.

Each finding lands by name, not as a round number — so reclaiming the seat is a defensible conversation with the department head, backed by data.

See how we build it: the Salesforce inactive user report.

Estimated-inactive users
no interactive login 90d+
Estimated-inactive (90d+)149
Last interactive login window90 days
Exempted (leave / new hire)7

Illustrative example. Figures vary by org.

License pool gap
UserLicense
450
Purchased
438
Assigned
289
Est. active

Illustrative example. Figures vary by org.

Step 2

Over-assigned licenses

Reading UserLicense and User together surfaces the full pool gap: purchased vs assigned vs estimated-active. The space between assigned and estimated-active is where most renewal savings hide — licenses allocated to people who aren't logging in.

Salesforce Enterprise lists at $175/user/mo and Unlimited at $350/user/mo (list prices), so every over-assigned seat carries a real number you can take into the renewal conversation.

Step 3

Permission set license waste

License optimization isn't only about base seats. Permission Set Licenses — the add-on entitlements layered on top — are easy to assign and easy to forget. SpendReady reads PermissionSetLicense and PermissionSetLicenseAssign and cross-references each assignment against login activity.

The result: idle PSLs identified by name, not just by count — the assignments attached to users who haven't been active.

Deep dive: how permission set license waste accumulates.

Idle permission set licenses
by name
Idle PSL assignments62
Tied to estimated-inactive users48
Distinct PSL types affected5

Illustrative example. Figures vary by org.

Step 4

Integration-user exclusions

The fastest way to ruin a license audit is to flag your automation accounts as “inactive” just because no human logs into them. SpendReady looks at login type in LoginHistory: accounts whose activity is API-only are treated as integration/service users and excluded from inactive-seat findings, so your estimated-inactive list stays clean and credible.

That same view also helps you spot service accounts holding interactive licenses they may not need — a separate optimization opportunity surfaced without false positives.

Renewal Savings Report

One report, ready for the renewal

Every finding rolls up into a single artifact you can hand to finance — purchased vs assigned vs estimated-active, with the waste called out by name.

Renewal Savings Report
Illustrative example · Acme Corp Salesforce Org
PDF export
450
Purchased licenses
what you're paying for
438
Assigned licenses
allocated to users
289
Estimated active users
interactive login in window
Estimated-inactive seats (90d+)no interactive login in window
149
Idle permission set licensesassigned to estimated-inactive users
62
Integration users (excluded)API-only accounts, not flagged
18
Estimated annual savings opportunity$312,900

Illustrative example: 149 estimated-inactive seats × $175/mo (Salesforce Enterprise list price). Actual savings depend on your negotiated rate and renewal terms.

The first (free) audit is a point-in-time snapshot. Peak-usage and lowest-usage months plus the multi-week trend chart are a Monitoring feature that unlocks at month 3, once weekly snapshots have accumulated. Salesforce's native LoginHistory is roughly 6 months deep and can't reconstruct that trend retroactively.

Bringing this to a vendor conversation? Read how to use utilization evidence in a Salesforce renewal negotiation. Prefer to see the audience-specific view? Visit SpendReady for Admins & RevOps or SpendReady for CFOs & Finance.

License optimization, answered

What does Salesforce license optimization actually mean here?
It means finding the gap between the licenses you purchased, the licenses you assigned, and the licenses your users are estimated to actually use — then turning that gap into a named, defensible list you can act on at renewal. It's not just counting seats; it's identifying which specific seats and permission set licenses are candidates to reclaim.
How do you decide a seat is inactive?
We read LoginHistory and distinguish interactive human logins from API/integration activity. A user with no interactive login in your chosen window (90 days by default) is flagged as estimated-inactive. This is login-derived evidence, not absolute proof of non-use — new hires, leave cases, and approved dormant accounts can be exempted from findings.
What objects does SpendReady read?
Read-only access to five objects: User, UserLicense, PermissionSetLicense, PermissionSetLicenseAssign, and LoginHistory. We never read Opportunities, Accounts, Contacts, or any CRM business data.
How does the install work?
Connection is via a lightweight Salesforce Connected App with read-only OAuth, installed from an AppExchange install URL. A Salesforce admin installs the package — which contains only the Connected App bridge, no Apex or business-data access — and authorizes the read-only connection. No write access ever.
Will the first audit show usage trends?
No. The first (free) audit is a point-in-time snapshot of your current license assignments and estimated-active users. Peak-usage and lowest-usage months, plus the multi-week trend chart, are a Monitoring feature: SpendReady captures weekly snapshots from your connection date, and the peak vs lowest views unlock at month 3. Salesforce's native LoginHistory is roughly 6 months deep and can't reconstruct that trend retroactively.
What does it cost?
A one-time audit is $499. Continuous Monitoring — weekly snapshots, the trend chart, and the monthly finance pack — is $399/month. Enterprise is $1,199/month. The first audit is free, no credit card required.

Optimize your Salesforce licenses without a spreadsheet.

The first audit is free. No credit card. A Salesforce admin connects in about 60 seconds.

Read-only OAuth · Lightweight Connected App · No Apex · No write access