Case study 01

Two flat years, and nobody could tell me why

A national kids’ activity brand with real demand, a healthy budget and a site that had stopped growing. It didn’t need more content. It needed to stop competing with itself.

+61%
Organic revenue
year over year, same period
+65%
Organic purchases
6,074 vs 3,684
+44%
Organic sessions
163,615 vs 113,424
6 mo
Time to those numbers
Jun–Nov 2025
Client national multi-location youth programmesRole SEO strategistScope architecture, content, dev direction

Part one

The problem

A chart that told the whole story before anyone said a word.

Let me show you the chart first.

Organic traffic, 2013 to 2025 A long climb through the 2010s, a plateau after a 2023 site launch, a drop when the French site fell out of the index, then a steep recovery during the campaign period. 24.9k 16.6k 8.3k 0 MY WORK STARTS New site launch French site fell out of the index two flat years 2013 2017 2021 2023 2025 Source: SEMrush, organic traffic, 2013–2025
Twelve years of organic traffic. You can read the story without me narrating it.

A long climb through the 2010s. A new website in 2023. Then a cliff, when the French half of the site dropped out of Google’s index. After that, nothing. Two flat years.

When I picked up the account in June 2025, that flat line was the brief. Strong brand, real demand, content going out every month, and none of it moving.

The obvious answer was the de-indexing. Fix the French site, get the traffic back. Except the ceiling predated the drop and outlived it. This wasn’t one event. It was structural.

Worth saying where I stood. I’d just been hired. This was one of the first accounts I’d strategise for, and the client was the first through a rebuilt onboarding process.

So I crawled the site before the call and turned up with a picture of it.

How I explained it

The client’s marketing lead is sharp and runs her own SEMrush reports. But crawl budget isn’t something you hand someone as a spreadsheet and expect them to feel.

"Imagine walking into a market. Vendors everywhere pulling you in, and when you finally ask for what you came for, they say it's not here, try over there. You end up lost and exhausted. Now imagine you're Google, trying to index this site."

Me, first meeting, before showing them the crawl map

Then I put the crawl map on screen. Green for pages Google can index, red for pages it can’t. Theirs had red hanging off it in every direction, and whole clusters floating unattached to the main site. I said what the picture showed: no wonder the rankings had slipped.

What the crawl turned up

I ran Screaming Frog over the site expecting to find a mess. What I found was worse than a mess, because a mess is visible. This was tidy on the surface and quietly broken underneath.

Indexation breakdown of 114 pages Of 114 pages on the site, 53 were indexable and 61 were not, split between intentional exclusions and unintentional errors. 114 PAGES ON THE SITE 53 indexable the pages Google could actually rank Excluded on purpose fine, intentional Excluded by accident not fine, and nobody knew 404s sitting in the header navigation Pages blocked by robots.txt French versions that were never published Two sitemaps live at once, www and non-www Source: Screaming Frog crawl and Google Search Console coverage report
Fewer than half the pages were eligible to rank. Some of that was deliberate. Most of it wasn't, and it had been true for a long time.

Then the duplicates. Filter and session parameters had spawned a shadow set of URLs, so one programme page was running against three or four copies of itself.

Two real pages were also fighting. A venue page and its parent city page chased the same queries, and rankings bounced between them for months. A page that never ranks has a relevance problem. A page that ranks, drops and ranks again has a competing-signal problem.

Signal consolidation, before and after Before, authority split across parameterised URLs and two competing pages. After, canonical tags consolidate every duplicate onto one target page. WHAT I FOUND WHAT I DID Programme page ?filter=… ?session=… ?sort=… authority split four ways City page Venue page same query, two pages Programme page ?filter=… ?session=… ?sort=… rel=canonical, one target City page Venue page one page carries the query
This is the whole problem in one picture. A site with more pages than it could support, all of them tugging at the same authority.

The biggest one, and the reason it was there

Those floating clusters were subdomains. The blog on one, a programme section on another. Years of content between them, and Google treats a subdomain as a separate property, so almost none of that authority reached the main site.

I asked why. The answer reframed the engagement.

"We don't have access to the website. It can take a long time to get any new pages built. On this platform we can make quick changes ourselves. Otherwise every update has to go through an external developer."

Client marketing lead, first meeting

The subdomains weren’t an oversight. They were a workaround. Marketing couldn’t get pages built on their own site quickly, so they built them somewhere they controlled.

So the technical and organisational problems were the same problem. I could merge every subdomain into the main domain and it would work, right until the next time marketing needed a page quickly.

Even the duplicate www sitemap had a cause. Their menu builder wouldn’t save a link without www in front. Nobody was careless. The tools pushed them there.

Months later, hunting for FAQ content to support AI search, I found another subdomain nobody had mentioned. An entire knowledge base, in the same wrong building as the rest.

Part two

How I came up with the solution

Research, a hypothesis I could test cheaply, and a decision the client and I worked out together.

Fixing the duplicates was easy. Canonicals across the parameterised URLs, venue page pointed at its parent. Within weeks the camp terms climbed. That felt like progress.

