A client's team had nine full-time people and one part-timer. They were paying for 22 software seats across their main tools.
"That doesn't make sense," I said.
They knew it didn't. They also didn't know how to fix it without breaking something.
How it accumulates
A contractor comes on for three months to help with a specific project. You give them a seat in your project management tool. Six months later, they're gone. Nobody removes the seat.
Someone gets promoted from project manager to department lead. They get access to the advanced tools that goes with the role. A year later, they move to a different company. The advanced license is still active.
You hire someone. They're in the system for a week while paperwork processes. They don't work out. HR moves fast. But the software seat sits there, still billing.
A contractor becomes an employee. Now they're in the contractor platform and the employee platform because nobody cleaned up the contractor account.
Each one is small. Each one is $20-50 a month. By the time anyone notices, you're 30 days into a new billing cycle and you figure it's not worth the effort to get a refund.
Why nobody notices
Because seat management is boring. Nobody's job description includes "audit user licenses every month." It's not exciting. It's not urgent. It doesn't make the project go faster.
So it doesn't happen. Which means everyone assumes someone else is handling it. Which means nobody is.
The bill arrives. Finance pays it. Nobody questions it because seat counts fluctuate. Maybe they did hire someone new. Maybe that's correct. By the time enough doubt accumulates to trigger an audit, you've already paid for three months of seats that don't exist.
The second-order cost
This one is less obvious than wasting $300 a month on licenses.
When unused accounts sit active in your systems, you have a security and compliance problem. Older team members who left still have access. If they ever get mad, or if their credentials get compromised, someone has a doorway into your systems.
You also have a data problem. Every report you run might include historical data from people who no longer work there. Every team export might include archived users. You're working with datasets that are harder to interpret because they're cluttered with ghosts.
The pattern in the data
One team had:
- 22 seats across their main software, team of 9 people
- 4 of those seats belonged to people who'd left more than 6 months ago
- 3 were duplicates (same person had a second account that got created during an onboarding error)
- 2 belonged to contractors who'd finished their work two years prior
- 1 was set up for a CEO who'd been bought out, but the email forwarded to a new owner and nobody had noticed
- The other 8 were legitimate
So roughly 15 of their 22 seats were billing them for people who weren't actually using the system.
At $45/seat/month, that's about $8,100 a year.
The fix took two hours. A series of emails asking "is this person still active?" and then removing the no answers.
How to prevent it
You need one person—not a whole team, one person—to do a quarterly audit. Pull up the user list. For each one, answer: "Is this person still here? Are they still in this role? Do they still need this access?"
If the answer is no to any of those, they come off.
That's it. That's the whole system. One afternoon every three months.
The alternatives are: keep paying for ghosts, or hire an external contractor to do it and pay them more than the licenses cost.
Seat audit is part of the account consolidation work I do. Start here if you want help with it.