SEO A/B testing enables data-driven decisions about optimization changes. Learn how to design, execute, and analyze SEO experiments that prove what works.
Why SEO A/B Testing Matters
The Problem with SEO Best Practices
Not all "best practices" work for every site:
- Title tag changes may not always improve CTR
- Internal linking strategies vary by site architecture
- Content length optimal varies by topic
- Schema markup impact differs by niche
What Can Be A/B Tested in SEO
- Title tags and meta descriptions
- Internal linking structures
- Content format and length
- Schema markup implementation
- URL structure changes
- Heading hierarchy
- CTA placement and wording
- Featured snippet optimization
SEO A/B Testing Methods
Method 1: Page-Level Split Testing
Split pages into control and variant groups:
Control Group: /category/product-a, /category/product-b, ...
Variant Group: /category/product-c, /category/product-d, ...
Change: New title tag format on variant group
Measure: CTR, rankings, traffic over 4 weeks
Method 2: Time-Based Testing
Compare before and after on the same pages:
Before: Measure metrics for 4 weeks
Change: Implement optimization
After: Measure metrics for 4 weeks
Compare: Adjust for seasonality and trends
Method 3: CausalImpact Analysis
Use statistical methods to isolate the effect:
from causalimpact import CausalImpact
import pandas as pd
# Load traffic data
data = pd.read_csv('traffic_data.csv', index_col='date')
# Define pre and post periods
pre_period = ['2025-01-01', '2025-03-31']
post_period = ['2025-04-01', '2025-06-15']
# Run CausalImpact analysis
ci = CausalImpact(data, pre_period, post_period)
print(ci.summary())
print(ci.plot())
Designing SEO Experiments
Experiment Framework
- Hypothesis: What change will produce what result?
- Metric: What will you measure?
- Duration: How long will you run the test?
- Sample size: How many pages/queries needed?
- Significance: What confidence level is required?
Sample Size Calculation
import math
def sample_size(baseline_rate, minimum_detectable_effect, confidence=0.95, power=0.80):
z_alpha = 1.96 # 95% confidence
z_beta = 0.84 # 80% power
p1 = baseline_rate
p2 = baseline_rate * (1 + minimum_detectable_effect)
n = ((z_alpha + z_beta) ** 2 * (p1 * (1 - p1) + p2 * (1 - p2))) / (p2 - p1) ** 2
return math.ceil(n)
# Example: Baseline CTR 3%, detect 20% improvement
print(sample_size(0.03, 0.20)) # ~11,000 impressions per group
Common SEO Experiments
Experiment 1: Title Tag Optimization
Hypothesis: Adding year to title tags will increase CTR
Control: "Best SEO Tools for Your Business"
Variant: "Best SEO Tools for Your Business (2025)"
Metric: CTR from Google Search Console
Duration: 4 weeks
Minimum sample: 1,000 impressions per page
Experiment 2: Internal Linking
Hypothesis: Adding 3 internal links per article improves rankings
Control: Current internal linking (1-2 links per article)
Variant: Enhanced internal linking (3-5 links per article)
Metric: Average ranking position
Duration: 8 weeks
Minimum sample: 50 articles per group
Experiment 3: Schema Markup
Hypothesis: Adding FAQ schema increases organic CTR
Control: Pages without FAQ schema
Variant: Pages with FAQ schema and FAQ content
Metric: CTR and rich result appearance
Duration: 6 weeks
Minimum sample: 30 pages per group
Analyzing SEO Test Results
Statistical Significance
from scipy import stats
def analyze_ab_test(control_clicks, control_impressions,
variant_clicks, variant_impressions,
confidence=0.95):
control_ctr = control_clicks / control_impressions
variant_ctr = variant_clicks / variant_impressions
# Z-test for proportions
p_pooled = (control_clicks + variant_clicks) / (control_impressions + variant_impressions)
se = math.sqrt(p_pooled * (1 - p_pooled) * (1/control_impressions + 1/variant_impressions))
z_score = (variant_ctr - control_ctr) / se
p_value = 1 - stats.norm.cdf(z_score)
return {
'control_ctr': control_ctr,
'variant_ctr': variant_ctr,
'lift': (variant_ctr - control_ctr) / control_ctr,
'z_score': z_score,
'p_value': p_value,
'significant': p_value < (1 - confidence)
}
Common Analysis Pitfalls
- Simpson's Paradox: Results reverse when aggregating
- Novelty effect: Short-term boost from any change
- Seasonality: Confounding from seasonal trends
- Insufficient duration: Not running long enough
- Google updates: Algorithm changes during test