Free tool · no account · runs in your browser

SEO test calculator

Before you change a page, find out whether a test on it is worth running. This runs penlid’s own estimator, thousands of times, on pages shaped like yours, and tells you how often it would catch a real change of each size, how big a change has to be to be caught four times in five, and when the answer arrives.

It is built for SEO tests, which change one page and compare it with pages left alone. Generic A/B calculators assume visitors are split at random between two versions, which a page edit is not, so they cannot say what you need. Nothing you type or upload leaves your browser. This page’s security policy blocks fetch, XHR, WebSocket, EventSource and beacon calls and form posts.

1. What are you measuring?

From Search Console, Performance, filtered to the page. The calculator treats it as the page’s normal level: the real before window will vary around it. 0 means a new page.

3. The pages you will leave alone

Pages with traffic that you will not touch for the 28 days after the change. Penlid uses at most 8 and needs at least 3: fewer than 3 means no verdict.

4. How differently do your site’s pages move from one another?

Tau (τ) is how far apart untouched pages drift in a month, beyond ordinary counting noise. It is the noise a real change has to stand out from, and it does not shrink as a page gets bigger.

Or estimate it from your own Search Console data

The file needed has one row per page per day, with Date, Page, Clicks and Impressions columns, covering at least 84 days (112 or more is better). Pages with fewer than 30 clicks a month (or impressions, if you measure those) are not used, because tau read from small pages comes out too low. Search Console’s own Export button does not produce one: its Pages and Dates tables are separate. You can get one from the Search Analytics API, a Data Studio (formerly Looker Studio) table with Date and Page dimensions, or a spreadsheet add-on. You can drop the file here.

Only used to print the date the answer would arrive.

What it tells you

Whether the test can see what you hope to change

Which answer you would get

A page with no clicks before the change cannot be measured. One with fewer than 10 gets a direction and no size. One with 10 or more gets a size with an interval. The calculator says which, and what that means.

The chance of a clear verdict

For changes of +10% to +150% and for drops, how often penlid’s estimator would say “improved” or “declined”, and the size of change that gets that chance to four in five. A small change in a noisy site often gets “can’t tell”, and you learn that now instead of in six weeks.

When the answer arrives

Penlid measures 38 days after the change goes live: the 28-day after window, Google’s week of restating its newest days, and its reporting lag. Pick a date and it prints the day.

How the numbers are made

The calculator simulates a site the way penlid’s acceptance grid does, and judges every simulated test with the real estimator. Counts in each 28-day window are Poisson draws. Every page has an early window (days −56 to −29), a before window (days −28 to −1) and an after window; each page’s after window also drifts by a random factor whose log has a standard deviation of tau, which is the noise untouched pages carry. Your page’s after window additionally carries the change you are asking about. The count you type is taken as each page’s steady rate per window.

Each simulated test then goes through the code the product runs. eligibleControls picks the comparison pages from the early window alone, then estimateLift judges the before and after windows of the pages it chose. Both are imported from /assets/lib/stats.js, the one file the paid evaluator also uses, so the calculator and the product cannot disagree about a verdict. A run in which fewer than 3 pages are usable counts as a run with no verdict, because that is what you would be told.

Every figure comes from a stated number of simulated runs and a seed that is a hash of what you entered, so the same inputs give the same numbers every time and a colleague who enters them reads what you read. Sampling error is about ±1.4 points on each chance in the tables, near 50% at the standard 5,000 runs, and larger when the accuracy is set lower. The 80% changes carry more error than that, and the range simulation noise leaves each one in is printed beside it.

The “change for an 80% chance” is found by bisection on simulated power: the size is narrowed seven times, each step a fresh simulation, from the table you see. The figure printed is where a curve fitted to every point that search simulated crosses 80%, which is steadier than the last step alone, and the range beside it is that crossing’s 95% range: how far simulation noise alone could move it. The “Significance threshold” is the median, over simulated tests where nothing changed, of the estimator’s own mde_pct: the smallest estimated lift that would have been called significant. It is where a verdict starts to read “improved”, not the lift the test can see: a real lift of that size is caught only about half the time in the tests that have enough comparison pages (less often where many tests have too few), which is why the 80% change is bigger. It is a typical value, not a guarantee for your page.

