{"id":338264,"date":"2026-08-14T21:54:48","date_gmt":"2026-08-14T21:54:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/server-side-ab-testing\/"},"modified":"2026-08-14T21:54:18","modified_gmt":"2026-08-14T21:54:18","slug":"nofliq-server-side-ab-testing","status":"publish","type":"plugin","link":"https:\/\/mr.wordpress.org\/plugins\/nofliq-server-side-ab-testing\/","author":23527702,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.9.1","stable_tag":"1.9.1","tested":"7.0.4","requires":"6.5","requires_php":"8.1","requires_plugins":null,"header_name":"Nofliq Server-Side A\/B Testing","header_author":"Victoria Vega","header_description":"No-flicker server-side A\/B testing. Integrates with AB Tasty Flagship.","assets_banners_color":"","last_updated":"2026-08-14 21:54:18","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":40,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.9.1":{"tag":"1.9.1","author":"victoriavegab","date":"2026-08-14 21:54:18"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.9.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[262246],"plugin_tags":[1588,19319,275760,5926,1589],"plugin_category":[],"plugin_contributors":[275761],"plugin_business_model":[],"class_list":["post-338264","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-a-b-testing","plugin_tags-experiments","plugin_tags-flagship","plugin_tags-server-side","plugin_tags-split-testing","plugin_contributors-victoriavegab","plugin_committers-victoriavegab"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/nofliq-server-side-ab-testing.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Server-side A\/B testing for WordPress that eliminates flicker.<\/p>\n\n<p>Most A\/B testing tools decide which variant to show in the browser, using JavaScript that runs after the page loads. This causes the \"flash of original content\" (FOOC): the visitor briefly sees the original version before the variant replaces it. It looks broken and it skews results.<\/p>\n\n<p>This plugin takes a different approach. It decides the variant in PHP, on the server, <strong>before<\/strong> the HTML is sent to the browser, and exposes the decision to your theme so the correct variant is rendered from the first byte. The visitor only ever sees the assigned variant, with no flash and no layout shift.<\/p>\n\n<h4>Two decision engines<\/h4>\n\n<p>The plugin has two modes, chosen in the settings:<\/p>\n\n<ul>\n<li><strong>Local<\/strong> (no account needed): the plugin decides variants itself, on your server, with deterministic bucketing. No data leaves your site. Ideal for evaluation or for running simple experiments without any third-party service.<\/li>\n<li><strong>Flagship<\/strong>: the plugin uses AB Tasty Flagship as the decision engine for remote targeting, segmentation and the Flagship dashboard. This mode sends data to AB Tasty's servers (see External services below) and requires a Flagship account.<\/li>\n<\/ul>\n\n<p>Flagship is the default because it adds targeting, segmentation and centralized reporting that a local engine cannot provide. Local mode is fully functional on its own.<\/p>\n\n<h4>How rendering works<\/h4>\n\n<p>This plugin decides and exposes the variant; your theme renders it. The decision is made available to the page as <code>window.abTestData<\/code>, and your theme (or a small snippet) reads it to render the assigned variant server-side via the <code>abtf_runner()<\/code> helper. This is the standard server-side pattern used by tools like LaunchDarkly, Optimizely and Split: the plugin decides, your code applies. A minimal integration example is provided in the FAQ.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li>Server-side variant decision in PHP, before the page is rendered.<\/li>\n<li>No flicker and no flash of original content.<\/li>\n<li>Works standalone (Local mode) or with AB Tasty Flagship.<\/li>\n<li>Optional Redis caching for fast repeat visits at scale.<\/li>\n<li>Internal conversion tracking and reporting inside the WordPress admin.<\/li>\n<li>Experiments start paused so you can verify configuration before going live.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin can connect to AB Tasty Flagship, a third-party experimentation service, <strong>only when the Decision Engine is set to \"Flagship\" in the plugin settings<\/strong>. In \"Local\" mode the plugin makes no external requests and no data leaves your site.<\/p>\n\n<p>When Flagship mode is active, the plugin contacts the following AB Tasty endpoints:<\/p>\n\n<p><strong>1. Flagship Decision API - https:\/\/decision.flagship.io<\/strong><\/p>\n\n<ul>\n<li>What it is: AB Tasty's decision server, which returns the variant a visitor should see for a given campaign.<\/li>\n<li>What is sent and when: when a visitor loads a page with an active experiment, the plugin sends the visitor ID and the campaign (flag) key to obtain the assigned variation. It also posts an \"activate\" hit to <code>https:\/\/decision.flagship.io\/v2\/activate<\/code> (visitor ID and the variation identifiers) the first time a visitor is assigned, so the visitor is counted in Flagship's reporting.<\/li>\n<\/ul>\n\n<p><strong>2. Flagship Collect API - https:\/\/events.flagship.io<\/strong><\/p>\n\n<ul>\n<li>What it is: AB Tasty's event collection endpoint.<\/li>\n<li>What is sent and when: when a visitor triggers a tracked goal (e.g. a click on a configured element), the plugin sends the visitor ID, the event name, the variant, and the page URL so the conversion is recorded in Flagship.<\/li>\n<\/ul>\n\n<p>The visitor ID is either a fingerprint hash (SHA-256 of IP + User-Agent + Accept-Language) or an ID provided by your analytics tool, depending on the configured Visitor ID Provider.<\/p>\n\n<p>Use of AB Tasty Flagship is subject to AB Tasty's terms and privacy policy:<\/p>\n\n<ul>\n<li>Terms of Use: https:\/\/www.abtasty.com\/terms-of-use\/<\/li>\n<li>Privacy Policy: https:\/\/www.abtasty.com\/privacy-policy\/<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to the <code>\/wp-content\/plugins\/<\/code> directory, or install the plugin through the WordPress plugins screen.<\/li>\n<li>Activate the plugin through the \"Plugins\" screen in WordPress.<\/li>\n<li>Go to <strong>AB Tests - Settings<\/strong> and choose a Decision Engine. For Local mode, no further configuration is required. For Flagship mode, enter your AB Tasty Flagship Environment ID and API Key.<\/li>\n<li>Create an experiment under <strong>AB Tests - Experiments<\/strong>. New experiments start paused.<\/li>\n<li>Review the configuration, then click Resume to activate the experiment.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20ab%20tasty%20flagship%20account%3F\"><h3>Do I need an AB Tasty Flagship account?<\/h3><\/dt>\n<dd><p>No. In Local mode the plugin decides variants on your own server and needs no third-party account. You only need a Flagship account if you choose Flagship mode, which adds remote targeting, segmentation and the Flagship dashboard.<\/p><\/dd>\n<dt id=\"does%20it%20require%20redis%3F\"><h3>Does it require Redis?<\/h3><\/dt>\n<dd><p>Redis is not strictly required, but it is recommended at scale. The plugin uses Redis to cache variant assignments and to store conversion counters for fast reporting. Without Redis the plugin still works: variant assignments fall back to the database, and in Local mode conversions are recorded in the database as well.<\/p><\/dd>\n<dt id=\"why%20do%20new%20experiments%20start%20paused%3F\"><h3>Why do new experiments start paused?<\/h3><\/dt>\n<dd><p>Starting paused lets you verify the configuration (selector, URLs, flag key, variants) before the experiment serves any variant. Only active experiments are applied, so a paused start prevents assignments from being cached before you are ready.<\/p><\/dd>\n<dt id=\"how%20does%20it%20avoid%20flicker%3F\"><h3>How does it avoid flicker?<\/h3><\/dt>\n<dd><p>The variant is decided in PHP before the HTML is generated, so your theme can render the correct variant from the first byte. There is no JavaScript swap after load, which is what causes flicker in client-side tools.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20change%20my%20page%20content%20automatically%3F\"><h3>Does the plugin change my page content automatically?<\/h3><\/dt>\n<dd><p>No. The plugin decides and exposes the variant; your theme renders it. This keeps the plugin theme-agnostic and avoids the flicker that DOM-manipulation approaches cause. See the next question for a minimal integration example.<\/p><\/dd>\n<dt id=\"how%20do%20i%20render%20the%20variant%20in%20my%20theme%3F\"><h3>How do I render the variant in my theme?<\/h3><\/dt>\n<dd><p>The plugin exposes the decided variant through the <code>abtf_runner()<\/code> helper. Call it in your theme where you want to render the variant, before output. For example:<\/p>\n\n<pre><code>&lt;?php\n$runner  = abtf_runner();\n$result  = $runner-&gt;run( 'your_flag_key' );\n$variant = $result['variant'];\n\nif ( $variant === 'control' ) {\n    \/\/ render the control version\n} else {\n    \/\/ render the variant version\n}\n?&gt;\n<\/code><\/pre>\n\n<p>The decision is made in PHP before the HTML is sent, so there is no flicker. The same variant is also available in JavaScript as <code>window.abTestData<\/code> for client-side needs.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>Added a Local decision engine so the plugin works fully without any third-party account.<\/li>\n<li>Added an explicit Decision Engine selector (Flagship or Local) in settings.<\/li>\n<li>Documented the AB Tasty Flagship external services used in Flagship mode.<\/li>\n<li>Internal improvements and code-quality fixes.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"No-flicker server-side A\/B testing. Decides experiment variants in PHP before rendering. Works on its own or with AB Tasty Flagship.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/338264","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=338264"}],"author":[{"embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/victoriavegab"}],"wp:attachment":[{"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=338264"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=338264"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=338264"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=338264"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=338264"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=338264"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}