Parent and child companies in HubSpot is one pointer field, not an account model. How to key, merge and roll up multi-entity accounts without losing data.
In shortParent and child companies in HubSpot is a labeled association with one parent per child, not an account model. Before linking records, decide what a company record represents, what the join key is and which record owns revenue. Then close the auto-create tap, merge in tiers with hard stops, and build the rollup on the parent.
Somebody on your team is going to ask how to set up parent and child companies in HubSpot. They will ask it because a rep opened the Acme record, saw one deal, and knew for a fact there were four. The answer they get back will be a link to the HubSpot docs on parent and child company associations, they will spend an afternoon linking records, and the problem will still be there next quarter.
It will still be there because parent and child companies is not an account hierarchy. It is a labeled association with one parent per child, almost no native workflow access, and no opinion whatsoever about which record owns the money. It is a pointer. Pointers are useful. Pointers are not models.
The account model is three decisions you make before you touch the association: what a company record represents, what the join key is, and which record owns revenue. Get those wrong and the hierarchy you build on top is decoration. Get them right and the association is the easy part.
Worth being precise, because most of the confusion here is people expecting a data model and getting a field.
A child company can have exactly one parent. That is fine for a clean holding structure and wrong the moment you have a site that sells into two divisions, or a distributor that is both a customer and a channel. Native workflow actions on parent versus child are thin, so any inheritance you want (owner, territory, tier, SLA) has to be built deliberately. It does not flow downhill on its own.
And reps read the parent record as "everything for this group." It shows nearly nothing unless you build the rollup. So the hierarchy gets linked, the parent record stays empty, trust dies, and everyone goes back to asking in Slack.
Then there are the two mechanics that quietly create the mess in the first place.
Domain is the unique identifier for companies on import. Email for contacts, domain for companies. The import merges or overwrites on match rather than creating both. Which means the moment you import a list of sites that share a corporate domain, HubSpot collapses them into one company record and nobody gets an error. Your three plants in three countries became one row, and the only evidence is a deal count that looks slightly wrong.
Auto-create-and-associate companies invents records from email domains. HubSpot will read a contact's email domain and manufacture a company, then associate it. That toggle should be off in almost every portal we touch. We have watched it get flipped back on by an ad form integration and refill a portal with hundreds of company duplicates inside a few weeks. Cleaning up on top of an open tap is theater.
"We have duplicate companies" is three different problems wearing the same coat, and the fix for one will damage the other two.
Same entity, twice. One legal entity, two records, identical normalized domain. This is a matching problem. Merge it.
Different entities, one domain. Acme Iberia and Acme France both live at acme.com. Two legal entities, two ERP customers, possibly two currencies, one domain. This is a modeling problem. Merge it and you have destroyed real commercial information that somebody will need at renewal.
Same entity, different domains. Acme Group SL at acmegroup.es and the operating company at acme.com. This is a resolution problem, and it is the one that punishes you for guessing. We never match on company name for exactly this reason: fuzzy name matching suppresses Acme and emails Acme Group SL, so name matches get flagged for review rather than auto-merged.
In the revenue leak framing we use on audits, this sits squarely in Leak #2, data quality and enrichment, and it surfaces as Leak #4, a bloated CRM with pipeline nobody trusts. It is a prevention problem, not a cleanup one.
Four questions, answered in writing, before anyone links a parent.
Is a record a legal entity, a site, or a buying unit? Pick one and hold it. Industrial and multi-location accounts almost always want the site as the record, because that is where the territory, the service SLA and the shipping address live. Software accounts usually want the legal entity, because that is where the contract lives.
What is the join key? Write the identity hierarchy down as an ordered list, not as folklore. Ours typically reads: billing or ERP customer ID, then tenant ID, then normalized domain, then name. Name is always flagged for review and never auto-merged. If revenue does not sync, it is usually not because the integration broke. It is because two systems are keyed on two different identities.
Which record owns revenue? A deal is an event. A company is the customer. If revenue is mirrored onto the deal or the contact instead of the company, renewals and expansions scatter and no record can answer "what is this customer worth."
What rolls up and what does not? Revenue rolls up. Suppression rolls up, because the relationship is with the company and not the mailbox. Owner does not roll up. Territory does not roll up. SLA does not roll up. On industrial builds this is the whole game: on the Elesa+Ganter service operations build, ownership runs by zone and postal code with SLA and escalation on top, which means owner lives on the site record and the group record has no business overwriting it.
That is also where the ID handshake earns its keep. Production and ERP stay in their own database, joined to the CRM by IDs rather than duplicated into it. Product 85421 was sold to customer 248. In an industrial account, the handshake is most of the work. We wrote more about that split in CRM Architecture: Your Tools Are Not the Problem.
Cleanup order matters more than cleanup technique.
Turn native auto-create off and confirm it has stayed off, including checking whatever flipped it. Ad form integrations and calendar booking flows are repeat offenders, and they will re-enable it after you finish.
Then find your orphans, because turning auto-create off creates a new gap. On one build, company creation ran only through the outbound path in Clay. Every other entry route (meeting bookings, forms, manual creation) produced contacts with perfectly valid business domains and no associated company at all. The fix was one workflow that owns company association regardless of entry path: enroll on a valid business domain plus a real account type plus no associated company, do a domain lookup, associate to the canonical company if it exists, create it if none exists, and hold for manual review if the domain is generic or shared.
The non-negotiable part: whatever creates companies has to use the same domain normalization and the same canonical company selection logic as everything else. If Clay normalizes domains one way and your HubSpot workflow does it another, you do not have a company model. You have two. More on keeping those in step in How to Sync Clay to HubSpot Without Wrecking Your CRM.
Our company dedupe runs tiered, with hard stops, and it runs after contacts.
Contacts first, then companies. Always. Running a company pass on drifted contacts wrecks associations.
Tier 1 is exact normalized domain and Tier 2 is name plus domain root, and those auto-merge. Tiers 3 to 5 are AI validated and reviewed by a human before anything writes. Writes stay button-triggered. Nobody sets this to auto-run.
The hard stops are the interesting part, because they are exactly the multi-entity protections:
Export before you merge. The restore table is a safety net, not a guarantee. Validate the result against a ten percent sample.
One operational detail that surprises people: clusters of three or more duplicates do not collapse in a single pass. The merge handles one primary and secondary pair at a time, so you re-resolve the canonical IDs against the surviving record and run it again, and again, until the cluster is gone. Then run a post-merge collision pass in order: domain, strict name, loose name. A residual duplicate after one pass means the cluster was big, not that something broke.
And the standing rule: flag for review over force merge. An unsafe merge that overwrites first-touch data is worse than a missed match.
The parent record answers "what is this customer worth" only if you make it. Nothing rolls up by itself.
Build group-level properties on the parent: total group revenue, open pipeline across all children, entity or site count, and last meaningful touch anywhere in the group. Then report at both levels deliberately. Deal and service reporting sits on the site record where the work happens. Revenue and renewal reporting sits on the group record where the money is.
When you migrate revenue out of the wrong fields to do this, hide the old properties and prove reporting parity against the export before you delete anything. Deprecation order is hide, prove, then delete.
You can answer, without opening a spreadsheet: what is this group worth, how many entities do we sell into, who owns each site, and which record is the one true customer. New companies enter through exactly one path with one normalization standard. Two entities on one domain stay two records on purpose, and there is a written reason why. And nobody on your team has to ask in Slack whether the Acme record is the real one.
If the honest answer is that you do not know how many company records you have for your largest account, that is a leak with a number attached, not a tidiness problem. Our Revenue Leak Audit quantifies it, and the CRM Foundation and Data Architecture module is where we rebuild the account model properly. Start with whichever one gets you an honest number fastest.
A 20-minute audit, two worksheets and one chapter from The Architecture Behind Growth.
You’ll also get The RevOps Build, one practical build per issue. Unsubscribe in one click.
The guide is on its way. If it has not landed in a couple of minutes, look in your promotions tab.