Skip to content
cccskills
FreePublished on GitHub

ab-test-analyzer

Analyze A/B test results for statistical significance with ship, extend, or kill recommendations

The English summary is being prepared. Showing the original description.

See how to install

Files included (2)

  • SKILL.md9.7 KB
  • skill.meta.json455 B

SKILL.md (original)

Review the instructions the agent will receive before you install.

A/B Test Analyzer

Analyzes A/B test results for statistical significance. Takes variant data (visitors and conversions), calculates conversion rates, lift, p-value, confidence interval, statistical power, and required sample size. Provides a clear recommendation to ship, extend, or kill the test based on rigorous statistical analysis.

Prerequisites

  • agency.config.json at repo root (for context on business goals and CRO service framing)
  • No external tools required; this is a pure computation skill

Phase 0: Intake

  1. Read agency.config.json from the project root.
  2. Extract:
    • services[] -- CRO context for framing recommendations
    • case_studies[] -- benchmark conversion data if relevant
  3. Accept parameters (required):
    • test_name -- descriptive name for the test
    • control -- control variant data: { "name": "Control", "visitors": N, "conversions": N }
    • variants -- array of variant data: [{ "name": "Variant B", "visitors": N, "conversions": N }]
  4. Accept optional parameters:
    • test_type -- what is being tested: headline | cta | layout | pricing | image | copy | color | other (default: other)
    • page -- which page the test runs on (default: unknown)
    • confidence_level -- desired confidence threshold (default: 0.95 for 95%)
    • minimum_detectable_effect -- smallest meaningful lift % (default: 5%)
    • daily_traffic -- average daily visitors to the test page (for duration estimates)
    • revenue_per_conversion -- average value per conversion (for revenue impact)
    • test_duration_days -- how long the test has been running (for novelty effect check)

Phase 1: Core Calculations

Per-variant calculations:

conversion_rate = conversions / visitors
standard_error = sqrt(conversion_rate * (1 - conversion_rate) / visitors)
confidence_interval_95 = [conversion_rate - 1.96 * SE, conversion_rate + 1.96 * SE]

Variant vs. Control comparison:

absolute_lift = variant_rate - control_rate
relative_lift = (variant_rate - control_rate) / control_rate * 100

pooled_rate = (control_conversions + variant_conversions) / (control_visitors + variant_visitors)
pooled_SE = sqrt(pooled_rate * (1 - pooled_rate) * (1/control_visitors + 1/variant_visitors))

z_score = (variant_rate - control_rate) / pooled_SE
p_value = 2 * (1 - normal_cdf(abs(z_score)))  // two-tailed test

Statistical significance:

  • Test is significant if p_value < (1 - confidence_level)
  • At 95% confidence: significant if p_value < 0.05

Statistical power calculation:

effect_size = abs(variant_rate - control_rate)
power = probability of detecting this effect size given sample sizes

Estimate power using:

  • Current sample sizes
  • Observed effect size
  • Significance level

Required sample size calculation:

For the specified minimum_detectable_effect:

required_per_variant = (z_alpha + z_beta)^2 * 2 * p * (1-p) / delta^2

where:
  z_alpha = 1.96 (for 95% confidence)
  z_beta = 0.84 (for 80% power)
  p = control_rate
  delta = control_rate * minimum_detectable_effect / 100

Remaining sample needed:

remaining = max(0, required_per_variant - min(control_visitors, variant_visitors))

Estimated days remaining (if daily_traffic provided):

days_remaining = remaining / (daily_traffic / num_variants)

Phase 2: Validity Checks

Run checks to ensure results are trustworthy:

Sample Ratio Mismatch (SRM):

expected_ratio = 1 / num_variants  // assuming equal split
actual_ratio = variant_visitors / total_visitors
chi_squared = sum((observed - expected)^2 / expected)
srm_p_value = chi_squared_test(chi_squared, df=num_variants-1)
  • If srm_p_value < 0.01: WARNING -- traffic split is uneven, results may be unreliable.

