Guide

How to find the HubSpot seats nobody is using

The manual method for finding paid HubSpot seats with no activity behind them, why the seats page cannot show you this, and the one category almost every review misses.

Published 13 August 2026 · How to audit a HubSpot portal

Almost every HubSpot portal past its second year is paying for seats nobody uses. Not through carelessness — someone leaves, someone changes role, someone is invited and never accepts. None of that shows up on an invoice that only ever gets larger, and it is nobody’s job to notice.

Here is how to find it by hand, and what makes it harder than it should be.

Why the seats page cannot answer this

Open Settings → Users & Teams and you get a list of people and the seat each one holds. What you do not get is whether any of them did anything.

That is the whole problem. A paid Sales Hub seat looks identical whether the person closed eleven deals last quarter or has not logged in since March. The page that tells you what you are paying for and the page that tells you whether it is earning are different pages, and one of them does not exist.

So the manual method is a join: take the user list, then go and find activity for each person, one at a time.

The manual method

1. Export the user list

From Settings → Users & Teams, export to CSV. You want, per user: name, email, seat type, status (active or deactivated), permission set, and last login if it is available to you.

Last login is a weak signal on its own — someone can log in daily and do nothing — but it is a fast first filter. Anyone who has not logged in for 90 days is worth a closer look regardless of what else you find.

2. Decide what “used” means, and write it down

This is the step people skip, and it is the one that decides whether the exercise survives contact with the person whose seat you want to remove.

“Used” is not “logged in”. A defensible definition is activity that the seat is actually for:

  • contacts touched or created
  • deals worked
  • meetings booked
  • sequences sent
  • calls logged
  • tasks completed

Pick a window — a quarter is the usual choice, because a month catches people on holiday and a year catches nobody. Then hold the same definition for every user, including the ones you would rather keep.

3. Pull activity per user

This is the slow part. For each signal you care about, filter the relevant object by owner and by date, and record a count against the user. Contacts by owner and create date. Deals by owner and last activity. Meetings and calls from the activity feed.

Doing this properly for a forty-user portal is an afternoon. Doing it again next quarter is the same afternoon, which is why most people do it once.

4. Match each person to the cheapest seat that still fits

A seat with no activity is the obvious case. The more common and more valuable case is a seat that is too expensive for what the person does.

Someone who only ever reads reports does not need a Sales Hub seat. Someone who works a support queue is genuinely busy but their activity looks nothing like a salesperson’s — and a review that only counts deals will read them as idle and recommend removing a seat they need. Judge each person against what their role actually produces, not against one number.

5. Check the leavers properly

Deactivating a user does not always release everything, and offboarding is where portals rot quietly. Two things to look for:

  • Records still owned by deactivated users. Their deals and contacts do not reassign themselves, and workflows that route by owner will quietly fail against them.
  • Deactivated users who kept elevated permissions. Losing the seat and losing Super Admin are separate actions, and it is easy to do the first and forget the second.

The category almost every review misses

Invitations that were never accepted still hold a seat, and you are still billed for them.

This is the one worth going out of your way for. When someone is invited but never completes setup, they sit in a state where they are not really a user yet — so they are not classified, and they do not appear in the activity join you just spent an afternoon building. They have no last login, no owned records and no activity, which means every filter you would naturally reach for excludes them.

They are, in other words, invisible to exactly the review designed to catch them. And because nobody ever used the seat, nobody ever notices it is there.

Check your pending invitations directly, and check them against the seat count on your invoice rather than against your user list.

What to do with the answer

Do not go straight to removing seats. Two things first:

  1. Check the renewal date. Seat reductions usually take effect at renewal rather than immediately, so the saving is only real if you act before the term rolls.
  2. Tell people before you remove them. A seat with no activity sometimes belongs to someone about to start a project. The finding is a question, not a verdict.

Then act, and write down the date you did it — because the number goes back up. Every hire, role change and invitation moves it, which is why a portal that was clean in March is not clean in September.

Doing it once is the easy part

The genuine difficulty is not the first audit. It is that the answer expires. The afternoon you spend produces a number that is correct on the day and drifts from that day onward, and the only way to keep it correct by hand is to spend the afternoon again.

That is the part worth automating, and it is the reason this product exists.

Stop doing this by hand

Tendal connects to your portal read-only and answers all of this in a few minutes, then keeps watching so you do not have to run it again. The first audit is free and needs no card.