It wasn’t enough. Nationally things improved. Locally they kept wobbling. And then the client’s marketing lead said something in a workshop that stuck with me:

"When we shared the report with her, the rankings didn't look as good."

Client marketing lead, reviewing what she saw when she searched herself

She was right and my report was right. That’s what made it interesting. Two accurate views of the same site that disagreed completely.

Chasing one query until it explained itself

So I stopped looking at dashboards and traced individual queries in Search Console. One keyword, ninety days at a time, watching which URL Google picked.

The pattern came fast. On any city-plus-service query Google cycled between three candidates: homepage, national service page, city page. It held one for a fortnight, then swapped.

That gave me something to test. If Google couldn’t choose, none of the three had a clear authority advantage. So I measured where the site’s authority actually sat.

Where the site's authority actually sat The service topic had years of accumulated ranking history and links. Individual city pages had almost none, which meant nesting service pages under cities made them inherit from the weakest parent available. THE TEST: WHICH PARENT IS STRONGER? The service topic Years of ranking history Most of the site's backlinks Brand recognised for this one thing Stronger link profile than competitors STRONG PARENT An individual city Page published recently Almost no links of its own No accumulated query history Competing with council and school sites WEAK PARENT Assessed in SEMrush and Search Console, autumn 2025
Once I laid it out like this the answer was obvious, which is exactly why it had been invisible. Everyone in the business thinks in territories, because that is how the business runs.

“So why didn’t we just build city pages from the start?”

Someone on my own team asked me that in a workshop, fairly pointedly. The client asked a version of it a few weeks later.

Fair question, and I’d had the answer since June. It was deliberate. The client gave us one clear instruction at kickoff: swim is the flagship. So we went after the national service pages first, where the revenue was. City pages came second, on purpose.

I still think that was right. You build authority at the top and let it flow down. Start at city level and you’re asking new pages with no links and no history to beat council sites on their own ground.

By autumn that work had done its job and the ceiling had moved. Phase two could start.

A page per pool, or a page per city?

Their leadership had asked about localised pages, and the team brought the question properly framed: by pool, or by city?

The case for pools was better than I expected. Their venues genuinely differ. Some are built for toddlers, shallow and warm. Others run cooler and suit stronger swimmers. Parents are making a real choice, and the website couldn’t help them make it.

The case against was volume. Dozens of near-identical pool pages is a duplicate content problem in a local SEO costume. And a city is something people search for. A pool name isn’t.

What settled it was the client raising the risk before I did. Someone on their side pointed out that three pages per location would compete with each other, which was exactly where my head had gone.

We landed on city pages carrying every programme, with pool detail inside them. Their idea, our shape. That’s usually the best version of this conversation.

Then I tested how far one page could stretch

Before committing, I wanted to know how granular Google expects you to be. So I searched the brand plus a major metro and watched what came back: results from four separate suburbs, all under the metro name.

Google already treated the metro as one place. A page per suburb would have split one strong page into several weak ones. That single search saved a quarter of pointless production.

Hierarchy inversion City-first nesting replaced with service-first nesting so location pages inherit strong national service authority. WHAT WE HAD WHAT I CHANGED IT TO /city/ /city/swim /city/soccer thin authority, divided again /swim/ /swim/city-a /swim/city-b national authority flows down
One folder move, and every location page changed parents.

And the knowledge base came home

The subdomain was the other half. We moved the whole knowledge base onto the main domain, redirects and all. Hundreds of pages that had spent years building relevance for a property nobody was trying to rank.

No new content. No new links. Just moving what already existed to where it counted.

The silo I designed to sit inside it

The client wanted to grow a second activity line that had always sat behind the flagship. So I read the sites beating them. Same pattern on every one: not more content, but content in clusters, with the main service page broken into children by participant level.

So instead of a blog calendar, I designed a silo. One parent page, child pages by level, each brief carrying its own keywords, title, meta, H1 and target length. Links ran sideways between adjacent levels and back up to the parent.

The topical silo blueprint A parent service page above four level-based child pages, which link sideways to adjacent levels and upward to the parent. SILO STRUCTURE Parent service page /soccer/ Toddler Preschool Ages 4–5 Ages 6–8 own keyword set own keyword set own keyword set own keyword set horizontal links between adjacent levels, every child links back up
Level-based children, not topic-based ones. Parents don't search for "soccer programmes". They search for something a four-year-old can do.

Keyword selection ran on four criteria: relevancy, volume, difficulty and cost per click. CPC earns its place. A term with 90 searches that competitors pay two dollars a click for beats one with 5,000 that nobody bids on.

The thing I'd have missed if I'd only looked at SEO tools

Partway through I spent an afternoon in the client's analytics rather than SEMrush, splitting revenue by channel. Paid search: 56% of sessions, under 30% of revenue. Organic: 19% of sessions, about 35% of revenue.

Organic converted about three times as efficiently as paid. That reframed every budget conversation for the year, and it came from a tool that isn't an SEO tool.

Part three

How the strategy got executed

Including the bit where I couldn't ship anything for weeks at a time.

Here's the part most case studies skip. I never controlled the website. A third-party dev team did, and the model was agreed in that first meeting: we recommend, they ship.

