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.




The exercise hub in three languages. Each has its own URL, title, description and FAQ, tied together with reciprocal hreflang on 832 of 832 non-home URLs.




Same pages on a 390 px phone. Mobile is where Interaction to Next Paint is watched.


Screenshots of the live site on 13 October 2026, with the cookie banner and ads removed.
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
GA4, 28-day view taken 13 Oct 2026.
Users by country
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 of | Clicks | Impressions |
|---|---|---|
| 15 Jun | 28 | 254 |
| 22 Jun | 44 | 477 |
| 29 Jun | 74 | 639 |
| 6 Jul | 162 | 2,057 |
| 13 Jul | 203 | 2,383 |
| 20 Jul | 277 | 3,926 |
| 27 Jul | 354 | 11,170 |
| 3 Aug | 528 | 11,247 |
| 10 Aug | 553 | 9,626 |
| 17 Aug | 668 | 12,556 |
| 24 Aug | 897 | 17,233 |
| 31 Aug | 1,022 | 25,814 |
| 7 Sep | 1,461 | 35,244 |
| 14 Sep | 1,537 | 35,398 |
| 21 Sep | 1,933 | 50,956 |
| 28 Sep | 2,402 | 49,527 |
| 5 Oct (5 days) | 2,766 | 49,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.
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
/practicereturned 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.
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.
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.
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.
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
sameAsprofiles 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
| Check | Before | After |
|---|---|---|
| URLs returning 200 | 835 | 835 |
| Titles over 60 characters | 444 | 88 |
| Titles rewritten | 418 | |
| Descriptions rewritten | 344 | |
| H1s corrected | 46 | |
| URLs in the sitemap | 835 | 795 |
Titles over 60 characters, share of 835
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
| URL | Before (characters) | After (characters) |
|---|---|---|
/practice/4 | SUM, Ribbon and Formatting Shortcuts Practice Practice Online - Free Excel Exercise - LogicExcel (96) | SUM, Ribbon and Formatting Shortcuts: Free Excel Practice (57) |
/practice/12 | IF, VLOOKUP and Data Shortcuts Practice Practice Online - Free Excel Exercise - LogicExcel (90) | IF, VLOOKUP and Data Shortcuts: Free Excel Practice Exercise (60) |
/courses | Excel 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
/practicenow sends a 308 to each language hub, and zero-padded lesson URLs like/practice/01send a 308 to/practice/1, which removes duplicate URLs.- Indexing
- 40 German and Spanish lesson pages that carried English text went to
noindex, followand 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.


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.
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.
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.
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.
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.
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.
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 of | Rewritten (test) | Every other lesson (control) | ||||||
|---|---|---|---|---|---|---|---|---|
| Clicks | Impr. | CTR | Pos. | Clicks | Impr. | CTR | Pos. | |
| 31 Aug | 85 | 834 | 10.2% | 7.5 | 35 | 809 | 4.3% | 11.6 |
| 7 Sep | 99 | 1,269 | 7.8% | 7.2 | 71 | 1,516 | 4.7% | 10.7 |
| 14 Sep | 156 | 1,540 | 10.1% | 5.7 | 72 | 1,478 | 4.9% | 7.5 |
| 21 Sep | 142 | 1,638 | 8.7% | 6.5 | 124 | 3,285 | 3.8% | 9.3 |
| 28 Sep | 181 | 1,829 | 9.9% | 5.5 | 112 | 2,463 | 4.5% | 7.8 |
Search Console, web search, Monday to Sunday weeks. Script: measure.py.
- 11 OctFixes live: titles, redirects, schema, 14 rewritten lessons
- 12 to 18 OctFirst complete week after the deploy
- 22 OctFirst read: test group against control, hub India against rest
- 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.

What comes next
Read the test on 22 October
If the new intro format wins, roll it across the remaining 277 lessons.
Build authority
Target pages are chosen and six outreach drafts are ready to send.
Cut mobile INP
Add attribution logging, then stagger the ad and consent scripts.
Index the translated articles
Same-language internal links into the German and Spanish articles Google has not picked up.
Complete the entity layer
A named reviewer, sameAs profiles and author pages.
Expand the controlled tests
Every future change ships with a baseline, a control and a read date.