There is a specific moment in most HubSpot portals where reporting stops being used. Someone quotes a number in a meeting, someone else contradicts it from a different dashboard, and from then on people go back to spreadsheets. The dashboards keep existing; nobody cites them.
The cause is almost never HubSpot. It is duplicate records inflating counts, lifecycle stages that mean different things to different teams, properties written by three sources at once, and deals that have been open since a rep who left in 2024 created them.
This is the cleanup sequence we run, in order, because order matters — deduplicating before you fix lifecycle definitions just means you merge records into the wrong stage. If you would rather hand the whole thing over, that is what HubSpot CRM setup and automation covers.
Step 1: Decide what the numbers are supposed to mean
Before touching a record, write down definitions for every lifecycle stage and every deal stage. A lead is what, exactly? Who moves a contact to MQL, and on what trigger? What has to be true for a deal to leave 'discovery'?
Do this in a shared document with sales and marketing in the room, and keep it to one line per stage. If two people give different answers, you have found the actual reason your reports disagree — and no amount of data hygiene fixes a definitional dispute.
Write exit criteria, not descriptions. 'Has agreed to a scoped proposal' is auditable. 'Is interested' is not.
Step 2: Audit properties and kill the dead ones
Export your property list and mark each one: actively used, historical, or dead. Most portals carry dozens of properties created for a campaign three years ago, half-populated, still appearing in filter dropdowns where somebody will eventually pick the wrong one.
For every surviving property, record who writes to it — form, import, integration, workflow, or human. A property with three writers and no owner is the single most common source of a broken report.
Archive rather than delete where history matters, and rename dead-but-needed fields with a clear prefix so nobody filters on them by accident.
| Property | Written by | Used in | Verdict |
|---|---|---|---|
| Lifecycle stage | Workflow only | All pipeline reporting | Protect — single writer |
| Original source | HubSpot tracking | Attribution reporting | Protect — never overwrite |
| Lead source (custom) | Form + import + rep | Nothing current | Retire — duplicates original source |
| Deal stage | Rep, with exit criteria | Forecasting | Protect — needs written criteria |
| Campaign 2023 flag | One-off import | Nothing | Archive |
Step 3: Deduplicate contacts and companies properly
Run HubSpot's duplicate management tool first, then hunt the duplicates it misses: personal versus work email on the same person, company records differing by 'Ltd' versus 'Limited', and contacts created by an integration that keys on a field your forms do not collect.
Merge in the right direction. The surviving record should be the one with the richest activity timeline, because associations and engagement history are what your reporting reads.
Then close the tap. Deduplicating without fixing the source — an import without a matching key, a form collecting a second email field, an integration creating rather than updating — means you repeat this in four months.
Step 4: Fix marketing versus non-marketing contacts
Suppliers, job applicants, partners, form spam and long-dead imported lists should not be marketing contacts. This is both a data quality issue and a billing one, because marketing contact tiers price in blocks.
Set non-marketing as the default on import, then use a single workflow to promote contacts when a campaign genuinely needs them.
This one change routinely drops a portal a full tier at renewal with no loss of capability — see the HubSpot pricing breakdown for how the tiers behave.
Step 5: Deal with the deals
Open deals with no activity for 90 days are not pipeline; they are optimism. Build a list, review it with the owner, and close them as lost with a reason. Forecast accuracy improves immediately, and usually the forecast gets smaller and more believable.
Reassign deals owned by departed users before doing anything else, or your rep performance reporting stays permanently wrong.
Add required close reasons on lost deals going forward. Six months of honest loss reasons is more useful than any attribution report you will build this year.
Step 6: Rebuild the dashboards, then delete the old ones
Once definitions and data are fixed, build a small number of dashboards that answer named questions for named people. Three good dashboards beat fifteen that nobody opens.
Delete or archive the old ones. Leaving contradictory dashboards in place guarantees somebody quotes the wrong number in a meeting and the trust problem returns.
Put a documented owner and a review date on each surviving dashboard. Reporting decays without maintenance, exactly like a website does.
Step 7: Keep it clean with automation, not willpower
Set up hygiene workflows: normalise country and job title values, flag records missing required fields, alert on deals stalled beyond a threshold, and set non-marketing status on new records from non-campaign sources.
Add validation at the entry point — required fields on forms, restricted dropdowns instead of free text, and progressive fields rather than one long form that reps fill with placeholder text.
Then schedule a quarterly 90-minute audit: duplicates, unowned properties, stalled deals, seat usage. Cleanup is cheap when it is routine and expensive when it is a project. Our ongoing HubSpot support exists largely because of this.
