Privacy policy: the page and how widely it is linked
A privacy policy nobody can find does not do its job. squirrel finds the page and measures what share of your pages link to it.
What a privacy policy is
A privacy policy states what data a site collects, why, who it goes to and what a visitor can do about it. Several jurisdictions require one, including the GDPR in the EU and the CCPA in California, and analytics or advertising vendors usually require one in their terms as well.
Being reachable is part of the requirement. The convention is a footer link on every page, which is why this rule measures link coverage rather than just existence.
What squirrel checks
The rule is site-wide. It finds the privacy page by a known multilingual slug, or by a crawled page whose title or h1 reads as a privacy policy, which catches unusual slugs and redirects. There is no standard schema type for a privacy page, so there is no schema fallback. It emits up to two checks:
- Skipped when no pages were crawled. Message:
No pages available for analysis. privacy-policypasses when a crawled page is the policy. Message:Privacy Policy page exists, with the URL as the value.privacy-policyreports info when no crawled page is the policy but a crawled page links to one the crawl did not fetch. Message:Privacy Policy linked but not crawled, with the link target as the value and the linking page in the details.privacy-policywarns instead when the internal link probe requested that uncrawled target and got a 4xx or 5xx. Message:Privacy Policy link returns N, whereNis the status. A 401, a 403 or a rate limit is not read as broken and stays info.privacy-policywarns when there is neither a crawled policy nor a link to one. Message:No Privacy Policy page found, withCreate /privacy-policy pageas the value. No further checks run. Severity warning, weight 5.privacy-linkedpasses when the coverage percentage, rounded to a whole number, is 80 or above. Message:Privacy policy linked from N% of pages.privacy-linkedreports info from 50. Message:Privacy policy linked from N% of pages, withConsider adding to all page footersas the value.privacy-linkedwarns below 50%. Message:Privacy policy only linked from N% of pages, withAdd privacy link to footer on all pagesas the value.
Coverage is measured by matching the link href against the known privacy slugs, not by anchor text. legal/privacy-policy is the rule that also reads anchor text.
Excluded and uncrawled policies
A crawl that excludes the policy’s path, such as exclude = ["/policies/**"] on a Shopify storefront, or that reaches its page limit first, never fetches the policy. A link is evidence the page exists, not proof that it works, so the rule says the policy is linked but not crawled instead of advising you to create one. Only links to the same host count, so a footer link to another site’s policy, such as reCAPTCHA’s policies.google.com/privacy, does not stand in for yours. Among those, a link whose href matches a privacy slug anywhere on the site wins, then a link whose anchor text names a privacy policy, the same order legal/privacy-policy uses. A target recognised only by its anchor text gets no privacy-linked check, because coverage counts slug links. A linked page the crawl did fetch was checked, and the rule judges it by its slug, title and h1 as above.
No extra requests are made for this. The only status the rule can report is one the internal link probe already recorded, and the probe never requests a path the crawl scope or robots.txt excludes. To have the policy checked, let the crawl fetch it.
How to fix it
<a href="/privacy-policy">Privacy policy</a>Put the link in the footer component so every page inherits it. Cover what you collect, why, who you share it with, how long you keep it, and how someone exercises their rights.
Update it when the practices change, and check what periodic requirement applies to you: a business covered by the CCPA has to refresh the specified disclosures at least every twelve months. A policy that describes vendors you stopped using is worse than useless.
| Rule ID | eeat/privacy-policy |
| Category | E-E-A-T |
| Scope | Site-wide |
| Severity | warning |
| Weight | 5/10 |
Enable / disable
Disable this rule
[rules]
disable = ["eeat/privacy-policy"]Disable all E-E-A-T rules
[rules]
disable = ["eeat/*"]Enable only this rule
[rules]
enable = ["eeat/privacy-policy"]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
- legal/privacy-policy: the compliance view, which also reads anchor text.
- legal/cookie-consent: whether a cookie consent mechanism is present.
- eeat/terms-of-service: the other legal page in the footer.
- security/third-party-cookies: the vendors the policy has to name.
E-E-A-T findings ship in every audit next to the 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 E-E-A-T section of the report. The privacy page is reported with its URL and the share of pages that link to it. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.