Skip to content
Digital Otters
Technical SEO agency · US market

If a crawler can't reach it, nothing else you do matters

Crawling, rendering, indexation, architecture, Core Web Vitals and migrations — diagnosed with source, rendered and index evidence, then written as tickets your developers can estimate and ship.

crawl-trace — user-agent: Googlebot/2.1live trace
Select a URL pattern
01GET /app/pricing HTTP/2
02200 OK · text/html · 4.2 kB
03robots.txt -> allow
04source html: div#root is empty
05source: 0 words · 0 internal links
06render queue -> deferred (bundle 812 kB)
07rendered: 640 words · 24 links
08INDEX: partial — crawled, not indexed
$ done
FailContent never reaches the index

The first response contains an empty root div. Rendering is deferred to a client bundle, so first-pass indexing sees no copy, no links and no metadata. Anything discovered later is discovered slowly and inconsistently.

Typical fix1 sprint
Direct answer

Technical SEO improves how search engines and search-connected AI systems crawl, render, interpret, index and retrieve a website. We audit architecture, JavaScript rendering, performance, structured data, migrations, robots controls and crawler access — then turn findings into implementation work that actually ships.

The pipeline

Five stages between your HTML and a ranking result

A page can fail at any one of them and look perfectly fine in a browser. Select a stage to see the failure modes, the evidence we collect, and what we change.

Stage 01Discover

A URL has to be found before anything else happens

Discovery comes from internal links, sitemaps and external references. If a page has none of those, it does not exist as far as search is concerned.

Failure modes
  • Orphan pages with zero internal links
  • Sitemaps listing redirects or 404s
  • Pagination that only exists in JavaScript
  • Infinite calendar or filter spaces
Evidence we pullcrawl + logs + GSC
sitemap.xmlxml
1<url>
2 <loc>https://site.com/c/boots</loc>
3 <lastmod>2026-07-31</lastmod>
4</url>
5# 412 of 2,140 entries resolve to 301
6# 88 entries return 404
7# 1,204 indexable URLs missing entirely
What we change

Rebuild sitemap generation from the canonical set, add hub links for orphans, and cap crawlable parameter space.

Audit manifest

218 checks, grouped the way engineers work

Not a plugin scan. Crawl data, Search Console, source HTML, rendered DOM, server logs, CDN behaviour and release history, cross-referenced by template.

audit/crawl-indexation/54 checksCrawling and indexation
  • robots.txt + meta directives
  • XML sitemap integrity
  • status codes by template
  • canonical consistency
  • duplicate clusters
  • index coverage causes
audit/architecture/38 checksArchitecture and internal links
  • click depth distribution
  • orphan page detection
  • pagination + faceting
  • breadcrumb + hub logic
  • anchor text patterns
  • authority flow to money pages
audit/rendering/41 checksJavaScript and rendering
  • source vs rendered parity
  • routing + history API
  • metadata injection timing
  • hydration + streaming
  • blocked resources
  • status handling in SPA routes
audit/performance/33 checksPerformance and vitals
  • field CWV by template
  • LCP element per template
  • long tasks + INP sources
  • layout shift sources
  • payload + third-party weight
  • cache + CDN behaviour
audit/semantics/29 checksStructured data and semantics
  • schema validity + eligibility
  • entity + sameAs consistency
  • content-to-markup parity
  • hreflang + locale signals
  • heading + landmark structure
  • image + media semantics
audit/release-risk/23 checksMigrations and release risk
  • redirect map coverage
  • chain + loop detection
  • staging noindex leaks
  • template regression diffs
  • analytics + GSC continuity
  • rollback readiness
JavaScript SEO

Source versus rendered — where SPAs quietly lose pages

The browser shows you the right-hand column. First-pass crawling sees the left. Everything that only exists on the right is a coin flip.

