Title: JM Split Tester
Author: Jose Mortellaro
Published: <strong>October 28, 2026</strong>
Last modified: October 28, 2026

---

Search plugins

![](https://ps.w.org/jm-split-tester/assets/banner-772x250.jpg?rev=3770282)

![](https://ps.w.org/jm-split-tester/assets/icon-256x256.jpg?rev=3770291)

# JM Split Tester

 By [Jose Mortellaro](https://profiles.wordpress.org/giuse/)

[Download](https://downloads.wordpress.org/plugin/jm-split-tester.1.0.4.zip)

 * [Details](https://wordpress.org/plugins/jm-split-tester/#description)
 * [Reviews](https://wordpress.org/plugins/jm-split-tester/#reviews)
 *  [Installation](https://wordpress.org/plugins/jm-split-tester/#installation)
 * [Development](https://wordpress.org/plugins/jm-split-tester/#developers)

 [Support](https://wordpress.org/support/plugin/jm-split-tester/)

## Description

JM Split Tester runs experiments on posts, pages, and custom post types. Every variant
is served on the original public URL. Visitors are assigned with a first-party cookie
and keep that variant on later visits. Conversion tracking, statistics, and winner
selection are built in. The plugin does not send data to Google Analytics or any
other external service.

A challenger is a draft copy of the original. Edit that copy in the normal editor:
title, content, excerpt, featured image, and page template. Visitors still request
the original URL. The copy stays a draft and is labeled “Experiment variant” in 
the posts list.

Traffic splits are manual. The percentages must add up to exactly 100%.

#### Goals

 * Page view
 * Click
 * Form submission
 * Scroll depth
 * Custom event from JavaScript or PHP

Each visitor is counted once per goal.

#### Statistics

Results use a two-proportion z-test against the control. A winner is reported only
after the configured gates pass. The defaults are 95% confidence, 100 visitors per
variant, 20 conversions per variant, and 7 days. Extra challengers use a Bonferroni
correction, which can be turned off.

Applying a winner asks for confirmation, writes the winning copy onto the original
post, and stores a snapshot. Rollback restores that snapshot. The post ID and public
URL stay the same.

#### Themes and plugins

A variant can use another theme and a different set of active plugins. The change
exists only for that request. If the chosen theme or a required plugin is missing,
the request falls back to the original theme and plugin set.

#### Audience, schedule, and SEO

An experiment can include everyone, only logged-in visitors, or only logged-out 
visitors. Known crawlers are excluded by default and see the control, on the same
canonical URL. The plugin does not add a noindex tag.

Start and end times are checked on the request. Visitors see the original when an
experiment is outside its window or paused, even if WP-Cron has not updated the 
status yet.

Pause, complete, and remove are available on the experiments list.

#### Cache

Experiment pages send a private `Cache-Control` header and `Vary: Cookie` by default.
When WP Fastest Cache or LiteSpeed Cache are active, logged-out visitors get a separate
cached file per variant, chosen from the assignment cookie. The first visit, previews,
and crawlers are not stored. A full-page cache that ignores cookies can still show
one variant to everyone; exclude the experiment URL or vary on `wpab_assignment_*`.

#### Privacy

The plugin does not store IP addresses, full user agents, email addresses, or form
contents. It stores a random anonymous id, a coarse device type, and a browser family.
Raw events can be kept for 30, 90, 180, or 365 days, or not deleted automatically.
WordPress personal-data export and erase are supported. Experiment configuration,
daily totals, and rollback history are kept.

Uninstall removes the must-use loader. Experiment data is deleted only when that
option is enabled.

### Custom Plugin Development

Need to customize this plugin or build a custom WordPress plugin from scratch? I
offer professional custom plugin development services, from adapting existing plugins
to meet your specific requirements to developing fully custom solutions tailored
to your needs.

Learn more about my [custom WordPress plugin development services](https://josemortellaro.com/custom-wordpress-plugin/)
or [book a free discovery call](https://josemortellaro.com/custom-plugin-call/) 
to discuss your project and explore the best solution for your requirements.

## Installation

 1. Upload the `jm-split-tester` folder to `/wp-content/plugins/`, or install the zip
    from Plugins  Add New  Upload Plugin.
 2. Activate JM Split Tester.
 3. Open JM Split Tester  New Experiment.

Activation creates the database tables, grants administrators the `manage_wpab` 
capability, and copies `wpab-runtime-loader.php` into `wp-content/mu-plugins/`. 
No API keys are required.

## FAQ

### Do all variants share one URL?

Yes. The public address stays the original post or page. The plugin does not add`?
variant=` to the URL visitors and crawlers use.

### How do I edit a variant?

Duplicate the original from the experiment wizard, then edit the draft copy in the
block editor or the classic editor. Publish is blocked for that copy. Visitors see
it only through the original URL, and only when they are assigned to that variant.

### Will this change my site theme or deactivate plugins?

No. Theme and plugin changes are applied in memory for the current request. The 
options in Appearance and Plugins are left as they are. Must-use plugins always 
stay loaded.

### How is a winner decided?

The plugin compares each challenger with the control using a two-proportion z-test.
It will not declare a winner until the confidence level, sample size, conversion
count, and minimum duration are all met. You choose when to apply the winner. Rollback
restores the snapshot taken at that moment.

### What do paused and scheduled experiments show?

Paused experiments, and experiments outside their start and end times, show the 
original content to everyone.

### Are crawlers included in the test?

Not by default. Detected bots see the control and are not counted. The canonical
URL is unchanged, and the plugin does not emit noindex.

### Does the plugin use Google Analytics?

No. Page views, clicks, form submissions, scroll depth, and custom events are stored
in your own database.

### What does it store about visitors?

A random anonymous id in the `wpab_vid` cookie, the assigned variant, event names,
a coarse device type, and a browser family. It does not store the IP address, the
full user agent, email addresses, or the contents of forms.

### What happens with a full-page cache?

Logged-out visitors can otherwise all receive the first cached HTML. WP Fastest 
Cache and LiteSpeed Cache each keep one copy per variant, selected by the assignment
cookie. The first visit is not cached, so that response is not reused. Other page
caches must vary on `wpab_assignment_*`, or skip the URLs under test. A cache drop-
in that exits before WordPress loads cannot be varied by this plugin.

Compatibility with additional caching plugins will be added in future versions.

### Can I preview a variant without affecting the results?

Yes. Administrators can open a signed preview link. The preview lasts 15 minutes,
uses its own cookie, and is excluded from the statistics. `?wpab_reset=` followed
by the experiment id clears your own assignment.

### Is the plugin multisite aware?

Each site has its own tables and runtime index. The must-use loader is network-wide
because must-use plugins load for the whole network. There is no network-admin screen
in this version.

### What is removed on uninstall?

The must-use loader and the private runtime index are always removed. Database tables
and settings remain unless you enable “Delete all experiment data” before uninstalling.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“JM Split Tester” is open source software. The following people have contributed
to this plugin.

Contributors

 *   [ Jose Mortellaro ](https://profiles.wordpress.org/giuse/)

[Translate “JM Split Tester” into your language.](https://translate.wordpress.org/projects/wp-plugins/jm-split-tester)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/jm-split-tester/), 
check out the [SVN repository](https://plugins.svn.wordpress.org/jm-split-tester/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/jm-split-tester/)
by [RSS](https://plugins.trac.wordpress.org/log/jm-split-tester/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.0.4

 * The plugin is now named JM Split Tester.
 * Requires PHP 8.1, which matches the code.
 * The must-use loader follows the real plugin directory, and the runtime index 
   is stored in the uploads directory.

#### 1.0.3

 * Serve a separate WP Fastest Cache file for each variant, so logged-out visitors
   are not all shown one cached page.
 * Vary LiteSpeed Cache on the assignment cookie, and do not cache the first visit,
   previews, or crawlers.
 * Remove the shared cache file for an experiment URL.

#### 1.0.2

 * Create a challenger by duplicating the original post and editing that draft. 
   The public URL stays on the original.
 * Pause, complete, or remove an experiment from the experiments list.
 * Label variant copies as “Experiment variant” in the posts list.

#### 1.0.0

 * Initial release.

## Meta

 *  Version **1.0.4**
 *  Last updated **3 days ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.5 or higher **
 *  Tested up to **7.1.4**
 *  PHP version ** 8.1 or higher **
 *  [Advanced View](https://wordpress.org/plugins/jm-split-tester/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/jm-split-tester/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/jm-split-tester/reviews/)

## Contributors

 *   [ Jose Mortellaro ](https://profiles.wordpress.org/giuse/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/jm-split-tester/)