What these numbers assume, and what they cannot tell you

  • Pages drift the way you said. Every figure assumes untouched pages drift apart by the tau you chose and that the site is otherwise flat. A site with a bigger tau than you picked will detect less than shown. If you estimate tau from your own file, its interval is printed so you can see how well the file pins it down.
  • Real pages also have seasonality and regression to the mean. The calculator does not simulate either. The acceptance grid did measure regression to the mean: when a page is chosen for a refresh because its last 28 days sit about one standard deviation below its own average and nothing is done to it, penlid’s estimator called it “improved” in 5.50% to 5.75% of simulated tests with no drift between pages, and 9.15% to 9.20% when each month’s level sat a random 15% (one standard deviation) off the page’s own average, so that the change from one month to the next had a spread of about 21%, which is a tau of about 0.21 on this page’s scale (this page’s tau is the spread of that change from the before month to the after month, and both months moved) (2,000 runs per scenario, run of 2026-10-01), so each figure is uncertain by about 1 point. The pre-trend warning fired on 10.9-22.7% of the pages picked this way, whether or not they were called “improved”. So a test on a page picked because it was declining reads “improved” more often than the false-alarm line on this page says.
  • Counts are Poisson. Real daily counts are somewhat more variable than that. The acceptance grid also checked daily counts with extra variance and found false alarms of at most 6.05%, inside its 8% limit, so the effect is small but it is not zero.
  • One page, one change. If you change a page twice within 56 days, or the change moves clicks between addresses (a redirect, a prune, a canonical change), penlid refuses to measure it. The comparison pages must also stay untouched for the whole period.
  • Your count stands in for a steady rate. The page’s last 28 days are used as its normal level. A page that is growing or decaying will not have that count in its before window, and the answer changes with it.
  • No promise about rankings. Penlid measures whether clicks or impressions moved more than the untouched pages predict. It cannot say that a change will improve a ranking, and nothing on this page does.

Estimating tau from your own file

The file needed is a page-by-day table: Date, Page, Clicks and Impressions columns, one row per page per day, covering at least 84 days. Search Console’s own Export button gives separate Pages and Dates tables, which cannot be joined into one, so this tool cannot use them; the Search Analytics API, a Data Studio table with Date and Page dimensions, or a spreadsheet add-on produce the right shape. The content decay check and the did-it-work tool on this site read the same file.

Windows count back from the newest day in the file, 28 days each. For each pair of consecutive windows it takes every page that had at least 30 in the window before them (the early window, which is not part of the page’s own before-and-after ratio), computes the page’s log ratio and its counting variance, and finds the tau at which the pages’ spread matches counting noise: the estimator’s own Paule-Mandel estimate. The headline is the middle of the pairs’ values, so one odd month does not set it. A pair with fewer than 12 usable pages, or with fewer than 26 of a window’s 28 days present, is skipped and named.

Penlid itself accepts a comparison page from 5 in that window, but tau is read from the spread between pages, and below about 30 a month counting noise swamps that spread and the estimate comes out too low. On simulated pages of 5.6 to 28 clicks a month, with a true tau of 0.15, a floor of 5 read a tau² of 0.0097 against the true 0.0225 on average, and 18 of 60 files read exactly 0, which the page would have called “very alike”. So smaller pages are not used, and when too few pages are big enough the tool says so and you pick one of the presets. The estimate is selected for you only when the file pins tau down. It is shown but not selected when its 95% range runs into the next preset’s zone (below 0.10 is “very alike”, 0.10 to 0.25 “typical”, 0.25 to 0.35 “volatile”), when the top of its range is more than 1.5 times the estimate, or when the estimate is exactly 0: the method cuts it off at 0 when the pages spread no more than counting noise would make them spread, so 0.00 says the file cannot see the drift, not that there is none. Reading tau too low makes every chance look better than it is; the top of the range is offered as the cautious choice. An estimate that is not selected still never leaves you calculating with a tau below what your file reads: if the tau already selected in step 4 is lower than the estimate, the page selects the cautious end instead and says so, and you can choose the estimate itself or a preset if you know your pages better than the file does. A tau selected at or above the estimate is left as it was.

Opening a very large file can hold the page for about half a second: the parser shared with the other tools reads it in one go. Working out tau from the rows afterwards is done in short slices, the way the simulation is, and the page stays responsive.

What happens to your numbers and your file

Nothing leaves your browser. What you type is read by JavaScript running in this tab and is not sent anywhere; a file you choose is read in memory, not uploaded, with no copy on a server, and nothing from it is written to a cookie or to local storage (the theme switch remembers light or dark and nothing else). The page loads no analytics and no third-party scripts.

