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
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
Impressions
Wave 0 — Apr–May 20261,407
Wave 3 — Aug–Sep 20267,913
Clicks
Wave 0 — Apr–May 20263
Wave 3 — Aug–Sep 20264
Bar lengths are on a logarithmic scale — on a linear axis the prior period would be invisible.
Period comparison
Metric
Wave 0 — Apr–May 2026
Wave 3 — Aug–Sep 2026
Clicks
3
4
Impressions
1,407
7,913
Average position
31.5
65.9
Source: Google Search Console, sc-domain:spaceagency.online
Comparison of four Search Console windows
Window
Clicks
Impressions
CTR
Avg. position
Queries
Pages with impressions
Wave 0 — baseline2026-04-22 → 2026-05-20
3
1,407
0.21%
31.5
154
68
Wave 12026-07-21 → 2026-08-18
6
5,517
0.11%
55.8
631
158
Wave 22026-07-25 → 2026-08-22
5
5,800
0.09%
58.0
630
159
Wave 3 — at publication2026-08-08 → 2026-09-05
4
7,913
0.05%
65.9
583
94
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 band
Wave 0
Wave 3
1–3
11
0
4–10
47
7
11–20
13
3
21–50
39
76
51+
44
497
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
Country
Impressions
Avg. position
United States
4,271
65.8
Spain
1,573
72.5
United Kingdom
583
64.8
Mexico
259
77.4
Colombia
120
60.9
Source: Google Search Console — 8 Aug – 5 Sep 2026 (28 days)
Wave 3 impressions and clicks by device
Device
Impressions
Clicks
Desktop
6,481
4
Mobile
1,410
0
Tablet
22
0
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.
Cookie Usage
We use cookies to improve your experience on our website.