Untangling One Company Into a Correct Account Tree
You can take one company split across CRM, billing, and enrichment and resolve it into a correct account tree, deciding merge, link, or keep-separate per record.
Key takeaways
- Your safest match signal lies by omission: exact email or domain match scores 99.1% precision but only 42.3% recall, so it leaves most duplicates un-merged in the ambiguous 20% that does the damage.
- A DBA is never a child node to link; all DBAs share one EIN tied to the legal entity, so a trade name is an alias to collapse, and EIN is the discriminator name and domain cannot provide.
- The master-ID choice is a one-way door: Salesforce keeps only the master's record ID, HubSpot has no native undo, and a third-party unmerge creates a new record ID rather than restoring the original.
- The roll-up view is unbuilt by default; Salesforce cannot tell you from a standard field whether an account has children, so keeping the roll-up is active engineering, not a merge side effect.
- In Refolk's index, US RevOps Managers (1,099) outnumber the UK (221) nearly 5 to 1, and the US data-quality bench (2,118) outnumbers US RevOps almost 2 to 1.
- A 301 redirect or a logo change is a marketing artifact, not legal evidence; classify an acquisition only on a registry filing, an LEI Level-2 relationship, or a press release.
You have one company. It shows up as a handful of conflicting records: a rebranded name in the CRM, an old legal name in billing, three subsidiaries your enrichment vendor added, and a trade name someone typed in by hand. This guide is for RevOps, data stewards, and anyone answerable for how the records got cleaned. It carries one real tangle from raw duplicates to a finished parent-child tree, with the counts, the forks, and one reversed wrong turn, so you can follow the same path on your own case.
The hard part is not the easy duplicates. Deterministic rules handle the easy 80% of duplicates; the remaining 20% is where a rebrand, an acquisition, three subsidiaries, and a DBA all collide, and where a single wrong merge quietly destroys history you can never get back. This guide shows how to decide merge, link, or keep-separate at each of those forks on evidence, not on name similarity.
The tangle I am working, record by record
I am resolving one company that appears as eight records across three systems. The company rebranded, acquired a smaller firm, operates three subsidiaries, and trades under a DBA. Here is the raw inventory I pulled in step one, before any decision.
| Record | System | Legal name / name shown | EIN | LEI | Verdict I reached |
|---|---|---|---|---|---|
| A | CRM | Northwind Analytics (new brand) | 11-1 | yes | Master |
| B | CRM | Nordic Data Systems (old name) | 11-1 | yes | Merge into A |
| C | Billing | Nordic Data Systems Inc | 11-1 | yes | Merge, repoint ID |
| D | CRM | NDS Insights (DBA) | 11-1 | - | Alias on A |
| E | Enrichment | Harbor Metrics (acquired) | 22-2 | yes | Link as child |
| F | Enrichment | Northwind EMEA Ltd | 33-3 | yes | Link as child |
| G | Enrichment | Northwind APAC Pte | 44-4 | yes | Link as child |
| H | CRM | Northwind Logistics | 55-5 | yes | Keep separate |
Three facts decide almost everything in this table. Records A, B, C, and D share one EIN, so they are one legal entity wearing four names. Records E, F, and G carry their own EINs and LEIs, so they are distinct entities that must be linked, not fused. Record H shares a brand word but nothing else, and it is a coincidental name collision I keep separate.
One company, eight records, narrowed to decisions
- 8Candidate records
pulled from CRM, billing, enrichment
- 4Same-EIN cluster
A, B, C, D collapse to one node
- 3Merges executed
B, C, D fold into master A
- 3Distinct entities linked
E, F, G become children
Why name similarity is the signal that lies
Name similarity is the most available signal and the least trustworthy; it is high for both true duplicates and unrelated firms, so it can never clear the merge bar on its own. The hard keys are domain, legal entity identifier, and tax ID. Everything else is a hint.
Here is the trap that caught me on record H. Northwind Logistics scored a high name-similarity match against Northwind Analytics. If I had trusted the score I would have fused two unrelated companies. The EIN told the truth: 55-5 against 11-1. Different legal entities, no relationship, keep separate.
The published benchmark below shows why your safest key is also your blindest. Read the recall column, not just the precision column.
| Signal | Precision | Recall | F1 | False-positive rate |
|---|---|---|---|---|
| Exact email match | 99.1% | 42.3% | 59.3% | 0.9% |
| Name + zip code | 84.7% | 68.9% | 75.9% | 15.3% |
| Probabilistic (Fellegi-Sunter) | 91.2% | 78.4% | 84.3% | 8.8% |
| Behavioral + relational ML | 96.8% | 93.1% | 94.9% | 3.2% |
The lesson is structural. Your cleanest signal silently leaves most duplicates un-merged, and the leftovers are precisely the rebrands, DBAs, and acquisitions that need a human. Name plus zip code looks productive at 68.9% recall but carries a 15.3% false-positive rate, which is how unrelated firms get fused. I use domain and EIN to confirm, and I treat every name-only match as a question, not an answer.
The one safeguard you build before touching anything
Export a full, frozen copy of every candidate record before you merge, because the undo you are imagining does not exist. Native rollback is largely absent across the tools you will use, and the window to notice a mistake is short while the consequences surface late.
The specifics are worth stating plainly. HubSpot provides no native undo for merged companies; once merged, the process is irreversible. In Salesforce, after a merge the deleted record is gone permanently. HubSpot does retain a breadcrumb through its Merged Record Ids property and property history, and a third-party reconstruction exists, but with a sharp caveat: due to API limitations, unmerging creates a new record with a new record ID rather than restoring the original, with original read-only fields like Create Date preserved in a separate property group.
That caveat matters more than it first appears. Even a "successful" reconstruction hands you a new record ID, so every downstream foreign key that pointed at the original is now dangling. The pre-merge export is the only artifact that lets you rebuild the exact prior state. On my tangle I exported all eight records, their related contacts, and their billing links to a dated sheet before I merged a single pair. I needed it later.
What survives a merge, and what does not
- Pre-merge exportThe only full, restorable copy of prior state, held outside the tool
- Master record IDRetained; becomes the surviving key everything must point to
- Winning field valuesOne value per conflicting field survives; recency should decide
- Deleted record and lost valuesGone permanently; a second phone or stale-but-real field vanishes
Merge, link, or keep-separate: the discriminators
Decide on hard keys, not on resemblance. A shared EIN or domain with a different trade name means merge or alias; a distinct legal entity more than 50% owned means link; a coincidental name with different keys means keep separate. The EIN is the discriminator that name and domain cannot provide.
Start with the DBA, because it masquerades as both a duplicate and a subsidiary. A DBA, also called an assumed, fictitious, or trade name, can operate using an EIN but does not own one independently; it lets a company conduct business under a name other than its legal name. You use the same EIN for a business and all its DBAs, because an EIN is tied to the legal entity, not to individual trade names. So record D, NDS Insights, sharing EIN 11-1, is an alias to collapse onto the master. It is never a child node to link.
For true separate entities in one family, the link evidence is the LEI Level-2 relationship. Legal entities report their direct accounting consolidating parent and their ultimate accounting consolidating parent. The parent test is explicit: the parent owns more than 50% of the legal entity, consolidates accounts, and is not restricted from reporting by legal obstacles. Records E, F, and G each have their own EIN and a Level-2 relationship pointing at the master's legal entity, so they link as children. Note the limit: GLEIF reports accounting consolidation, not every ownership nuance, so it confirms the relationships it covers and is silent on the rest.
This is the fork most generic merge posts skip. They tell you to merge duplicates and stop. The real work is telling an alias (collapse), a subsidiary (link), and a coincidence (keep separate) apart, and the only reliable way to do it is the legal-entity key.
If you need a person who has run a Salesforce-to-billing cleanup end to end, describing the job in plain English and getting back the people who have done it is the shortest path. That is what Refolk is for.
Classify the corporate event on primary evidence only
Assert a rebrand, acquisition, or divestiture only from a registry filing, an LEI Level-2 relationship, or a press release. A 301 redirect and a logo change are marketing artifacts, not legal evidence, and reading them as ownership is the most common way this step goes wrong.
On my tangle, the acquired firm Harbor Metrics had 301-redirected its old domain onto the Northwind domain. That redirect is suggestive, and it is exactly the move an acquirer makes: acquirers routinely use a 301 redirect to migrate an acquired domain to a parent or sister domain, and 301s are permanent. But the same redirect is a staple of pure link-building, so it does not establish ownership. The transferable principle from engineering says it cleanly: browser-controlled redirect data does not grant access by itself.
So I did not classify Harbor Metrics as acquired on the redirect. I found the press release and the LEI Level-2 relationship, which needs consolidated accounts verifying the link. With that primary evidence in hand, E linked as a child. Had I stopped at the redirect, I might have linked a company Northwind merely partnered with, or worse, fused it.
A redirect tells you where a page went, never who owns the company behind it.
The procedure, step by step
Work the nine steps below in order, with the one documented exception that teams who already know an acquisition happened sometimes classify events before bucketing pairs. Each step names who does it, roughly how long it takes, and what done looks like.
Resolve one company into a correct account tree
- Inventory and snapshotPull every candidate record from CRM, billing, and enrichment into one sheet with domain, legal name, EIN or tax ID, LEI, and record ID, then export a full copy outside the tool. Done when a frozen pre-merge export exists that you could restore from.
- Surface candidate pairsBlock on domain and name to generate the pair list across all three systems. Done when every record sits in at least one candidate cluster.
- Score and bucket each pairApply thresholds to split pairs into auto-merge, human-review, and keep-separate or link, and refuse transitive chains. Done when every pair has a verdict and a one-line reason.
- Classify corporate eventsFor any rebrand, acquisition, or divestiture, attach primary evidence: a registry filing, an LEI Level-2 relationship, or a press release. Done when no event is asserted from a redirect or logo alone.
- Decide merge, link, or keep-separate per recordSame EIN plus a trade name is merge or alias; a distinct entity more than 50% owned is link; a coincidental name is keep separate. Done when every record carries a documented decision and its discriminating key.
- Execute merges and choose the masterPick the surviving record ID and set field survivorship so recent good values prevail. Done when the master retains its ID and related records are reparented to it.
- Reconcile cross-system IDsOverwrite stale CRM IDs in billing and enrichment to point at the master, then re-run sync. Done when billing and enrichment both resolve to the master.
- Build the hierarchyPopulate the Parent Account lookup plus custom ultimate-parent and tier fields, and mirror the tree in billing. Done when the roll-up view renders and subsidiary history is intact.
- Verify and keep the rollback artifact readySpot-check counts against the export and confirm every subsidiary's contracts still resolve. Done when counts reconcile and the export stays retrievable.
On execution, a few tool facts constrain you. Salesforce merges a maximum of three accounts at a time, so my four-record cluster (A, B, C, D) took two passes. The master's record ID is retained after merge, which is why choosing it is a one-way door. And vanilla Salesforce keeps exactly one surviving value per conflicting field; a second phone number or a real-but-not-chosen value is simply lost.
Field survivorship is where I nearly erred. Defaulting to the first record open can overwrite good data with stale data, because the primary wins conflicts. Record A had the new brand name but a stale address; record C had the current billing address. I set survivorship field by field on recency rather than taking A wholesale, then committed.
The master-ID choice and the cross-system repoint
Choose the master, then make every other system point at it, because the master's ID becomes the one surviving key and billing will not follow on its own. This is the step that, skipped, leaves a clean CRM sitting on top of a broken billing ledger.
Because the deleted record IDs for B, C, and D vanished at merge, any system still referencing them now dangles. The billing reconciliation is explicit: identify the customer accounts linked to the merged CRM records and replace the old CRM ID with the CRM ID of the master account, so all existing and future records sync to the correct account. I repointed the billing record that had been keyed to C's old CRM ID over to A, then re-ran the sync.
Here is where I made and reversed the wrong turn. In my first pass I merged B into C instead of into A, making the old legal-name billing record the master because it looked more complete. That buried the new brand under the old name and left A's richer CRM history orphaned. Because I had the pre-merge export from step one, I restored all four records, chose A as master deliberately, and redid the cluster. Without the export, that mistake would have been permanent, and I would have discovered it weeks later when an invoice went out under the dead name.
Build the hierarchy so roll-up and subsidiary history both survive
Link distinct entities with the Parent Account lookup and custom ultimate-parent fields, and mirror the tree in billing, because the roll-up view is not a merge side effect. It is something you build.
The native field is thin. In Salesforce the Parent Account field is a lookup pointing to another account; it establishes the parent-child relationship that builds the Account Hierarchy view, but it is a lookup, not a formula, so it does not roll up data or enforce ownership logic. Worse, Salesforce cannot tell you from a standard field whether an account has children, and finding the ultimate parent three levels up needs custom configuration or a separate query. So teams add custom Ultimate Parent Name, Ultimate Parent ID, and Hierarchy Level fields, keyed on a stable external ID like DUNS. A traversal formula typically climbs about ten levels before hitting recursion limits, which is ample for most trees.
For my tangle, A became the ultimate parent, and E, F, and G each got A's record ID in their Parent Account and Ultimate Parent ID fields, with Hierarchy Level set to 2. The billing side needs its own parallel tree: activate the Customer Hierarchy feature, assign the parent account in the billing system, and sync so both parent and child CRM IDs resolve correctly. Each subsidiary keeps its own contracts and history; the roll-up is simply the traversable parent chain, not a fusion of data.
How this goes wrong: the failure modes to watch
Most wrong trees come from a short list of recurring mistakes, each of which looks like success at the moment you make it. Here is what each one looks like, and the check that catches it.
- Name-only match. Two unrelated firms share a common name and score high on similarity. It looks like a strong duplicate. Check EIN, domain, or LEI before merging; name alone never clears the bar. This is the check that saved record H.
- Merging a parent into a subsidiary. Firmographics overlap, so it looks like a clean duplicate. They are distinct entities. Check for differing EINs or LEIs and link them in a hierarchy instead of fusing.
- Wrong master chosen. The surviving record looks complete, but because the primary wins conflicts, defaulting to the first record open overwrites good data with stale data. Check field recency and set survivorship field by field before committing.
- Silent chain merge. Treating "A matches B, B matches C" as transitive. One false-positive link can silently merge unrelated entities, chaining hundreds of records together, so actively check every cross-group merge rather than accepting the chain.
- No rollback artifact. The merge appears to work, but no export exists and the undo window has closed. Confirm a frozen export exists before any destructive action.
- Redirect read as acquisition. An old domain 301s to a new one, so you infer ownership. It may be link-building. Require a filing, press release, or LEI Level-2 relationship.
- Cross-system drift. The CRM is clean but billing still points at the deleted ID, so invoices fork. Check that every billing CRM ID was repointed to the master and the sync re-ran.
- Stale ultimate-parent fields. Custom hierarchy fields go stale after reparenting events. Recompute on save so the roll-up stays correct.
Merge, link, or keep-separate at a glance
Verify the result and keep it current
Before you call the job done, reconcile counts against the pre-merge export and confirm every subsidiary's history and contracts still resolve. The tree is correct only when the roll-up renders and nothing downstream is pointing at a dead ID.
Before you call the tree correct
- A frozen pre-merge export exists outside the tool and is retrievable.
- Every merge was confirmed on EIN, domain, or LEI, never on name alone.
- No corporate event was asserted from a 301 redirect or a logo change.
- Each DBA was collapsed as an alias, not created as a child node.
- Each true subsidiary is linked by Parent Account, with its own contracts intact.
- The master retained its record ID and field survivorship favored recent good values.
- Billing and enrichment CRM IDs were repointed to the master and sync re-ran.
- Ultimate-parent and hierarchy-level fields are populated and recompute on save.
- Record counts reconcile against the export and no downstream key is dangling.
Keeping the tree current is a staffing question as much as a technical one. In Refolk's index, the people who should own this are scarce and unevenly placed. US Revenue Operations Managers number 1,099 against 221 in the UK, nearly five to one; and within the US, the dedicated data-quality bench outnumbers RevOps almost two to one.
| Role (US) | Count | Share of the three |
|---|---|---|
| Marketing Operations Manager | 2,725 | 46% |
| Data Quality Analyst / Data Steward / CRM Data Analyst | 2,118 | 36% |
| Revenue Operations Manager / RevOps Manager | 1,099 | 18% |
The practical implication: the people who own the CRM (often marketing ops) are frequently not the people best equipped to own entity resolution (the data-quality bench). When you assign this work, assign it to someone who can read a legal-entity key, not just someone with admin rights. Re-run the inventory step after any acquisition or rebrand, because that is when the next tangle starts, and recompute the ultimate-parent chain so the roll-up you just built does not quietly go stale.
Questions practitioners ask
Should I merge a subsidiary into its parent account?
No. Merge only records that are the same legal entity. A parent and a subsidiary are distinct entities, usually with different EINs or LEIs, and should be linked in a hierarchy rather than fused. Fusing them destroys the subsidiary's separate contracts and history. The firmographic overlap that makes them look like duplicates is exactly the trap: check for differing legal-entity identifiers before you ever merge, and link instead when they differ.
Is a DBA a separate company I should keep as a child record?
No. A DBA, or trade name, is not a legal entity and cannot own an EIN. All DBAs of one business share the single EIN tied to the legal entity. So a shared EIN with a different trade name means you collapse that name into an alias on the real record, never create a child node. EIN is the discriminator here because name and domain cannot distinguish an alias from a genuine subsidiary.
How do I roll back a wrong account merge?
Restore from your pre-merge export. Native undo is largely absent: HubSpot offers no undo and the merge is irreversible, and in Salesforce the deleted record is gone permanently. HubSpot retains a Merged Record Ids breadcrumb, and third-party reconstruction exists, but an unmerge creates a new record ID rather than restoring the original, so downstream foreign keys still break. The frozen export you took before merging is your only true rollback.
Does a 301 redirect from an old domain prove an acquisition?
No. Acquirers do commonly 301 an acquired domain onto a parent domain, but the same redirect is also used for pure link-building, so it does not establish ownership. Classify a corporate event only on primary evidence: a registry filing, a press release, or an LEI Level-2 relationship backed by consolidated accounts. Treat the redirect and any logo change as a prompt to investigate, not as the finding itself.
How do I keep CRM and billing in sync after merging?
Repoint billing to the master. In the billing system, identify the customer accounts linked to the merged CRM records and replace the old CRM ID with the CRM ID of the master account, so all existing and future records sync to the correct account. If you skip this, the CRM looks clean while billing still points at the deleted ID and invoices fork. Verify every subsidiary's contracts resolve to the right node after the repoint.
Why can't Salesforce just show me the whole account tree?
Because the native Parent Account field is a one-level lookup, not a roll-up. Salesforce cannot tell you from a standard field whether an account has children, and finding the ultimate parent several levels up needs custom configuration or a separate query. Teams add custom Ultimate Parent Name, Ultimate Parent ID, and Hierarchy Level fields keyed on a stable external ID, and recompute them on save because they go stale quickly after reparenting.
Try it on the search you came here for
Stop building boolean strings. Just describe the person.
Type one sentence. I plan the search, read GitHub, public LinkedIn and Crunchbase records, and the open web as it is right now, and hand back a ranked list with the reason next to every name.
01Describe them
One plain sentence. Role, city, stack, stage, whatever matters to you.
02I read the web live
GitHub, public LinkedIn and Crunchbase records, the open web. Not a database that went stale last quarter.
03You read the shortlist
Ranked, with the reasoning under every name. Open a profile, ask a follow-up, narrow it down.
- Staff backend engineers in NYC who shipped Rust in production
- Series A fintechs in SF under 50 people, growing headcount this year
- Maintainers of fast-growing Rust web frameworks on GitHub
- No boolean, no filters, no seat to buy. One box.
- Read at search time, so a profile updated yesterday counts today.
- Every step visible as it runs, every name with its reason.
500 free credits on sign-up. No card, no demo call. See real searches.