We knew the cost going in. The client had already told me it was why half her content lived on subdomains. Knowing about a constraint and having a plan for it are different things.

Approved content waited weeks. When I audited the live site against every recommendation we’d delivered since January, not one title tag or meta description had been shipped. Not one.

Where content stalled between brief and live A five-stage content pipeline in which the agency controlled the first three stages and the client's third-party development team controlled the stage where work accumulated. Brief Draft Approval Dev queue Live me my team client marketing third party everything piled up here and I couldn't do a thing about it WHAT I CONTROLLED
You can have the best strategy in the world and still be stuck at stage four.

I could have kept escalating. Instead I rebuilt the programme to fit the constraint, because a smaller plan that ships beats a bigger one that doesn’t.

Cadence dropped to two or three pieces a month, planned five months out. The growth activity jumped the blog queue because its pages had a season to hit. Metadata changes became their own deliverables, since a one-line change ships and a page rebuild doesn’t. Every recommendation went over as a build ticket with screenshots.

What shipped, month by month Technical consolidation shipped first, then subdomain consolidation and the hierarchy change, then location pages and the silo build. MONTH 1 MONTH 2 MONTHS 3–4 MONTH 5 MONTH 6 Crawl + audit Canonicals Subdomains Hierarchy Silo + pages find the problem stop the bleeding merge to one domain re-nest locations build the cluster camp terms climb authority pools local settles revenue follows Consolidation always came before production. No new pages onto a leaky structure.
The order was the strategy. Every month of publishing onto an unfixed structure would have been a month of compounding the original problem.
On AI search, since everyone asks

I tracked AI Overviews and Gemini alongside classic rankings. They diverged usefully: for one term the brand appeared in AI answers while its organic position had slipped. So I added AI visibility to reporting.

I didn't build a separate AEO strategy. AI search volume here is still small, and what feeds AI visibility is already on the roadmap: clean structure, real depth, reputation. The one genuinely AI-shaped move was publishing starting prices by region, because pricing is what people ask answer engines and this site had no answer.

What it produced

+61%
Organic revenue
year over year, same period
+65%
Organic purchases
6,074 vs 3,684
+44%
Organic sessions
163,615 vs 113,424
Organic converted more efficiently than paid
19% of sessions, 35% of revenue

Look at the order. Purchases grew faster than sessions. Revenue faster than purchases. That’s not a traffic win dressed up as a business win. The people arriving were better qualified.

The page that proved the architecture

Totals hide things. Look at which pages moved.

Revenue growth by page type Homepage revenue up 47 percent, flagship service page up 101 percent, province page up 169 percent, year over year. REVENUE, YEAR OVER YEAR Homepage routine optimisation +47% Flagship service page rebuilt as silo parent +101% Province page the new location hierarchy +169% Source: GA4, 9 Sep – 30 Nov 2025 vs same period prior year
The page carrying the new structure grew fastest, by a distance. Its conversion rate climbed too, 11.4% to 13.2%, so this wasn't simply more people finding the same page.

Keywords this brand didn’t own six months earlier

Every term below sat at zero when I started.

QueryJuneDecemberVolumeDifficulty
private [service] classes near meunranked#126025
[service] lessons classesunranked#21,60027
[service] lessons near meunranked#22,90032
kids [service] lessons near meunranked#326034
[service] lessonsunranked#42,40030
children's [service] lessonsunranked#588039
[service] classes near meunranked#154,40032

By the six-month review the domain held 2,237 ranking keywords, 179 in the top three, on 839 referring domains.

One number I refused to claim

While building the six-month deck, a colleague wanted to credit the province page’s growth to the page itself. Cleanest possible story. Would have looked great on a slide.

I asked them to take it out. That page didn’t grow alone. It grew because we’d optimised the homepage, added links, built citations, merged the subdomains and run months of technical fixes. Crediting one page makes a nice slide and bad measurement, and the first time a single-page change fails, the whole model loses credibility.

Where the relationship ended up

Worth remembering how this started. A strategist three weeks into a job, a client being run through a new onboarding process, nobody with a reason to trust anybody.

By September she was volunteering things I’d never have found. Which cities Google clusters together. Which of her locations was the flagship and why it mattered more than its search volume suggested. That’s a client doing strategy with you.

Eight months in, when they set the following year’s budget:

"We chose last year's strategy to prove out the SEO programme, that it's worth the investment. The results are super strong and warrant us continuing the relationship."

Client marketing lead, setting the next year's scope

What I took from it

Report revenue, not traffic. Purchases grew faster than sessions here, and that gap is the whole case for the work. A traffic chart would have undersold it.

And sequence beats speed. The pressure here, from my own team as much as the client, was to build city pages immediately. Holding them back until the flagship pages could carry them is why they worked. That's hard to argue for, because "not yet" sounds like "not done".

Sources. Figures come from the six-month client review deck and from recorded optimisation workshops. GA4, SEMrush and Google Search Console, read live in session. Nothing modelled, nothing estimated.

Client name, locations, personnel and vendor relationships withheld. Happy to talk through the reasoning in more detail.

← Back to harisjilani.com