response.html — first fetchwhat crawlers get
<!doctype html>
<html lang=\"en\">
<head>
<title>App</title>
# no canonical declared
</head>
<body>
<div id=\"root\"></div>
<script src=\"/_app/main.812kb.js\">
</body>
# 0 words · 0 internal links
rendered DOM — after hydrationwhat browsers get
<h1>Ridge Jacket — Waterproof Shell</h1>
<p>1,240 words of product copy…</p>
<nav>42 internal links</nav>
<link rel=\"canonical\" href=\"/products/…\">
<script type=\"application/ld+json\">
{ \"@type\": \"Product\", \"offers\": {…} }
</script>
# injected 2.4s after first paint
# render queue: not guaranteed
# parity with source: 0.02
TestEvery template, not one URL

Parity is measured per template group, because one broken layout is thousands of URLs.

MetadataTitles set after hydration

A title injected client-side may never be the one used. It belongs in the first response.

RoutingSoft 404s in SPA routes

Client routers return 200 for missing pages unless status handling is explicit.

FixSSR, SSG or ISR per route

We recommend a rendering strategy route by route against traffic and freshness needs.

Core Web Vitals

Field thresholds, and the code that breaks them

We work against 75th-percentile field data, per template — not a lab score from one run on one URL.

LCPLargest Contentful Paint

When the main content of the viewport is actually painted. On most templates the culprit is a hero image or a font, not the server.

Goodunder 2.5sNeeds work4.0sPoorover 4.0sUsual culprits
  • render-blocking CSS + fonts
  • unoptimised hero images
  • slow TTFB / no edge cache
  • client-side fetch before paint
INPInteraction to Next Paint

How quickly the page responds to a real interaction. It replaced FID because it measures every interaction, not just the first.

Goodunder 200msNeeds work500msPoorover 500msUsual culprits
  • long tasks during hydration
  • third-party tag managers
  • heavy event handlers
  • unsplit JS bundles
CLSCumulative Layout Shift

How much the layout moves while loading. Almost always fixable in a day, and almost always still broken.

Goodunder 0.1Needs work0.25Poorover 0.25Usual culprits
  • images without dimensions
  • injected banners + consent bars
  • web fonts swapping metrics
  • late-loading ad slots
The deliverable

You get tickets, not a 90-page PDF

Every finding lands as a ticket with evidence, affected templates, acceptance criteria and an estimate your engineers can argue with. This is a real one, anonymised.

SEO-1042 · canonical-consolidationP13 ptsFaceted URLs self-canonicalise, splitting authority across 41,800 variants
Templates hitcategory, facetURLs affected41,812Evidencecrawl + logs + GSC
- <link rel=\"canonical\" href=\"{current_url}\">
+ <link rel=\"canonical\" href=\"{category.base_url}\">
# facet links: add rel=nofollow + noindex for
# combinations outside the curated allow-list
# robots.txt: Disallow: /*?*color=
Acceptance criteria
  • Facet URLs outside the allow-list canonicalise to the parent category, verified on 20 sampled URLs.
  • Curated facets (colour, size) remain indexable with unique titles and copy.
  • Crawl of the category tree returns 3,000 or fewer indexable URLs, down from 41,812.
  • Head-output regression test added to CI so the canonical rule cannot silently revert.
PrioritisationImpact × reach × confidence ÷ effort

Every ticket is scored, so your team can argue with the order instead of guessing at it.

EvidenceNothing without a receipt

Each finding links to the crawl row, log sample or GSC export that proves it.

ValidationWe retest after release

Affected templates are re-crawled post-deploy and the ticket only closes on evidence.

Migrations

The gates a migration has to pass

Most post-migration traffic losses are decided weeks before launch. These are the gates, the owner and the failure we are protecting against.

PhaseGateIf it is skippedOwner
PreURL map signed offLegacy URLs land on the homepage and years of equity is flattened.SEO + dev
PreTemplate parity reviewNew templates quietly drop copy, links or metadata the old ones had.SEO + design
PreStaging crawl + noindex checkStaging gets indexed, or production ships with noindex still on.Dev
LaunchRedirect chain validationHops and loops dilute signals and slow reprocessing to weeks.Dev
LaunchAnalytics + GSC continuityYou lose the ability to prove what the migration did, in either direction.Analytics
PostIndexation reconciliationMissing pages go unnoticed until a quarterly report surfaces them.SEO
PostRollback readinessA bad release has to be fixed forward under pressure instead of reverted.Dev
Measurement

Reported by template, because that is where fixes land

Four leading indicators, each tied to a template group so a regression is traceable to the release that caused it.

Index coverage94%of strategic URLs indexed

Tracked against a defined list of commercial URLs, with a named cause for every exclusion.

Crawl efficiency71%of hits on valuable templates

Log-derived. The inverse is crawl waste on parameters, duplicates and dead ends.

Template health0 P1open regressions

Canonical, status, depth and rendered-parity checks run per template on every release.

Field vitals82%of templates passing

75th-percentile field data by template group, not a single lab run on the homepage.

Decision guide

Technical SEO or on-page SEO?

The shortest diagnostic: if your pages are indexed but not ranking, it is on-page. If they are not indexed at all, or the site is fast in the lab and slow in the field, it is here.

  • Large, JavaScript-heavy, ecommerce, marketplace or multi-location sites
  • A redesign, replatform, domain move or international rollout is planned
  • Search Console is showing crawl or indexation anomalies you cannot explain
  • Your developers need precise, testable tickets rather than a PDF of warnings
FactorTechnicalOn-page
FocusCrawling, rendering, indexing, speedContent, intent match, internal links
OwnerUsually engineeringUsually marketing
Typical blockerPages not indexed at allPages indexed but not ranking
Unit of workTemplate and releasePage and cluster
CadenceSprint-based, front-loadedContinuous
Failure modeSilent — looks fine in a browserVisible — rankings plateau
Commercial scope

Scoped by URL count, template variety and who ships the fix

Log-file analysis, international signals and implementation support are the three variables that move price most.

Diagnostic

Technical SEO audit

from$6,500

Full diagnosis across crawl, render, index, architecture, performance and semantics.

  • Crawl + GSC + rendered-DOM evidence
  • Findings segmented by template
  • Prioritised ticket backlog
  • Two developer walkthrough calls
Scope an audit
Specialist

JavaScript SEO review

from$4,200

Source-versus-rendered testing across every template in a framework app.

  • Parity testing per template
  • Routing, metadata + status handling
  • Rendering strategy recommendation
  • PR-level implementation notes
Review my app
High risk

Migration support

from$8,000

Pre-launch requirements through post-launch reconciliation and recovery.

  • URL map + redirect validation
  • Template parity + staging QA
  • Launch-day monitoring window
  • Post-launch reconciliation report
Protect a migration
Ongoing

Implementation retainer

from$4,500/mo

Release reviews, ticket writing, staging QA and regression monitoring.

  • Pre-release template review
  • Standing crawler + index alerts
  • Backlog grooming with your team
  • Monthly technical health report
Discuss a retainer
FAQs

What engineers and heads of growth ask us

Send the URL, the platform and what changed. You get a written technical read from the person who would run the audit.

Ask a question
What is the difference between an audit and ongoing technical SEO?

An audit is a point-in-time diagnosis with a prioritised backlog. Ongoing work supports implementation, reviews new templates before release, QAs staging, monitors regressions and keeps the backlog current as the site changes. Most teams need the audit once and the ongoing support during a period of heavy development.

Can you work with Next.js, Nuxt, Remix or a custom SPA?

Yes. We review source HTML, rendered output, routing, metadata timing, canonical behaviour, streaming, caching and deployment patterns. Recommendations differ depending on whether rendering is static, server-side, streamed or client-side — we scope after seeing how your app actually renders, not from the framework name.

Do you fix the issues or only report them?

Either. For client-controlled codebases we write implementation tickets with acceptance criteria and work alongside your developers, including PR review. Where the CMS and scope allow, we implement directly and validate the release ourselves.

How long does a technical SEO audit take?

A small marketing site is one to two weeks. Large ecommerce, marketplace or international sites take three to six, because findings have to be segmented by template, market and business impact — and because log-file analysis needs a full 30-day window to be meaningful.

Can technical SEO recover traffic lost after a migration?

It can resolve migration-caused problems: missing or chained redirects, changed canonicals, blocked resources, altered architecture, indexation errors. Recovery also depends on how long the problems persisted and whether content, links or demand changed at the same time. We tell you which of those we can see in the data before quoting.

Is Core Web Vitals a ranking factor?

Page experience is one input among many, and a weak one relative to relevance. We improve field vitals because speed and stability affect conversion and crawl efficiency as well as search — not because one score is a strategy. Anyone selling a 100 Lighthouse score as an SEO plan is selling the wrong thing.

How much does a technical SEO audit cost?

It moves with URL count, template variety, JavaScript complexity, international or ecommerce features, whether log-file analysis is in scope, and how much implementation support you need. Starting points are on this page; we review the site before proposing a scope.

Does technical SEO affect ChatGPT, Copilot and AI search?

At the eligibility level, yes. Search-connected AI systems depend on crawlable, indexable, well-structured content. Robots rules, CDN and WAF access, canonicalisation, internal links and clear textual HTML all affect whether your content can be retrieved at all. No agency can guarantee citation — but being unfetchable guarantees the opposite.

Send the URL and what changed. We will tell you what is broken.

Platform, recent releases, migration history and the Search Console or performance symptom you are seeing. You get a written technical read — the likely cause, the evidence we would pull to confirm it, and the right scope. No obligation.

Digital OttersWhat you get back
Likely cause, named — not a list of every warningThe evidence we would pull to confirm itWhether it is an audit, a review or a migration jobWritten scope and cost range, no obligation