You do not have to take our word for it. Open your browser’s developer tools, choose the Network tab, run a calculation, and watch it make no request. Two things back that up. This page carries a content security policy, readable in its source, that blocks fetch, XHR, WebSocket, EventSource and beacon calls (connect-src 'none') and form posts (form-action 'none'), and allows images only as inline data: URIs. A content security policy does not cover every browser feature (WebRTC, for one), so the second check matters: the project’s tests read this page’s own script and every module it imports, and fail on any of the browser’s network APIs.

The simulation runs on this page in short slices rather than in a Web Worker, so that the page can keep the same strict policy as the other tools (worker-src 'none'). The site-wide script penlid.js, which every page loads, contains network calls for the signed-in app’s account switcher. This page never calls it, and a test checks that those calls sit only inside the switcher.

Methods: the rules and thresholds

Each number below is a constant in public/assets/lib/power.js or public/assets/lib/stats.js. The project’s tests compare the numbers quoted here with those constants; that is a check on the numbers, and not on every sentence. They are judgement calls, and they are the owner’s to change.

The three answers
A page with 0 in the 28 days before the change is a new page: no lift can be measured. 1 to 9 earns a direction (“improved” or “declined” at p < 0.05) and no size. 10 or more earns a size. This is the rule estimateLift applies to the before window, from SIZED_MIN_BEFORE.
Comparison pages
At least 3 are needed and at most 8 are used. Candidates are ranked by closeness in size to the page and the closest 30 are kept, as at publication. On every simulated run a candidate is used only if it had at least 5 in its early window (days −56 to −29) and, for a sized answer, that count is within ten times the page’s before count; the best 8 that pass are used. A run with fewer than 3 usable pages has no verdict.
Tau presets
Very alike 0.05, typical 0.15, volatile 0.35. The acceptance grid’s tau went to 0.35, its counts to 11,200 in 28 days (400 a day) and its comparison pages to 8; outside those the page says so.
Chance of a verdict
The share of simulated tests that returned “improved” (for a lift) or “declined” (for a drop), counting refused tests as having no verdict. Lifts are +10%, +30%, +50%, +80% and +150%. Drops are −10%, −30%, −50%, −80% and −90%; a drop of 150% cannot happen.
The change that gets 80%
A chance of 80% (the usual target for a test’s power), found by bisection in 7 steps on simulated tests, each step half the standard run count. The figure printed is where a straight line fitted on the normal-quantile scale to every simulated point with a chance between 50% and 95% reaches 80%, counting each point’s chance among the simulated tests that had enough comparison pages to give a verdict at all and reading 80% of all tests the same way (a test with no verdict can never read “improved”, so the chance cannot climb past the share that had one); the range beside it is that crossing’s 95% range, 1.96 standard errors either side, widened when the line misses its points by more than their noise. If there is nothing sound to fit, the bisection’s own answer and the bracket the search started from are printed instead. If no lift up to +99,900%, or no drop up to −99.9%, gets there, it says so and why.
False alarms
The share of simulated tests, with no change at all, that returned “improved” or “declined”. At the 95% level it should be at or under about 5%. The acceptance grid held every recorded scenario to 7%, and its worst was 5.85%. A figure above 7% is flagged on the page as outside what was tested.
Accuracy
2,000, 5,000 (standard) or 20,000 simulated runs per scenario. A calculation runs 11 scenarios plus the 80% searches, so about 18 times the per-scenario count. The binomial standard error of a figure p is √(p(1−p)/runs).
When the answer arrives
The after window starts 1 day after the change and runs 28 days. Google restates the newest days for 7 days, and reports about 3 days late, so the answer is 28 + 7 + 3 = 38 days after the change goes live. These are the server’s own constants (EVAL_WINDOW_DAYS, REVISION_WINDOW_DAYS, REPORTING_LAG_DAYS), mirrored here, and a test runs the server’s functions and compares.
Estimating tau
At least 84 days in the file (three windows of 28), at least 12 usable pages in a pair, at least 26 of a window’s 28 days present, and the newest 6 pairs at most. A page is read only if it had at least 30 in the window before the pair. The interval printed is the Q-profile interval for tau². An estimate whose 95% range reaches into the next preset’s zone, whose range tops out at more than 1.5 times the estimate, or which is exactly 0, is not selected for you, and the top of the range is offered as the cautious end. If the tau already selected is below the estimate, the page selects the cautious end instead; otherwise it leaves the selection as it was.