# A technical SEO audit that renders JavaScript.

URL: https://serpel.app/features/site-audit

Updated: 2026-10-10

A technical SEO audit crawls your website like a search engine and reports what stops pages from being found, indexed or shown well. Serpel runs 94 checks in 18 categories, renders JavaScript when a page needs it and measures Core Web Vitals. Every issue says why it matters and how to fix it.

## What the site audit covers

- **An issue catalogue:** 11 error, 43 warning and 40 notice checks. Each one comes with the reason it matters and a fix.
- **JavaScript rendering:** Pages that arrive almost empty are rendered in a headless browser and audited as visitors see them. Choose automatic, always or never per project.
- **Core Web Vitals:** LCP, INP and CLS for the start page and key pages on mobile and desktop, with lab and field values.
- **Crawl comparison:** Compare two crawls to see new, fixed and changed issues, and the score before and after.
- **AI search checks:** Your robots.txt is tested against 13 AI crawlers, and Serpel looks for an llms.txt file.
- **A polite crawler:** SerpelBot respects robots.txt and crawl-delay, keeps its request rate low and identifies itself with its own user agent.

## What does a technical SEO audit check?

A technical SEO audit looks at the parts of a site that search engines and AI crawlers depend on: whether pages respond, whether they can be indexed, whether titles and headings are in place, how pages link to each other and how fast they load. Serpel’s audit is a crawl of your own domain that starts at your start URL and follows internal links up to the page limit you set, within the maximum of your plan.

People also call this a website SEO checker. The difference to a one-page checker is scope: Serpel covers the whole site and reports issues by type, with the number of affected URLs.

| Group | Checks | What it finds |
| --- | --- | --- |
| Availability and redirects | 10 | Client and server errors, unreachable URLs, soft 404s, redirect loops and redirect chains. |
| Links | 10 | Broken internal and external links, orphan pages and pages buried deep in the site. |
| Titles, descriptions and headings | 12 | Missing, duplicate, too long or too short titles and descriptions, and missing or repeated H1s. |
| Indexing and crawling | 16 | noindex, canonical conflicts, robots.txt and sitemap problems, and blocked search crawlers. |
| Content and images | 7 | Duplicate and thin content, a missing page language, missing alt text and image dimensions. |
| HTTPS, mobile and speed | 9 | Missing HTTPS, mixed content, a missing viewport tag, slow responses and oversized pages. |
| Structured data, social and international | 13 | Invalid structured data, missing Open Graph and Twitter cards, and hreflang errors. |
| JavaScript rendering | 8 | Content, links or meta tags that only exist after JavaScript runs, and pages that fail to render. |
| Core Web Vitals | 7 | LCP, INP and CLS values that need improvement or are poor. |
| AI search | 2 | Blocked AI search crawlers and a missing llms.txt. |

15 of the checks are heuristics, such as title length or thin content. They are marked “heuristic” in the results, so you can tell a rule of thumb from a confirmed error.

## How does Serpel audit JavaScript websites?

Serpel first fetches the HTML your server delivers. If a page arrives almost empty but shows traces of a JavaScript framework, it renders the page in a headless browser and audits the result. It compares the delivered HTML with the rendered page, so it can flag content, links, titles, canonicals and robots directives that only exist after JavaScript runs.

- **Automatic for empty pages:** the default. Only pages delivered almost empty are rendered.
- **Always render:** every page is rendered.
- **Never render:** only the delivered HTML is audited.

Rendering is capped per crawl, and a page that can’t be rendered is reported as such, so the audit never claims more than it measured. Change the mode in the project settings or with `serpel projects update <project-id> --render-mode always`.

## How does Serpel measure Core Web Vitals?

At the end of a crawl, Serpel measures the start page and key pages on mobile and desktop with Google PageSpeed Insights and rates LCP, INP and CLS against Google’s thresholds.

| Metric | Good | Poor |
| --- | --- | --- |
| Largest Contentful Paint (LCP) | Up to 2,500 ms | Above 4,000 ms |
| Interaction to Next Paint (INP) | Up to 200 ms | Above 500 ms |
| Cumulative Layout Shift (CLS) | Up to 0.1 | Above 0.25 |

You get lab values from a test run and, where Google has enough data, field values from real users over the last 28 days. INP exists only as a field value.

## How big a crawl can you run, and what does it cost?

| Plan | Maximum pages per crawl |
| --- | --- |
| Free | 250 |
| Starter | 1,000 |
| Pro | 1,000 |

New projects crawl up to 100 pages by default, and you can raise the limit up to your plan’s maximum, for example with `serpel projects update <project-id> --max-pages 500`. A crawl costs 1 credit per 20 pages, so 100 pages cost 5 credits and 1,000 pages cost 50 credits, or €0.50. Reading the results is free, and crawls can also run weekly on a schedule. See [pricing](https://serpel.app/pricing) for plans and credit packs.

## What happens after the audit?

- **Score and issues:** a score from 0 to 100, plus issues grouped by severity with the affected URLs, the reason and the fix.
- **Tasks:** create a task from any issue with `serpel tasks create --project <project-id> --issue title_missing`. The next crawl rechecks it.
- **Comparison:** `serpel crawl compare` lists new, fixed and changed issues between two crawls.
- **Exports and API:** download issues as CSV or JSON, or read them through the [REST API](https://serpel.app/developers/api).
- **Search data:** read the audit next to [Search Console and Bing data](https://serpel.app/features/search-data) in the same project.

## Run your first audit

1. **Create a project** Add your domain. Serpel uses it as the start URL for the crawl.

```bash
serpel projects create --domain example.com --country US --language en
```

2. **Start a crawl** The crawl runs in the background. With `--wait`, the command ends with a summary of pages and issues.

```bash
serpel crawl start --project <project-id> --wait
```

3. **Read the errors first** List the issues of the latest crawl, starting with errors.

```bash
serpel audit issues --project <project-id> --severity error
```

4. **Fix, crawl again and compare** After your fixes, run another crawl and compare it with the previous one.

```bash
serpel crawl compare --project <project-id>
```

## Frequently asked questions

### Is Serpel a website SEO checker?

Yes. Create a project for your domain and start a crawl. You get a score from 0 to 100, issues grouped by severity and a fix for each. The crawl covers the whole site up to the page limit you set, within your plan’s maximum, not a single page.

### Does the audit work for single-page apps and server-rendered sites?

Yes. Pages delivered almost empty are rendered in a headless browser, and Serpel reports differences between the delivered HTML and the rendered page. Server-rendered pages are audited from their HTML.

### How is the audit score calculated?

The score starts at 100 and loses points for each issue type, weighted by severity and by the share of HTML pages affected. Site-wide issues count in full. Compare two crawls to see how a fix changed the score.

### Does the crawler respect robots.txt?

Yes. SerpelBot follows robots.txt and crawl-delay, keeps its request rate low and identifies itself with its own user agent. The crawler is described on the [Serpel crawler page](https://serpel.app/bot).