Site health checks
What PandaCrawl's free site audit checks on every crawl, from broken links and duplicate titles to pages that contradict each other on prices and trial lengths.
The site audit crawls your site the way a search engine does and reports what to fix, most serious first. It is free: it needs no DataForSEO or OpenRouter key, and only the optional page-speed checks on a sample of pages cost anything.
Run it from a project's Site health page, or with the run_site_audit and get_audit_issues MCP tools. Every issue comes with an explanation and a "how to fix".
What it checks
Critical
- Server errors (5xx), broken internal links, missing title tags.
- Pages the crawler was blocked from (a bot challenge or 403).
Warnings
- Pages that return 4xx, redirect chains and loops, temporary (302/307) redirects, internal links that point at a redirect.
- Duplicate titles, meta descriptions and page content.
- Missing meta descriptions, missing or multiple H1s, HTML codes such as
'in titles and descriptions. - Conflicting canonical signals, thin content, images without alt text, orphan pages, pages with no outgoing links.
- Pages that contradict each other on a price or a free-trial length (see below).
- Rate limiting (429), on one page or for the whole crawl.
Info
- Titles and meta descriptions that are too long or too short, heading levels that skip, slow server responses, noindex and canonicalized pages, and pages five or more clicks from the homepage.
Pages that contradict each other
AI assistants and search engines repeat whatever your pages say, including the old blog post that still quotes last year's price. This check finds pages on your own site that state different values for the same fact:
- Plan prices. "Pro: $12 a seat" on /pricing against "Pro is $10 a seat" in an old post. A price counts only when a plan name (Starter, Pro, Business, "Growth plan" and so on) comes right before it, joined by nothing more than a colon, comma, dash, "is", "costs", "at" or "for", or heads the same pricing card or table row. Prices are compared only for the same plan, currency and billing period, so $12 a month and $120 a year are not a contradiction. Only your own plans are compared: the plans your pricing page (a URL such as /pricing or /plans) lists a price for.
- Free-trial length. "14-day free trial" on the homepage against "free for 30 days" on a landing page.
Each issue names the fact, every value the site states, the pages that state it with the sentence each one says, and which value looks current: the one on your pricing page, otherwise the one on clearly the most pages. When neither applies, it asks you to check which is current. Fix the outdated page, or redirect it, so every page says the same thing.
To keep false alarms rare, the check skips:
- the navigation, header, footer, sidebars and cookie banners, which repeat on every page;
- noindex pages, error pages, and pages canonicalized to another URL;
- prices with no plan name next to them, struck-through prices, "was $15" or "save $5" prices, add-ons and price ranges;
- a fact a single page states two ways, such as a pricing table with a monthly/annual toggle;
- trial sentences that compare with someone else ("their", "vs", "compared") or describe a change ("was", "extended").
Comparison pages quote other vendors' Starter and Lite plans all the time. Those prices are left alone: a plan your pricing page does not list is not compared, and in a comparison table whose first column names a product ("Otterly.AI | Lite $29/month"), the plan is read as that product's plan, not yours. If the audit did not crawl your pricing page, plan prices are not compared at all; free-trial lengths still are.