Skip to main content

HubSpot

Why Your HubSpot Report Shows Duplicate Contacts and 'No Value'


Both symptoms come from one cause: a multi-source report counts a record once per association. The diagnosis, and the two fixes that work.

Julia HanneyBy Julia HanneyUpdated September 3, 20267 min read
A HubSpot custom report table with a contact appearing on several rows and a row labelled No value.

Key Takeaways

  • Duplicate rows are an association artefact: HubSpot counts a record once per association when a report spans two data sources.
  • The '(No value)' row holds records from the primary source that have no associated record in the secondary source, and it is often the most useful row on the report.
  • Grouping by Record ID collapses duplicate rows back to one per record without hiding the underlying data.
  • Archived, deleted and renamed segments still leave associations behind, which is why a report can reference something the interface no longer shows.
  • Decide the question before you pick the primary data source, because the primary source determines what a row means.

Two symptoms, one cause, and it is not a bug.

A client opened a report filtered on an advertising audience and found the same contacts listed several times over, alongside a row labelled "(No value)" that they could not remove. The conclusion in the room was that the CRM data was corrupt. It was not. The report was doing exactly what a two-source report does, and the number at the bottom was wrong only because the question was wrong.

The mechanism, in one paragraph

When a HubSpot report draws on more than one data source, the underlying operation is a join. HubSpot's documentation states it plainly: a record might be counted more than once depending on the filters added, because associated records can meet the filter criteria more than once per association.

So a contact associated with three segments produces three rows. A company with four deals produces four rows. Nothing is duplicated in your CRM. The report is listing associations, and you are reading it as though it lists records.

The "(No value)" row is the same mechanism seen from the other end. HubSpot documents that in a deals-and-contacts report, the (No value) row in the contact column holds all the deals not associated with any contact. It is the bucket for primary-source records that found no match in the secondary source.

Why "(No value)" is usually the most useful row on the report

The instinct is to filter it out. Resist it, at least until you have looked at what is in there, because that row is frequently the actual finding.

In a deals-and-contacts report, "(No value)" is every deal with no associated contact. That is a pipeline hygiene problem, an attribution problem, and probably a forecasting problem, and it has just been handed to you for free.

We see the same pattern in audits repeatedly. On one 78,000-contact portal, 85.9 percent of deals had no owner and 99.4 percent had no amount. Those numbers came out of reports where the empty bucket was the story. A client who filters "(No value)" out of every report has built a dashboard that structurally cannot show them their worst data.

The other reason a "(No value)" row appears is more mundane and worth checking second: the association points at something that is no longer visible in the interface. Deleting, archiving or renaming a segment does not retroactively clean up the associations that reference it. The report resolves the association, finds nothing to display, and renders no value. This is why a report can appear to reference a list nobody can find any more.

The fix: group by Record ID

If what you want is one row per contact, group by the contact's Record ID. That collapses the association-driven duplication back to a single row per record while keeping the underlying data intact.

Two things to know about doing it:

Remove the aggregation on the Record ID field if you want it to render as a clickable link to the record rather than as a count. HubSpot documents this behaviour for table reports and it catches people who add the field and then wonder why it shows a number.

Grouping is not the same as filtering. Grouping collapses the presentation; it does not discard rows. If your goal is "contacts who are in at least one of these segments," grouping gives you that honestly. If your goal is "how many segment memberships exist," you wanted the ungrouped version all along.

The better fix: decide the question first

Grouping by Record ID resolves the symptom. The more useful habit is upstream, and it is a single decision made before you build anything.

The primary data source determines what a row means.

  • Primary source contacts, secondary deals: one row is a contact, and the report answers questions about people.
  • Primary source deals, secondary contacts: one row is a deal, and the report answers questions about pipeline.

These are different reports and they will produce different totals from the same data, correctly. Most confused reports we are handed are one report trying to answer both questions, which is why a column nobody wants cannot be removed: the column is load-bearing for one of the two questions the report is attempting.

The practical test we apply before building: write down the sentence the report should let you say. "Forty-two contacts in the enterprise segment have an open deal" is a contact-primary report. "Eleven open deals have no associated contact" is a deal-primary report. If the sentence has two subjects, you need two reports.

The diagnostic, in order

When a report looks wrong:

  1. Count the data sources. One source cannot produce association duplicates. If the report is single-source and still shows repeats, you have genuine duplicate records and that is a different job.
  2. Identify the one-to-many relationship. Which side of the join has multiples? That is where the row inflation comes from.
  3. Open one duplicated record in the CRM. Confirm the associations are real. Nine times in ten they are, and the report is accurate.
  4. Check what "(No value)" contains before you remove it. It is a finding until proven otherwise.
  5. Restate the question and check that the primary source matches its subject.
  6. Group by Record ID if the answer is genuinely one row per record.

