Remove remaining inactive seats after the notice window
Reduce purchased seats or tiers in the admin or billing system
Confirm invoices reflect changes
Document savings and install monthly check
Define "inactive" (simple, defensible)
Pick a rule you can explain.
Examples:
No login in 60 days
No activity in 60 days (if available)
Not in the owning team anymore (HR offboarding)
Add exceptions:
executives (if needed)
service accounts
admin accounts
seasonal roles
The goal is not to win an argument. The goal is to run a safe, repeatable process.
Step-by-step execution
Step 1: Choose vendors (pick the ROI)
Choose vendors that meet at least one:
high annual spend
renews in the next 120 days
seat-based pricing
clear inactivity patterns
Start with 2-3 vendors. You will learn and go faster on the next batch.
Step 2: Build the seat roster (minimum viable)
For each vendor, produce:
user email
seat type or tier (if applicable)
last login date (if available)
role (admin vs standard)
department or team
manager (if available)
If you cannot get last login:
use "assigned seats vs known users"
ask owners to confirm "who actually needs it"
Step 3: Notify stakeholders (short and clear)
You need permission and a predictable deadline.
Use a short notice window:
5 business days for low-risk tools
10 business days for high-risk tools
Step 4: Run reclaim in two passes
Pass 1 (low risk):
users who left the company
duplicate accounts
obvious non-users
contractors whose engagement ended
Pass 2 (confirm or deny):
send a list to owners or managers
reclaim unless explicitly justified
Step 5: Right-size tiers and packaging
Common opportunities:
downgrade power users who do not use advanced features
convert full seats to "viewer" seats
remove add-ons that were enabled "just in case"
switch from monthly to annual only if discounts exceed flexibility cost
Right-sizing is usually easier during renewal. Capture it as a negotiation lever for:
Step 6: Make billing match reality
Seat removal is not savings unless billing changes.
Do these checks:
admin console shows reduced purchased seats
upcoming invoice reflects new counts
if not, open a case with vendor and track until corrected
Step 7: Prove savings (defensible, simple)
Use to compute:
monthly savings
annualized savings
break-even period (if any implementation effort exists)
Capture:
before seats paid
after seats paid
price per seat (or effective blended)
effective date of change
invoice evidence
Step 8: Install the monthly cadence (this is where the money stays)
Monthly 30-minute cadence:
new seats added (who approved and why)
inactive seats list (reclaim plan)
tier creep (add-ons, upgrades)
renewal timing (inside 120 days)
actions and owners
Templates (copy and paste)
A) User notice email
Copyable template (TEXT)
Subject: Action Required: [Tool Name] Access Review
Hi,
We are reviewing [Tool Name] access to remove unused seats and prevent unnecessary subscription costs.
If you still need access, reply to this message by [DATE] with:
- why you need access
- how often you use it
If we do not hear from you by [DATE], your access may be removed. You can request access again later if needed.
Thanks,
[Name]
B) Exception request (simple)
Copyable template (TEXT)
Exception request for [Tool Name]
User:
Role:
Reason access is required:
Risk if removed:
Approver (business owner):
Approval date:
Review date (90 days from now):
C) Seat reclaim tracker (CSV starter)
Copyable template (CSV)
vendor_name,user_email,seat_type,last_login,team,manager,status,action_date,exception_approved,notes
ExampleCo CRM,user@example.com,full,2025-09-01,Sales,manager@example.com,remove,2026-02-10,false,Inactive 90+ days
D) Monthly audit checklist
Export seat roster
Flag inactive seats using the chosen rule
Send notice for questionable seats
Remove confirmed inactive seats
Reduce purchased seats or tiers
Confirm invoice reflects changes
Update SaaS inventory and renewal notes
Common pitfalls (avoid)
reclaiming seats but forgetting to reduce purchased quantity
removing admin or service accounts accidentally
making exceptions permanent (exceptions must be time-bound)
not installing a cadence (savings will drift back)