SEO best practices, by category
The working checklist behind every Dr Urls audit. Each category: why it matters, the practices that keep you clean, and deep-dive guides for every issue we detect. This library grows with every new check the scanner learns.
Crawlability
Crawlability is whether search engine bots can physically reach and read your pages. Before Google can rank anything, Googlebot has to fetch it: follow links to it, receive a successful response, and parse the HTML. Crawl problems are silent — the page looks fine in a browser while bots hit walls (robots rules, broken chains, server errors, infinite URL spaces). Because everything downstream depends on the crawl, fixing crawlability issues usually unlocks more value per hour than any other SEO work.
The checklist
- Keep robots.txt minimal and deliberate — block admin/duplicate spaces, never CSS/JS assets.
- Maintain an XML sitemap that lists only canonical, indexable, 200-status pages, and reference it in robots.txt.
- Keep every important page within 3 clicks of the homepage.
- Return proper status codes: 200 for content, 301 for permanent moves, 410 for gone — never soft-404s.
- Collapse redirect chains to a single hop; update internal links to point at final URLs.
- Keep URL parameters under control — infinite filter/sort combinations burn crawl budget.
Deep dives (22)
- Canonical URL points to a redirecting URL
- Inconsistent trailing slash usage
- No internal links point to this page
- No XML sitemap found
- Orphan page (no internal links pointing to it)
- Page blocked by robots.txt
- Page is too many clicks from homepage
- Page redirects to a different domain
- Page uses meta refresh redirect
- Paginated page missing rel=prev/next
- URL contains double slashes in path
- URL contains non-ASCII characters
- URL contains session ID parameter
- URL contains special characters
- URL contains unnecessary file extension
- URL contains uppercase characters
- URL exceeds recommended length
- URL has excessive query parameters
- URL has too many directory levels
- URL uses underscores instead of hyphens
- X-Robots-Tag HTTP header contains noindex
- XML sitemap contains errors
Indexability
Indexability is whether a crawled page is allowed into the search index at all. A page can be perfectly reachable and still tell Google to ignore it — through a noindex directive, a conflicting canonical, or an X-Robots-Tag header set by the server. These directives are absolute: one stray meta tag removes a page from search entirely. Indexability issues are the most binary in SEO — the page either can rank or it cannot — which is why they sit at the top of every serious audit.
The checklist
- Audit noindex directives after every deploy — one templating mistake can deindex a section overnight.
- Give every indexable page exactly one self-referencing canonical URL.
- Never mix signals: a page should not be canonicalised away AND noindexed AND in the sitemap.
- Use hreflang pairs that reciprocate; a one-way hreflang is ignored.
- Check the HTTP layer too — X-Robots-Tag headers override what you see in the HTML.
Deep dives (16)
- Canonical URL is relative instead of absolute
- Canonical URL points to a different page
- Content-Language HTTP header missing
- Duplicate content detected
- Duplicate language code in hreflang set
- Hreflang set missing self-referencing entry
- Hreflang set missing x-default
- Hreflang tags missing on multilingual page
- Hreflang URL protocol mismatch
- Hreflang uses invalid language code
- Hreflang uses relative URL
- HTML lang attribute does not match content language
- Missing canonical tag
- Page has noindex directive
- Redirect chain detected
- Redirect loop detected
Metadata
Metadata is how your page introduces itself to search engines and social platforms: the title tag, meta description, canonical URL, Open Graph and Twitter cards. Titles remain one of the strongest on-page relevance signals, and descriptions drive click-through rate from the results page even though they aren't a direct ranking factor. Bad metadata rarely breaks a site — it quietly bleeds clicks on every query where you appear.
The checklist
- Write one unique title per page, 50–60 characters, primary topic first, brand last.
- Write meta descriptions as ad copy: 140–155 characters, include the query intent, end with a reason to click.
- Ship Open Graph + Twitter Card tags on every shareable page — social embeds are free impressions.
- Keep canonical URLs absolute, lowercase, and consistent with your internal links.
- Never duplicate titles across pages — duplicates tell Google the pages are interchangeable.
Deep dives (37)
- Character encoding declaration missing
- Character encoding is not UTF-8
- Content-Type HTTP header missing
- Duplicate meta description
- Duplicate title tag
- Favicon not found
- Meta description appears keyword-stuffed
- Meta description is too long
- Meta description is too short
- Meta keywords tag is present
- Meta robots tag contains nofollow
- Missing meta description
- Missing title tag
- Multiple <title> tags found
- Multiple canonical tags found
- Multiple meta description tags found
- Open Graph og:description is too long
- Open Graph og:description tag missing
- Open Graph og:image tag missing
- Open Graph og:locale tag missing
- Open Graph og:title is too long
- Open Graph og:title tag missing
- Open Graph og:type tag missing
- Open Graph og:url does not match canonical
- Open Graph og:url tag missing
- Open Graph tags missing
- Social media preview is incomplete
- Title tag appears keyword-stuffed
- Title tag is too long
- Title tag is too short
- Title tag starts with site name
- Twitter Card meta tag missing
- Twitter description meta tag missing
- Twitter image meta tag missing
- Twitter site handle meta tag missing
- Twitter title meta tag missing
- X-Content-Type-Options header missing
Structured data
Structured data (JSON-LD / schema.org) is how you describe your content to machines in their own vocabulary: this is a product with this price, an article by this author, an event on this date. It powers rich results — stars, FAQs, breadcrumbs, product info — which materially raise click-through rates. Invalid or incomplete markup doesn't just miss the enhancement; sustained abuse can earn manual actions, so correctness matters as much as presence.
The checklist
- Use JSON-LD in the head, one graph per page, validated against schema.org.
- Mark up what's actually on the page — invisible markup risks manual actions.
- Complete the fields rich results need: price+availability for products, dates for events, steps for how-tos.
- Add Organization + WebSite schema sitewide, and sameAs links to every social profile.
- Re-validate after redesigns — markup silently breaks when templates change.
Deep dives (18)
- A linked social profile is dead
- Article schema missing image
- Article schema missing publisher
- Event schema missing date information
- Few or no social profiles linked
- HowTo schema missing step information
- Microdata format detected instead of JSON-LD
- No structured data (schema.org) found
- Product schema missing image
- Product schema missing price information
- Recipe schema missing recommended fields
- Review schema missing rating value
- SearchAction missing from WebSite schema
- Structured data has validation errors
- Structured data has warnings
- Structured data points at an image that does not respond
- Video schema missing recommended fields
- WebSite schema markup missing
Content
Content is what actually earns rankings: text that answers the query better than the competition. Search engines evaluate depth, originality, structure (headings), and freshness. Thin, duplicated, or poorly structured content doesn't just fail to rank — it can drag down a domain's overall quality assessment. Every content issue here is ultimately about the same question: does this page deserve to be someone's answer?
The checklist
- One H1 per page that states the topic; H2/H3 in strict hierarchy underneath.
- Cover the query completely — the best-ranking page is usually the one that ends the search session.
- Keep paragraphs short, front-load conclusions, and use lists for anything enumerable.
- Update cornerstone pages on a schedule; freshness compounds.
- Delete or merge thin pages — 10 strong pages outrank 100 weak ones on the same domain.
Deep dives (18)
- Broken heading hierarchy
- Content readability score is low
- Duplicate H1 heading across pages
- Duplicate heading text on same page
- Empty heading tag found
- Excessive use of bold/strong tags
- H1 heading is too long
- H1 heading is too short
- Image has empty alt attribute
- Image missing alt attribute
- Keyword density is suspiciously high
- Link has malformed or empty href
- Lorem ipsum placeholder text detected
- Low text-to-HTML ratio
- Missing H1 heading
- Multiple H1 headings on page
- No paragraph tags in main content
- Thin content (too few words)
Internal linking
Internal links are how authority and discoverability flow through your site. They tell crawlers which pages exist, tell ranking systems which pages you consider important, and give users paths deeper into your content. Orphan pages (no internal links pointing to them) are nearly invisible to search engines regardless of quality. A deliberate internal-linking structure is one of the highest-leverage, fully-in-your-control SEO instruments.
The checklist
- Link every new page from at least two existing relevant pages the day it ships.
- Use descriptive anchor text — 'pricing for agencies', never 'click here'.
- Fix broken internal links weekly; every 404 wastes both crawl budget and user trust.
- Build hub pages for your main topics and spoke out to detail pages.
- Keep orphan-page count at zero — if nothing links to it, neither will Google.
Deep dives (13)
- All internal links are in navigation only
- Broken external link (4xx/5xx)
- Broken internal link (4xx/5xx)
- Excessive number of external links
- Excessively long anchor text
- Internal link has nofollow attribute
- Link has empty anchor text
- Link is named for screen readers but has no anchor text
- Link points to non-existent page fragment
- Link uses generic anchor text
- Links implemented with JavaScript only
- Page contains no internal links
- Too many on-page links
Performance
Performance is both a ranking signal (Core Web Vitals) and a conversion multiplier. Google measures real-user loading (LCP), interactivity (INP), and visual stability (CLS) — and slow sites lose visitors before analytics even registers them. Most performance issues concentrate in a few repeat offenders: unoptimised images, render-blocking resources, and third-party scripts. Fixing the top three usually moves the needle more than fixing the next thirty.
The checklist
- Serve images in modern formats (WebP/AVIF), sized to their container, with explicit dimensions.
- Inline critical CSS and defer everything else; eliminate render-blocking third parties.
- Set far-future cache headers on static assets and an ETag on everything.
- Preload the fonts and hero image; font-display: swap to avoid invisible text.
- Measure with real-user Core Web Vitals, not just lab scores — Google ranks on field data.
Deep dives (42)
- Above-fold images not prioritized
- Below-the-fold images not lazy loaded
- Cache-Control header missing
- Cacheable response sets a cookie, so no CDN will cache it
- Critical CSS not inlined
- CSS files are not minified
- Cumulative Layout Shift (CLS) is too high
- DNS resolution may be slow
- ETag header missing on resources
- Excessive DOM nesting depth
- Excessive DOM size
- Excessive inline CSS
- Excessive inline JavaScript
- Excessive redirect chain
- Excessive third-party resource loading
- Image file too large (>500 KB)
- Images missing responsive srcset
- Images missing width and height attributes
- Images not using modern format
- Interaction to Next Paint (INP) is too slow
- JavaScript files are not minified
- Key resources not preloaded
- Largest Contentful Paint (LCP) is too slow
- Largest Contentful Paint (LCP) needs improvement
- Lighthouse performance score needs improvement
- Low Lighthouse performance score
- Missing preconnect hints for critical origins
- Page size exceeds 3 MB
- Render-blocking CSS or JavaScript
- Scripts without async or defer
- Slow first byte, but only on the first request
- Slow server response time (TTFB > 3s)
- Stylesheets loaded in body
- Text resources not compressed
- Time to First Byte (TTFB) is slow
- Too many external CSS stylesheets
- Too many external JavaScript files
- Too many HTTP requests per page
- Total Blocking Time (TBT) is too high
- Total page weight exceeds 5MB
- Web font uses font-display: block
- Web fonts missing font-display property
Mobile
Google indexes the mobile version of your site — desktop is the afterthought, not the other way round. Mobile issues (missing viewport, tap targets too close, content wider than the screen, intrusive interstitials) directly gate rankings for every query. With most traffic on phones, a mobile problem is not a subset of your audience — it is your audience.
The checklist
- Ship a correct viewport meta tag on every page — it is one line and it gates everything.
- Keep tap targets ≥ 44×44px with real spacing between them.
- Never let content overflow the viewport horizontally.
- Test on a real mid-range phone over 4G, not just desktop devtools.
- Avoid intrusive interstitials — Google demotes pages that greet mobile users with a wall.
Deep dives (14)
- App install banner configuration missing
- Apple touch icon missing
- Content wider than viewport on mobile
- Flash content detected
- Font size too small for mobile
- Horizontal scrolling likely on mobile
- Images not responsive for mobile
- Mobile-specific redirect detected
- Tables use fixed widths
- Tap targets too small or too close together
- User scaling disabled in viewport
- Viewport meta tag missing
- Viewport missing initial-scale
- Viewport uses fixed width instead of device-width
Accessibility
Accessibility overlaps heavily with SEO because both depend on machine-readable structure: alt text, heading hierarchy, labels, contrast. Screen readers and search crawlers consume the same signals. Accessible sites rank better not by special treatment but because the same fixes — descriptive alt attributes, proper headings, real link text — are exactly what search engines parse for meaning. It is also, in a growing number of jurisdictions, the law.
The checklist
- Give every informative image an alt attribute that describes its content; decorative images get alt="".
- Maintain heading hierarchy — never skip levels for styling reasons.
- Make link text meaningful out of context; screen readers list links in isolation.
- Keep text contrast at WCAG AA (4.5:1) minimum.
- Make everything keyboard-operable with a visible focus state.
Deep dives (30)
- Animations without prefers-reduced-motion
- Button has no accessible text
- Data table missing caption
- Data table missing header cells
- Duplicate ID attributes found
- Elements use positive tabindex values
- Elements with positive tabindex
- Focus indicators removed or hidden
- Form inputs missing associated labels
- Form inputs missing autocomplete attribute
- Heading element is empty (accessibility)
- Icon-only button missing aria-label
- Iframe missing title attribute
- Image inside link missing alt text
- Insufficient color contrast ratio
- Invalid lang attribute value
- Link has no accessible text
- Low contrast text
- Media element autoplays with sound
- Missing ARIA landmark regions
- Missing landmark elements
- Missing lang attribute on <html> element
- Missing language direction for RTL content
- Missing skip-to-content navigation link
- Nested interactive elements detected
- No :focus-visible styles detected
- Related form controls not grouped with fieldset
- Skip navigation link missing
- Touch targets too small
- Video without captions
Security
Security issues erode both rankings and trust. HTTPS has been a ranking signal since 2014, and browsers actively warn users away from insecure or mixed-content pages — a warning interstitial is a 100% bounce rate. Missing security headers rarely block indexing, but they widen your attack surface, and a hacked site (injected spam, malicious redirects) can be removed from results entirely. Security is the SEO work you do so you never have to do recovery work.
The checklist
- Serve everything over HTTPS and redirect HTTP with a single 301.
- Send HSTS, X-Content-Type-Options, and a Content-Security-Policy on every response.
- Eliminate mixed content — one insecure asset breaks the padlock.
- Keep dependencies and CMS plugins patched; most site hacks are known-CVE exploits.
- Monitor Search Console's security section — Google often knows you're hacked before you do.
Deep dives (25)
- Contact details are scrapable in plain text
- Content-Security-Policy header missing
- Content-Security-Policy is in report-only mode
- Cookie missing HttpOnly flag
- Cookie missing SameSite attribute
- Cookie missing Secure flag
- CORS allows all origins (wildcard)
- CORS wildcard with credentials enabled
- CSP allows unsafe-inline scripts
- Deprecated TLS version detected
- External resources without Subresource Integrity
- External scripts missing integrity hash
- Form submits to insecure HTTP endpoint
- HSTS header missing
- HSTS max-age is shorter than a year
- Links worth checking for open redirect
- Mixed content (HTTP resources on HTTPS page)
- Page served over HTTP instead of HTTPS
- Page vulnerable to clickjacking
- Permissions-Policy header missing
- Referrer-Policy header missing
- Server header leaks technology information
- X-DNS-Prefetch-Control header missing
- X-Frame-Options header missing
- X-Powered-By header present
Audit your site against every practice on this page
Run a free audit