Step three matters more than it looks. It is the step that converts "the report is broken" into "the report is telling us something," and it is the one people skip because opening a record feels like slower work than adjusting a filter.

Three report shapes that sidestep the problem entirely

Sometimes the right answer is not to fix the two-source report but to build a different kind of report.

Shape one: a single-source report with a rollup property. If the question is "how many deals does this company have," a single-source company report reading a calculated property beats a two-source join. Rollup and calculation properties are computed on the record, so there is no join to duplicate. The trade is that you have to create and maintain the property, and it only answers the question it was built for.

Shape two: a list, not a report. "Which contacts are in at least one of these segments" is a membership question, and an active list answers it exactly once per contact by construction. Teams reach for the report builder out of habit when the thing they need is a list they can also use for a send.

Shape three: two reports side by side on one dashboard. A contact-primary report and a deal-primary report, each honest about its own subject, presented together. This is usually what the client wanted when they asked for "one report showing both," and it removes the pressure to make a single table answer two questions.

The decision rule: if the answer is a count of records, prefer single-source. If the answer is genuinely about relationships, accept the join and group deliberately.

One more habit worth building. When a report is going to be read by someone who did not build it, put the row definition in the report description. One sentence: "One row is a contact. Contacts with several qualifying deals appear once because the report groups by contact Record ID." That sentence prevents the ticket.

Where this becomes an agency problem

A client acting on a wrong number is worse than a client with no number, and reporting is where inherited portals fail most quietly. Nobody audits report logic. They audit the data and trust the reports built on it.

In portal audit work we score reporting trust as its own dimension, and the findings are consistent: dashboards built years ago by people who have left, reports counting associations while their titles promise records, and a long tail of reports owned by former agencies' accounts. On one portal, 222 of 282 reports were owned by three former agencies' email addresses. On another, 118 of 150 custom reports were owned by two people and 26 by ex-employees.

Ownership matters here because a report nobody owns is a report nobody questions. The duplicate-row problem survives for years in exactly those conditions.

Three habits that prevent it on portals you manage:

  • Name reports after the sentence they answer, not after the objects they contain. "Contacts with an open deal" tells the next person what a row means. "Contacts and deals" does not.
  • Put the primary source in the description field. It costs one line and it is the first thing anyone debugging the report needs.
  • Review report ownership at every handover, and reassign anything owned by a departing user before they are deactivated.

The bottom line

Duplicate contacts and "(No value)" rows are the same feature seen from two directions: a multi-source report counts a record once per association, and records with no association land in the empty bucket. Neither indicates bad CRM data on its own.

Group by Record ID when you want one row per record, look inside "(No value)" before you filter it away, and pick the primary data source from the question rather than from habit.

If your team is inheriting client portals with dashboards nobody can vouch for, reporting logic is one of the dimensions our white-label HubSpot audits score, and the rebuild afterwards is the same engagement. Our guide to creating better reports in HubSpot covers the build side once the structure is right.

Sources

  1. HubSpot: Understand the custom report builder (opens in new tab)
  2. HubSpot: Create reports with the custom report builder (opens in new tab)

Frequently Asked Questions

Why does the same contact appear multiple times in my HubSpot report?

Because the report spans two data sources and the contact has more than one association that meets the criteria. HubSpot counts a record once per qualifying association, so a contact in three lists or with three deals produces three rows rather than one.

What does '(No value)' mean in a HubSpot custom report?

It is the bucket for records in the primary data source that have no associated record in the secondary source. In a deals-and-contacts report, the (No value) contact row contains every deal with no associated contact, which is usually a finding rather than a glitch.

How do I remove duplicate rows from a HubSpot report?

Group by Record ID for the object you want one row per. This collapses the association-driven duplicates back to a single row per record. If you also need the associated detail, keep it as a separate report rather than forcing one table to do both jobs.

Can you remove a column from a HubSpot report table?

You can control which fields appear, but you cannot remove the grouping dimension a multi-source report is built on without changing the report's structure. If a column you cannot remove is causing duplication, the report is asking the wrong question and needs rebuilding.

Why does my report reference a list that no longer exists?

Deleting, archiving or renaming a segment does not remove the association records that already point at it. Reports built on those associations keep resolving them, and an association pointing at something no longer visible renders as no value.

HubSpot Portal Audits

What's Hiding in Your Clients' Portals?

A meticulous white-label audit turns messy portals into a prioritized roadmap, and into your next retainer conversation.