# ABTestly > ABTestly documentation: code-first A/B testing for CRO developers, agencies, and technical growth teams. Covers experiment setup, targeting, analytics integrations, and the developer API. - [ABTestly Documentation: Code-first A/B Testing](https://docs.abtestly.com/introduction.md): A/B testing that ships from Cloudflare's edge in about 30 KB of runtime, keeps every accepted event, and never surprises you with an overage bill. - [Run your first A/B test in about fifteen minutes](https://docs.abtestly.com/quickstart.md): From signup to a live experiment. No coding required beyond dropping one script tag on your site. - [How ABTestly works](https://docs.abtestly.com/concepts/how-it-works.md): A picture of the whole system, so the rest of the docs make sense. - [Documentation index](https://docs.abtestly.com/index.md): Every section of the ABTestly docs on one page. Use this when you know what you want to learn but not where it lives. - [Documentation changelog](https://docs.abtestly.com/changelog.md): What changed in the ABTestly docs, most recent first. Every entry links to the pages it landed on. - [Install the snippet](https://docs.abtestly.com/install/snippet.md): One script tag, first in , no async or defer, no tag manager. And what to do if flicker becomes a problem. - [Verify the snippet is working](https://docs.abtestly.com/install/verify.md): Three checks: the config object, the exposure beacon, and the dashboard banner. In that order. - [Single-page apps](https://docs.abtestly.com/install/spa.md): How ABTestly works on apps with client-side routing, the lifecycle, the helpers, the gotchas, and the patterns that hold up in production. - [Consent & deferred mode](https://docs.abtestly.com/install/consent.md): How ABTestly respects EU ePrivacy / GDPR consent signals, and how to wire it to your CMP. - [Visitor opt-out](https://docs.abtestly.com/install/opt-out.md): A single URL parameter that removes a visitor from every test on your site, including future tests, for two years. - [Create an experiment](https://docs.abtestly.com/build/create.md): The editor is one screen with seven sections plus an optional schedule. Fill what you care about and leave the rest at defaults. - [JavaScript and CSS variations](https://docs.abtestly.com/build/variations.md): The Original and one or more variants. Each variant is JavaScript, CSS, or a redirect. Editor settings, lints, size caps. - [Review changes before you save](https://docs.abtestly.com/build/review-changes.md): Compare your unsaved edits to a variation's JavaScript, CSS and libraries with the saved code, then save from the comparison or go back to the editor. - [Code history](https://docs.abtestly.com/build/code-history.md): Every saved version of a variation's JavaScript, CSS and libraries, kept for the life of the experiment. Compare any two, see what changed since launch or the last reset, and restore an older version as a draft. - [Code check](https://docs.abtestly.com/build/code-check.md): A static review of your variation JavaScript and CSS that runs on every publish, save, and resume. Warn only: it flags common mistakes but never blocks a publish. - [Dev libraries](https://docs.abtestly.com/build/dev-libraries.md): Attach a curated JavaScript library to a variant. It loads once per page, on the pages that need it, pinned to a version with an SRI hash. - [Split URL redirect tests](https://docs.abtestly.com/build/redirect-tests.md): Split URL tests where a variant sends the visitor to a different page. When to use them, how the exposure is delivered, and how attribution survives the hop. - [Clone an experiment](https://docs.abtestly.com/build/clone.md): Duplicate an experiment as a fresh draft. Same setup, new salt, new key. Goals become shared between the two, which locks them. - [Schedule an experiment](https://docs.abtestly.com/build/schedule.md): Start on a date, stop on a date, or cap the run length. All in your project's timezone. Auto-stop lands the test in Paused, never in the trash. - [Autosave and drafts](https://docs.abtestly.com/build/autosave.md): What the editor saves for you and what it does not. Local draft recovery after a crash, and what happens when a publish does not go through on the first try. - [Targeting overview](https://docs.abtestly.com/targeting/overview.md): Locations decide which pages count. Audiences decide which visitors count. Activation triggers decide when the exposure fires. Three separate questions. - [URL rules](https://docs.abtestly.com/targeting/url-rules.md): How Locations decide which pages qualify. Operators, negations, and the per-rule case-insensitive toggle. - [Audiences](https://docs.abtestly.com/targeting/audiences.md): Every visitor rule ABTestly ships. Device, geo, source, history, and a handful of custom escape hatches. - [Geo targeting](https://docs.abtestly.com/targeting/geo.md): Country, region, and city, looked up at the edge, cached per session, bounded wait so a slow lookup does not stall the page. - [Saved Locations & Audiences](https://docs.abtestly.com/targeting/saved-lists.md): Define the rules once, attach them to many experiments. Edit in one place and every experiment picks up the change. - [Activation triggers](https://docs.abtestly.com/targeting/activation-triggers.md): Fire the exposure when it matters, on load, on click, when an element scrolls into view, or when your own code says so. - [Exclusion groups overview](https://docs.abtestly.com/exclusion-groups/overview.md): Two experiments that touch the same element would produce untrustworthy results if a single visitor could enter both. Mutual exclusion groups partition traffic so at most one member ever fires per visitor. Here is why they exist and when to reach for one. - [How allocation works](https://docs.abtestly.com/exclusion-groups/how-it-works.md): A group has 10,000 slots. Members own shares of those slots. Each visitor is deterministically assigned to exactly one slot. Whichever member owns that slot is the one they are eligible for; the rest are silently excluded. - [Long-term holdouts](https://docs.abtestly.com/exclusion-groups/holdouts.md): Reserve a slice of traffic that sees the original forever. Then measure the cumulative effect of every test you have shipped, weeks later. The most under-used feature in A/B testing. - [Managing membership](https://docs.abtestly.com/exclusion-groups/managing.md): Add, remove, and re-share members. Retired vs allocated status. What generation bumps do to running experiments. Activation trigger restrictions. Cloning behavior. Everything you need to run a group day to day. - [A/B test goals in ABTestly](https://docs.abtestly.com/goals/overview.md): A goal is a thing you want to happen. ABTestly counts each fire and attributes it to the variant the visitor saw. - [A/B test conversion goals: clicks, forms, revenue and custom events](https://docs.abtestly.com/goals/types.md): The seven kinds of goal ABTestly can count for you: click, page visit, form submit, scroll depth, engaged session, revenue, custom event. - [System default goals](https://docs.abtestly.com/goals/system-defaults.md): Every site gets two goals for free, Increase Engagement and Engaged session, and every new experiment attaches both automatically. Here is what they measure and why they exist. - [A/B test guardrail metrics and primary goals](https://docs.abtestly.com/goals/primary-vs-guardrail.md): Every experiment has exactly one primary goal that decides the winner, and any number of guardrails that catch collateral damage. - [A/B test goal tracking health](https://docs.abtestly.com/goals/health.md): When your primary goal is silent or converting on one variation only, the results page tells you before it costs you a shipped test. - [Reading a result](https://docs.abtestly.com/results/reading-a-result.md): A tour of the results page. What each panel means, what to trust today, and when the test is actually done. - [The three statistics engines](https://docs.abtestly.com/results/engines.md): Frequentist for classical CRO, sequential for peeking without penalty, Bayesian for probability-of-being-better. Pick per experiment. The math is locked once you start. - [Revenue metrics](https://docs.abtestly.com/results/revenue-metrics.md): Four ways to look at a revenue test. Conversion rate, revenue per visitor, average order value, orders per visitor. Each answers a different question. - [Segments](https://docs.abtestly.com/results/segments.md): Narrow the whole results report to a slice of your traffic. Mobile-only, US-only, paid-search-only. Sample size shrinks; the verdict stays honest. - [Change the baseline](https://docs.abtestly.com/results/baseline.md): By default the Original variant is the reference. Override it when you want to compare two treatments head-to-head. - [Time to decision](https://docs.abtestly.com/results/time-to-decision.md): An honest estimate of how much longer this test might need. Not a promise, not a forecast, a rough runway based on current traffic. - [Business impact projection](https://docs.abtestly.com/results/business-impact.md): Turn a winning lift into a currency figure. What the projection assumes, and where it can mislead you. - [Compare LCP between A/B test variants](https://docs.abtestly.com/results/speed-guardrail.md): A per device panel showing p75 largest contentful paint (LCP) for each variant, with a published threshold rule for when a variant is called slower. - [The Exact Experiment Ledger](https://docs.abtestly.com/results/exact-ledger.md): Every event ABTestly accepts is written to a canonical store, a queue, gzipped NDJSON in R2, and a per-experiment Durable Object. That is what your final numbers come from. - [Detect sample ratio mismatch and broken experiment allocation](https://docs.abtestly.com/results/srm.md): What an SRM warning on your experiment results means, the exact test behind it, what causes it, and what to do. - [Editing a running A/B test without invalidating the results](https://docs.abtestly.com/results/editing-a-running-test.md): What happens when you change the goal, traffic split, audience or variation code on a test that is already collecting data, why ABTestly asks you to reset, and what the configuration change notice on your results means. - [What the affected page loads count on your results means](https://docs.abtestly.com/results/variation-errors.md): What it means when a variation's JavaScript throws on a visitor's page, why ABTestly counts the exposure anyway, and what the affected page loads count does and does not tell you. - [Exports](https://docs.abtestly.com/results/exports.md): CSV of the results table for a stakeholder deck, or a raw-event dump for your own analysis. Both from the Export button on the results page. - [Methodology](https://docs.abtestly.com/methodology/overview.md): How ABTestly computes the numbers you make decisions from. Every formula on these pages is the one that runs in production, quoted from the function that runs it. - [Underneath the statistics](https://docs.abtestly.com/methodology/underneath-the-statistics.md): A result is only worth as much as the chain it sits on: research, hypothesis, implementation, measurement, analysis, decision. What breaks at each link, what we do about it, and the experiment on our own homepage that ran for a month without recording a conversion. - [Minimum detectable effect](https://docs.abtestly.com/methodology/minimum-detectable-effect.md): MDE is an input you declare, not a result you receive. The exact sample-size formula we run, a worked example to the visitor, and the sizes our own function returns across common baselines. - [Test duration](https://docs.abtestly.com/methodology/test-duration.md): Duration is required sample divided by accrual. The exact projection we run, the four statuses it can return, the copy thresholds behind the line on your results page, and the four things the estimator deliberately does not know. - [The peeking problem](https://docs.abtestly.com/methodology/peeking.md): Why a fixed-horizon significance test loses its guarantee when you read it repeatedly. The exact test we run, a false-positive rate we measured against our own z-test, and the engine that removes the penalty. - [Confidence intervals](https://docs.abtestly.com/methodology/confidence-intervals.md): Four different intervals appear on a results page, computed four different ways. The formulas, why the rate interval is Wilson and the lift interval is Wald, and why every one of them is printed next to its n. - [Sample ratio mismatch](https://docs.abtestly.com/methodology/sample-ratio-mismatch.md): The chi-square goodness-of-fit test we run on the observed traffic split, the incomplete-gamma machinery behind its p-value, why the bar is 0.001 rather than 0.05, and exactly which of its outputs reach a screen. - [Signals overview](https://docs.abtestly.com/signals/overview.md): Signals is ABTestly's AI CRO audit. Scan a page of your own site, get ranked test ideas backed by evidence, triage them on an idea board, and turn the good ones into real experiments. Currently in Beta. - [Scan a page](https://docs.abtestly.com/signals/scan-a-page.md): How a Signals scan works. Install the ABTestly browser extension, open the side panel on your own live site, and capture three renders of the page, desktop, mobile, and mobile on a throttled connection, plus its structure. Walk several funnel steps in one pass. - [Connect Google Analytics](https://docs.abtestly.com/signals/connect-google-analytics.md): Connect Google Analytics 4 to Signals with one click, read only, so a scan can read your funnel data and credit it on the ideas it speaks to. It is the only route to the Full evidence and Verified tiers. - [Prioritize A/B test ideas: PXL scores and evidence](https://docs.abtestly.com/signals/read-a-scan.md): The Signals idea board. Ideas ranked by a PXL score, badged Test ready, Needs evidence, Below threshold, or Unverified against a per tier evidence gate, grouped into campaigns, and triaged New, Approve, or Dismiss. - [Signals evidence contract](https://docs.abtestly.com/signals/evidence-contract.md): The precise contract for how Signals grades evidence: structural versus behavioral signals, the four evidence tiers, the PXL gate that decides the Test ready, Needs evidence, Below threshold, and Unverified board badges, which experiments feed back, and what a scan reads. Currently in Beta. - [Build a test from an idea](https://docs.abtestly.com/signals/build-a-test.md): Build this turns an approved Signals idea into a real ABTestly experiment draft, prefilled from the hypothesis. When that experiment concludes, its outcome feeds back into future scans as ground truth. - [Preview links](https://docs.abtestly.com/preview/preview-modal.md): Open any variant on your live site before you launch. Preview drafts and paused tests with a signed link, keep targeting intact, and record no ABTestly data. - [Forced variation](https://docs.abtestly.com/preview/forced-variation.md): Pin yourself to one variant for a whole browsing session. Not yet available. Here is what the tab does today and what to use instead. - [QA session links and the QA overlay](https://docs.abtestly.com/preview/qa-overlay.md): The QA Overlay tab issues a site wide QA session link today. The on page overlay panel itself has not shipped yet. - [Dev debugger](https://docs.abtestly.com/preview/dev-debugger.md): window.__abtestly.debug(), the runtime's built in explainer. Shows what the snippet decided, what applied, and what it tried to send. - [General settings](https://docs.abtestly.com/settings/general.md): The site-wide knobs. Name, domain, project timezone, currency, default statistics engine. - [Snippet panel](https://docs.abtestly.com/settings/snippet-panel.md): The install snippet you paste on your site. Weight, last-published time, anti-flicker checkbox. - [Analytics adapters](https://docs.abtestly.com/settings/analytics-adapters.md): Push ABTestly exposures to your existing analytics tool. GA4, Segment, RudderStack, Amplitude, Mixpanel, turn on the ones you use, ignore the rest. - [SPA support panel](https://docs.abtestly.com/settings/spa-panel.md): Turn on route detection for single-page apps. Configure apply, cleanup, and waitFor templates that variants inherit. - [Global JS](https://docs.abtestly.com/settings/global-js.md): One JavaScript block that runs on every page of the site, before any variant. For shared helpers, polyfills, or one-time analytics wiring. - [Blocked IPs](https://docs.abtestly.com/settings/blocked-ips.md): Server-side filter that drops events from IPs you list. The visitor still sees your site; ABTestly just does not record them. - [Danger zone](https://docs.abtestly.com/settings/danger-zone.md): Preview link controls and site deletion. Deleting a site removes every experiment, every event and every asset, and there is no undo. - [Members and roles](https://docs.abtestly.com/team/members-and-roles.md): Invite people, put them on the right sites, and decide who can publish, who can edit code and who can only look. Three roles and four access presets from Starter, and twenty five per site permission keys to pick by hand on Pro and above. - [Permissions catalog](https://docs.abtestly.com/team/permissions-catalog.md): Every per site permission key, what it lets a Dev do, what it needs alongside, and which plans can pick it by hand. - [Activity log](https://docs.abtestly.com/team/activity-log.md): Every meaningful change on every experiment on every site, grouped by day. Who did what, and to which experiment. - [Upload an asset](https://docs.abtestly.com/assets/upload.md): Images and PDFs, served from usercontent.abtestly.com with an immutable, canonical filename. Per-plan storage budget. - [How assets are served](https://docs.abtestly.com/assets/serving.md): usercontent.abtestly.com. Immutable, canonical URL, one-year immutable cache header, CORS wildcard, DMCA takedown path. - [Recycle bin](https://docs.abtestly.com/assets/recycle-bin.md): Soft delete leaves the file serving. Permanent delete is the one that actually frees storage. Two-step, on purpose. - [GA4 dataLayer integration](https://docs.abtestly.com/integrations/ga4-datalayer.md): How ABTestly pushes an experience_impression event into window.dataLayer, and how to read the exp_variant_string field in GA4. - [GA4 export](https://docs.abtestly.com/ga4-export.md): Cross-check experiment results in your Google Analytics 4 property using the official A/B-testing vendor event. - [GA4 BigQuery analysis](https://docs.abtestly.com/ga4-bigquery.md): Exact conversion-by-variant attribution across concurrent experiments using GA4 raw exports and SQL. - [Product analytics](https://docs.abtestly.com/product-analytics.md): Forward each experiment exposure to Segment, RudderStack, Amplitude, or Mixpanel so you can split any report by variant in the tools you already run. - [Google Tag Manager](https://docs.abtestly.com/integrations/gtm.md): How ABTestly coexists with GTM. Short version: do not install ABTestly through GTM; do install your GTM tags after ABTestly. - [ABTestly plans: limits, upgrades, downgrades and cancellation](https://docs.abtestly.com/plans.md): Per-plan site, experiment, tracked-user, seat and storage limits, what each paid tier adds, and exactly what happens on upgrade, downgrade and cancellation. - [The 14 day free trial](https://docs.abtestly.com/billing/trial.md): How every new account starts: fourteen days on a paid plan before any charge. A card is required, nothing is taken until day 15, and you can cancel at any point. - [What is a Monthly Tracked User (MTU)](https://docs.abtestly.com/billing/mtu.md): One unique visitor bucketed into any experiment during a calendar month. Not one per experiment. Not one per pageview. - [Refunds and cancellation](https://docs.abtestly.com/billing/refunds.md): Thirty day money back on your first paid month, no questions asked, whether or not the subscription began with a trial. Cancel any time; downgrading does not delete anything. - [Trust and compliance](https://docs.abtestly.com/trust-and-compliance.md): How ABTestly handles security, privacy, subprocessors, GDPR, retention, and uptime. Sourced from our public policies. Enterprise-track answers where they exist, honest gaps where they do not. - [window.abtestly API](https://docs.abtestly.com/developer/window-abtestly-api.md): Every method and event on the runtime object. Stable surface, you can call these from variant JS or from your own scripts. - [REST API](https://docs.abtestly.com/developer/rest-api.md): The full HTTP surface behind app.abtestly.com. Base URL, auth, rate limits, and every endpoint you can hit from your own code. - [Beacon protocol](https://docs.abtestly.com/developer/beacon-protocol.md): Exact wire format for /e, /e/validate, /err, /m, /g, and /preview-config. If you build a client, this is what to send. - [Bucketing model](https://docs.abtestly.com/developer/bucketing.md): How ABTestly assigns a variant. MurmurHash3, a two-step allocation, a per-experiment salt. Deterministic and portable, you can re-derive any visitor's bucket from the same inputs. - [Runtime bindings](https://docs.abtestly.com/developer/runtime-bindings.md): Every name available inside a variant's JavaScript. What each one is, where it comes from, why the order matters. - [SPA lifecycle](https://docs.abtestly.com/developer/spa-lifecycle.md): How ABTestly handles a single-page-app route change. Cleanup, re-eval, apply, plus the ApplyContext object and the routeRevision counter. - [Errors and telemetry](https://docs.abtestly.com/developer/errors-and-telemetry.md): What ABTestly logs when things go wrong, how first-occurrence dedup keeps a bad variant from flooding the /err endpoint, and where you can see the errors. - [Rate limits](https://docs.abtestly.com/developer/rate-limits.md): 100 requests per minute per authenticated user on /api. Visitor-facing beacons are not rate-limited. Fails open on rate-limiter errors. - [ABTestly Script Not Working: Installation Troubleshooting](https://docs.abtestly.com/troubleshooting/snippet-not-firing.md): A diagnostic ladder for the most common install issue: the tag is in the HTML but no variants apply and no beacons fire. - [Why A/B Test Results Look Wrong: SRM, Revenue and Attribution](https://docs.abtestly.com/troubleshooting/numbers-look-off.md): Conversion count higher than visitor count. Two arms with wildly different sizes. Lift that flip-flops. A ladder for each. - [Troubleshoot CMP Consent and Deferred A/B Testing](https://docs.abtestly.com/troubleshooting/consent-stuck.md): You are in deferred consent mode. The visitor granted consent on your CMP. But ABTestly's snippet does not fire. Here is why. - [Exclude Internal and QA Traffic from A/B Tests](https://docs.abtestly.com/troubleshooting/blocked-ip.md): You are testing on your live site, but your data does not appear in the results. The most likely cause: you or your office is on the site's blocked-IP list. - [A/B Testing Diagnostic Reference: Error Codes and Debug Report](https://docs.abtestly.com/troubleshooting/diagnostic-reference.md): Stable ABTestly diagnostic codes, what each one means and how to resolve it, plus how to generate a copyable diagnostic report from the browser for a support ticket. - [METHODOLOGY MIGRATION](https://docs.abtestly.com/METHODOLOGY-MIGRATION.md) - [Installing the snippet](https://docs.abtestly.com/snippet-install.md): How to install the ABTestly snippet in your site's , including the optional anti-flicker checkbox, plus SPA and Google Tag Manager notes. This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.