{"id":297409,"date":"2026-05-12T12:27:01","date_gmt":"2026-05-12T12:27:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/noticepilot\/"},"modified":"2026-08-06T07:06:22","modified_gmt":"2026-08-06T07:06:22","slug":"noticepilot","status":"publish","type":"plugin","link":"https:\/\/ast.wordpress.org\/plugins\/noticepilot\/","author":20355371,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.0","stable_tag":"1.5.0","tested":"7.0.2","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"NoticePilot","header_author":"spider-themes","header_description":"A self-hosted campaign hub for plugin and theme authors \u2014 push targeted admin notices to remote sites via REST API and SDK, with built-in analytics.","assets_banners_color":"153666","last_updated":"2026-08-06 07:06:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/spider-themes.net\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":299,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"akramhossain","date":"2026-06-08 09:55:03"},"1.5.0":{"tag":"1.5.0","author":"akramhossain","date":"2026-08-06 07:06:22"}},"upgrade_notice":{"1.5.0":"<p>Major admin UI upgrade with a new React-powered interface, REST API workflows, and improved extensibility for Pro add-ons. Existing campaigns remain fully compatible.<\/p>","1.2.0":"<p>Introduces the Free + Pro model (Freemius) and SDK 1.3.0 with opt-in deactivation feedback. The free hub is unchanged in behaviour; Pro is an optional add-on. Re-download the SDK to enable deactivation feedback in your plugins.<\/p>","1.1.0":"<p>Adds campaign templates, live preview, notice styles, placement control, snooze, import\/export, test-site exclusion, and SDK 1.2.0 with an analytics consent mode plus a dismiss-duration fix. Re-download the SDK for your plugins to get the new options. Database is upgraded automatically.<\/p>","1.0.1":"<p>This release includes important security hardening for the admin form handler and the remote SDK. All users are encouraged to upgrade.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3549159,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3562957,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3562957,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1","1.5.0"],"block_files":[],"assets_screenshots":{"screenshot-01.png":{"filename":"screenshot-01.png","revision":3556777,"resolution":"1","location":"assets","locale":"","width":1189,"height":721},"screenshot-02.png":{"filename":"screenshot-02.png","revision":3556777,"resolution":"2","location":"assets","locale":"","width":1369,"height":737},"screenshot-03.png":{"filename":"screenshot-03.png","revision":3556777,"resolution":"3","location":"assets","locale":"","width":918,"height":944},"screenshot-04.png":{"filename":"screenshot-04.png","revision":3556777,"resolution":"4","location":"assets","locale":"","width":810,"height":930}},"screenshots":{"1":"<strong>NoticePilot Dashboard<\/strong> \u2013 Centralized hub to manage products, launch campaigns, and configure SDK integrations.","2":"<strong>Campaign Analytics<\/strong> \u2013 Track performance, impressions, clicks, and conversion rates across all remote installations.","3":"<strong>SDK Integration<\/strong> \u2013 Simple, step-by-step guide to download and initialize the remote notice client SDK.","4":"<strong>Add Campaign<\/strong> \u2013 Create HTML campaigns with customized start dates, end dates, and targeting rules."}},"plugin_section":[],"plugin_tags":[1588,26308,7557,4906,244981],"plugin_category":[],"plugin_contributors":[252241,209471],"plugin_business_model":[],"class_list":["post-297409","plugin","type-plugin","status-publish","hentry","plugin_tags-a-b-testing","plugin_tags-admin-notices","plugin_tags-announcements","plugin_tags-notifications","plugin_tags-plugin-analytics","plugin_contributors-muaz404","plugin_contributors-spiderdevs","plugin_committers-akramhossain","plugin_committers-alimran01","plugin_committers-spiderdevs","plugin_support_reps-spiderdevs"],"banners":{"banner":"https:\/\/ps.w.org\/noticepilot\/assets\/banner-772x250.png?rev=3562957","banner_2x":"https:\/\/ps.w.org\/noticepilot\/assets\/banner-1544x500.png?rev=3562957","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/noticepilot\/assets\/icon-256x256.png?rev=3549159","icon_2x":"https:\/\/ps.w.org\/noticepilot\/assets\/icon-256x256.png?rev=3549159","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/noticepilot\/assets\/screenshot-01.png?rev=3556777","caption":"<strong>NoticePilot Dashboard<\/strong> \u2013 Centralized hub to manage products, launch campaigns, and configure SDK integrations."},{"src":"https:\/\/ps.w.org\/noticepilot\/assets\/screenshot-02.png?rev=3556777","caption":"<strong>Campaign Analytics<\/strong> \u2013 Track performance, impressions, clicks, and conversion rates across all remote installations."},{"src":"https:\/\/ps.w.org\/noticepilot\/assets\/screenshot-03.png?rev=3556777","caption":"<strong>SDK Integration<\/strong> \u2013 Simple, step-by-step guide to download and initialize the remote notice client SDK."},{"src":"https:\/\/ps.w.org\/noticepilot\/assets\/screenshot-04.png?rev=3556777","caption":"<strong>Add Campaign<\/strong> \u2013 Create HTML campaigns with customized start dates, end dates, and targeting rules."}],"raw_content":"<!--section=description-->\n<p><strong>NoticePilot is not another admin notice plugin.<\/strong> It is a <strong>self-hosted remote campaign distribution platform<\/strong> built specifically for WordPress plugin and theme authors.<\/p>\n\n<p>If you maintain a WordPress plugin or theme running on hundreds or thousands of remote sites, NoticePilot lets you push announcements, update prompts, sales banners, or deprecation warnings centrally from your own site\u2014without shipping new plugin releases. It operates via a <strong>hub-to-remote architecture<\/strong>: manage your campaigns centrally on your hub site, while a lightweight PHP SDK bundled in your plugin automatically fetches and renders them.<\/p>\n\n<h4>Who Is This For?<\/h4>\n\n<p>NoticePilot is built for <strong>WordPress plugin and theme developers<\/strong> who need to manage user communication across multiple remote installations from a single, self-hosted dashboard. It is <strong>not<\/strong> a tool for suppressing or customizing notices on a single site.<\/p>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li><strong>Hub-to-Remote Architecture<\/strong> \u2014 Manage campaigns from a single dashboard and distribute them to unlimited remote WordPress sites via a REST API. Zero SaaS dependencies.<\/li>\n<li><strong>Single-File PHP SDK<\/strong> \u2014 Bundle a lightweight, self-contained PHP file in your plugin or theme. Initialize it with a single line of code.<\/li>\n<li><strong>Privacy-First Analytics<\/strong> \u2014 Track impressions, clicks, and dismissals. Site URLs are MD5-hashed; no IP addresses, usernames, or cookies are ever saved.<\/li>\n<li><strong>Audience Targeting<\/strong> \u2014 Target campaigns by plan type (free vs. pro), plugin\/theme version (supporting <code>&lt;<\/code>, <code>&gt;<\/code>, <code>=<\/code>), and WordPress user roles.<\/li>\n<li><strong>Campaign Scheduling<\/strong> \u2014 Set start\/end dates for campaigns. Expired campaigns are automatically deactivated via WP-Cron.<\/li>\n<li><strong>Rich HTML &amp; Styles<\/strong> \u2014 Author custom layouts with standard HTML and CSS. Offers predefined styles (Info, Success, Warning, Error).<\/li>\n<li><strong>Smart Dismissal &amp; Snooze<\/strong> \u2014 Limit notice clutter with automatic dismissal periods (stored locally on remote sites using a FIFO queue) and optional snooze options.<\/li>\n<li><strong>A\/B Testing &amp; Conversions (Pro)<\/strong> \u2014 Test campaign variants, set metric-based smart triggers, track conversion goals, and collect deactivation feedback.<\/li>\n<\/ul>\n\n<h4>How It Works<\/h4>\n\n<ol>\n<li><strong>Create a Product<\/strong> \u2014 Add your plugin\/theme in the hub to generate a unique API endpoint.<\/li>\n<li><strong>Add Campaigns<\/strong> \u2014 Write the HTML notice content, define targeting and scheduling rules, and publish.<\/li>\n<li><strong>Integrate the SDK<\/strong> \u2014 Download the single-file SDK, bundle it with your extension, and initialize it with one line of code.<\/li>\n<li><strong>Track Performance<\/strong> \u2014 Monitor impressions, clicks, and conversion rates from the dashboard.<\/li>\n<\/ol>\n\n<h3>SDK Integration Guide<\/h3>\n\n<p>Integrating the NoticePilot SDK into your plugin or theme is simple. Follow these steps to get started:<\/p>\n\n<h4>1. Setup the Hub &amp; Product<\/h4>\n\n<p>Install NoticePilot on your central management site. Navigate to <strong>NoticePilot<\/strong>, click <strong>+ Add New Product<\/strong>, enter your plugin\/theme name, and toggle <strong>Enable this site<\/strong>. This generates your product's API endpoint.<\/p>\n\n<h4>2. Create a Campaign<\/h4>\n\n<p>On your product card, click <strong>+ Add Content<\/strong>. Enter your HTML notice content, configure optional targeting or scheduling rules, toggle <strong>Enable this offer<\/strong>, and save.<\/p>\n\n<h4>3. Bundle the SDK<\/h4>\n\n<p>Download <code>class-remote-notice-client.php<\/code> from the product card's <strong>How To Integrate<\/strong> tab (or copy it from the plugin's <code>sdk\/<\/code> folder) and place it in your extension (e.g., in an <code>includes\/<\/code> folder).<\/p>\n\n<h4>4. Initialize the SDK<\/h4>\n\n<p>Add the following code to your plugin's main file or theme's <code>functions.php<\/code>:<\/p>\n\n<pre><code>require_once __DIR__ . '\/includes\/class-remote-notice-client.php';\n\nadd_action( 'plugins_loaded', function() {\n    Noticepilot_Remote_Notice_Client::init( 'your-product-slug', [\n        'api_url'          =&gt; 'https:\/\/your-hub-site.com\/wp-json\/noticepilot\/v1\/content\/your-product-slug',\n        'schedule'         =&gt; 'daily',\n        'capability'       =&gt; 'manage_options',\n        'dismiss_duration' =&gt; WEEK_IN_SECONDS,\n    ] );\n} );\n<\/code><\/pre>\n\n<p><em>Replace <code>your-product-slug<\/code> and the <code>api_url<\/code> with the values from your product card.<\/em><\/p>\n\n<h4>SDK Configuration Options<\/h4>\n\n<p>The <code>init()<\/code> method supports several optional parameters:\n* <code>schedule<\/code> \u2014 Polling frequency: <code>hourly<\/code>, <code>twicedaily<\/code>, or <code>daily<\/code> (default).\n* <code>capability<\/code> \u2014 Required user capability to see notices. Default is <code>manage_options<\/code>.\n* <code>dismiss_duration<\/code> \u2014 Cooldown in seconds before a dismissed notice can reappear. Default is one week.\n* <code>snooze_duration<\/code> \u2014 Cooldown for \"Remind me later\" links. Default is one week.\n* <code>max_notices<\/code> \u2014 Maximum number of notices displayed at once. Default is <code>3<\/code>.\n* <code>screen_ids<\/code> \u2014 Restrict notices to specific admin screen IDs. Default is <code>[]<\/code> (site-wide).\n* <code>require_consent<\/code> \u2014 Set to <code>true<\/code> to block tracking until the user explicitly consents (highly recommended for WordPress.org compliance).\n* <code>plugin_version<\/code> \u2014 Current version string to enable version targeting on the hub.\n* <code>is_pro<\/code> \u2014 Set to <code>true<\/code> when Pro features\/plans are active to enable plan targeting.<\/p>\n\n<h4>Advanced SDK Features<\/h4>\n\n<ul>\n<li><p><strong>Analytics Consent (WordPress.org Guideline 7 Compliance):<\/strong>\nIf <code>require_consent<\/code> is set to <code>true<\/code>, control tracking dynamically using:\n  Noticepilot_Remote_Notice_Client::grant_consent( 'product-slug' );\n  Noticepilot_Remote_Notice_Client::revoke_consent( 'product-slug' );<\/p><\/li>\n<li><p><strong>Conversion Goals (Pro):<\/strong>\nTrack high-value user conversions (e.g., upgrading to Pro):\n  Noticepilot_Remote_Notice_Client::track_goal( 'product-slug', 'goal_key' );<\/p><\/li>\n<li><p><strong>Smart Triggers (Pro):<\/strong>\nReport usage metrics (e.g., forms created) to trigger milestone campaigns:\n  Noticepilot_Remote_Notice_Client::set_metric( 'product-slug', 'metric_key', $count );<\/p><\/li>\n<li><p><strong>Deactivation Feedback (Pro):<\/strong>\nCollect deactivation surveys without blocking deactivation:\n  Noticepilot_Remote_Notice_Client::init( 'product-slug', [\n        'api_url'               =&gt; '...',\n        'deactivation_feedback' =&gt; true,\n        'plugin_file'           =&gt; 'plugin-folder\/plugin-file.php',\n    ] );<\/p><\/li>\n<\/ul>\n\n<h4>Verification &amp; Testing<\/h4>\n\n<ol>\n<li><strong>Force a Fetch:<\/strong> Run <code>wp cron event run noticepilot_rnc_fetch_content_your-product-slug<\/code> via WP-CLI on your test site to fetch campaigns immediately.<\/li>\n<li><strong>Check Database:<\/strong> Verify campaigns are cached in <code>wp_options<\/code> under the key <code>noticepilot_rnc_your-product-slug_contents<\/code>.<\/li>\n<li><strong>Verify Render:<\/strong> Navigate to the admin dashboard on your test site to see the notice and test its dismissal.<\/li>\n<li><strong>Verify Analytics:<\/strong> Check <strong>NoticePilot \u2192 Analytics<\/strong> on your hub site to see impression and click tracking roll up (typically hourly).<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20is%20noticepilot%20different%20from%20other%20admin%20notice%20plugins%3F\"><h3>How is NoticePilot different from other admin notice plugins?<\/h3><\/dt>\n<dd><p>Most admin-notice plugins manage, dismiss, or suppress notices on a single WordPress installation. NoticePilot serves an entirely different purpose \u2014 it is a <strong>remote campaign distribution platform<\/strong> for plugin and theme authors. You create and manage campaigns on a central hub site, and a lightweight SDK embedded in your plugin automatically fetches and displays those campaigns across hundreds or thousands of remote installations. It also includes campaign analytics, audience targeting, and scheduling \u2014 capabilities not found in typical notice-management plugins.<\/p><\/dd>\n<dt id=\"can%20i%20use%20custom%20html%20and%20css%20in%20my%20campaigns%3F\"><h3>Can I use custom HTML and CSS in my campaigns?<\/h3><\/dt>\n<dd><p>Yes. Campaign content supports full HTML, including inline styles, <code>&lt;style&gt;<\/code> blocks, and custom layouts. Your content renders exactly as written on every remote site.<\/p><\/dd>\n<dt id=\"is%20it%20safe%20to%20store%20and%20serve%20raw%20html%20campaign%20content%3F\"><h3>Is it safe to store and serve raw HTML campaign content?<\/h3><\/dt>\n<dd><p>Yes, within its intended use case. Campaign content can only be created by administrators who have the <code>manage_options<\/code> capability, and all form submissions are protected by WordPress nonce verification. HTML is stored without additional sanitization intentionally, to preserve inline CSS and custom styling. NoticePilot is a developer tool designed for trusted authors \u2014 not for end-user-generated content.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20collect%20personal%20data%20from%20remote%20sites%3F\"><h3>Does the plugin collect personal data from remote sites?<\/h3><\/dt>\n<dd><p>No. Analytics events are recorded using fire-and-forget <code>navigator.sendBeacon()<\/code> calls. Before any data is written to the database, remote site URLs are MD5-hashed server-side. No IP addresses, usernames, cookies, user agents, or other personally identifiable information is ever collected or stored.<\/p><\/dd>\n<dt id=\"can%20i%20target%20campaigns%20to%20specific%20users%20or%20plan%20types%3F\"><h3>Can I target campaigns to specific users or plan types?<\/h3><\/dt>\n<dd><p>Yes. Each campaign supports three independent targeting dimensions:<\/p>\n\n<ul>\n<li><strong>Plan type<\/strong> \u2014 Show to all users, free-plan users only, or pro-plan users only.<\/li>\n<li><strong>Plugin version<\/strong> \u2014 Target by version number using comparison operators (<code>&lt;<\/code>, <code>&gt;<\/code>, <code>=<\/code>, <code>&lt;=<\/code>, <code>&gt;=<\/code>).<\/li>\n<li><strong>WordPress user role<\/strong> \u2014 Restrict visibility to specific roles such as Administrator, Editor, and others.<\/li>\n<\/ul>\n\n<p>Leave all targeting fields blank to display the campaign to every eligible user.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20a%20user%20dismisses%20a%20notice%3F\"><h3>What happens when a user dismisses a notice?<\/h3><\/dt>\n<dd><p>The notice is hidden for the duration configured via the <code>dismiss_duration<\/code> SDK option. Dismissals are recorded locally on the remote site in <code>wp_options<\/code> using a FIFO cleanup strategy that retains only the 20 most recent dismissed campaign IDs. During each fetch cycle, the SDK also automatically prunes stale IDs for campaigns that no longer exist on the hub.<\/p><\/dd>\n<dt id=\"does%20installing%20noticepilot%20add%20notices%20to%20my%20own%20site%27s%20dashboard%3F\"><h3>Does installing NoticePilot add notices to my own site's dashboard?<\/h3><\/dt>\n<dd><p>No. NoticePilot does not inject any admin notices into the WordPress dashboard of the site where it is installed. It provides only a management interface under its own admin menu page. Campaign notices are displayed exclusively on <strong>remote sites<\/strong> \u2014 and only when a plugin or theme author explicitly integrates the SDK.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.0<\/h4>\n\n<ul>\n<li><strong>Rebuilt:<\/strong> The entire admin UI is now a <strong>React + JSX<\/strong> app (built with @wordpress\/scripts) \u2014 hero, stats, product cards, and all dialogs are component-based, with modals and form fields as reusable components. Same look (reuses the existing styles); smoother, no full-page reloads.<\/li>\n<li><strong>New:<\/strong> Authenticated REST CRUD (<code>\/noticepilot\/v1\/admin\/\u2026<\/code>) replaces the old form-POST handlers for every product\/campaign action (create, edit, delete, duplicate, import).<\/li>\n<li><strong>New:<\/strong> Add-on extension point \u2014 the campaign modal exposes the <code>noticepilot.campaignFieldGroups<\/code> JS filter (@wordpress\/hooks), so NoticePilot Pro injects its A\/B, snooze, and trigger fields as React components. Server-side, add-ons still receive their data via the <code>noticepilot_campaign_data<\/code> filter.<\/li>\n<li><strong>Removed:<\/strong> The legacy jQuery admin script and PHP-rendered modals.<\/li>\n<li>All existing features preserved: templates, live preview, targeting, scheduling, notice styles, placement, import\/export, \"See More\", and the SDK integration guide + download.<\/li>\n<\/ul>\n\n<h4>1.4.1<\/h4>\n\n<ul>\n<li><strong>Developer:<\/strong> Added range-aware analytics query methods to the data layer \u2014 <code>Analytics::get_range_totals()<\/code>, <code>get_product_daily()<\/code>, and optional date bounds on <code>get_product_summary()<\/code> \u2014 powering the enhanced Pro analytics dashboard (date ranges, trend deltas, activity chart). Backward compatible; no schema change.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li><strong>Change:<\/strong> The Analytics screen has moved entirely to <strong>NoticePilot Pro<\/strong>, rebuilt as a modern React dashboard (charts, per-campaign detail, A\/B variant comparison, conversions, CSV export). The free hub keeps the analytics data layer (event recording + hourly rollup) and the product\/campaign stat ribbon.<\/li>\n<li><strong>New:<\/strong> Opt-in geo (data layer) \u2014 a <code>country_code<\/code> column and a cached, filterable resolver (<code>noticepilot_geoip_lookup<\/code>, defaulting to ip-api.com, with CDN-header fast-path). Collected only when the hub owner enables it in Pro's analytics settings and Pro is active (<code>noticepilot_geo_collection<\/code> filter). No per-visitor data.<\/li>\n<li><strong>Improvement:<\/strong> Analytics schema upgraded to 1.2.0 (adds <code>country_code<\/code>); migrates automatically on update.<\/li>\n<li><strong>Removed:<\/strong> The legacy jQuery analytics page, its script, and its CSS.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li><strong>Change:<\/strong> A\/B testing, conversion goals, smart triggers, and per-campaign snooze are now <strong>NoticePilot Pro<\/strong> features. The free hub keeps campaign push, scheduling, targeting, templates, live preview, placement, and analytics.<\/li>\n<li><strong>New (SDK 1.5.0):<\/strong> <code>set_metric()<\/code> for usage-milestone smart triggers, plus first-seen tracking for install-age triggers. The SDK runtime ships free; the rules that drive it are authored in Pro.<\/li>\n<li><strong>Developer:<\/strong> New <code>noticepilot_accept_goal_events<\/code> filter \u2014 the free hub ignores conversion (goal) events unless an add-on opts in, keeping conversion analytics gated. Snooze and trigger data are exposed to the SDK via the existing <code>noticepilot_api_content_item<\/code> filter.<\/li>\n<li>The SDK continues to support <code>snooze_duration<\/code> and <code>max_notices<\/code> config options; a campaign only shows a \"Remind me later\" link when a Pro-authored snooze flag is delivered.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li><strong>New (SDK 1.4.0):<\/strong> <code>Noticepilot_Remote_Notice_Client::track_goal( 'slug', 'goal_key' )<\/code> reports a conversion, attributed to the campaign\/variant a site last saw. The hub records goal events (and accepts them after a campaign ends). Per-variant CVR and conversion summaries surface in NoticePilot Pro.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li><strong>New:<\/strong> Freemius integration and a Free + Pro model. The free hub stays fully functional; the optional <strong>NoticePilot Pro<\/strong> add-on unlocks A\/B testing, per-variant analytics, and deactivation feedback.<\/li>\n<li><strong>New:<\/strong> A\/B testing groundwork \u2014 campaigns can carry weighted variants (authored in Pro); the SDK splits traffic deterministically and tracks events per variant.<\/li>\n<li><strong>New (SDK 1.3.0):<\/strong> Opt-in deactivation-feedback modal (<code>deactivation_feedback<\/code> + <code>plugin_file<\/code> options) \u2014 asks users why they deactivated your plugin (skippable, anonymous) and reports it to your hub.<\/li>\n<li><strong>New:<\/strong> Developer extension points are stable \u2014 <code>noticepilot_campaign_data<\/code>, <code>noticepilot_api_content_item<\/code>, <code>noticepilot_test_site_hashes<\/code> filters and the <code>noticepilot_campaign_modal_fields<\/code> action \u2014 so add-ons plug in without core changes.<\/li>\n<li><strong>Improvement:<\/strong> An A\/B testing upsell appears in the campaign editor when Pro is not active.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li><strong>New:<\/strong> Campaign templates \u2014 one-click starting points for review requests, BFCM sales, update prompts, deprecation warnings, and feature announcements.<\/li>\n<li><strong>New:<\/strong> Live notice preview \u2014 see exactly how a campaign renders as a WordPress admin notice before publishing.<\/li>\n<li><strong>New:<\/strong> Notice styles \u2014 choose Info, Success, Warning, or Error styling per campaign.<\/li>\n<li><strong>New:<\/strong> Placement control \u2014 restrict a campaign to the integrating plugin's own admin screens (via the SDK <code>screen_ids<\/code> option) instead of site-wide, following WordPress.org guideline 11.<\/li>\n<li><strong>New:<\/strong> \"Remind me later\" snooze \u2014 an optional gentler alternative to permanent dismissal.<\/li>\n<li><strong>New:<\/strong> Import\/export campaigns as JSON, and duplicate any campaign in one click.<\/li>\n<li><strong>New:<\/strong> Test sites \u2014 exclude your own development\/staging URLs from analytics so test traffic never skews campaign numbers.<\/li>\n<li><strong>New (SDK 1.2.0):<\/strong> Analytics consent mode (<code>require_consent<\/code>) with <code>grant_consent()<\/code> \/ <code>revoke_consent()<\/code> helpers \u2014 keeps beacons off until the user opts in, for WordPress.org guideline 7 compliance.<\/li>\n<li><strong>New (SDK 1.2.0):<\/strong> Frequency cap (<code>max_notices<\/code>) and configurable <code>snooze_duration<\/code>.<\/li>\n<li><strong>Fix (SDK 1.2.0):<\/strong> <code>dismiss_duration<\/code> is now honored \u2014 dismissed notices reappear after the configured window (previously dismissals were effectively permanent).<\/li>\n<li><strong>Improvement:<\/strong> Analytics schema now records per-variant events and conversion goals, laying the groundwork for A\/B testing (NoticePilot Pro). Existing data is migrated automatically on update.<\/li>\n<li><strong>Developer:<\/strong> New extension filters \u2014 <code>noticepilot_campaign_data<\/code>, <code>noticepilot_api_content_item<\/code>, <code>noticepilot_test_site_hashes<\/code> \u2014 and the <code>noticepilot_campaign_modal_fields<\/code> action for add-ons.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li><strong>Security:<\/strong> Sanitized nonce input in the admin form handler.<\/li>\n<li><strong>Security:<\/strong> Replaced inline <code>&lt;style&gt;<\/code> output in the SDK with the proper <code>wp_add_inline_style()<\/code> API.<\/li>\n<li><strong>Security:<\/strong> Replaced inline <code>&lt;script&gt;<\/code> output in the SDK with the proper <code>wp_add_inline_script()<\/code> API.<\/li>\n<li><strong>Improvement:<\/strong> Added an explicit <code>__return_true<\/code> permission callback to the public analytics REST API route to comply with WP REST API guidelines.<\/li>\n<li><strong>Improvement:<\/strong> Added plugin owner to the contributors list.<\/li>\n<li><strong>Improvement:<\/strong> Updated readme tags and short description to better reflect the plugin's developer-focused, remote-distribution use case.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<li>Multi-product management with support for unlimited campaigns per product.<\/li>\n<li>Rich HTML campaign editor with full CSS and custom layout support.<\/li>\n<li>Campaign scheduling with automatic expiration handling via WP-Cron.<\/li>\n<li>Built-in analytics tracking for impressions, clicks, and dismissals.<\/li>\n<li>Analytics dashboard with both product-level and campaign-level breakdowns.<\/li>\n<li>Lightweight single-file PHP SDK for remote site integration, with auto-fetch, transient caching, and dismissal handling.<\/li>\n<li>Privacy-first analytics \u2014 remote site URLs are MD5-hashed before storage; no personal data is collected.<\/li>\n<\/ul>","raw_excerpt":"Self-hosted remote campaign hub for plugin and theme authors. Push notices to unlimited sites via a PHP SDK \u2014 no SaaS needed.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/297409","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=297409"}],"author":[{"embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/spiderdevs"}],"wp:attachment":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=297409"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=297409"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=297409"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=297409"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=297409"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=297409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}