squirrelscan
GitHub

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 @type is LocalBusiness, Organization, Restaurant or Store, with the message LocalBusiness/Organization schema found. The value is the business name taken from the first LocalBusiness or Organization node, and is absent when the markup does not name one. Otherwise it reports at info status with the message No LocalBusiness schema found and the value Add schema if this is a local business.
  • contact-info: passes with the message Contact page has contact information when the first crawled URL whose path contains /contact, matched case-insensitively, carries a tel: or mailto: 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 message N page(s) show a different phone number to the site norm "...". One number written several ways warns with the message The same phone number is formatted N different ways across M pages. Agreement with no format drift passes with The 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 with postal address substituted for phone 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 IDlocal/nap-consistency
CategoryLocal SEO
ScopeSite-wide
Severitywarning
Weight6/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.

  • 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: and mailto: 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

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.

Type to search…

↑↓ navigate↵ openesc close