All case studies

FILE 09 — METHOD TEARDOWN

Impressions grew 5.6×. Clicks stayed at four. This case study explains why.

Most agencies do not publish a result like this. We are publishing it — because a measured record of where on-page SEO ends and authority begins teaches more than another growth chart.

Subject
spaceagency.online — our delivery partner’s own site
Scope
Site build, technical SEO, content, measurement
Period
April – September 2026
Outcome
Visibility multiplied, clicks flat
Technical SEOProgrammatic SEOGA4 & GTMSearch ConsoleCROInformation Architecture

spaceagency.online

Wave 0 → Wave 3 (28-day windows)

What four waves actually produced

5.6×
Impressions
1,407 → 7,913
3.8×
Queries
154 → 583
4
Clicks
total in 28 days
20
Referring domains
Source: DataForSEO, measured 31 August 2026

The multipliers cannot be read alone: over the same period total clicks went from 3 to 4. This entire page exists to explain how both facts are true at once.

Source: Google Search Console, sc-domain:spaceagency.online

01 — The brief

Leaving a market that worked for one that did not

The site was a Spanish-language agency site aimed at Mendoza, Argentina. It was a known fish in a small pond: in the Wave 0 window, 11 of its 154 queries sat in the top three positions and 47 in the top ten.

The decision was to abandon that position and enter the US market in English. The commercial case was obvious — the same services sell at multiples of the price in the US. The SEO case was not: rankings earned in a known locale do not transfer. You start at zero.

So the work was planned as a migration, not a redesign. Every route was audited first and sorted into three buckets: keep, re-scope, retire. No page was touched before its bucket was decided.

  • 01

    Kept

    Geography-independent service pages — web design, ecommerce, technical SEO. The language and examples changed; the URL did not.

  • 02

    Re-scoped

    Mendoza-specific service pages became sector pages: “web design in Mendoza” turned into “web design for law firms”.

  • 03

    Retired

    39 programmatically generated geographic paths. Their story is chapter 04, because how they were closed matters more than that they were closed.

The audit was built as a gate: no code was written until the inventory existed. In a migration, the most expensive mistake is generating new pages before you know why the old ones existed.

02 — Architecture

One route registry, SEO enforced at build time

The site is a React and Vite single-page application. For SEO that is a bad default — the source HTML is empty. The fix was to render every route to real HTML after the build.

Today 43 routes are fed by a single registry. The sitemap, the redirects, the prerender list and the internal-link checks all read the same file. Removing a route there removes it everywhere, and shipping a route without adding it there is not possible.

The pipeline runs in order: generate the sitemap and RSS from the registry, generate redirects, build the app, prerender 63 HTML files, stabilise sitemap dates, generate llms.txt, and finally run a verification step. If verification fails, the deploy stops.

  • 01

    Prerender assertion

    Every page is asserted at build time to carry its own canonical tag. A page emitted with the wrong canonical breaks the build instead of reaching production.

  • 02

    Prohibited-term check

    A guard that blocks the old geography and brand name from leaking into titles and descriptions. It is the most common silent failure in a migration.

  • 03

    Sitemap date stabilisation

    Rewriting every lastmod on every build tells crawlers everything changed, which is a lie they learn to ignore. Dates advance only when content actually changes.

03 — Keyword ownership

One commercial intent, exactly one page

The site has 31 keyword clusters, each bound to a single route. That binding lives in a registry protected by tests, not in a spreadsheet.

The goal was to make a very common agency mistake impossible: two pages chasing the same commercial intent. “SEO agency”, “SEO services” and “SEO consulting” look like three pages. To Google they are usually one intent. Write all three and all three get weaker.

The registry turns two routes claiming the same stem into a failing test. 13 routes are deliberately exempt — contact, privacy, tools and other pages with no commercial intent. The exemption is recorded too; there is no page that is merely forgotten.

Clusters were chosen against low difficulty scores. Chapter 11 shows the measured reason: with 20 referring domains, targeting competitive terms is a waste of time.

04 — Programmatic SEO

39 templated pages, and how we closed them

The old site generated geographic pages by pouring city names into a template: Godoy Cruz, Guaymallén, Luján de Cuyo, Maipú, San Rafael and the rest. After the migration all of them were meaningless.

