ohayo.

WORKED EXAMPLE · V1.0.0

Record the difference.
Leave room for doubt.

These synthetic exports are not Ohayo traffic or customer data. Both use sc-domain:example.com, all countries and devices, web search, query dimension and the same declared export coverage.

Two processed seven-day windows

Before: 2026-09-01 through 2026-09-07. After: 2026-09-08 through 2026-09-14. Data is declared processed through 2026-09-20; that declaration does not prove the export contains every query.

Normalize the original exports

python3 scripts/normalize_gsc.py examples/before.csv --scope examples/before-scope.json --key-column "Top queries" --output before.json
python3 scripts/normalize_gsc.py examples/after.csv --scope examples/after-scope.json --key-column "Top queries" --output after.json

Keep the raw CSVs. Review the metadata yourself before running: filters and export coverage cannot be inferred from row values.

Compare and keep the evidence

python3 scripts/compare_windows.py before.json after.json --json review.json --output review.md

Exit 0 means a valid descriptive comparison: 2 comparable rows and 2 unknown rows. It does not mean an SEO improvement or a statistically significant change. SHA-256 values identify the normalized JSON inputs; retain the original CSVs separately.

Reject a different device

python3 scripts/compare_windows.py before.json examples/incomparable-after.json --json rejected.json --output rejected.md

The supplied mobile-device example returns exit 2 and produces no accepted reports. Mixed reporting scopes cannot be treated as a controlled comparison.

One change, with competing explanations

The included experiment ledger records an owner, one page change, its date, the hypothesis and evidence. Seasonality, competitors, ranking changes and export omissions remain possible explanations. The package does not measure AI citations or GEO performance.

Get Search Experiment Ledger · $2.90 ↗