# SEO Change Impact Checker: GSC Before/After Test (`cygnix_labs/seo-change-impact-checker`) Actor

Did your SEO change work or is it noise? Upload a Google Search Console CSV + change date: matched DOW-adjusted windows, control-group diff-in-diff, placebo noise band, GSC lag guard, verdict REAL WIN / LOSS / NOISE / TOO EARLY. $0.01 per change.

- **URL**: https://apify.com/cygnix_labs/seo-change-impact-checker.md
- **Developed by:** [Umair Saleem Mohammad Saleem](https://apify.com/cygnix_labs) (community)
- **Categories:** SEO tools, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 change analyseds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SEO Change Impact Checker: GSC Before/After Test

**Did your SEO change work, or is it noise? Give it a Google Search Console CSV and the change date. It returns REAL WIN, REAL LOSS, NOISE or TOO EARLY, with the numbers behind it.**

A plain before/after in Search Console fools people all the time. A core update, a holiday, a weekend-heavy window or the last 2-3 days of incomplete GSC data can fake a win or hide one. This Actor runs the test an analyst would:

- **Matched windows** of whole weeks before and after the change, a recrawl buffer (default 3 days) and **day-of-week adjustment**
- **Control group diff-in-diff**: changed pages vs. all other (or chosen) pages, so sitewide swings and seasonality cancel out
- **Noise band from your own history**: the same test re-run on 100+ placebo change dates where nothing happened (weekly-block bootstrap if history is short)
- **GSC data-lag guard**: drops the last 3 days and tells you the exact date to re-run when it's TOO EARLY
- **Drivers**: impressions, average position and CTR before vs after
- Warnings for overlapping changes, sitewide shifts, low volume and partial windows

Use it for title/meta rewrites, content refreshes, internal-linking pushes, schema roll-outs, page-speed work, migrations or "is this traffic drop real?".

### Input

- `csvUrl` (public CSV or Google Sheets link), `csvText` (pasted), or `gscRows` (Search Analytics API rows with dimensions `[date, page]`)
  - **Date + page CSV** (Date, Page, Clicks, Impressions\[, Position]) enables the control group. Get it from the GSC API, Looker Studio or BigQuery bulk export.
  - The **Performance > Dates** export works for a sitewide or UI-filtered before/after (placebo band only).
  - The Pages tab has no dates, so it can't be used.
- `changeDates`: one or more `YYYY-MM-DD`
- `treatmentPatterns`: regex for changed pages, e.g. `/guides/` (empty = sitewide)
- optional `controlPatterns`, `noControl`, `windowDays` (28), `bufferDays` (3), `minEffect` (0.05), `asOf`

```json
{ "csvUrl": "https://example.com/gsc-date-page.csv", "changeDates": ["2026-08-17"], "treatmentPatterns": ["/guides/"] }
```

**Run with no data = free SYNTHETIC demo** on a fake site (example-synthetic.test) with a planted +20% win, so you can see the output first. Demo runs are never billed.

### Output (one dataset item per change date)

`verdict`, `netEffect`, `treatmentLift`, `controlLift`, `noiseBandLow/High`, `noiseMethod`, `impressionsEffect`, clicks/day, CTR and position before/after, windows, `summary` (plain English), `warnings`. A Markdown report is saved as `REPORT` in the key-value store.

Example (real run on the SYNTHETIC demo data): `REAL WIN`, net effect **+20.0%**, noise band -6.8% to +8.5% (placebo test on 80 fake change dates), avg position 9.0 -> 7.45. In the same data, a page group with **no** real change shows -9% in a naive before/after, but with the control group it's **NOISE**, because the whole site fell 12% that week.

### Pricing

Pay per event: **$0.01 per change date analysed**. TOO EARLY results, failed inputs and the synthetic demo are free. Apify platform usage is included.

### FAQ

- **Is this CausalImpact?** No. It's diff-in-diff with a placebo/bootstrap noise band: simpler, transparent and explained in the report.
- **Do you store my data?** Only in your own run's dataset and key-value store. No Google login is needed; you provide the export.
- **Why NOISE?** The effect is inside the normal swing of your own data or below `minEffect`. Wait 2-4 weeks or test on more pages.
- **Small sites?** Under ~100 clicks in the pre window the band gets wide and results are mostly NOISE. That's the honest answer.

### Limitations

Evidence, not proof: other edits on the same pages or updates that hit page types differently can still explain a result. Needs daily data. Clicks are the primary metric.

Also by Cygnix Labs: Redirect Checker, Internal Link Audit, Content Decay Audit, Keyword Cannibalization Finder. Agent skill version: agensi.io (SEO Change Impact Checker).

# Actor input Schema

## `csvUrl` (type: `string`):

Public link to a Search Console CSV: a date+page export (Date, Page, Clicks, Impressions\[, Position]) for a control-group test, or the Performance > Dates export. Google Sheets share links work. Leave all data fields empty to run a free SYNTHETIC demo.

## `csvText` (type: `string`):

Paste the CSV text instead of a URL.

## `gscRows` (type: `array`):

rows\[] from the Search Console API with dimensions \[date, page] (keys, clicks, impressions, position).

## `changeDates` (type: `array`):

When the change went live, YYYY-MM-DD. Each date is analysed separately.

## `treatmentPatterns` (type: `array`):

Regex or URL fragments for the pages you changed, e.g. /guides/. Leave empty for a sitewide test.

## `controlPatterns` (type: `array`):

Untouched pages to compare against. Default: all other pages.

## `noControl` (type: `boolean`):

Skip diff-in-diff and use only the placebo noise band.

## `windowDays` (type: `integer`):

Days in each before/after window, rounded down to whole weeks.

## `bufferDays` (type: `integer`):

Days skipped after the change for recrawl/reindex.

## `minEffect` (type: `number`):

0.05 = 5%. Smaller significant effects are reported as NOISE.

## `asOf` (type: `string`):

Treat this date as today (YYYY-MM-DD). The last 3 days before it are dropped because GSC data is incomplete.

## Actor input object example

```json
{
  "changeDates": [
    "2026-08-17"
  ],
  "treatmentPatterns": [
    "/guides/"
  ],
  "noControl": false,
  "windowDays": 28,
  "bufferDays": 3,
  "minEffect": 0.05
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `report` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "changeDates": [
        "2026-08-17"
    ],
    "treatmentPatterns": [
        "/guides/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cygnix_labs/seo-change-impact-checker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "changeDates": ["2026-08-17"],
    "treatmentPatterns": ["/guides/"],
}

# Run the Actor and wait for it to finish
run = client.actor("cygnix_labs/seo-change-impact-checker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "changeDates": [
    "2026-08-17"
  ],
  "treatmentPatterns": [
    "/guides/"
  ]
}' |
apify call cygnix_labs/seo-change-impact-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cygnix_labs/seo-change-impact-checker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Tv98nqWeSKQQVguQV/builds/5rD3kB1OeLfKcJ4YI/openapi.json