The first instinct was to 301 them into the relevant generic pages. That turned out to be wrong. When many distinct URLs redirect into one generic page, Google reads it not as a redirect but as a soft 404: the destination does not honour the source’s promise. The result was a pile of crawled pages carrying no value.

The correct answer was to kill them explicitly. 39 paths were marked to return 410 Gone, which with trailing-slash and locale-prefix variants came to 192 redirect rules. Unlike a 404, a 410 says “this is gone, stop coming back”, and crawlers accept it faster.

  • 01

    No city pages were rebuilt

    The new site lists 10 US metros as areas served — but none of them is a page and none of them is a link. Not repeating the same mistake in a new language was a deliberate decision.

  • 02

    The template moved to sectors

    Programmatic generation was not abandoned; its axis changed. Today 20 service content modules generate pages by sector and service rather than by city — each owning its own cluster.

  • 03

    The measured effect

    The retirement working is visible in chapter 10: pages receiving impressions fell from 159 to 94 while impressions kept rising. Not a loss of pages — a concentration.

05 — Design system

Pages defined in JSON, design validated by schema

Page layouts were not buried inside components. Section types live in a registry and page layouts live in JSON files, validated against a schema at build time.

The practical benefit: the order of a service page, or the contents of a section, can be changed without knowing React. The schema turns an invalid section type or a missing field into a build error — so a page cannot end up broken but live.

On the UI side the priority was legibility. Someone visiting this site in the US market is evaluating an agency; what carries the decision is understanding quickly what is on offer, not elaborate transitions. So every service page follows the same skeleton: what it is, who it is for, how it works, how long it takes, then a single action.

Design’s most concrete contribution to SEO here was structural rather than visual: the same skeleton guarantees the same heading hierarchy and the same internal-link positions on every page.

06 — Content

A phase spent deleting more than writing

The first half of the content work was not producing pages — it was auditing the existing blog. Most older posts were tied to Mendoza, to Spanish local searches, and to services no longer offered.

Every post was judged on three tests: did it take impressions in the last 480 days, is it still attached to a service being sold, and does it support a cluster under the new positioning. Posts failing all three were retired — some with a 410, some merged into the relevant service page.

Everything that survived, and everything written since, is bound by one rule: a post must support a cluster and may never own one. That stops the blog competing with the service pages — the structure that cannibalises agency-site traffic more than any other.

  • 01

    Claims register

    Every numeric claim published on the site is recorded with its figure, its source and its measurement date. A claim without a source cannot ship. This page is held to the same rule.

  • 02

    Brand and geography leakage

    The automated check stripping the old brand and city names from titles triggered corrections in more than 40 titles during the migration.

07 — CRO

One conversion channel, fed by two tools

The site has no competing conversion paths. Every page leads to the same single action. That is arithmetic rather than preference: at this traffic volume, the data to optimise two separate paths independently will never accumulate.

Two interactive tools were published to feed that channel: a website cost calculator and an AI visibility checker. Both are useful on their own, both return a result in exchange for an email, and both own their own keyword cluster.

The tools have a second job: earning links. Linking to a calculator is far easier than linking to a service page. As chapter 11 shows, that is exactly this site’s binding constraint.

Forms were cut to three fields. At this traffic volume every extra field is too small to measure and too expensive to recover.

08 — Measurement

GA4, GTM, and what consent-based measurement costs

Measurement was built on Google Consent Mode v2, denied by default. No tracking tag runs when the page opens; the GTM container loads only after the visitor explicitly opts in.

That was a deliberate choice and it has a price: GA4 structurally under-counts real traffic on this site. Every visitor who declines is invisible to it. That is why not one number in this case study comes from GA4 — all of them come from Search Console.

We state this plainly because it is the first question a careful reader asks: why do GA4 and Search Console disagree? They should. One is consent-bound and incomplete, the other is server-side and complete. Any report that merges them into a single table misrepresents at least one of them.

  • 01

    Tag management

    All tags live in one GTM container; there are no tracking calls scattered through the code. Consent state is re-applied on every page load.

  • 02

    Web Vitals

    Page performance is measured separately and runs regardless of consent, because it carries no personal data.

09 — Indexing

Eight pages, unreachable for eight days

This chapter records an accident, not an achievement. On 2026-08-10, 8 new US commercial pages were shipped. They were not shipped.

