Tool · tool guide

Year Over Year GSC Comparison: Match Like-for-Like Periods

Build a year over year GSC comparison with equivalent dates, identical filters, complete row keys, and reconciled totals so changes remain reproducible.

Published Updated 10 min readBy William Zhu & InfiniSynapse Data Team

Author credentials: William Zhu is cofounder of InfiniSynapse (GitHub @allwefantasy · auto-coder). Desk: shipping SEO Health and the /en/tool/ visibility pages. No personal LinkedIn published. About: team / editorial standards.

Publisher credentials: InfiniSynapse has public profiles on GitHub, YouTube, and X. A 2026 WAIC Future Tech OPC excellence award covers the Agentic Data Infra entry (WAIC; third-party recap: Xinhua / Caohejing). That award does not review this page or SEO Health. Method CLI: infinitegrowth on npm. Archive: recognition and scope notes.

Year Over Year GSC Comparison: Match Like-for-Like Periods
On this page

By William Zhu · Cofounder, InfiniSynapse · Published: 2026-09-08 · Last updated: 2026-09-14 · Last verified: 2026-09-14 · Reviewed by the InfiniSynapse Data Team.

Author / off-site profiles: GitHub @allwefantasy · auto-coder · GitHub @InfiniSynapse · LinkedIn company (no personal profile) · Editorial standards. No personal LinkedIn or vendor badge.

Reviewed by: InfiniSynapse Data Team · method review 2026-09-14. Hands-on pairing of like-named official windows. No Search Console file was imported.

Trust / COI: About · Corrections. We sell SEO analysis workflows, so product references are a conflict of interest. The pairs below are official like-named events. They are not a click study and not a customer export.

Build a year over year GSC comparison with equivalent dates, identical filters, complete row keys, and reconciled totals so changes remain reproducible.

TL;DR

A year over year GSC comparison is a full-outer join of two Search Console periods that share the same keys. The keys are date logic, query, page, country, device, and search type. The join does not invent click totals, and it does not start from a rumor calendar.

Direct answer: Build a year over year GSC comparison only after both exports can be reopened with identical filters. This page has no property file. The observed sample is official like-named windows you would later align against, not a table of clicks or impressions.

On 2026-09-14 we evaluated incidents.json with curl and json.loads. HTTP 200, 12,961 bytes, ten objects. The August 2025 spam window lasted 639.0 hours. The August 2026 spam window lasted 64.4 hours. Those are like-named official intervals, one year apart. They are join keys you might draw on a chart. They are not a year over year GSC comparison of any site.

The December 2025 core window lasted 433.6 hours. The March 2026 and May 2026 core windows lasted 292.0 and 285.0 hours. Those three names share a class. They do not share a calendar month. An honest year over year GSC comparison would refuse to treat “core versus core” as automatically like-for-like.

What you will learn

  • Which official windows we actually paired
  • Why like-named is not the same as like-dated
  • How filter parity and row keys keep the join honest
  • Why missing keys become explicit zeros, not deleted rows
  • Where this year over year GSC comparison stops without an export

What a year over year GSC comparison actually joins

Key definition: A year over year GSC comparison is a reproducible full-outer join of two Search Console periods that use the same dimensions and filters. It is not a screenshot of two blended lines.

The Search Analytics API is the machine contract for those dimensions. A year over year GSC comparison copies the contract: if a dimension was not exported, it is not in the key.

The Search Console API overview sits beside that reference. It does not add hidden metrics to the join.

InfiniSynapse can run a durable join inside an InfiniSynapse Server API task workspace after you upload two exports. That API foundation keeps the serialized filters. It does not invent missing click totals and it does not guarantee a story.

Official windows are alignment candidates

The Search Console introduction reminds you that the product reports performance you already own. The ten-row feed we parsed is not that product. A year over year GSC comparison may draw official windows on the same axis later. It may not borrow their hour counts as if they were impressions.

The W3C Data on the Web Best Practices is an independent model for provenance and versioning. Applying those practices to a year over year GSC comparison improves replay. It does not remove Search Console sampling or anonymization.

What the join refuses to invent

We have no property export. Therefore this page publishes no click series, no impression series, and no position averages. The sample size is ten official objects. Anyone who needs a real year over year GSC comparison must supply the two files. This desk note cannot establish a site-level change.

Like-named official windows observed on 2026-09-14

This is a first-party pairing of like-named events, not a customer case. The rows below are the official windows we would later align a property export against. Hours equal end minus begin in UTC. Hours are not clicks.

PairWindow AHours AWindow BHours B
August spam, one year apart2025-08-26 16:00 → 2025-09-22 07:00639.02026-08-18 16:27 → 2026-08-21 08:4964.4
December core vs March core2025-12-11 17:25 → 2025-12-29 19:00433.62026-03-27 09:00 → 2026-04-08 13:00292.0
December core vs May core2025-12-11 17:25 → 2025-12-29 19:00433.62026-05-21 15:40 → 2026-06-02 12:40285.0

Like-named is a weak key. August-to-August spam shares a month label. December-to-March core does not. A year over year GSC comparison that treats every core as interchangeable has collapsed the key.

Grouped bars for like-named official windows fetched 2026-09-14: duration in hours beside status-update count

Figure: Like-named official windows from the 2026-09-14 feed, plotted as length in hours beside status-update count. No click or impression values were available.

August spam windows a year apart

curl -sS -D - -o incidents-2026-09-14.json \
  https://status.search.google.com/incidents.json

Reproduce the pair with curl and json.loads. The 2025 August spam object runs 639.0 hours and the 2026 August spam object runs 64.4 hours. Same class label. Different length. A year over year GSC comparison overlay that paints both as “August spam month” will manufacture overlap the feed never claimed.

