Site audit
A site audit crawls your website and lists the technical problems it finds on each page: broken internal links, server errors, missing or duplicate titles and descriptions, thin or duplicate content, redirect chains and more. Every issue comes with an explanation and a fix. You can also run Lighthouse on a sample of pages and have pages rendered in a browser before they are checked.
Start an audit
- Open your project in NameIO and choose Site Audit in the sidebar, under My Site.
- In Start New Audit, enter the site's URL. You can leave out
https://, because NameIO adds it. - Set Max pages, and turn on Include Lighthouse or Render JavaScript if you want them (see the options below).
- Click Start Audit.
NameIO opens the new audit as soon as it starts. The audit runs in the background, so you can leave the page and come back later. If you ask for more than 500 pages, NameIO asks you to confirm first.
The URL can be any http or https address. It doesn't have to match the project's domain. NameIO's terms don't allow you to audit or crawl websites you aren't allowed to.
Before crawling, NameIO follows the start URL's redirects (up to 5) so the audit covers the site's real address, for example example.com redirecting to www.example.com. Addresses on local or private networks, such as localhost or private IP ranges, are refused with "This crawl target is blocked by security policy."
To open the form with a URL already filled in, use https://app.getnameio.com/p/<projectId>/audit?url=https://example.com. The dashboard's Audit your site step links there.
Below the form, Previous Audits lists every audit in the project with its Date, URL, Status, Pages and Lighthouse. Click View to open one.
Audit options
| Option | Default | What it does |
|---|---|---|
| Max pages | 50 | The most pages the audit crawls. Enter any value from 10 to your plan's limit. A value outside that range is corrected when you leave the field. |
| Include Lighthouse | Off | After the crawl, runs Lighthouse on a sample of pages to measure performance, accessibility and SEO. |
| Render JavaScript | Off | Loads each page in a browser before auditing it. Slower. |
Lighthouse and JavaScript rendering are on the Pro plan and are charged to your usage credits. On the free plan, both switches are off and marked "On the Pro plan." From an AI assistant on the free plan, an audit that asks for rendering is refused with "Rendering JavaScript in audits is on the paid plan. Run the audit without rendering, or upgrade.", and one that asks for Lighthouse runs without it.
Your first audit
When you create a project with a domain, or add or change a project's domain in its settings, and the project has no audit yet, NameIO starts one for you. The audit covers https://<domain>, up to 50 pages, without Lighthouse. On Pro it also renders JavaScript, which is charged to your usage credits; on the free plan it runs without rendering. If the first audit can't start, for example because a Pro organization doesn't have the $0.20 of credits that rendering 50 pages holds, NameIO shows "Website saved. The first scan could not start."
Plans and limits
| Free | Pro | |
|---|---|---|
| Pages per audit | 50 | 10,000 (1,000 with Render JavaScript) |
| Audit capacity | 2,000 units | 100,000 units |
| Audits running at once | 5 | No limit |
Pro costs $54 a month or $499 a year, plus applicable tax. Both include $15 of usage credits a month. Crawling itself spends no credits.
Limits count across your whole organization, not per member. Capacity used is the pages plus Lighthouse checks of every audit in the organization. A completed audit counts the pages it actually crawled, not its page limit. A failed audit keeps counting what it had reserved until you delete it: its full page limit if it failed before crawling began, otherwise the pages it had queued up to that limit, plus any Lighthouse checks it had reserved. Deleting audits frees capacity.
A new audit is refused when its page limit (plus any Lighthouse checks) would take your organization past its capacity, with "You've reached audit capacity for your account. Delete old audits from your projects to start a new one." With too many audits running, it is refused with "You've reached the limit of audits running at once. Wait for one to finish or delete it before starting another."
Watch an audit run
While an audit runs, its progress updates every 3 seconds and the list of crawled pages every 1.5 seconds. When the audit finishes, the badge next to the hostname reads Done or Failed. In Previous Audits, a running audit shows Running.
The progress card is titled Crawling pages or Running Lighthouse checks. It shows the current phase (Discovery, Crawling, Lighthouse or Finalizing) and a progress bar: "X / Y pages" during the crawl, or "X / Y checks (N failed)" during Lighthouse.
The Crawled Pages (N) card lists each page as it is crawled, with its HTTP status, path and title, newest first. It shows the last 300 pages.
If the background job running an audit is lost, NameIO marks the audit Failed. This happens the next time its status is checked, or through a regular check of audits that have been running for more than 15 minutes.
How the crawler works
- Identity. The crawler is called NameIO-Audit and sends the user agent
NameIO-Audit/1.0on page, robots.txt and sitemap requests, and when it checks the start URL. - Boundary. The crawl stays on the start URL's site: the same host or its www twin, with the same scheme and port. An upgrade from http to https is allowed. Other subdomains, such as
blog.example.com, are not crawled. - Discovery. NameIO reads the
Sitemap:lines in robots.txt plus/sitemap.xml, following sitemap indexes up to three levels deep and keeping only entries on the same site. It also queues the links it finds on each crawled page. The crawl stops at Max pages. - robots.txt. NameIO reads
/robots.txton the site and follows the rules in theUser-agent: *group. Disallowed URLs on the start URL's host are not crawled, including the start URL. If robots.txt is missing, unreachable or returns an error, everything is allowed. - Speed. The crawler starts at most one request per second, with at most two in flight. It slows down when a third or more of recent requests fail, are blocked or take 10 seconds or longer.
- Each page. A request times out after 15 seconds, and only the first 1 MiB of HTML is read. Only HTML pages are checked; other files, such as PDFs, are listed without content checks. Redirects are not followed silently: each hop is recorded as its own page, and its target is queued.
Rate limits and bot protection
Each page fetch gets one of four results, which you can filter on in the Pages tab:
- Read: the site answered normally. This includes redirects and 4xx or 5xx pages; filter by Status to separate them.
- Blocked: the site answered with a bot challenge (a Cloudflare or SiteGround challenge page, a
cf-mitigatedheader or a 503 challenge), a 401 or 403, or a 202. - Rate limited: the site's final answer was 429.
- Failed: the page couldn't be read: no response, or with Render JavaScript on, the page couldn't be rendered.
Any 429 pauses the whole crawl. The crawler honors Retry-After. Without it, the crawler waits 30 seconds, then doubles the wait each time, and the gap between requests doubles too, up to 30 seconds. Each URL is retried up to 3 times. The crawl stops when more than 3 consecutive 429s arrive or the total wait passes 30 minutes. The audit then records a "Crawl stopped early: rate limit" issue, and the report says "The crawl stopped early because of the site’s rate limit."
If your site uses bot protection, allowlist the NameIO-Audit user agent in your WAF or bot-protection settings, then re-run the audit. On Cloudflare Pro and above, add a WAF custom rule with the Skip action that skips Super Bot Fight Mode when the user agent contains NameIO-Audit. On Cloudflare's Free plan, a custom rule can't skip Bot Fight Mode: turn Bot Fight Mode off while the audit runs. An audit with Render JavaScript on also tries to render pages that returned a bot challenge.
Shopify stores
Shopify often limits crawlers. NameIO treats a site as a Shopify store when it responds with a powered-by: Shopify header, resolves to an address in 23.227.38.x, or your organization has saved a crawler signature for it. When a Shopify store blocks or throttles an audit, the report shows "Shopify limited this crawl." with the steps below, a signature form and a Re-run audit button.
To let the crawler in, create a crawler-access signature in Shopify and save it in NameIO. You need to be an owner or admin of the NameIO organization.
- In Shopify admin, go to Online Store > Preferences > Crawler access and click Create signature.
- Enter a name, choose the domain you audit under Domain, pick a period under Valid for (up to 3 months), then click Create.
- Copy the Signature-Input and Signature values. You don't need the Signature-Agent value, because NameIO sends it with every request.
- In NameIO, click the gear button labelled Project settings next to the project switcher, then open Integrations.
- On the Shopify card, click Connect.
- Enter the Domain (for example
store.example.com), paste Signature-Input and Signature, and click Save signature. - Re-run the audit.
Before saving, NameIO checks the signature against the signing key Shopify publishes. The domain must match the signature exactly. A signature made for the www or non-www version of the domain is refused and names the domain it was made for. An invalid signature is refused with a message to check that it was created for that domain and that both values were copied in full. An expired one is refused with "This signature has already expired. Create a new one in Shopify admin."
Signatures are stored encrypted. Every audit of that exact host in your organization sends one, in any project, and the audited project's own signature is tried first. NameIO sends it only over https to that host, never after a redirect to another host or to plain http. Each project's Integrations page lists the signatures saved on it, with Domain, Type, Added and Expires, and marks one Expired once it lapses. NameIO stops sending an expired signature, so create a new one in Shopify and save it again.
With Render JavaScript on, a Shopify page that answers 429 goes straight to the renderer instead of waiting. If an audit with a signature but without rendering is still throttled, the report says "We ran into an error with your Shopify domain." and asks you to run a new audit with Render JavaScript on.
How JavaScript rendering works
With Render JavaScript on, NameIO still fetches each page directly first. It renders the page in a browser when the direct fetch returned readable HTML with a 2xx status, or a bot challenge other than a 401. Redirects, non-HTML files, errors from your site and rate-limited responses keep the direct result, except on Shopify stores as described above.
NameIO renders the page in a browser, starting with Cloudflare Browser Run (20-second timeout, waiting until network activity has almost stopped). If rendering fails, is challenged or gets an error from your site, the page is recorded as Failed (or stays Blocked or Rate limited).
When Render JavaScript is on, the form shows an estimate for your page limit before you start. Some examples:
| Pages | Estimate |
|---|---|
| 50 | $0.04 to $0.20 |
| 100 | $0.07 to $0.39 |
| 1,000 | $0.64 to $3.84 |
When a rendered audit starts, NameIO holds the high estimate from your credits, monthly credits first and then top-up credits. If you don't have enough, the audit doesn't start, and you see "Rendering up to N pages needs $X of credits available. Lower the page limit or add credits." When the audit ends, completed or failed, you are charged for the render attempts it made, including pages the renderer couldn't read, and the rest of the hold is released. A hold lasts at most 24 hours. A rendered audit you delete while it is running is not charged; its hold is returned when it expires, within 24 hours.
Lighthouse
Lighthouse runs after the crawl, on the start page plus one page for each URL pattern, up to 10 pages. URLs that differ only by a numeric ID, UUID, date or long slug count as one pattern. Each page is checked on mobile and desktop, so an audit runs up to 20 checks. Only crawled pages that returned a 2xx status and loaded normally are eligible. Lighthouse adds several minutes to an audit.
For each Lighthouse check, NameIO holds an estimate from your credits when the check runs and settles it at the check's billed cost.
Read the results
The audit page shows the site's hostname with its status, the date it started and an All audits button to go back. A summary lists pages crawled, issues found (with Critical, Warning and Info counts) and average response time. When Lighthouse ran, it also shows the number of Lighthouse tests, the Lighthouse performance, SEO and accessibility scores, and Lighthouse failures.
Issues (N) groups issues by severity (Critical, Warning, Info), then by type, with the most affected types first. Each type shows its explanation, a How to fix: text, and up to 100 affected URLs with details. Export the issues CSV for the full list.
Pages (N) lists every crawled page with URL, Status, Title, H1, Words, Images and Speed. You can search, and filter by Status (2xx, 3xx, 4xx/5xx, Missing), Crawl result (Read, Failed, Blocked, Rate limited), Alt text (Missing alt, No missing alt), Words and Speed ms.
Performance (N) appears when Lighthouse ran. It lists each check with URL, Device, Status, Perf, A11y, SEO, LCP, CLS, INP and TTFB. Scores of 90 and up are good, 50 to 89 need work, and under 50 are poor. View issues opens the Lighthouse findings for that check.
When an audit is blocked or stops early
The report explains what got in the way:
- "This site's bot protection blocked our crawler." The audit finished but reached one page or none.
- "Bot protection blocked our crawler on N pages." Some pages were blocked.
- "Some pages may need JavaScript to show their content." Some pages were JavaScript app shells.
- "We couldn't read N pages." In a rendered audit, some pages didn't respond or couldn't be rendered. Open Pages and filter Crawl result by Failed to see them.
Pages are saved in batches during the crawl, so a failed audit keeps the pages it saved before it stopped. It shows "This audit stopped early after N pages." and the results cover everything crawled before it stopped. An audit that failed before crawling any page shows "This audit stopped before it crawled any pages." with an error code, such as step_timeout or instance_lost. Include the code if you write to chris@getnameio.com.
What the audit checks
The audit checks for 30 types of issue: 4 critical, 17 warnings and 9 info.
| Issue | Severity | Reported when |
|---|---|---|
| Crawler was blocked | Critical | The site returned a bot challenge or access denial instead of the page. |
| Server error (5xx) | Critical | The page returned a 5xx status. |
| Broken internal link | Critical | The page links to a page on your site that was crawled in this audit and returned 4xx or 5xx. |
| Missing title tag | Critical | The page has no title. |
| Content may require JavaScript | Warning | The HTML looks like a JavaScript app shell with almost no readable content. |
| Rate limited (429) | Warning | The site answered 429 for this page. |
| Crawl stopped early: rate limit | Warning | The site's rate limit stopped the crawl before it finished. |
| Page returns an error (4xx) | Warning | The page returned a 4xx status. |
| Redirect chain | Warning | The URL goes through two or more consecutive redirects. |
| Redirect loop | Warning | The redirects loop. |
| Orphan page | Warning | The page is reachable only through the sitemap. |
| Page has no outgoing links | Warning | An indexable page links nowhere. |
| Missing meta description | Warning | The page has no meta description. |
| Duplicate title | Warning | Another page has the same title. |
| Duplicate meta description | Warning | Another page has the same meta description. |
| Missing H1 heading | Warning | The page has no H1. |
| Multiple H1 headings | Warning | The page has more than one H1. |
| Duplicate page content | Warning | Another page has identical visible text. |
| Thin content | Warning | An indexable page has fewer than 150 words. |
| Images missing alt text | Warning | An image has no alt attribute. An empty alt="" is accepted. |
| Conflicting canonical signals | Warning | The HTML rel=canonical differs from the canonical in the HTTP Link header. |
| Title too long | Info | The title is over 60 characters. |
| Title too short | Info | The title is under 10 characters. |
| Meta description too long | Info | The meta description is over 160 characters. |
| Meta description too short | Info | The meta description is under 70 characters. |
| Heading levels skip | Info | Headings skip a level, for example H2 to H4. |
| Slow server response | Info | The page's response took over 1.5 seconds. |
| Page is noindex | Info | A robots meta tag or X-Robots-Tag header sets noindex. |
| Canonicalized to another URL | Info | The page's canonical points to a different URL. |
| Page is deep in the site structure | Info | The page is 5 or more clicks from the start URL. |
A blocked or rate-limited page gets only that access issue, and a page that couldn't be read gets no issue; neither has its content checked. Find unread pages in Pages under Crawl result: Failed. A JavaScript app shell gets the JavaScript warning in place of content checks. A page counts as a shell when its HTML has an app root element and a script, fewer than 20 words, and no headings, links or images. Duplicate checks skip noindex pages, pages canonicalized elsewhere, and shells. Orphan pages are reported only when the crawl reached every page it found: it wasn't cut off by the page limit or a rate-limit stop, and no JavaScript app shells were left unread. An audit reports at most 2,000 broken internal links.
Export and share results
Each tab has an Export menu covering that tab:
- Export to Sheets copies the table and offers to open a new Google Sheet.
- Export CSV downloads a CSV file.
- Download JSON downloads a JSON file.
The issues export has the columns Severity, Issue, URL, Details and How To Fix. The pages export has URL, Status, Title, H1, Words, Images, Missing Alt and Response Time (ms). The performance export has URL, Device, Performance, Accessibility, SEO, LCP (ms), CLS, INP (ms) and TTFB (ms).
To share results, send an export, or have an AI assistant write a report with the seo-audit skill. The skill runs an audit, reads its results, saves a report and can turn on sharing for that report. Deleting a report doesn't delete the audit.
Delete audits and how long results are kept
Audit results don't expire. They are kept until you delete the audit or your account is erased.
To delete an audit, open the row menu in Previous Audits and choose Delete audit. You need to be an owner or admin. Deleting stops the audit if it is still running and removes its pages, issues and Lighthouse results. The capacity it used is freed.
Run audits from an AI assistant
NameIO's MCP server at https://app.getnameio.com/mcp lets an AI assistant run and read audits. See Connect an AI assistant for setup.
| Tool | What it does | Access |
|---|---|---|
run_site_audit | Starts an audit and returns its auditId. | Make changes |
get_audit_status | Reports status, phase, page and Lighthouse progress, and any error code. Defaults to the newest audit. | Read |
get_audit_issues | Lists issues sorted by severity, filtered by severity or issue type, with each type's fix and up to 5 sample URLs. Returns 200 rows by default, up to 1,000. | Read |
get_audit_pages | Lists crawled pages, filtered by crawl result (ok, blocked, rate_limited, error), status code or URL text. Returns 100 rows by default, up to 1,000. | Read |
list_site_audits | Lists the project's audits, newest first. | Read |
delete_site_audit | Permanently deletes one audit by its exact auditId. Needs an owner or admin. Saved reports and project context are kept. | Make changes |
The read tools spend no credits.
run_site_audit takes projectId, url, maxPages (10 to 10,000, default 50), renderJavaScript (default false) and runLighthouse (default false). Lighthouse is off unless the assistant asks for it. The assistant then polls get_audit_status and reads the results with get_audit_issues. Plan limits apply as in the app. Over capacity, at the limit of running audits, or asking for rendering on the free plan, the tool explains why in its answer and starts no audit. Asking for more pages than the free plan allows returns AUDIT_PAGE_LIMIT_EXCEEDED.
An assistant connected read-only can't see the tools that make changes. To allow them, disconnect the assistant under Settings → Connected apps in NameIO (row menu, Disconnect), connect it again and leave Make changes on.
What's not done
- Audits have no share link of their own.
- The crawler doesn't read a robots.txt group written for NameIO-Audit, and it ignores
Crawl-delay. - Pages on the www twin, or reached after an http-to-https upgrade, are not checked against robots.txt.
- Pages loaded with Render JavaScript come from a browser rendering service, without the NameIO-Audit user agent or a Shopify signature. A rule that allowlists NameIO-Audit doesn't cover them.
- Apart from Shopify signatures, there is no way to verify the crawler: no reverse DNS check, published IP list or access token.
- Projects set up during onboarding, or created or set up by an AI assistant, don't get an automatic first audit.