Contrast analysis is one of the most useful and most tedious jobs in SEO. Open the top results, write down what competitors cover, compare it with your own page, and repeat for every query. I handed that work to a router agent in Orakul and ran it on a real store — anastasiya.studio, which sells printable music worksheets for kids. Below is the data: what the agent found, where its export needed a second look, what I changed on the site right away, and how I'll check the result.
What contrast analysis is
It answers one question: what is my page missing compared with the pages already in the top results for this query? Not "write 2,000 words" and not a generic checklist, but specific subtopics that most competitors cover and you don't. If a subtopic shows up on 4 pages out of 6, that's a signal. If it shows up on one, it's probably just that site's quirk.
Step 1. Where to look: clicks, but positions 10–20
The first request to the agent is a 30-day Google Search Console export: pages that got clicks but sit on page two of the results. Clicks confirm there is demand, and page one isn't far away.
| Page | Query | Average position |
|---|---|---|
| /tag/music-tracing-worksheets/ | music note tracing worksheets | 10.0 |
| /tag/free-printable-music-theory-worksheets/ | music color by number | 10.5 |
| /tag/free-printable-music-coloring-pages/ | music coloring sheets for elementary free | 15.5 |
| /product/back-to-school-bass-clef-note-naming-worksheets/ | bass clef note naming worksheets pdf | 16.2 |
| game.anastasiya.studio/002_star.html | twinkle twinkle little star game | 18.4 |
A manual check: the number matches, but it rests on 2 impressions
An export shouldn't be taken on faith, so I checked one pair in the Search Console interface, filtering by both query and page.
The position matched: 10 in GSC, 10.0 from the agent. But behind it are 2 impressions and 1 click on a single day, September 4. That's not a ranking, it's a fluke. A "has clicks + position 10–20" filter with no impression floor lets pairs like this through, so the request to the agent should include a minimum number of impressions.
The other rows can't be checked the same way: the GSC interface won't build a page + query table across several URLs at once. For those, you have to trust the export the agent pulls from the connected Search Console.
Step 2. How the agent compares a page with the top results
The second request goes page by page: "analyze the page for query X and determine what it needs to reach the top." The agent takes Google's first page of results, opens the competitors, extracts subtopics, counts how many pages cover each one, and checks whether ours does. Each subtopic becomes one line. For example, for "music color by number":
Add explicit age groups and grade levels (Preschool, Pre-K, Kindergarten, Grade 1) to the page copy and product data. Found on 4 out of 6 competitors. On our page: weak — ages are mentioned only in navigation and product titles.
Besides the list of edits, the report has a "what's already good" section and demand context. All of it is in the public document covering all five pages.
Two caveats the agent states in the report itself. First, the samples are incomplete: it managed to open 4 pages out of 8, 6 of 9, 6 of 9, and 3 of 9. Pinterest, Scribd, and direct PDF files don't return HTML, so there's nothing to compare. Second, it found no demand data for the exact long-tail queries. Wordstat shows zero for an English-speaking audience, and Bing only reports the broader topic: "music coloring pages," for example, had 141 impressions over 4 weeks.
What the five queries showed
1. "music note tracing worksheets," position 10.0 — a ceiling of 1–2 positions
The top results belong to big players. Content work might move the page up 1–2 positions, no more. The agent still found gaps: grade levels and ages (3 of 4 competitors), sequential note reading from Middle C (3 of 4), and instrument-specific sections (2 of 4).
2–3. "music color by number" (10.5) and "music coloring sheets for elementary free" (15.5) — worth working on
Here the report gives a clear list. For color by number:
- worksheet and page count on the product card — 4 of 6;
- an explanation of the mechanics and color key ("1 = red, 2 = purple") — 4 of 6;
- ages and grade levels — 4 of 6;
- file format (PDF) and how to download it — 4 of 6;
- skill benefits in visible copy: number recognition, fine motor skills — 3 of 6.
For the coloring pages, the main gaps are character-driven themes (5 of 6) and the total number of sheets available (3 of 6).
4. "bass clef note naming worksheets pdf," position 16.2 — the agent refused to suggest edits
This is the most useful result of the whole run. The results are direct PDF files from school sites and free directories where the file downloads in one click. Our page is a $2.50 product with a cart. The searcher wants a free file, and added subtopics won't change that. On top of that, only 3 of the 9 results returned HTML, which is too few for a reliable comparison.
The agent offered two paths: retarget the product page to commercial queries (for example, "printable bass clef music theory worksheets for kids"), or build a separate free page with 1–2 PDFs that links to the full paid 10-worksheet pack.
5. "twinkle twinkle little star game," position 18.4 — nothing to compare
This is a game page with no text content. Contrast analysis doesn't apply.
What I changed right away
- "A4 PDF" and "Instant Download" badges on every product. 4 of 6 competitors state the file format and instant download explicitly. Our product cards didn't.
- A "grade level" field in the admin. Anastasiya is filling it in for the top products. 3 of 4 and 4 of 6 competitors state ages and grades.
- Free products now hand over the file immediately.
- A reminder in one month to check the average position for these pages.
I deliberately left the snippets alone. Snippets move CTR, content moves position. Change both at once, and a month from now there's no telling which one worked.
What's in the report but not done yet
- Sheet count per pack on the product cards (4 of 6 competitors).
- A block explaining how color by number works, with the color key (4 of 6).
- Skill benefits in the visible page copy. Right now they're only in the meta description (3 of 6).
Seasonality: why the analysis runs every two weeks
The store is highly seasonal: back-to-school, Halloween, Christmas, Easter. In two weeks people will be searching for Halloween coloring pages, and a fresh export will surface different pages. So there are two cycles. A new export and analysis every two weeks, for pages that have just reached positions 10–20. A check after one month, for what has already been fixed.
That leads to a practical takeaway. Changes take weeks to show up in the results, so seasonal pages are better analyzed before the season, using last year's data, rather than waiting for them to surface on page two.
How I'll check the result
In a month, mid-October, I'll compare average positions. I'll look at each page as a whole, not at page + query pairs: with two impressions, any change is meaningless. And not at clicks: by October back-to-school demand will have faded, and clicks will drop no matter what I changed. I'll publish the result as an update to this article, even if it's zero.
What to take away
- Pick pages with clicks at positions 10–20, but set an impression floor.
- Check at least one row of the export by hand in GSC.
- Count frequency: a subtopic most of the top covers is a must; one covered by 1–2 sites is optional.
- Check intent first. A paid product page doesn't belong in a SERP full of free PDFs, and no amount of copy fixes that.
- Change one lever at a time, or you won't know what worked.
- With seasonal demand, repeat the analysis on a schedule, not once.
The agent behind this analysis runs in Orakul. The full report on all five pages is in the public document.
Update, September 29, 2026: what happened to the rankings
A month has passed and the check is done — twice, because the first time I measured the wrong thing. Below are both attempts: first the one that's useless, then the honest one. Unfortunately, the verdict on the edits didn't improve along the way.
As a reminder, here's what was done right after the analysis: "A4 PDF" and "Instant Download" badges on all products, a grade level field in the admin, and instant file delivery for free products. I deliberately left the snippets alone.
Attempt one: page + query pairs
| Query | Before Aug 13 – Sep 12 |
After Aug 31 – Sep 27 |
Change |
|---|---|---|---|
| music note tracing worksheets | 10.0 (2 impressions) | 8.1 (10 impressions) | +1.9 |
| music color by number | 10.5 | 11.1 (7 impressions) | −0.6 |
| music coloring sheets for elementary free | 15.5 | 6.2 (39 impressions) | +9.3 |
| bass clef note naming worksheets pdf | 16.2 | 13.8 (8 impressions) | +2.4 |
| twinkle twinkle little star game | 18.4 | not measured | no edits were made |
It looks decent, which is exactly what makes this kind of measurement dangerous. It has two holes. The periods overlap: 13 shared days out of 28, so part of the "growth" is the same days appearing in both samples. And I measured something other than what I promised: the article says to look at a page as a whole, not at page + query pairs. Query three showed why pairs fall apart.
Google swapped the page
That jump from 15.5 to 6.2 happened where we made no edits at all. The page the agent analyzed, /tag/free-printable-music-coloring-pages/, no longer shows up for that query. Google ranks /tag/free-printable-music-theory-worksheets/ instead (2 clicks, 34 impressions), along with an old blog post, /blog/enhancing-elementary-music-lessons-with-music-colo/ (10 impressions).
The takeaway that justifies the whole exercise: the page that ranks isn't the one you picked to work on — it's the one Google picked. And Google changes its pick without telling you.
Attempt two: whole pages, against a baseline
The second measurement works differently. I take each page's average position across all its queries: before is June 15 – September 14, after is the week of September 21–27. No overlap. And crucially, I add a baseline: the same change for every other page on the site. The baseline is the median across 90 pages with at least 10 impressions that week and 40 over the three months.
The baseline came out at −1.85 positions. The site as a whole climbed almost two positions on its own. So our pages had to climb at least that much just to keep up.
| Page | Jun 15 – Sep 14 | Sep 21–27 | Δ | vs. baseline |
|---|---|---|---|---|
| /tag/music-tracing-worksheets/ | 8.17 | 9.21 | +1.04 | +2.89 worse |
| /tag/free-printable-music-theory-worksheets/ | 16.33 | 8.45 | −7.88 | −6.03 better |
| /tag/free-printable-music-coloring-pages/ | 24.44 | 20.94 | −3.50 | −1.65 better |
| /product/back-to-school-bass-clef-note-naming-worksheets/ | 21.50 | 17.83 | −3.67 | −1.82 better |
Three pages out of four beat the baseline and one fell behind. But before celebrating, look at where the biggest success happened. The page that beat the baseline hardest, by 6.03, is the music theory worksheets tag — the very page Google swapped into the results in place of the one we analyzed, and one that got no targeted edits. As for the bass clef product page, it had 6 impressions that week; at that volume its −1.82 means nothing.
There's a more direct test available. The "A4 PDF" and "Instant Download" badges went onto every product page, while tag and blog pages got nothing. That's a ready-made split between pages that were edited and pages that weren't:
- product pages: median −1.75;
- tag, blog, and everything else: median −3.50.
The edited pages climbed less than the untouched ones. That doesn't prove badges hurt — the untouched group is only 11 pages. But it firmly settles whether a positive effect from the edits is visible in the data. It isn't.
Caveats
- The windows differ in length. "Before" is a three-month average, "after" is a single week. Those three months include the slow summer, so part of the overall climb is the season rather than the work. That's exactly what the baseline is for: the season hits the whole site equally.
- Impressions fell on all four pages: 2,159 → 166, 1,020 → 70, 3,321 → 108, 203 → 6 on a weekly basis. Back-to-school demand is over, which is one more reason to look at position rather than clicks.
- Week over week shows almost nothing. I checked that too: September 21–27 against September 14–20. The median across 82 pages is +0.12, meaning a flat baseline. Meanwhile the Compare card in Search Console reports the site's average position improving from 4.8 to 4.3 — that figure is impression-weighted and gets moved by a handful of large pages, not by the site as a whole. A useful reminder that the number on the card and the median across pages are different things.
What was actually tested, and what wasn't
Before extending this verdict to the approach itself, it's worth stating what went into the measurement and what didn't.
- Only a small part of the report was implemented. The agent asked for the sheet count per pack on product cards (4 of 6 competitors have it), a block explaining the color-by-number mechanics and color key (4 of 6), and skill benefits in the page's visible copy (3 of 6). What got done was badges, a grade level field, and instant file delivery. So what was tested is the three cheapest edits, not the report's recommendations.
- The window is short. The edits went live on September 15, the measurement covers September 21–27. That's one to two weeks — not much for recrawling and recalculation, especially on pages with dozens of impressions per week.
- The season worked against us. Back-to-school demand ended and impressions on the analyzed pages fell several times over. The baseline removes part of that interference, but any effect is harder to see on falling demand.
- There was no control group. Every product got the badges at once, so the comparison had to be product pages against tag pages — different page types with different behavior.
So the correct way to state the result is this: three cosmetic edits, over a week and a half, on falling demand, produced no effect visible in the data. This measurement can't support the claim that contrast analysis doesn't work — its main recommendations were never implemented.
The agent did pay for itself once in this run, though not in rankings. It refused to suggest edits for bass clef and took off the table a page that has no business ranking in a SERP of free PDFs. Work not wasted is a result too; it just doesn't show up in Search Console.
What's next
Waiting another two weeks wouldn't help: the data would get noisier, not cleaner. The next round will be set up as a proper experiment.
- I implement the report's substantive recommendations — sheet counts, the mechanics block, benefits in visible copy — on 10 pages.
- Another 10 similar pages stay untouched as a control.
- I measure in 4–6 weeks: whole pages, non-overlapping windows, baseline from the rest of the site.
- I add an impression floor to the agent's export so queries with two impressions don't make it in.
- For bass clef I pick one of two paths: commercial queries or a separate free page.
I'll publish the result here either way.
Maxim Safianov
0 comments
No comments yet — be the first to share your thoughts.
Sign in to post your comment instantly:
…or comment as a guest — guest comments appear after moderation.