Features
A/B testing software that measures money, not just clicks
Split testing software with revenue tracking, decision-ready reporting, Google Analytics goals, and built-in anti-flicker — everything a conversion rate optimization programme needs, in one platform.
Revenue tracking
Measure the bottom line, not just the click
Track purchases and revenue per variant, with Welch's t-test for revenue comparisons. When conversion rate and revenue disagree, Otter shows you the conflict instead of picking for you — so you never ship a “winner” that costs you money.
Statistical engine
Know when results are real
Frequentist and Bayesian analysis with configurable thresholds, automatic Bonferroni correction for frequentist A/B/n tests, and real-time calculation — so you ship on evidence rather than on a hunch that the line looks higher.
A/B split testing
Test any element on your page
Create unlimited variants with different headlines, images, CTAs, or entire layouts. Split traffic with precision — deterministic assignment keeps every returning visitor in the same experience.
Google Analytics integration
Use your GA4 events as test goals
Connect your GA4 property and use any existing event as a conversion goal — no extra tracking code, no duplicate instrumentation. Keep the events you already trust and measure experiments against them directly.
- Connect GA4 with one click via OAuth
- Browse and select events from your property — no manual configuration
- Combine GA4 goals with SDK-tracked goals in the same experiment
Preview tool
Prove your goals fire before you launch
Open your real site with the Otter bar and browse as any test variant, drafts included. Emulate mobile and tablet, then watch each goal light up “Fired” the instant you trigger it — a live dry run that never records a conversion.
- Switch variants live on real pages — no staging site required
- Validate click, pageview, custom-event, DataLayer-event, and revenue goals in real time
- Emulate mobile and tablet, and never touch your experiment results
Anti-flicker
Hidden until your variant is ready.
The snippet hides the page until your changes are applied, so visitors see the variant instead of a flash of the original. A three-second failsafe shows the original page rather than leaving it blank. Anti-flicker is the default, not an optional snippet.
Async SDK
One async script tag.
Plain JavaScript with no virtual DOM and no framework runtime, and a single dependency, DOMPurify, that sanitises HTML changes. It loads async, never blocks your page from parsing, and caches after the first visit.
Platform support
Works with the stacks teams already run
Otter ships as one runtime, but the setup guides are tailored to the platforms and deployment workflows teams actually use.
Developer first
Built for engineers
A REST API for projects, experiments, and results, plus SDK methods for custom event tracking, user identification, and consent management — full control over the testing lifecycle when you want it, and none of it required when you don't.
- REST API with scoped keys and an OpenAPI spec
- MCP server for managing experiments from your editor
- Consent hooks so tests respect your privacy banner
Features in depth
What each capability actually means
Most A/B testing tools share the same feature checklist. The differences are in how each one is implemented, what trade-offs it makes, and whether it helps you ship the right decision. Here is what each Otter feature does, and why we built it that way.
A preview tool that validates goals, not just looks
Every A/B tool lets you preview how a variant looks. Almost none let you confirm the thing that actually decides whether a test is worth running: that its goals fire. Otter's Preview Tool is a bar that rides along the bottom of your real site — switch between any test and variant (drafts included, since drafts are never served to live traffic), and emulate mobile and tablet in a true-to-size device frame.
The part teams tell us they wish every tool had is goal validation. Open the Goals panel and you get a live checklist of every goal on the test. Click the tracked element, navigate to the pageview URL, or fire a custom or revenue event from your own code, and each goal ticks over to ✓ Fired the instant Otter observes it — with a toast and a progress bar as you complete the set. It is a genuine dry run: the whole Preview Tool bypasses assignment and conversion tracking, so you can trigger everything as many times as you like and never record a conversion. You catch a broken selector or a mis-named event before launch, instead of discovering a week of empty data after it.
Anti-flicker on by default
The classic A/B testing failure mode is “flash of original content” — the visitor briefly sees the control variant before the variant overrides it. It looks broken, and on mobile connections it can show the original page for hundreds of milliseconds.
Otter hides the body with a CSS rule injected synchronously in the <head>, then removes that rule once the SDK has resolved which variant to show and applied it. The page stays hidden only as long as that takes, and a hard failsafe caps it at 3 seconds — if the SDK is slow or fails to load, the page shows the original rather than staying invisible. Competitor tools that ship anti-flicker as a “manual snippet you can optionally add” leave this off by default; we made it the default.
Frequentist and Bayesian analysis, both done correctly
Most platforms ship one statistical model — usually frequentist with a hardcoded 95% confidence threshold — and call it a day. That is the wrong default for small-traffic tests where you need a directional decision faster than textbook significance allows, and it is the wrong default for A/B/n tests with several variants, where you need adjusted thresholds to avoid false positives.
Manual splits let you pick frequentist or Bayesian reporting. Frequentist mode reports significance and lift against a configurable threshold. For A/B/n tests, that threshold tightens automatically using a Bonferroni correction. Bayesian mode reports the posterior probability that each variant beats control. Multi-armed bandits use Bayesian reporting automatically while adapting new-visitor traffic from primary-goal results.
Revenue tracking that surfaces the right conflict
A conversion-rate winner can lose on revenue. If a variant moves customers toward a cheaper SKU or a smaller cart, the conversion bar can move up while revenue per visitor moves down — and shipping the “winner” actively costs you money.
Otter attaches monetary values to conversion events and reports conversion rate, average order value, and revenue per visitor side by side. When they disagree, the results page surfaces the conflict instead of hiding it — you decide what matters more rather than relying on the tool to pick for you.
Targeting that runs on the visitor side
URL matching supports exact, prefix, wildcard, and regex. Visitor targeting supports country, device class, traffic source (UTM), referrer, and custom attributes passed through the SDK. All targeting is evaluated client-side at variant assignment time, so a “logged-in users only” test never assigns logged-out visitors at all — the noise that would otherwise creep into your data never gets a chance to.
Exclusion lists support office IPs, internal QA traffic, and known bot user-agent patterns out of the box. The CrawlerDetect library handles modern Chrome client-hint headers correctly, which means your data is not contaminated by Sec-CH-UA false positives that older bot filters can fall for.
GA4 integration without re-instrumentation
Most teams already have GA4 conversion events configured for purchase, signup, lead, and key page views. Otter can read those events directly through the GA4 API and use them as test goals — no JavaScript changes, no re-instrumentation, no duplicate event tracking.
The trade-off is GA4's sampling and processing delay, which means decision data lags real-time by up to 24 hours. For tests where freshness matters, use a native Otter goal; for tests where attribution accuracy matters more, use the GA4 source.
One async script tag
The SDK is plain JavaScript with no virtual DOM and no framework runtime. Its one dependency is DOMPurify, which sanitises HTML changes before they reach your page. It loads with the async attribute, so it never blocks your HTML from parsing, and lives in the browser cache after the first visit.
Calls you make before the SDK finishes loading are queued and replayed once it is ready, so your own tracking code never has to wait on it. Every page that carries the snippet asks Otter which tests apply, and the anti-flicker window covers that request, with the same three-second cap.
Single-page app support
Otter supports single-page apps. The SDK patches pushState and replaceState, listens for popstate and hashchange, and re-evaluates active tests when the URL changes. It switches this on automatically when it detects a Next.js, Nuxt, or Gatsby build, a global Vue, or a React app mounted on #root.
If your app routes in a way the SDK does not detect, or you want manual control after a view change, call optimo.reload() to fetch the visitor's active tests again. Pageview goals follow route changes either way.
Ready when you are
Find out what your next test is worth
Launch your first A/B test in minutes — validate your goals before you ship, then let the revenue numbers call the winner.
- 14-day free trial
- No credit card required
- Cancel anytime