Worked example · run 2026-08-15, re-verified 2026-09-05

What breaks when 280 franchise locations publish their own data to machines?

We audited one 300-ish-location home-services franchise network using nothing but what the brand publishes about itself. Two of its franchises still declare, in their own markup, that they are the same business. Here is the whole method, the controls that came back clean, and what changed when we re-ran it five weeks later.

  • 280 location rows parsed, exactly — not sampled
  • 1 confirmed entity collision, still live on 2026-09-05
  • ~1 hour of manual work, public sources only

Why this brand, and what this page is not

The subject is Mr. Rooter Plumbing, a Neighborly brand, and its public US/Canada location directory. We picked it precisely because it is not a customer and not a prospect of ours, and it has not been contacted about this page. Auditing a company you are simultaneously selling to is a conflict; auditing one you are not removes it.

Nothing here is a claim about how this business is run. Every defect below lives in the machine-readable layer only — every one of these pages renders correctly to a human. A franchisor reviewing its own website sees nothing wrong, which is exactly why this class of defect survives. It is also extremely common: at several hundred locations, maintained by several hundred different franchisees, some drift is the normal state, not a scandal.

Notice and correction. If you own or represent any record described on this page and something here is wrong or has since been fixed, email board@tryauranode.com and we will verify and update this page. We already did that once to ourselves — see what changed between runs.

Method

Public first-party sources only

No paid data, no scraping of gated surfaces, no third-party aggregator. Two sources, both published by the brand for anyone to read:

SourceWhat it givesRun 2 result
/locations/ Every directory row: name, URL, city/state/ZIP, displayed phone and tel: href HTTP 200, 484,621 bytes, 280 rows
Individual location pages schema.org/Plumber blocks: name, telephone, PostalAddress, sameAs, areaServed, description HTTP 200; every flagged pair re-pulled directly

The directory parse is exact, not sampled: 280 rows from 280 location-item blocks. Elapsed time for the original run, end to end: about an hour.

Findings

Two franchises that tell machines they are one business

Severe · confirmed live 2026-09-05

A. Entity collision — one identity, two franchises

Mr. Rooter Plumbing of Elgin declares, in its own schema.org/Plumber sameAs array, the Facebook page ID and a Yelp listing belonging to Mr. Rooter Plumbing of Cook County.

FieldCook CountyElgin
nameMr. Rooter Plumbing of Cook CountyMr. Rooter Plumbing of Elgin
addressElk Grove, IL 60007Bartlett, IL 60103
telephone84768632008476863200 — identical
sameAs Facebook…/Mr-Rooter-Plumbing-of-Cook-County-898973246879421/…/898973246879421 — the same page ID
sameAs Yelp…/mr-rooter-plumbing-of-cook-county-schaumburg-2…/mr-rooter-plumbing-of-cook-county-elk-grove
areaServed42 Chicago-area municipalities13 Fox Valley municipalities — disjoint

sameAs is the strongest entity-identity signal a business can emit — it is the explicit instruction to a machine reader that two records are one thing. These two have disjoint service areas and different addresses, so they are plainly separate franchises.

Consequence: an answer engine asked for the Elgin plumber can legitimately return the Cook County address, the Cook County review corpus, and a phone that rings the Cook County office. One franchisee pays for a lead that is attributed and routed to another. Nothing on the Elgin website looks wrong to a human.

Re-pulled directly from /elgin/ and /cook-county/ on 2026-09-05. Unchanged from run 1.

Severe · 1 of 3 remaining on 2026-09-05

B. One URL serving two different franchises

/muskegon-county/ appears twice in the directory, as two different businesses with two different phone numbers and two different cities:

Directory rowCityPhone
Mr. Rooter PlumbingMuskegon, MI 49442(231) 903-6029
Mr. Rooter Plumbing of HollandHolland, MI 49423(616) 377-2350

Only one of them can be the canonical entity at that URL. The page's own schema resolves to the Muskegon record, so the Holland franchise has no distinct page for a machine to cite.

High · confirmed 2026-09-05

C. Six locations have no resolvable name

Six rows are named exactly Mr. Rooter Plumbing, with no locality qualifier: Gladstone OR 97027 · Vancouver WA 98685 · Longview WA 98632 · Hillsboro OR 97123 · Muskegon MI 49442 · Ennis TX 75119. Four of the six sit in the Portland / SW-Washington corridor, so a regional query has four identically-named candidates and must disambiguate on address alone.

A seventh case is subtler: Mr. Rooter Plumbing of Rochester is the name of two distinct franchises — Rochester NY 14623 and Rochester MN 55902, different URLs, different phones. An answer engine given the bare brand name has no way to pick.

Medium · confirmed 2026-09-05

D. The registered mark drifts in the name field

Three rows drop the period from the mark — Mr Rooter Plumbing of Dover (Dover DE), … of Eugene (Eugene OR), … of Kingston (Kingston NY). Mr Rooter and Mr. Rooter are the same string to a human and different strings to an exact-match retriever.

Related, and legitimate: the Dover row carries a 410 (Maryland) number for a Delaware city and sits at /dover-salisbury/ — consistent with a real Delmarva-peninsula territory, and inconsistent as a published record. Cases like this are why a defect list has to be read by someone, not just generated.

High · confirmed 2026-09-05

E. Every sampled location publishes an empty description

Every Plumber block we sampled carries "description": "" — 25 of 25 on run 1, and every page re-pulled on run 2. The one field whose entire purpose is to tell a machine reader what this business is, is empty across the network. A summarising engine has to synthesise the description from whatever else it can find, which is where invented detail comes from.

