SEO teams spend plenty of time creating new pages while existing pages quietly lose rankings, clicks, and revenue.
Updating those pages can recover performance. But rewriting too much wipes out the SEO equity they have already built.
This is the 14-step process ground transportation marketplace hoppa uses to diagnose content decay and make targeted updates — and how they turned it into a system with Claude Code.
Why existing pages deserve more attention
Content decays. Not dramatically — no penalty, no algorithm update to blame. Just a slow drift.
A ranking creeps down. Impressions hold steady while clicks quietly fall. An AI Overview eats the top of the results. Google notices before your analytics dashboard does.
The Antalya diagnostic
The example comes from a marketplace with pages covering airports, resorts and routes across multiple countries and languages. Before touching its Antalya Airport transfers page, the 56-day diagnostic showed:
- 148,537 impressions
- Average position 14.89
- CTR 1.49%
- 2,215 clicks
Buried, not invisible. Nothing was broken. It was just stale.
A fundamentally different job
New pages start at zero. Updating a page that already ranks is a different job entirely — you are working with a live asset:
- Internal links already pointing at it
- Schema already in place
- A historical baseline you can break if careless
Teams "refresh" a decaying page by rewriting it top to bottom and lose every ranking it had. That is a self-inflicted demotion.
Step 1: Read the 56-day GSC window
Every update starts with a 56-day window in Search Console. Not 90 days, not a year.
Two reasons. It is wide enough to be reliable and narrow enough to stay within one season — on a seasonal site, a wider window averages June against January and produces the wrong conclusion.
Second, the same window is used when the update goes live. SEOTesting offers 2, 4, 6 or 8-week test periods; eight weeks equals 56 days.
Three things inside the data
- Top queries: preserve these, whatever else changes
- Striking-distance queries (positions 5–20, weak CTR): the cheap wins
- Zero-click queries (high impressions, almost no clicks): the page is served for an intent it does not answer
Step 2: Tag every section
This tagging discipline is really the whole game.
- Keep: still ranks, still accurate. Do not touch it.
- Fix: right idea, stale execution. Rewrite in place.
- Remove: wrong, redundant, or actively hurting.
- Add: the data says something is missing.
Most self-inflicted damage comes from mistaking a Keep section for a Fix.
Steps 3–5: Competitors, keywords, personas
Here it stops being generic. Antalya's query data turned up:
- A striking-distance opportunity: "antalya airport transfer" sitting at position 7 with real volume behind it
- A private-hire gap: "private transfer antalya" pulling 1,091 impressions and 14 clicks, a 1.28% CTR — because the page had nothing for travellers wanting a private transfer rather than a shared shuttle
- A comparison gap: "best antalya airport transfers" at position 10.5, with no comparison content on the page at all
How the personas get built
Personas come from a two-source process rather than a single dataset.
The foundation is a sitewide taxonomy: a Search Console export covering the last 16 months, with every query clustered into a master persona set that holds across the whole portfolio.
For any specific update, that sitewide set is paired with SEOTesting's Query Fan-Out tool, fed a seed term for the destination. It generates synthetic queries people would plausibly ask within an LLM interface rather than type into a search box, clustered the same way.
The two datasets — 16 months of real GSC behaviour and synthetic fan-out queries for that destination — combine into the final set.
For Antalya, that produced four personas:
- The standard shuttle shopper
- The private-hire shopper
- The group traveller
- The day-tripper
Steps 6–7: Refresh local knowledge, decide the angle
What changes at an airport destination every 18 to 24 months gets checked against current sources rather than assumed from the original brief:
- Terminal assignments
- Taxi rank locations
- Scam patterns
- Tipping conventions
- Peak congestion
- Review themes on Trustpilot
Then the angle. The original angle on a commercial page tends to start generic — something like "we make airport transfers easy."
That is not an argument. It is a brochure, and it said nothing to the four different personas the data just surfaced.
Antalya's new angle:
Different travellers need different transfers, and the page should surface the right answer based on who is actually looking, instead of presenting every option to everyone and hoping they self-sort.
Step 8: Write the delta brief
Not a brief for the whole page: a delta brief covering only what changes.
Each section gets one of the four labels explicitly, with a reason attached. It runs roughly 1,500 words for a page this size and reads more like an engineering change request than a writer's brief — which is the right tone for the work.
Step 9: Write the delta
Only the sections tagged "fix" and "add" get written.
That meant refreshed copy and keyword coverage across the fix list, plus one add: a persona chooser, "Expert Airport Transfer Finder."
A visitor picks the option closest to their situation, and the module surfaces the vehicle recommendation, price range, and detail that matters to that persona.
Notably, the component does not add new information. All of it already existed somewhere on the page, spread across vehicle explainers, the group-size guide and the FAQ. It gives each visitor a direct path to the part that is already theirs, instead of asking them to scan the whole page.
Step 10: Fact-check everything
Including the "keep" sections.
Staying does not mean it is still accurate, so every numeric claim — distances, prices, transit times, terminal assignments — gets reverified against current sources.
Most "AI-refreshed" pages skip this part, updating the surface text while leaving the underlying facts untouched.
Steps 11–12: Audit images, preserve the SEO equity
Every image gets checked for three things: still accurate, still on-brand, still meeting current performance spec (WebP/AVIF, properly sized, lazy-loaded). Anything failing gets replaced.
The rule for everything else is preserved unless there is a specific reason not to:
- The URL slug never changes
- The meta title stays if it is earning CTR
- Schema gets extended rather than replaced
- Internal links are checked in both directions — into the page and out of it
Step 13: Build the UI components
When the brief calls for something visual rather than prose, vibe-code it:
- Describe the behaviour in natural language
- Let Claude or Gemini generate the component
- Iterate live until it works
- Server-render it so LLMs can read the content without executing JavaScript
The old workflow for a custom component was Figma mockup, design review, dev sprint, QA — two weeks best case. This is closer to an hour for moderate complexity.
That is the only reason a persona chooser is feasible per page across a portfolio this size rather than a rare special-case build.
Step 14: Measure the change
Every update runs through SEOTesting, connected to both Search Console and GA4.
- GSC side: clicks, impressions, position, CTR
- GA4 side: whatever actually matters commercially — the purchase event, in this case
The same locked window and control-versus-test structure are used on both sides simultaneously, so a content update is judged by revenue and sales, not just rankings.
The Antalya result
Measured against the 56-day baseline locked before a single word changed:
| Metric | Control | Test | Change |
|---|
| Clicks/day | 39.55 | 49.00 | +23.88% |
| Impressions/day | 2,652 | 2,744 | +3.44% |
| Avg. position | 14.89 | 10.87 | improved |
| CTR | 1.49% | 1.79% | +0.30pp |
| Queries/day | 366 | 389 | +6.28% |
Every single metric moved the right way.
Most updates that move one number quietly cost you on another. This one didn't.
And it was not down to any single piece of the delta. It is what the diagnostic, the angle, the rewritten sections, and the new component produced together.
That is the whole point of locking a baseline before touching anything: it is the only way to know an update did something, rather than getting lucky with a publish date.
Turning it into a system with Claude Code
That whole process, done properly by hand, is about two focused days per page.
hoppa runs thousands of pages across nine languages. Two days a page is fine math until you multiply it across a portfolio that size. Even at one update per page per year, the arithmetic does not survive contact with reality.
The real cost is the opportunity cost: every month a page sits at position 14.89 instead of 10.87 is a month of impressions that never got the chance to convert.
So the 14 steps were mapped into Claude skills, with Claude Code running the process instead of a person running it with AI help on the side.
The judgment didn't move to the machine. The enforcement of that judgment did.
The foundation: a dedicated Claude project
Every skill that touches content runs inside a project preloaded with the brand book, terms and conditions, pricing policy, and a library of brand-specific reference material — so brand constraints are always in context instead of being re-explained each run.
Step-to-skill mapping
| Step | Skill | Function |
|---|
| 1 | hoppa-intelligence | Pulls the 56-day GSC window and locks the baseline automatically |
| 2 | Audit Skill | Runs keep/fix/remove/add tagging against actual query performance |
| 3–4 | Competitor-Gap Skill | Defended queries, gap-close queries and new intents from Ahrefs, plus a SERP read |
| 5–7 | Editorial Intelligence | Persona revalidation, query fan-out gap detection, local-knowledge refresh |
| 8 | Delta-Brief Skill | Generates the brief with keep/fix/remove/add explicit |
| 9 | hoppa-editorial | Writes only "fix" and "add" sections, calibrated against gold-set tone benchmarks |
| 10 | hoppa-scientific-refiner | Fact-checks new and kept content |
| 11 | Image-Auditor | Runs the accuracy, on-brand and spec checks automatically |
| 12 | seo-preservation | Locks the slug, protects CTR-earning meta titles, extends schema |
| 13 | Component Generator | Turns the brief's spec into the working component |
The hard gates sit at steps 5–7. The update cannot proceed without:
- A validated persona set
- Current local knowledge
- A defined angle
Skip those and you get generic AI output, which is exactly why so much AI-assisted content reads the same regardless of who published it.
A failed fact-check on a "keep" section automatically bumps it to "fix." No human has to ask "is this still true?" first.
If the new content's voice drifts from the kept content's, step 9 refires until they match.
Measurement isn't a separate skill so much as the discipline that wraps around all of it. Tests are still set up manually.
Closing the loop: deployment
Getting the content right was only half the job. The other half was getting it live — which until recently meant a person copying finished sections into the CMS, checking formatting, and hitting publish.
Now Claude connects directly to the CMS (Strapi) through an MCP server, and deployment runs as its own step:
- Staging deploy
- A full section-by-section diff against the live page
- Internal and anchor link verification
- Schema validation
If any check fails, the deploy halts and flags it rather than silently shipping something broken. When everything passes, it produces a single ready-to-publish report for a human to approve.
Content production and CMS deployment are now a single continuous pipeline rather than two jobs with a person bridging them.
What running this at scale taught them
Once the pipeline worked for one page, the question became how many it could run at once without compromising quality.
Two content updates were tested in parallel. Technically it works — nothing errors out, nothing breaks. But quality drops on both.
The two runs share the same underlying agents, and pushing two batches through simultaneously visibly softens the output on each:
- Diagnostics get shallower
- Delta briefs get looser
- Writing needs more editing on review
So they do not run it that way. One update runs at a time, start to finish, working through a batch sequentially.
It is slower on paper. It is also the difference between output you trust on the first read and output that needs a second pass to catch what got rushed. At this stage of the tooling, that trade is not close.
What the difference looks like on the page
Not yet updated:
- Generic copy
- No local content
- No FAQ
- None of the newer components
Fully updated:
- Rich local detail
- A banner tied to a real current event
- Review proof
- Structured sections routing different visitors to what applies to them
Practical takeaways
Remove full rewrites from the default menu. Refreshing a ranking page is editing, not re-authoring. Skipping the tagging step erases that distinction.
Lock the baseline first. Without stored pre-update data you cannot prove the effect — and that proof funds the next round.
Fact-check the "keep" sections too. This is where most AI refreshes cut corners, and why stale numbers survive.
Design hard gates into the automation. Blocking progress without personas, local knowledge and an angle is the mechanism that stops AI content from all reading the same.
Resist parallel execution. Doubling throughput at the cost of quality on both runs is rarely the better trade.
Do not mistake a lift for causation — see Seven Reasons SEO Tests Fail.
Manage the decay backlog like technical debt — the framework in Technical Debt in SEO transfers directly.
Promote recurring corrections into rules. On updating system instructions when the same edit repeats, see Feedback Loops for AI Content Workflows.
Shipping new pages is visible work. Repairing old ones is not. The revenue is usually in the second one.