Performance report help is the later UI for the property file you do not see here. Use it only after the two date ranges are declared.

Core windows across two winters

December 2025, March 2026, and May 2026 are three named cores. Pairing December with March is a class match, not a calendar match. A year over year GSC comparison should write that caveat on the pair. Pairing December with the following December would be the calendar-shaped alternative, and this snapshot does not contain a December 2026 core.

Hours are not clicks

639.0 versus 64.4 is a duration delta. It does not prove traffic moved, and it cannot establish that any URL gained or lost impressions. Publish the hour pair as an alignment candidate. Leave the metric columns empty until an export exists.

How like-for-like keys are locked

These steps apply to a property file. We cannot execute them on this desk snapshot. They stay written so a later join does not skip the contract.

Declare period equivalence

Write both ranges, weekday mix, and event notes. Leap days and campaigns belong in that note. A year over year GSC comparison that ignores a leap day will later invent a one-day gap and call it a ranking change.

Google Trends comparison is a separate official tool for interest, not a substitute export. Direction on Trends is not a reconciled total.

Lock filter parity

Serialize search type, country, device, query, and appearance filters beside each file. One year on Web and one year on Discover is not a pair. A reviewer can audit filter parity in a year over year GSC comparison only when that fingerprint survives handoff.

The bulk data export is the official large-file path when the UI comparison is too coarse. Bulk rows still need the same keys.

Construct row keys

Use date, query, page, country, device, and appearance. Normalize strings without collapsing distinct URLs. RFC 4180 is the CSV grammar many exports actually ship. Checking the file against that grammar prevents a delimiter bug from looking like a vanished query.

Google’s Search Console content analysis guide is a reminder that appearance and content type change the row. A year over year GSC comparison that merges appearance values too early has already broken the key.

How years are joined without inventing metrics

Full outer join

Keep every key from both periods. Rows that exist in only one year get an explicit zero after the join, not a deletion. An inner join that drops disappeared queries is no longer a year over year GSC comparison. It is a survival table.

We still publish no invented zeros for a property we do not have. The rule is stated so a later operator cannot fill empty metric cells with rumor.

Reconcile aggregates

Compare chart totals with joined-row sums. Anonymized queries create a known gap. Write the gap down. A year over year GSC comparison that presents the joined table as complete has left the method.

Attach the official update window after the join exists. Attach is not replace.

Mistakes that break year comparability

Same dates, different weekdays

The warning sign is calendar matching that ignores weekday mix. The correction is equivalent weekday counts or an explicit note. Keep that note on the year over year GSC comparison row.

Silent zero deletion

The warning sign is a missing-year row disappearing. The correction is a full outer join and visible zeros. Resolving silent deletion requires a documented rerun, not a smoother percentage.

Rate-only reporting

The warning sign is a percentage without baseline volume. The correction is both year totals and the absolute delta. A second reviewer should reopen the raw files before a year over year GSC comparison closes on a rate-only slide.

The Ranking Drop After Update sibling is the place to compare matching segments inside one admitted window, which is a different job from a year join.

What a public window pair cannot show

Query anonymization

Some queries are withheld. Row sums and chart totals will differ. This limit constrains every year over year GSC comparison even when the official hour pairs are exact.

Property change

Migrations, URL rewrites, and tracking changes break history. The ten-row sample also cannot establish which URL moved. That snapshot is not a customer result. Like-named windows do not prove like-for-like traffic.

Without two preserved exports, stop at “official pair observed” and leave the metric columns blank.

Where this join hands off

This page keeps the like-for-like key job. Adjacent jobs live elsewhere.

Draw the official update window on the same axis only after the join exists.

The Ranking Drop After Update page compares segments inside one admitted window.

The Seasonal Traffic vs Penalty test is the demand check you run before a year join is asked to explain a holiday-shaped dip.

Open a workspace only after both year files share keys

Lock filters and row keys first. Then inspect only the Search Console rows those keys can reopen.

Open InfiniSynapse

Use only authorized, sanitized data. Do not paste secrets.

Frequently Asked Questions

Should query and page be joined separately?

Use the most granular exported dimensions you have. Separate joins answer different questions and are not additive. A year over year GSC comparison that adds a query join to a page join will double-count change.

How is change calculated from zero?

Report the absolute gain or loss. Label percentage change undefined instead of writing infinity. That rule is operational. It assumes no private ranking knowledge.

Can average position be summed?

No. Treat position as impression-weighted and keep Google’s aggregation caveats. Summing averages across keys is not a valid year over year GSC comparison step.

What makes the comparison reproducible?

Saved raw exports, declared filters, key construction, join type, zero rules, formulas, and reconciliation totals. Official window hours can sit in a side column. They cannot replace those artifacts.

Conclusion

Use a year over year GSC comparison when the job is to join two like-for-like Search Console periods and to keep empty metric cells empty until the files exist. The 2026-09-14 snapshot gives an August spam pair of 639.0 versus 64.4 hours and a core sequence that does not share a month. Those are alignment candidates. They are not clicks. Close the join when the keys, the filters, and the unresolved alternatives are still visible.

A later property export must reuse the same date, query, page, country, device, and search-type fields. If any of those keys drift, the year-over-year label is no longer earned. Official incident hours can sit in a side column after that contract is frozen. They still cannot fill a missing click cell, and they still cannot explain why one URL moved. Record the retrieval date of both exports beside the official window note so a reviewer can replay the join without guessing which file was current.

WZ

William Zhu · Cofounder, InfiniSynapse · GitHub @allwefantasy

Desk-validated SEO Health methods. Corrections: zhuhl@infinisynapse.com · corrections policy.

Year Over Year GSC Comparison: Match Like-for-Like Periods