Minimum sample check:

  • If any variant has < 100 conversions: WARNING -- sample too small for reliable conclusions.
  • If any variant has < 1000 visitors: CAUTION -- results may shift with more data.

Novelty effect check:

  • If test_duration_days < 7: CAUTION -- possible novelty effect inflating variant performance.
  • If test_duration_days < 14: NOTE -- consider running through at least one full business cycle.

Multiple comparison correction:

If more than 2 variants total (control + 2+ variants):

  • Apply Bonferroni correction: adjusted significance = 0.05 / number_of_comparisons
  • Note which results survive correction

Phase 3: Revenue Impact

If revenue_per_conversion is provided:

{
  "current_revenue_per_1000_visitors": "control_rate * 1000 * revenue_per_conversion",
  "projected_revenue_per_1000_visitors": "variant_rate * 1000 * revenue_per_conversion",
  "monthly_revenue_impact": "lift * monthly_traffic * revenue_per_conversion",
  "annualized_revenue_impact": "monthly_impact * 12",
  "confidence_interval_revenue": "[low_lift * traffic * rpv, high_lift * traffic * rpv]"
}

Phase 4: Decision Recommendation

Based on all calculations, issue one of three recommendations:

SHIP (implement the variant):

Conditions:

  • p_value < 0.05 (or specified confidence level)
  • Variant conversion rate > Control conversion rate
  • Statistical power > 0.80
  • No SRM detected
  • Test duration >= 7 days
  • Minimum 100 conversions per variant

EXTEND (keep running the test):

Conditions:

  • p_value between 0.05 and 0.20 (trending but not yet significant)
  • OR statistical power < 0.80 (underpowered)
  • OR test duration < 7 days (too early)
  • OR sample size below minimum threshold
  • AND the observed lift is positive

Provide: estimated days/visitors needed to reach significance.

KILL (stop the test, keep control):

Conditions:

  • p_value < 0.05 AND variant is worse than control (significant negative result)
  • OR p_value > 0.20 AND sufficient sample size (no detectable effect, likely flat)
  • OR test has run 3x the estimated required duration with no trend toward significance

Phase 5: Output

Return structured analysis:

{
  "test_summary": {
    "test_name": "Homepage hero CTA test",
    "test_type": "cta",
    "page": "Homepage",
    "confidence_level": 0.95,
    "total_visitors": 5000,
    "total_conversions": 250,
    "test_duration_days": 14,
    "recommendation": "SHIP | EXTEND | KILL"
  },
  "variants": [
    {
      "name": "Control",
      "visitors": 2500,
      "conversions": 100,
      "conversion_rate": 0.04,
      "conversion_rate_pct": "4.00%",
      "confidence_interval": ["3.23%", "4.77%"],
      "is_control": true
    },
    {
      "name": "Variant B",
      "visitors": 2500,
      "conversions": 150,
      "conversion_rate": 0.06,
      "conversion_rate_pct": "6.00%",
      "confidence_interval": ["5.07%", "6.93%"],
      "is_control": false,
      "vs_control": {
        "absolute_lift": "+2.00%",
        "relative_lift": "+50.0%",
        "z_score": 3.21,
        "p_value": 0.0013,
        "significant": true,
        "direction": "WINNER"
      }
    }
  ],
  "statistical_analysis": {
    "p_value": 0.0013,
    "z_score": 3.21,
    "confidence_level": 0.95,
    "is_significant": true,
    "statistical_power": 0.92,
    "sample_size_required_per_variant": 1537,
    "current_sample_sufficient": true,
    "srm_check": "PASS",
    "novelty_check": "PASS",
    "multiple_comparison_correction": "N/A"
  },
  "revenue_impact": {
    "monthly_uplift": "Rs 75,000",
    "annualized_uplift": "Rs 900,000",
    "confidence_interval": ["Rs 40,000", "Rs 110,000"]
  },
  "validity_warnings": [],
  "recommendation": {
    "action": "SHIP",
    "confidence": "HIGH",
    "reasoning": "Variant B shows a statistically significant 50% relative lift (p=0.0013) with adequate power (0.92). No SRM detected. Test has run 14 days through multiple business cycles.",
    "next_steps": [
      "Implement Variant B as the new default",
      "Monitor for 2 weeks post-implementation to confirm lift holds",
      "Plan next test: test button color or placement"
    ]
  }
}

