The setup
Six months of silence, then a checkup this morning, then this. The site has 43 posts written in March against a keyword map and no live evidence. Today I picked six of them and put them through the process I use at work: capture Google's AI Overview for the target query 30 times across three locations and two devices, sort what appears in every capture from what flickers, fetch every page it cites, trace which passages it lifts, and write a build spec. Then rewrite the post to that spec, stage it at a hidden URL, and score it against the top organic results with PageOptimizer Pro, median of three runs each. A draft ships only if it matches or beats the best competitor.
What I found before touching anything
The true cost post was already cited in 28 of 30 AI Overview captures for "how much does youth soccer cost." It did not rank in the organic top ten. Google's model had decided the page was a source. Google's index had not decided it was a result. Those are different systems.
The why-kids-quit post ranked seventh organically and was cited in 6 of 30 captures. The ECNL cost post and the pathways guide were not cited and did not rank.
The AI Overview for each query has a shape, and the shape is stable even when the words are not. All 30 captures for the cost query had distinct text. All 30 opened with the range, the $1,188 average, and "depends on level of play." Twenty-nine had a three-row table. The sources it cites are the ones that already look like that.
What changed on four posts
Each post kept its argument and got a new front. An answer-first opening that carries the figures the AI Overview always states. A table where the captures use one, and none where they do not. Question-form headings where a parent would type the question. A FAQ block with schema. An updated date. A title tag separate from the headline.
Every number I added was checked against the fetched text of a cited page. The teardown briefs named several figures that no source actually contained, including an ECNL Regional League fee and a percentage split of registration versus total cost. Those were dropped. The most useful information-gain items were things the posts already had and had buried: the cost-per-coached-hour table, the levels-versus-age-groups distinction, the reasons kids quit sorted by age.
The scores
| Post | Live before | Best competitor | Draft |
|---|---|---|---|
| How much does youth soccer cost | 29.05 | 28.74 | 49.78 |
| ECNL vs MLS NEXT cost | 48.98 | 51.38 | 61.70 |
| Youth soccer levels explained | 40.97 | 63.60 | 64.12 |
| Why do kids quit soccer | 24.97 | 28.73 | 64.91 |
The pathways guide is the one to watch. Its margin is half a point. A revision that added sixteen subheadings scored four points lower, so the simpler version shipped. Scores are a content-shape gate, not a ranking promise. The domain still has no links.
What did not ship
Two queries failed the page-type gate. "Youth soccer scholarships" returns program pages, not guides; the AI Overview cites one guide, but the organic result set wants the programs themselves. The right move there is a state-by-state directory as a new asset, not a rewrite. "Community owned soccer club" turns out to mean fan-owned professional clubs, and the two youth-flavored variants I tried instead return club homepages and cooperative-learning drills. Nobody searches for a youth club ownership model by that word. The cooperative post stays a manifesto.
What the site gained
A draft slug: any post in a drafts folder renders at a hidden noindex URL so it can be scored before it replaces the live one. Frontmatter for an updated date, a title-tag override, and a FAQ list that becomes FAQPage schema. All of it was needed today and none of it existed this morning.