Nkosi NdwandweSEO case study

Case study / LogicExcel Academy / October 2026

835 URLs audited, fixed and shipped in a day

LogicExcel Academy is a free Excel practice site in English, German and Spanish. Its search clicks grew from 28 a week to 2,766 in 16 weeks while I ran the SEO. On 11 October I audited every URL, wrote and deployed the fixes myself, re-crawled to prove them, and set up a controlled test to measure what they earn.

Search Console clicks per week

28 to 2,766

01,0002,0003,00024 Sep: Google spam update2815 Jun29 Jun13 Jul35427 Jul10 Aug24 Aug1,0227 Sep1,93321 Sep2,4022,7665 Oct
01,0002,0003,00024 Sep: Google spam update2815 Jun13 Jul10 Aug7 Sep2,7665 Oct

Complete Monday to Sunday weeks from 15 June; the last bar is five days (5 to 9 October). Source: Search Console API, logicexcel.com, web search. The fixes below shipped on 11 October, after this chart ends.

835of835URLs returning 200 on the re-crawl after the deploy
444to88titles over 60 characters. 418 titles and 344 descriptions rewritten
2deploys in one day, 2,324 of 2,324 tests green before the second
22 Octfirst read of a controlled test on 14 rewritten lessons

One person, from crawl to deploy to measurement

I do not hand over a list of recommendations. I run the crawl, read the Search Console data, write the fix in the codebase, ship it, confirm it with a second crawl and design the test that shows whether it worked.

This is that loop on a live site, on one day: what I found, what I shipped, what I deliberately left alone, and how the result will be read.

Site
LogicExcel Academy, logicexcel.com
Product
Free Excel practice: you type a real formula into a live grid and get marked. About 95 exercises, three courses and an article library.
Languages
English, German, Spanish, each on its own URLs with hreflang
Launched
April 2026
My role
SEO and development: audit, fixes, deploy, measurement
Scope
835 URLs across three locales
Toolkit
Semrush, BabyLoveGrowth, the claude-seo audit toolkit, Search Console, GA4, Bing Webmaster Tools, Chrome UX Report, URL Inspection API, IndexNow, a Python crawler I wrote, Claude Code, Next.js, Cloudflare

A real product, not a page farm

Every lesson is a working exercise with a live spreadsheet grid and instant marking. That is the asset the SEO protects: pages that genuinely answer the search, in three languages, on a site that is fast on desktop and mobile.

Where the traffic comes from

Search drives the site, and it arrives from three continents.

Clicks went from 28 in the week of 15 June to 2,766 in the first five days of the week of 5 October. Google’s 24 September spam update passed without a dent: 1,933, then 2,402, then 2,766.

The demand mix is healthy. Over 13 September to 8 October, 53% of the clicks Search Console attributes to a query came from people searching LogicExcel by name, which is brand pull, and the other 47% came from non-brand searches for formulas and exercises. AI assistants already send 1,381 users a month.

Clicks by query type

Brand 2,575 clicks, non-brand 2,239. 13 Sep to 8 Oct 2026, top 5,000 queries (4,814 clicks). Search Console withholds anonymous queries, so this covers part of the 8,439 total.

Users by channel

Organic Search
14,111
Direct
3,929
AI Assistant
1,381
Unassigned
721
Referral
538

GA4, 28-day view taken 13 Oct 2026.

Users by country

United States
3,935
India
3,208
Germany
2,412
Mexico
1,675
United Kingdom
696
Spain
651
Colombia
619
Philippines
536

GA4, 28-day view taken 13 Oct 2026. The United States, India, Germany and Mexico lead, which is why English, German and Spanish each get their own pages.

Weekly numbers behind the chart

Week ofClicksImpressions
15 Jun28254
22 Jun44477
29 Jun74639
6 Jul1622,057
13 Jul2032,383
20 Jul2773,926
27 Jul35411,170
3 Aug52811,247
10 Aug5539,626
17 Aug66812,556
24 Aug89717,233
31 Aug1,02225,814
7 Sep1,46135,244
14 Sep1,53735,398
21 Sep1,93350,956
28 Sep2,40249,527
5 Oct (5 days)2,76649,448

The audit found five things worth fixing

I crawled all 835 sitemap URLs with a script of my own (status, title, description, canonical, hreflang, schema), exported Search Console by page, query, device and country, pulled Chrome UX Report field data, and checked a 40-URL sample against Google’s URL Inspection API.

The site scored 67 out of 100. Technical SEO is its strength at 80. The gains sit in content and AI-search readiness, and that is where the work went.