Present formatted summary:

A/B TEST RESULTS: {test_name}
Page: {page} | Type: {test_type} | Duration: {days} days

VARIANTS:
  Control:   {rate}% ({conversions}/{visitors}) [CI: {low}-{high}]
  Variant B: {rate}% ({conversions}/{visitors}) [CI: {low}-{high}]

LIFT: {relative_lift}% ({absolute_lift} absolute)
P-VALUE: {p_value} ({significant ? "SIGNIFICANT" : "NOT SIGNIFICANT"} at {confidence_level}%)
POWER: {power}%

VALIDITY CHECKS:
  Sample ratio mismatch: {PASS/FAIL}
  Minimum sample:        {PASS/FAIL}
  Novelty effect:        {PASS/CAUTION}
  Multiple comparisons:  {N/A/PASS}

RECOMMENDATION: {SHIP | EXTEND | KILL}
{reasoning}

{if EXTEND}
  Estimated visitors needed: {N} more per variant
  Estimated days remaining: {N} days at current traffic
{/if}

REVENUE IMPACT (if shipped):
  Monthly: {amount}
  Annual:  {amount}
  Range:   [{low}, {high}]

NEXT STEPS:
1. {step}
2. {step}

Example Usage

Trigger phrases:

  • "Analyze this A/B test"
  • "Is this test significant?"
  • "Should we ship this variant?"
  • "A/B test results: Control 4% (2500 visitors), Variant 6% (2500 visitors)"
  • "Check if we have enough data to call this test"
  • "Run statistical significance on these numbers"
User: Analyze this test -- Control: 2500 visitors, 100 conversions. Variant B: 2500 visitors, 150 conversions. AOV is Rs 2500.
Assistant: [calculates conversion rates, lift, p-value, power, CI, revenue impact; runs validity checks; recommends SHIP/EXTEND/KILL with reasoning]
User: We've been running a test for 3 days. Control: 500 visitors, 20 conversions. Variant: 500 visitors, 30 conversions. Should we call it?
Assistant: [calculates stats, flags insufficient duration and sample size, recommends EXTEND with estimate of remaining days needed]

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Reallocate ad budget across campaigns and channels using ROAS and marginal return analysis

The English summary is being prepared. Showing the original description.

ekatasingh1107/b2b-gtm-skills2Updated Apr 12, 2026

Generate structured creative briefs for ad designers with brand-consistent direction

The English summary is being prepared. Showing the original description.

ekatasingh1107/b2b-gtm-skills2Updated Apr 12, 2026

Mine winning ad angles, hooks, and creative patterns from top-performing ads

The English summary is being prepared. Showing the original description.

ekatasingh1107/b2b-gtm-skills2Updated Apr 12, 2026

ad-spy

Free

Monitor competitor ads across Meta, Google, and LinkedIn with strategic analysis

The English summary is being prepared. Showing the original description.

ekatasingh1107/b2b-gtm-skills2Updated Apr 12, 2026

Interactive onboarding wizard that generates agency.config.json for any B2B agency. Asks structured questions about the agency, services, ICP, tools, outreach preferences, and CRM setup. Outputs a complete config file.

The English summary is being prepared. Showing the original description.

ekatasingh1107/b2b-gtm-skills2Updated Apr 12, 2026

Two-phase Apollo.io prospecting: free People Search to discover ICP-matching leads, then selective enrichment to reveal emails/phones (credits per contact). Deduplicates against CRM (Google Sheets). Supports Apollo API and MCP tools.

The English summary is being prepared. Showing the original description.

ekatasingh1107/b2b-gtm-skills2Updated Apr 12, 2026

See all skills by ekatasingh1107

Report a problem with this skill