Marketing contacts are the line on a HubSpot bill that grows without anyone deciding it should. Seats change when someone joins or leaves, which is at least a visible event. Marketing contacts change because a form was filled in, and nobody experiences that as a purchase.
How the billing actually works
Two things matter, and the second one is the one that catches people.
You are billed in blocks, not per contact. Marketing contacts are priced in tiers, and you buy a tier. Going from the top of one block to the bottom of the next is a step change in cost, not a gradual one. This means the practical question is never “how many marketing contacts do we have” — it is “how far are we from the next boundary”, and that is a question almost nobody has an answer to until the invoice arrives.
The tier ratchets. Crossing into a higher block raises your bill for the term. Dropping back below the line later does not automatically lower it again — you are committed for the period you bought. So the cost of drifting over a boundary is not the difference for a month; it is the difference for the whole term.
Those two facts together are why this line item behaves so differently from seats. A seat you can release. A block boundary you cross once and pay for until renewal.
Marketing versus non-marketing
Every contact in HubSpot is either marketing or non-marketing. Only marketing contacts count toward the billed total, and only marketing contacts can be sent marketing email.
The trap is that the setting is easy to apply broadly and hard to review afterwards. Imports get flagged as marketing wholesale. Form submissions set it automatically. Integrations set it because that was the sensible default when someone configured them two years ago and nobody has looked since.
The result is a billed population that grew by accretion rather than by decision, and which nobody has ever audited as a whole.
Finding the contacts you pay for and never mail
The number worth knowing is not your total. It is the slice of that total which is marketable but inert — contacts you are billed for that have never engaged, or have not engaged in a very long time.
To find it by hand:
1. Establish the billed total
Check your marketing contacts count against your current tier, and note the distance to the next boundary in both directions. Write down the boundary numbers themselves. This is the figure you will actually manage against.
2. Segment by engagement, not by age
Build a list of marketing contacts with no email engagement in a meaningful window — no opens, no clicks, no form submissions. A year is a reasonable starting point.
Do not simply segment by create date. An old contact who still opens things is a good contact; a contact created last month who has never once engaged may be worth less than one from four years ago. Age is a proxy for engagement, and a bad one.
3. Separate “never engaged” from “stopped engaging”
These look identical in a count and mean different things:
- Never engaged usually points at an acquisition problem — a source that produces contacts who were never really interested. Worth fixing upstream, or you will refill the list as fast as you clear it.
- Stopped engaging is ordinary lifecycle decay, and is the population to set non-marketing.
4. Check what is creating them
Before cleaning, find out what is filling the list. Typically: an integration syncing a whole external database, a form that flags everything as marketing, or an import nobody scoped. Cleaning without closing the tap means doing this again in six months with the same result.
5. Set the inert ones non-marketing
Setting a contact to non-marketing removes it from the billed count and stops it receiving marketing email. It does not delete the record — the contact, its history and its associations all stay exactly where they are, and you can set it back at any time.
This matters, because the reversibility is what makes the decision safe. You are not throwing anything away; you are declining to pay to keep mailing someone who does not read it.
Watch the boundary, not the number
The single most useful habit here is to know where the next block boundary sits and how fast you are approaching it — before you cross it, not after.
Crossing a boundary is the expensive event, and it is entirely predictable: the count only ever climbs, so the date you will cross is a straight line from your current growth rate. The reason it surprises people is not that it is unpredictable. It is that nobody is looking.
That is a monitoring problem rather than a cleanup problem, and it is the reason this is one of the things Tendal watches continuously: it reports the total, the inert slice inside it, and warns as a boundary approaches rather than once the invoice has already changed.