67out of 100, weighted across seven categories
Technical SEO 22%
80
Content quality 23%
59
On-page SEO 20%
66
Schema 10%
70
Performance 10%
72
AI search readiness 10%
58
Images 5%
60
  1. Production was two SEO passes behind the repo

    28 German and Spanish category pages carried English titles, 444 of 835 titles ran over length, and /practice returned 404 with 18 internal links pointing at it.

    DidMatched the live server to the repo file by file (1,278 files by checksum) so nothing a teammate shipped could be overwritten, then deployed the missing fixes.

  2. Mobile interaction speed was drifting

    Interaction to Next Paint at the 75th percentile went from 170 ms in June to 269 ms in the window ending 3 October. Third-party scripts dominate it.

    DidDeferred Clarity until after load. Left the ad loaders as an owner decision with no ad unit removed, and queued attribution logging so the next change rests on measurement.

  3. The money page was under-clicked for its position

    “excel practice online”: 11,457 impressions at position 5.9 and a 1.78% click rate. The page had run three title versions since 25 August, and India made up 44% of that query’s impressions at a lower click rate.

    DidDiagnosed it before touching it, then froze the title, description and H1 until 26 October so the read stays clean.

  4. Template faults a spam classifier compares as a set

    16 English titles read “… Practice Practice Online”, with Spanish and German twins. 57% of every lesson page body was the same template text.

    DidFixed the title helper at the source and wrote unique intros for 14 lesson URLs, which became the test group.

  5. Trust and entity gaps

    No named reviewer, empty sameAs, an unrelated funnel link in four article bodies and three different exercise counts across articles.

    DidRemoved the funnel links and reconciled the counts. The named reviewer and sameAs profiles are specced for the owners to supply.

Shipped in two deploys, proved by a re-crawl

Every change landed in the codebase with tests behind it, 2,324 of 2,324 green before the second deploy. After each deploy I re-crawled the same 835 URLs and compared the two crawls row by row.

Cloudflare was purged, all 95 lessons returned 200, and all 795 sitemap URLs went to IndexNow, then the 14 rewritten lessons again by name, because the deploy hook skips pages that carry no modified date.

Same 835 URLs, before and after

CheckBeforeAfter
URLs returning 200835835
Titles over 60 characters44488
Titles rewritten418
Descriptions rewritten344
H1s corrected46
URLs in the sitemap835795

Titles over 60 characters, share of 835

Before
444
After
88

The 88 that remain sit mostly on tutorial pages (30) and function articles (20), plus the German hub held on purpose.

Three real titles, as crawled

URLBefore (characters)After (characters)
/practice/4SUM, Ribbon and Formatting Shortcuts Practice Practice Online - Free Excel Exercise - LogicExcel (96)SUM, Ribbon and Formatting Shortcuts: Free Excel Practice (57)
/practice/12IF, VLOOKUP and Data Shortcuts Practice Practice Online - Free Excel Exercise - LogicExcel (90)IF, VLOOKUP and Data Shortcuts: Free Excel Practice Exercise (60)
/coursesExcel Courses I, II and III: Lessons, Quizzes and a Marked Final Exam | Logic Excel (83)Excel Courses I, II and III: Lessons, Quizzes, Final Exam (57)
Titles
A length ladder fits every title to the budget. The template bug that printed “Practice Practice Online” is fixed at the helper, so every language is corrected at once.
Redirects
/practice now sends a 308 to each language hub, and zero-padded lesson URLs like /practice/01 send a 308 to /practice/1, which removes duplicate URLs.
Indexing
40 German and Spanish lesson pages that carried English text went to noindex, follow and left the sitemap. They earned 2 clicks and 166 impressions in 28 days. The pages stay for users.
Schema
BreadcrumbList on the 60 lesson pages and the course pages. Hub FAQ markup is now built from the same list as the visible questions; before, the markup held 8 questions and the page showed 12.
Copy
Eight English lessons, and three each in German and Spanish, got their own intro, description and a fourth FAQ question. The other lessons keep the template as the control.
Crawlers
AI-bot groups completed in robots.txt, Clarity deferred past load, and backslash artefacts removed from 17 article files.
Before: the shared template
logicexcel.com/practice/1
Lesson /practice/1 with the generic intro: This free, interactive exercise teaches you SUM Function in Excel through 10 hands-on steps.
After: written for the lesson
logicexcel.com/practice/11
Lesson /practice/11 with an intro written for VLOOKUP that explains the exact-match argument and the beginner mistake.