The local build passed cleanly. In continuous integration the application crashed at runtime — a chunk-splitting setting left React undefined. The prerender step produced empty pages and sometimes timed out. The dependency lockfile was out of sync, so installation did not even complete.

It was resolved on 2026-08-18: the chunk split was removed, prerendering was made parallel and fault-tolerant, and canonical verification was moved into the build step. 8 days had passed — in the middle of a wave.

This is the proof that rank tracking is not enough. A report watching rankings would have read those eight days as “no effect yet”. A check watching the build said the pages had never shipped, on day one.

10 — Results

Visibility multiplied, clicks stayed flat

Four 28-day windows. Impressions went from 1,407 to 7,913 — 5.6×. The query surface widened from 154 to 583. Over the same period total clicks went from 3 to 4.

Average position falling from 31.5 to 65.9 is not a loss; it is arithmetic. The site now appears for nearly four times as many queries and almost all of the new ones start deep. The average of a few well-ranked terms will always beat the average of many poorly ranked ones.

Period comparison

Bar lengths are on a logarithmic scale — on a linear axis the prior period would be invisible.

Period comparison
MetricWave 0 — Apr–May 2026Wave 3 — Aug–Sep 2026
Clicks34
Impressions1,4077,913
Average position31.565.9

Source: Google Search Console, sc-domain:spaceagency.online

Comparison of four Search Console windows
WindowClicksImpressionsCTRAvg. positionQueriesPages with impressions
Wave 0 — baseline2026-04-22 → 2026-05-2031,4070.21%31.515468
Wave 12026-07-21 → 2026-08-1865,5170.11%55.8631158
Wave 22026-07-25 → 2026-08-2255,8000.09%58.0630159
Wave 3 — at publication2026-08-08 → 2026-09-0547,9130.05%65.958394

The Wave 1 and Wave 2 windows overlap by 25 days — they are two readings of the same period, not two periods.

Source: Google Search Console, sc-domain:spaceagency.online

The table that actually tells the story is the position distribution. Wave 0 had 11 queries in the top three; Wave 3 has none. At position 51 and beyond the count went from 44 queries to 497. That is exactly what the pivot did: it gave up a small, well-ranked Spanish local cluster and bought a large, unranked US one.

Queries by position band, Wave 0 against Wave 3
Position bandWave 0Wave 3
1–3110
4–10477
11–20133
21–503976
51+44497

Wave 0 had 11 queries in the top three positions. Wave 3 has none. That is precisely what the pivot cost.

Source: Google Search Console, sc-domain:spaceagency.online

The direction is right: the US is now 54.0% of impressions. Pages receiving impressions falling from 159 to 94 is not decay either — it is the geographic pages closed with 410 in chapter 04 leaving the results. Fewer pages, more impressions.

Wave 3 impressions by country
CountryImpressionsAvg. position
United States4,27165.8
Spain1,57372.5
United Kingdom58364.8
Mexico25977.4
Colombia12060.9

Source: Google Search Console — 8 Aug – 5 Sep 2026 (28 days)

Wave 3 impressions and clicks by device
DeviceImpressionsClicks
Desktop6,4814
Mobile1,4100
Tablet220

Source: Google Search Console — 8 Aug – 5 Sep 2026 (28 days)

11 — Diagnosis

The ceiling is not on the page. It is in the domain’s authority.

Four waves did everything that can be done on-page and technically. The reason the clicks did not follow was measured on 2026-08-31 and fits in one sentence: this domain has no authority.

The measurement: 20 referring domains. Of 120 referring pages, 102 are nofollow — 85% carry no authority at all. 100 of them are footer links from a single platform. Organically, the domain ranks for 1 US keyword.

20
Referring domains
85%
Nofollow share
100
Footer links, one platform
1
US keyword ranked

Source: DataForSEO, measured 31 August 2026

That profile explains precisely why the pages sit between positions 53 and 90. The clusters were chosen correctly, the pages were written correctly, the technical side is clean. The one missing input is the external signal Google needs before it will trust these pages.

The working rule that follows is unambiguous: with this authority only low-difficulty terms are contestable, and the sole objective of the next phase is taking referring domains from 20 to the 45–60 band. Writing more pages changes nothing in this table.

That is also why we publish this case study. A measured example of where on-page SEO stops is more useful than the growth chart most agencies publish — particularly to anyone starting out on a new domain.