NAP consistency: same name, address and phone everywhere
One phone number or address written several ways across a site. squirrel finds the site norm and lists every page that disagrees with it.
What NAP consistency is
NAP is the name, address and phone number a business publishes. Anything that reads those values off the page and compares them as strings, from a directory importer to an agent filling a contact form, sees (415) 555-0142 in the header and +1 415 555 0142 in the footer as two different values. Suite 400 against Ste. 400 in an address is the same problem.
One written form per value removes the ambiguity. It matters for a business with a physical location or a service area, and not at all for a product site with no address to publish. A genuine multi-location business has several correct numbers by design, which is why this rule needs a clear majority before it calls anything a deviation.
What squirrel checks
The rule runs once per crawl, over every page, and emits up to four checks. Three always appear; contact-info appears only when it passes. It reads each page’s first phone number as that page’s primary contact number, so a branch list further down the page does not make the site look inconsistent.
local-business-schema: passes when any page carries a JSON-LD node whose@typeisLocalBusiness,Organization,RestaurantorStore, with the messageLocalBusiness/Organization schema found. The value is the business name taken from the firstLocalBusinessorOrganizationnode, and is absent when the markup does not name one. Otherwise it reports at info status with the messageNo LocalBusiness schema foundand the valueAdd schema if this is a local business.contact-info: passes with the messageContact page has contact informationwhen the first crawled URL whose path contains/contact, matched case-insensitively, carries atel:ormailto:link. The check is emitted only on that pass, so it never appears as a failure.phone-consistency: judges the primary phone number across the crawl. A different number on some pages fails with the messageN page(s) show a different phone number to the site norm "...". One number written several ways warns with the messageThe same phone number is formatted N different ways across M pages. Agreement with no format drift passes withThe same phone number is used consistently across N pages.address-consistency: the same outcomes for the postal address. Both checks share one message builder, so every message below is the phone wording withpostal addresssubstituted forphone number.
A page’s phone numbers come from its tel: links first, then from the telephone of its JSON-LD nodes. Two renderings are the same number when their last seven digits match. The written form compared for format drift is the number as the link text writes it, and only the number: digits, +, parentheses, ., /, - and spaces. A label beside it, such as Call now or Jetzt anrufen in the same button, is not part of the format, so a translated label does not count as a second way of writing the number. When the link text does not contain the number, the tel: href is used instead.
Both consistency checks skip rather than guess when the evidence is thin. Fewer than 10 pages declaring the signal skips with Only N page(s) declare a phone number; 10 needed to judge consistency. No page declaring it skips with No phone number declared on any page. When the most common value appears on less than 70% of the samples, the site is treated as genuinely varied and the check skips with No dominant phone number across N pages (the most common appears on X%), so the site is too varied to judge. A crawl with no pages emits a single nap-consistency check, skipped, with No pages available for analysis.
Reported items and example URLs are both capped at 10, so a large site with a widespread problem lists a sample rather than every page. The whole rule is skipped, with the reason shown in the report, when the site profile says the site is not a local business.
How to fix it
Render the contact block from one source and include it in the layout, so every page emits the same bytes:
<address>
Acme Coffee<br />
1 Market Street, Suite 400<br />
San Francisco, CA 94105<br />
<a href="tel:+14155550142">(415) 555-0142</a>
</address>Pick one written form for the phone number and one for the address, then use it in the header, the footer, the contact page and the LocalBusiness JSON-LD. The tel: href should stay in E.164 form even when the visible text is formatted for readers.
The common false positive is a multi-location business whose pages each show their own branch number. The 70% agreement floor is there to skip that case, but a site where one location dominates the page count can still see the smaller branches reported as deviations. Check the listed pages before changing anything.
| Rule ID | local/nap-consistency |
| Category | Local SEO |
| Scope | Site-wide |
| Severity | warning |
| Weight | 6/10 |
Enable / disable
Disable this rule
[rules]
disable = ["local/nap-consistency"]Disable all Local SEO rules
[rules]
disable = ["local/*"]Enable only this rule
[rules]
enable = ["local/nap-consistency"]enable replaces the default ["*"], so this is the only rule selected. Leave disable out: a rule that matches any disable pattern is skipped even when enable names it. Only an enabled setting under a rule’s own [rule_options] table overrides both lists.
Related rules
- schema/local-business: whether the LocalBusiness JSON-LD carries the required address and phone fields.
- eeat/physical-address: a postal address readers can see, which this rule expects to find.
- eeat/contact-page: whether a contact page exists and offers more than one way to get in touch.
- links/tel-mailto:
tel:andmailto:links whose href disagrees with the number or address shown to the reader.
Local SEO findings ship in every audit next to the core SEO, performance and agent experience rules. See Fix SEO issues with AI for how an agent works through a report.
References
- Local business structured data, Google Search Central
- LocalBusiness, schema.org
- PostalAddress, schema.org
Check your site
Run squirrel audit https://example.com and open the Local SEO section of the report. Each deviating value is listed with the pages that carry it. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.