Left: /practice/1, still on the template. Right: /practice/11, with an intro written for VLOOKUP and a fourth FAQ question. Live site, 13 October 2026.

Four calls I made on purpose

Held the hub title

The English hub had three title versions in six weeks. Another change would blur the read, so title, description and H1 stay byte for byte until 26 October.

Kept a 70-character title

The German hub title runs ten over the usual guide and earns 730 clicks in 28 days at position 4.8 with a 16% click rate. A length rule does not outrank a page that performs.

Noindexed, not deleted

The 40 thin German and Spanish lessons stay live for users and leave the index, so the quality signal improves without breaking a single link.

Protected revenue

No ad unit was removed. Speed work is sequenced: measure the third-party cost first, then stagger the loaders.

A stack that keeps the site sharpening

No single tool does this. Demand research, content supply, tactic scouting, audits, measurement and indexing each have a tool, and I own the judgement that joins them. The site gets better every week because the loop never stops.

Keyword demand

Semrush

Demand tables for each market, ranked by winnability, with targets at keyword difficulty 29 or below. Seeds are written in the market’s own language, after English seeds undercounted German demand about three times. Head terms re-pulled per country for the US, UK and Canada also shaped the accounting course plan.

Content supply

BabyLoveGrowth

Feeds the article library through its API. Every piece then passes my repair pass, German and Spanish localisation and the audit’s template checks, so volume never outruns quality.

Tactic scouting

X Premium articles

Long-form SEO articles are a daily source of tactics and strategy, and nothing ships on a claim. A post promising a free DR 93 backlink through a ChatGPT plugin listing was scoped against OpenAI’s requirements and held until the dofollow claim can be verified.

Audit

claude-seo and my own crawler

A full audit runs end to end: 835-URL crawl, schema probe, content and AI-search checks, scored out of 100, every script re-runnable. Claude Code is my daily coworker for it, and I review what it produces before it ships.

Measurement

Search Console, GA4, Bing, CrUX

All pulled by API into Portfolio Watch for every site, with same-weekday reads and a control group for each change.

Indexing and AI search

IndexNow, URL Inspection, robots rules

Every change is submitted by name, sampled against Google’s own indexing answer, and written for AI crawlers too, with explicit bot rules and answer-first page structure.

A test with a control, read on a schedule

The 14 rewritten lesson URLs are the test group. Every other /practice/N page is the control. I read complete Monday to Sunday weeks and compare the same weekday against the same weekday, because rolling totals hide cliffs.

Each group is read against its own baseline. The rewritten lessons already click at 8 to 10% and the rest at 4 to 5%, so the read measures change, not level. If clicks rise on the test group and not on the control, the copy earned it. If both rise, it was the sitemap, the titles or the season.

The English hub is also split into India and the rest of the world, since India behaves differently on that page.

Baseline: five weeks before the deploy

Week ofRewritten (test)Every other lesson (control)
ClicksImpr.CTRPos.ClicksImpr.CTRPos.
31 Aug8583410.2%7.5358094.3%11.6
7 Sep991,2697.8%7.2711,5164.7%10.7
14 Sep1561,54010.1%5.7721,4784.9%7.5
21 Sep1421,6388.7%6.51243,2853.8%9.3
28 Sep1811,8299.9%5.51122,4634.5%7.8

Search Console, web search, Monday to Sunday weeks. Script: measure.py.

  1. 11 OctFixes live: titles, redirects, schema, 14 rewritten lessons
  2. 12 to 18 OctFirst complete week after the deploy
  3. 22 OctFirst read: test group against control, hub India against rest
  4. 26 OctHub freeze ends, next hub test opens

One screen for the whole portfolio

I built Portfolio Watch to run SEO across many sites at once. It pulls Search Console, GA4 and Bing Webmaster data through a service account for every site, flags growth and decline, tracks rank movement, keeps daily snapshots and shows where to invest next.

LogicExcel leads the board: 26k visitors (up 75%), 9.1k search clicks (up 131%) and average position 8.1, improved from 12.3.

Portfolio Watch / Search & Traffic / 28 days
Portfolio Watch, Search and Traffic tab: the six sites with the most visitors, with LogicExcel in first place and highlighted: 26k visitors, 9.1k clicks, 194k impressions, average position 8.1.
Top six of 65 tracked sites by visitors, 28-day view taken 13 October 2026, with LogicExcel highlighted. The dashboard’s window runs past the audit’s (13 September to 8 October), so its click count differs from the 8,439 quoted elsewhere on this page.

What comes next