Eight cannibalisation pairs, one prefix strip, one PR

The audit found eight of them. Eight URL pairs, each targeting the same keyword territory, each on the same domain. The pattern was uniform across the site: a slug carrying an NN- numeric prefix, and its un-prefixed twin. Google sees both. It can’t determine which is authoritative. So it ranks neither confidently. Across eight pairs, that’s a systematic authority split on the highest-traffic keyword clusters in the site.

That was the lead finding from the Phase 1 tech audit on ukcalculator.uk, run in mid-June 2026. The audit trigger was direct: get the site indexed and ranking. The site had content; it had a working Next.js 15 stack; it had zero meaningful search presence. The prefix was one reason why.

The fix was straightforward to describe and genuinely complex to execute correctly. Strip the prefix universally, push permanent redirects for every old URL, and repoint every internal reference to the new canonical form, in one operation rather than three.

What cannibalisation does to rank signals

Cannibalisation isn’t a ranking penalty. It’s a coherence failure. When a site presents two URLs that both answer the same query, Google has to decide where to concentrate link equity. It can’t split it cleanly. The result is that neither URL accumulates the authority it would if only one existed. On a site where internal links point at the prefixed form, external links might point at the un-prefixed form, and crawlers have indexed both, the signals are genuinely incoherent. Google’s response to incoherence is conservative ranking, not generous.

The NN- prefix on ukcalculator.uk was producing exactly this. The prefix was structural, almost certainly a legacy routing decision that made slugs sortable during development. These decisions survive into production unchanged because they work locally. By the time the Phase 1 audit ran, the prefix was load-bearing in both the routing layer and the internal link graph. Eight pairs of pages were competing against themselves on the keyword clusters they should have been consolidating.

Fixing the routing without fixing the internal links would leave the old prefix form still referenced within the site, routing link authority through an extra redirect hop. That is a weaker signal than a direct link to the canonical. Fixing the content slugs without the redirects would swap a cannibalisation problem for a 404 problem. The three changes are coupled at the dependency level.

Why universal

The alternative is case-by-case. Evaluate each pair, decide which URL form should win, redirect the loser. On eight pairs that’s a bounded decision set. But a case-by-case operation produces a mixed URL shape, some slugs prefixed and some not, which requires maintaining two routing conventions indefinitely and guarantees new cannibalisation as the content set grows.

Universal strip produces one convention. Every slug in the canonical un-prefixed form, every redirect from the old prefix form permanent, every internal link resolved to the canonical target. There’s nothing to maintain.

Out of scope: per-pair keyword weighting to determine which canonical form had stronger signals before the strip. The audit treated uniform canonical shape as the goal; short-term ranking differences between the prefixed and un-prefixed forms were subordinate to long-term structural coherence.

The operation

Three groups of file changes, one PR.

Content. The slug field in every affected MDX file updated to the un-prefixed form. Slug is the ground truth for routing in a Next.js content site: the value the framework reads to determine what URL a page occupies. Change this first and every downstream reference has a clear canonical to resolve against.

Routing. 23 redirects, each an HTTP 308 Permanent Redirect. 308 rather than 301 because 308 preserves the request method, the semantically correct choice for “this resource has permanently moved; repeat the same request at the new location.” These map every old NN--prefixed URL to its canonical un-prefixed form. Google follows 308s and transfers link equity to the destination.

Internal links. Every MDX cross-link pointing at an NN--prefixed URL repointed to the canonical URL. This is the step most operational SEO guides defer. Deferring it means the internal link graph continues routing authority toward URLs that are 308-redirecting: an extra hop in the authority chain, and a signal to Google that the site hasn’t fully committed to the new canonical form. The full repoint closes that gap at deploy time.

Why one commit

The three groups are coupled at the failure boundary. A 308 redirect that points at a canonical URL the content layer doesn’t recognise returns 308 → 404, a redirect chain terminating in an error. A content slug update deployed before the redirects are live means a window where the old URL 404s directly rather than redirecting.

Staging all three in a single atomic commit eliminates both failure modes. The verification pass becomes a single-pass check. Does every old NN--prefixed URL return 308 to its expected canonical? Does every canonical return 200? Do any internal links still reference the old prefix form? The devlog records zero soft-failures.

Where 1.3 sits in Phase 1

Phase 1.3 was the third of five operations in the locked SEO foundation for ukcalculator.uk:

  • 1.1: site-wide title double-brand fix
  • 1.2: dynamic og:image and twitter:image on every route, Aether-themed ImageResponse templates with per-article variants
  • 1.3: eight cannibalisation pairs resolved (this)
  • 1.5: public/robots.txt converted to a MetadataRoute.Robots export at app/robots.ts, GSC indexing action plan filed

PRs #99 through #102 merged on 14 June 2026 at 21:24 BST. Three days later, Google started indexing pages, qualitative confirmation from Search Console that the technical foundation is visible.

Phase 1.3 was the structural fix in the sequence. Title fixes improve click-through signals. OG images improve social distribution. Neither resolves a structural authority split. The prefix strip does. Eight pairs, one routing convention, one internal link graph, no competing signals. That’s the precondition for other ranking inputs to compound.

What to watch

Consolidating cannibalisation pairs transfers authority from the old prefixed URL to the canonical. The transfer follows Google’s recrawl schedule, not a deployment timestamp. How long it takes depends on whatever interval Google decides to revisit the affected URLs.

Search Console will show the prefixed URLs dropping from the index as Google recrawls them and receives the 308 response. The canonical un-prefixed URLs should accumulate the consolidated authority in position data, visible as gradual upward movement on the keyword clusters the pairs were competing on.

The indicator to watch in the near term is crawl coverage, not rank position. How many of the old prefixed URLs are being recrawled and returning 308, versus how many are still generating impressions as live pages? When coverage approaches zero, the consolidation is complete and position data becomes interpretable without cannibalisation noise.

Phase 1 as a whole landed on 14 June. Google began indexing three days later. That’s the minimum signal needed before anything else is interpretable. The cannibalisation pairs resolved in 1.3 are what allow that indexing to land on a coherent URL structure rather than a split one.

All writing