Controls

A finding set with no clean results is a broken method

These were computed the same way as the defects above and came back clean. They are reported for the same reason a lab reports its negative control: a check that never passes is as broken as one that never fires.

ControlResult on 2026-09-05
Displayed phone == tel: href, all rows 280 / 280 match. No defect.
Directory phone == schema telephone, sampled pages Match. No defect.
Greater Syracuse / Oswego County — flagged on shared phone (315) 887-4057 Not a collision. Distinct Facebook pages, distinct Yelp listings, distinct addresses. One shared dispatch line is a business decision, not a data defect. Cleared.

Two further candidates were discarded on inspection: Dover → “Delmarva” and Santa Maria → “Central Coast” both tripped an automated collision check, and both turned out to be legitimate DBA names. They are reported under D as name drift, not as collisions.

Run 1 → run 2

What changed in five weeks

We re-ran the whole audit on 2026-09-05 before publishing, because a worked example whose numbers have quietly gone stale is worse than none. Two things had changed, and both are worth more than the original findings were.

Measure2026-08-152026-09-05
Rows in the brand's own directory309280
URLs serving two different franchises31
Confirmed entity collisions (sameAs)1 pair1 pair — same pair
Locations with no resolvable name66
Registered-mark drift in name field33
Sampled pages with an empty schema description25 / 25all re-sampled

The two duplicate-URL rows that cleared — /bakersfield/ and /santa-maria/ — cleared because those directory rows are no longer published at all, along with 27 others. Directory maintenance happens.

The collision did not clear. The single most consequential defect — the one that can route a paid lead to the wrong franchisee — survived five weeks of directory maintenance that removed 29 rows. That is the honest headline of this page, and it is not a criticism of anyone: nothing in the normal maintenance loop looks at the machine-readable layer, so nothing in it can find this. That is the whole thesis in one row of a table.

Why an AI visibility tracker would not have found this

The AI-visibility tracker category is already crowded and already commoditised — several tools track ChatGPT, Google AI Mode, AI Overviews, Perplexity and Gemini, some with white-label agency reporting, in the $29–$489/month band. If you run one, keep it. This works on top of it.

They answer whether a location appeared in an AI answer and where it ranked. None of them diffs a brand's sameAs graph across locations to detect two franchises claiming one identity.

The trackers tell you that you are invisible. They do not tell you why, and they cannot tell you which record to fix.

FAQ

Questions this page answers

What is an AI answer data integrity audit?
It is a check of what a multi-location brand publishes about itself in machine-readable form — its location directory and its schema.org markup — for defects that make an answer engine describe a location wrongly or merge it with another. It is not a rank tracker. It reports named, countable defects with the source URL for each, so each one can be fixed.
Why audit a brand that is not a customer?
Auditing a company you are simultaneously selling to is a conflict. Mr. Rooter Plumbing (a Neighborly brand) is neither a customer nor a prospect of ours, and has never been contacted about this page. It was chosen because it is a textbook instance of the shape being studied — a franchise home-services network in the several-hundred-unit range — and because everything used here is published by the brand itself for anyone to read.
What is an entity collision in structured data?
It is when two separate businesses assert, in their own schema.org markup, that they are the same entity — most often by publishing the same sameAs identifiers, such as the same Facebook page ID or the same review-site listing. sameAs is the strongest identity instruction a business can give a machine reader, so a crossed sameAs invites an answer engine to merge two franchises that have different addresses, different service areas and different owners.
Why do AI visibility trackers not find these defects?
Trackers in the common $29–$489/month band measure presence and rank — whether a brand appeared in an AI answer, and where. That is a different question. None of them diff a brand's sameAs graph across locations, so they can tell you a location is invisible or misquoted without being able to tell you which published record caused it.
Can these findings be reproduced independently?
Yes, and that is the point. Every finding is computed from two public first-party sources: the brand's own /locations/ directory page and the schema.org blocks on its own location pages. No paid data, no gated surfaces, no third-party aggregator. The audit was run on 2026-08-15 and re-run on 2026-09-05; both runs and the differences between them are published here.
What does the audit cost?
The 30-day design-partner pilot is $3,000 white-label for an agency running it for one client brand, or $1,500 for a direct operator with one location set. That is design-partner pricing and roughly break-even on the labour: the work is done manually by a senior operator, not by a product we have not built yet.

The same audit, on your network

One brand, up to 10 locations, 30 days

A per-location answer audit, a countable data-integrity defect list with the source URL for each, the upstream root cause per defect, a remediation queue ranked by revenue exposure, executed fixes on everything actionable inside the window, and a before/after scorecard against the day-0 baseline.

Agency, white-label, one client brand

$3,000

Direct operator, one location set

$1,500

Design-partner pricing, and it is honest: at this scope it is roughly break-even on our labour. You are buying senior manual work at cost in exchange for shaping what gets built. No auto-renew, invoice not a lock-in, and at day 30 we both decide.

What we explicitly do not promise

  • No ranking promises, no lead-volume promises, no traffic guarantees.
  • Thirty days is long enough to fix data and see re-crawl on some surfaces. It is not long enough to prove a revenue lift, and anyone telling you otherwise is guessing.
  • We have not built a product. This is delivered manually by a senior operator, and everything it produces is yours whether or not we ever ship software.

Goes to one inbox. We reply once. If it is not a fit we say so and go away — no sequence, no list.