{"id":364921,"date":"2026-09-19T08:14:48","date_gmt":"2026-09-19T08:14:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/pixel-made-simple\/"},"modified":"2026-10-06T20:50:46","modified_gmt":"2026-10-06T20:50:46","slug":"pixel-made-simple","status":"publish","type":"plugin","link":"https:\/\/eu.wordpress.org\/plugins\/pixel-made-simple\/","author":23275004,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.20.1","stable_tag":"0.20.1","tested":"7.1.3","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"Pixel Made Simple","header_author":"Dominik Seitz","header_description":"Lightweight, high-performance tracking for Meta Pixel & Conversions API, Google Ads (Consent Mode v2) and TikTok Pixel \u2013 with URL-based multi-platform events and clean event deduplication.","assets_banners_color":"f6f8f7","last_updated":"2026-10-06 20:50:46","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/pixelmadesimple.com","header_author_uri":"https:\/\/sdv.design","rating":0,"author_block_rating":0,"active_installs":0,"downloads":136,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.12.7":{"tag":"0.12.7","author":"seitzdominik","date":"2026-09-19 08:14:32","revision":3703114},"0.20.1":{"tag":"0.20.1","author":"seitzdominik","date":"2026-10-06 20:50:46","revision":3731559}},"upgrade_notice":{"0.20.1":"<p>Small fixes from the review of 0.20.0.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3731557,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3731557,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3731557,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.12.7","0.20.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3731557,"resolution":"1","location":"assets","locale":"","width":1460,"height":868},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3731557,"resolution":"2","location":"assets","locale":"","width":1460,"height":868},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3731557,"resolution":"3","location":"assets","locale":"","width":1460,"height":868},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3731557,"resolution":"4","location":"assets","locale":"","width":1460,"height":868},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3731557,"resolution":"5","location":"assets","locale":"","width":1460,"height":868},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3731557,"resolution":"6","location":"assets","locale":"","width":1460,"height":868},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3731565,"resolution":"7","location":"assets","locale":"","width":1460,"height":868}},"screenshots":{"1":"Overview \u2013 one sentence says whether tracking is running, with what needs your attention, the consent of the last 7 days and the latest events.","2":"Platforms \u2013 Meta Pixel ID, Conversions API access token and <em>Test connection<\/em>.","3":"Events \u2013 page events for thank-you and confirmation pages.","4":"Forms \u2013 automatic form leads.","5":"Cookie Banner \u2013 the detected banner and one choice for server events: wait for consent or send right away.","6":"Log \u2013 the event log with route, status and event ID, plus the consent statistics.","7":"AI assistants \u2013 connect Claude and other AI tools in three steps."}},"plugin_section":[],"plugin_tags":[223629,195844,985,207498,179062],"plugin_category":[],"plugin_contributors":[281561],"plugin_business_model":[],"class_list":["post-364921","plugin","type-plugin","status-publish","hentry","plugin_tags-consent-mode","plugin_tags-conversions-api","plugin_tags-google-ads","plugin_tags-meta-pixel","plugin_tags-tiktok-pixel","plugin_contributors-seitzdominik","plugin_committers-seitzdominik"],"banners":[],"icons":{"svg":"https:\/\/ps.w.org\/pixel-made-simple\/assets\/icon.svg?rev=3731557","icon":"https:\/\/ps.w.org\/pixel-made-simple\/assets\/icon.svg?rev=3731557","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/pixel-made-simple\/assets\/screenshot-1.png?rev=3731557","caption":"Overview \u2013 one sentence says whether tracking is running, with what needs your attention, the consent of the last 7 days and the latest events."},{"src":"https:\/\/ps.w.org\/pixel-made-simple\/assets\/screenshot-2.png?rev=3731557","caption":"Platforms \u2013 Meta Pixel ID, Conversions API access token and <em>Test connection<\/em>."},{"src":"https:\/\/ps.w.org\/pixel-made-simple\/assets\/screenshot-3.png?rev=3731557","caption":"Events \u2013 page events for thank-you and confirmation pages."},{"src":"https:\/\/ps.w.org\/pixel-made-simple\/assets\/screenshot-4.png?rev=3731557","caption":"Forms \u2013 automatic form leads."},{"src":"https:\/\/ps.w.org\/pixel-made-simple\/assets\/screenshot-5.png?rev=3731557","caption":"Cookie Banner \u2013 the detected banner and one choice for server events: wait for consent or send right away."},{"src":"https:\/\/ps.w.org\/pixel-made-simple\/assets\/screenshot-6.png?rev=3731557","caption":"Log \u2013 the event log with route, status and event ID, plus the consent statistics."},{"src":"https:\/\/ps.w.org\/pixel-made-simple\/assets\/screenshot-7.png?rev=3731565","caption":"AI assistants \u2013 connect Claude and other AI tools in three steps."}],"raw_content":"<!--section=description-->\n<p>Pixel Made Simple sends your sales and leads to Meta, Google and TikTok. <strong>Once, not twice:<\/strong> browser and server send each event with the same receipt number (event ID), so the platform can count it once. <strong>Meta and TikTok wait<\/strong> until your visitor says yes in your cookie banner. And when something needs your attention, the <em>Overview<\/em> tells you in one sentence.<\/p>\n\n<p>Everything described here is free and unlocked. No trial, no locked buttons, no upgrade banners across your dashboard: Pro is mentioned in exactly two places, inside the plugin's own settings.<\/p>\n\n<h4>Three problems this plugin solves<\/h4>\n\n<ul>\n<li><strong>Sales and leads counted twice, or not at all.<\/strong> A visitor reloads the thank-you page, or the browser and server each send the same lead. Without a shared event ID, the platform can't tell it's the same one, and your ads learn from wrong numbers.<\/li>\n<li><strong>You can't tell whether tracking works.<\/strong> A pixel doesn't complain when it stops. The <em>Overview<\/em>, the connection test and the event log show you what runs and what was sent.<\/li>\n<li><strong>Banner on, pixel loads anyway.<\/strong> Many banners and pixels don't talk to each other. Pixel Made Simple reads your cookie banner directly: no Meta or TikTok before a yes, and after \"Accept\" tracking starts right away, without a reload.<\/li>\n<\/ul>\n\n<h4>What you get<\/h4>\n\n<ul>\n<li><strong>Meta Pixel + Conversions API:<\/strong> browser pixel and server events from the same request, with one event ID for both, so Meta deduplicates the pair. Server events are sent without slowing down your page.<\/li>\n<li><strong>Google Ads and GA4:<\/strong> with Google Consent Mode v2. After a marketing yes, the plugin sets Google's advertising signals itself, so Google Ads can count the conversion. Form leads carry Enhanced Conversions data.<\/li>\n<li><strong>TikTok Pixel:<\/strong> web events with the same event ID as the matching Meta event.<\/li>\n<li><strong>Automatic form leads (off by default):<\/strong> Contact Form 7, WPForms, Gravity Forms, Fluent Forms, Ninja Forms, Forminator, Elementor Pro, SureForms, Bricks, Divi and plain HTML forms. One lead per form sent, sent to Meta, Google Ads and TikTok. Contact data is hashed before it leaves your server. Cart, checkout and login forms never count.<\/li>\n<li><strong>Page events:<\/strong> fire a standard or custom event on any URL, e.g. <code>Lead<\/code> on <code>\/thank-you\/<\/code>. A form and its thank-you page share one event ID, so a lead counts once, and the thank-you page saves it if the form's own event got lost on the way.<\/li>\n<li><strong>Cookie banner detection (on by default):<\/strong> detects 10 popular banners, including Borlabs Cookie, Complianz, CookieYes, Cookiebot and Real Cookie Banner, plus the WP Consent API. Your banner isn't on the list? Describe its consent cookie yourself. Consent is never cached with the page, so one visitor's yes is never passed on to the next.<\/li>\n<li><strong>Overview:<\/strong> one sentence says whether tracking is running. \"Needs your attention\" lists what to do, each with one action. A fresh install gets four setup steps.<\/li>\n<li><strong>Connection test:<\/strong> one click checks whether Meta accepts your access token for your pixel, without sending an event.<\/li>\n<li><strong>Duplicate pixel warning:<\/strong> moving over from another tracking plugin? You get a warning when a known plugin sends to the same pixel or measurement ID. A page check also finds snippets in your theme, a code snippet plugin or a page builder.<\/li>\n<li><strong>Event log:<\/strong> recent browser and server events with event name, event ID, route, status and match keys. Filter by status, event or platform.<\/li>\n<li><strong>Consent statistics:<\/strong> how much of your tracking does the cookie banner hold back? Daily counts only: no IP address, no visitor profile.<\/li>\n<li><strong>Live debug bar for administrators:<\/strong> see consent status, fired events and the server response on the page itself. Regular visitors get zero extra bytes.<\/li>\n<li><strong>Cookieless analytics:<\/strong> Plausible, Umami or Rybbit, set up in the same place.<\/li>\n<li><strong>AI assistants:<\/strong> with WordPress 6.9 or newer and an MCP adapter, Claude and other AI tools can read the status, explain the event log and run the connection test, signed in as you. They can never change your settings or see your access tokens. The plugin itself sends nothing to an AI provider.<\/li>\n<li><strong>Export &amp; import:<\/strong> move your whole configuration to another site in one step.<\/li>\n<\/ul>\n\n<h4>Measured, not promised<\/h4>\n\n<p>We test Pixel Made Simple on real WordPress sites, with real cookie banners, form plugins, page builders and speed plugins.<\/p>\n\n<ul>\n<li><strong>80\u201390 % less JavaScript than common alternatives:<\/strong> around 6\u20139 KB instead of 50\u201380 KB. With only Pixel, Conversions API and GA4, there is no extra file at all, just about 1 KB of inline code. No jQuery, no frameworks. <em>(Measured against the same page without a tracking plugin. Scripts from Meta, Google and TikTok are not counted, because every plugin loads those.)<\/em><\/li>\n<li><strong>No extra database queries<\/strong> on a normal page view.<\/li>\n<li><strong>Ad blockers stop the pixel, not your server events.<\/strong> Tested with real filter lists: leads and page events still reach your server, which sends them on through the Conversions API.<\/li>\n<li><strong>One lead per form sent.<\/strong> Not two, not zero. Tested with Contact Form 7, WPForms, Gravity Forms, Fluent Forms, Ninja Forms, Forminator and Divi.<\/li>\n<li><strong>Works with speed plugins<\/strong> that delay JavaScript: form leads always reach the server, even when scripts are delayed.<\/li>\n<\/ul>\n\n<h4>What it can't promise<\/h4>\n\n<p>Your Ads Manager will never match your shop exactly, and no plugin can change that. Visitors who decline cookies aren't tracked, and every platform counts by its own rules. What changes: no event is sent twice, and you see what was sent.<\/p>\n\n<h4>Technology, not legal advice<\/h4>\n\n<p>Pixel Made Simple implements your settings technically. Whether your tracking is legally permitted is your decision \u2013 if in doubt, together with your data protection officer or a lawyer.<\/p>\n\n<p>We put a lot of work into making events arrive reliably. We cannot guarantee it: ad platforms, browsers, cookie banners and caches change constantly. We accept no responsibility for the success of campaigns, ad spend or lost revenue. The license terms are binding.<\/p>\n\n<h4>Pixel Made Simple Pro<\/h4>\n\n<p>Everything above stays free. <a href=\"https:\/\/pixelmadesimple.com\">Pixel Made Simple Pro<\/a> is a separate plugin for online shops, service businesses and campaign attribution:<\/p>\n\n<ul>\n<li><strong>WooCommerce and SureCart tracking:<\/strong> ViewContent, AddToCart, InitiateCheckout and Purchase for Meta, Google Ads, GA4 and TikTok, including the block checkout.<\/li>\n<li><strong>Sales that don't get lost:<\/strong> a server-side fallback reports the purchase even when the buyer never returns to the thank-you page. Reloading the thank-you page doesn't send a second sale.<\/li>\n<li><strong>Click events:<\/strong> a click on your phone number, email address or WhatsApp button counts as a conversion for Meta, Google Ads and TikTok.<\/li>\n<li><strong>TikTok Events API<\/strong> for server-side purchase events.<\/li>\n<li><strong>First-touch \/ UTM attribution<\/strong> with automatic form fill.<\/li>\n<\/ul>\n\n<p>From \u20ac79 per year, with a 60-day money-back guarantee. Both plugins use the same settings, so switching keeps your configuration.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to third-party tracking services. Nothing is sent until you enter the respective ID\/token and switch the platform on. With cookie banner detection enabled, the plugin also waits for the visitor\u2019s marketing consent, with three exceptions you control: Google Ads and GA4 load right away while Google Consent Mode v2 is on (every consent signal set to \u201cdenied\u201d), a privacy tracker whose <em>Load without cookie consent<\/em> switch you turned on loads right away (that provider alone), and with \u201cServer-side events: Always send\u201d the server-side requests are sent regardless of the banner.<\/p>\n\n<p><strong>Meta (Facebook) \u2013 Meta Pixel and Conversions API<\/strong><\/p>\n\n<ul>\n<li>The browser loads the official pixel script from <code>https:\/\/connect.facebook.net\/<\/code> and sends events to <code>https:\/\/www.facebook.com\/tr<\/code> (including the <code>&lt;noscript&gt;<\/code> fallback image). This happens on every page view for which tracking is active.<\/li>\n<li>The Conversions API request goes from your server to <code>https:\/\/graph.facebook.com\/<\/code> whenever a URL event matches, a tracked form is submitted or \u2013 in Pixel Made Simple Pro \u2013 a visitor clicks a phone number, email address or WhatsApp button covered by a click event (for a URL event that takes part in the handover to the confirmation page, and for a click event, the browser asks your server to send it). It contains the event name, time, event ID, page URL, the visitor\u2019s IP address and user agent, the <code>_fbp<\/code>\/<code>_fbc<\/code> cookie values if present and \u2013 only where enabled \u2013 SHA-256 hashes of the email address\/phone number (form leads, logged-in users) or of billing details (Pro e-commerce tracking). A click event carries no contact data at all \u2013 neither the visitor\u2019s nor the number or address that was clicked, only whether it was a phone, email, WhatsApp or custom click.<\/li>\n<li>When you click <em>Test connection<\/em> in the Meta card, your server sends one request to the same address with your saved access token, your pixel ID and an empty list of events. Meta checks the token and rejects the empty list; no event is recorded and no visitor data is sent.<\/li>\n<li>Terms of service: https:\/\/www.facebook.com\/legal\/terms \u2013 Privacy policy: https:\/\/www.facebook.com\/privacy\/policy\/ \u2013 Platform terms: https:\/\/developers.facebook.com\/terms\/<\/li>\n<\/ul>\n\n<p><strong>Google \u2013 Google Ads and Google Analytics 4<\/strong><\/p>\n\n<ul>\n<li>The browser loads <code>gtag.js<\/code> from <code>https:\/\/www.googletagmanager.com\/<\/code> and sends page views, conversions and e-commerce events to Google Ads \/ Google Analytics. For form leads the conversion additionally carries SHA-256 hashes of the email address and \u2013 where an international number is available \u2013 the phone number (Enhanced Conversions). For purchases with advanced matching enabled it carries the same two plus hashed first and last name, and city, region, postal code and country in the clear. There is no server-side connection to Google. With Consent Mode v2 enabled, <code>gtag.js<\/code> loads before consent and every consent signal defaults to \u201cdenied\u201d until your banner \u2013 or, without a detected banner, the plugin itself \u2013 updates it.<\/li>\n<li>Terms: https:\/\/policies.google.com\/terms \u2013 Privacy: https:\/\/policies.google.com\/privacy \u2013 Google Analytics terms: https:\/\/marketingplatform.google.com\/about\/analytics\/terms\/us\/<\/li>\n<\/ul>\n\n<p><strong>TikTok \u2013 TikTok Pixel and Events API<\/strong> (the Events API is part of Pixel Made Simple Pro)<\/p>\n\n<ul>\n<li>The browser loads the pixel from <code>https:\/\/analytics.tiktok.com\/<\/code> and sends web events to TikTok. For purchases the server additionally sends an Events API request to <code>https:\/\/business-api.tiktok.com\/<\/code> containing the event, event ID, IP address, user agent, order values and \u2013 only where enabled \u2013 the hashed email address and, where an international number is available, the hashed phone number.<\/li>\n<li>When you click <em>Test connection<\/em> in the TikTok card (Pro), your server sends one request to the same address with your saved token, your pixel ID and an empty list of events. TikTok checks the token and rejects the empty list; no event is recorded and no visitor data is sent.<\/li>\n<li>Terms: https:\/\/www.tiktok.com\/legal\/page\/global\/terms-of-service\/en \u2013 Privacy: https:\/\/www.tiktok.com\/legal\/page\/row\/privacy-policy\/en \u2013 Business products terms: https:\/\/ads.tiktok.com\/i18n\/official\/policy\/business-products-terms<\/li>\n<\/ul>\n\n<p><strong>Plausible, Umami and Rybbit \u2013 cookieless analytics<\/strong> (all off by default)<\/p>\n\n<ul>\n<li>Unlike the platforms above, the address contacted here is <strong>not part of the plugin<\/strong>. You paste the script URL from your own dashboard into the <em>Privacy Tracker<\/em> card on the <em>Platforms<\/em> tab; the plugin ships no default and never assembles one from a host name. Which server receives the data therefore depends on your account \u2013 the provider's cloud for a hosted plan, your own machine for a self-hosted instance. The example addresses shown in the empty fields are placeholders, never sent.<\/li>\n<li>Nothing is loaded for a provider until you switch it on <strong>and<\/strong> fill in both of its fields. Until then not a single line for it appears in your page source.<\/li>\n<li><strong>Plausible:<\/strong> the browser loads the script from the address you entered (typically <code>https:\/\/plausible.io\/js\/script.js<\/code>) and reports a page view for every page on which tracking is active, tagged with the domain you entered. Service: https:\/\/plausible.io\/ \u2013 Terms: https:\/\/plausible.io\/terms \u2013 Privacy: https:\/\/plausible.io\/privacy \u2013 What Plausible collects: https:\/\/plausible.io\/data-policy<\/li>\n<li><strong>Umami:<\/strong> same, from the address you entered (typically <code>https:\/\/cloud.umami.is\/script.js<\/code>), tagged with the website ID you entered. Service: https:\/\/umami.is\/ \u2013 Terms: https:\/\/umami.is\/terms \u2013 Privacy: https:\/\/umami.is\/privacy<\/li>\n<li><strong>Rybbit:<\/strong> same, from the address you entered (typically <code>https:\/\/app.rybbit.io\/api\/script.js<\/code>), with the site ID appended to the URL as <code>?siteId=<\/code>. Service: https:\/\/www.rybbit.io\/ \u2013 Terms: https:\/\/www.rybbit.io\/terms-and-conditions \u2013 Privacy: https:\/\/www.rybbit.io\/privacy<\/li>\n<li>The plugin loads each provider's <strong>base script and nothing else<\/strong>: no custom events, no goals, no e-commerce data, and no server-side connection of any kind. What that script then collects is the provider's business and is described in their own documentation above.<\/li>\n<li>Consent: by default each provider waits for marketing consent like the Meta and TikTok pixels, and starts without a page reload once the visitor accepts. The per-provider <em>Load without cookie consent<\/em> switch changes that for <strong>that one provider only<\/strong> \u2013 it does not change how Meta, Google or TikTok load.<\/li>\n<\/ul>\n\n<p><strong>SureCart \u2013 licensing and automatic updates<\/strong> (Pro only)<\/p>\n\n<ul>\n<li>The Pro version activates its license and checks for updates against <code>https:\/\/api.surecart.com<\/code>. This happens when you activate or deactivate a license in the \u201cLicense\u201d tab, and when WordPress checks for plugin updates (the result is cached for three hours). Transmitted are the license key you entered, your site URL and your site title.<\/li>\n<li>The free version never contacts this service. It is updated through WordPress.org and contains no update checker of its own.<\/li>\n<li>Terms: https:\/\/surecart.com\/terms-and-conditions\/ \u2013 Privacy: https:\/\/surecart.com\/privacy-policy\/<\/li>\n<\/ul>\n\n<p>A freshly activated Pixel Made Simple contacts nothing at all: with no platform configured, the plugin writes no third-party script, image or request into your pages. Every connection described above needs a setting you made yourself. Two more requests need a click rather than a setting: when you click <em>Check<\/em> in the duplicate pixel check on the <em>Platforms<\/em> tab, your server loads a page of your own site \u2013 no third party is contacted, and nothing is stored. And when you click <em>Test connection<\/em> in a platform card, your server sends the empty test request to Meta or TikTok described above. The settings page links to https:\/\/pixelmadesimple.com (documentation, quick tips, Pro upgrade). These are plain links \u2013 no data is transmitted unless you click them. The free version contains no update checker or telemetry of its own; updates come from WordPress.org.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin from the WordPress.org plugin directory (or upload it via <em>Plugins \u2192 Add New \u2192 Upload Plugin<\/em>) and activate it.<\/li>\n<li>Open <em>Pixel Made Simple<\/em> in the admin menu. The <em>Overview<\/em> walks you through four setup steps. In the <em>Platforms<\/em> tab, switch Meta on and paste your Pixel ID \u2013 every field saves itself.<\/li>\n<li>Optional: paste your Conversions API access token (Meta Events Manager \u2192 Data sources \u2192 Settings \u2192 Conversions API) \u2013 the Conversions API switches on automatically. Click <em>Test connection<\/em> at the top of the Meta card to check that Meta accepts the token for your pixel.<\/li>\n<li>In the <em>Events<\/em> tab, add rules for your thank-you or confirmation pages. For forms without a redirect, switch on <em>Form leads<\/em> in the <em>Forms<\/em> tab instead.<\/li>\n<li>Check the <em>Overview<\/em> and the <em>Log<\/em> tab \u2013 or the live debug bar in the frontend, visible to administrators only \u2013 to see what was sent.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20my%20ads%20manager%20match%20my%20shop%20after%20this%3F\"><h3>Will my Ads Manager match my shop after this?<\/h3><\/dt>\n<dd><p>Not exactly, and no plugin can promise that. Visitors who decline cookies aren't tracked, and each platform counts by its own rules. What changes: no event is sent twice, and with Pixel Made Simple Pro, sales that never reach the thank-you page aren't lost.<\/p><\/dd>\n<dt id=\"is%20it%20gdpr%20compliant%3F\"><h3>Is it GDPR compliant?<\/h3><\/dt>\n<dd><p>No plugin can make a site compliant on its own. What Pixel Made Simple does: Meta and TikTok load nothing before your visitor says yes in your cookie banner, and nothing after \"Reject\". Google loads in its \"denied\" mode until there is a yes (Consent Mode v2). Whether your whole setup is compliant also depends on your banner settings and your privacy policy.<\/p><\/dd>\n<dt id=\"meta%20offers%20a%20free%20one-click%20connection.%20why%20use%20this%20plugin%3F\"><h3>Meta offers a free one-click connection. Why use this plugin?<\/h3><\/dt>\n<dd><p>That connection covers Meta. Pixel Made Simple sends to Meta, Google and TikTok with the same event ID, works with your cookie banner and shows you every event it sent.<\/p><\/dd>\n<dt id=\"i%20already%20use%20another%20tracking%20plugin.%20how%20do%20i%20switch%3F\"><h3>I already use another tracking plugin. How do I switch?<\/h3><\/dt>\n<dd><p>Install Pixel Made Simple, enter your IDs and turn off the old plugin. If the same pixel still runs somewhere else \u2013 in another plugin or in your theme \u2013 the <em>Platforms<\/em> tab warns you. See \"Does the plugin notice when a pixel runs twice?\" below.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>It adds 0 to 2 small files, around 6\u20139 KB, and no extra database queries on a normal page view. It works with speed plugins that delay JavaScript, too \u2013 see \"Does the plugin work with page caching?\" below.<\/p><\/dd>\n<dt id=\"i%20build%20sites%20for%20clients.%20anything%20i%20should%20know%3F\"><h3>I build sites for clients. Anything I should know?<\/h3><\/dt>\n<dd><p>Your settings can be exported from one site and imported on the next \u2013 then change the IDs. The duplicate pixel warning finds old tracking code left behind by a previous setup. And the free version shows no upgrade banners in your clients' dashboards.<\/p><\/dd>\n<dt id=\"what%20can%20an%20ai%20assistant%20see%20and%20change%3F\"><h3>What can an AI assistant see and change?<\/h3><\/dt>\n<dd><p>Only what you allow, and only signed in as you. With WordPress 6.9 or newer, Pixel Made Simple registers its functions as WordPress Abilities. An MCP adapter plugin on your site, such as the official MCP Adapter, makes them available to AI tools like Claude. Your AI tool signs in with an application password and acts with your user rights \u2013 only administrators can use the abilities.<\/p>\n\n<p>An AI tool can read the tracking status, the event log, the consent statistics and your page events, check for duplicate pixels and test the connection (a request without an event). Access tokens are never part of an answer \u2013 it only learns whether one is saved. Creating and changing page events (and, in Pixel Made Simple Pro, click events) and switching them on or off works only after you turn on <em>Allow AI to create and change events<\/em> in the <em>AI assistants<\/em> tab. An AI tool can never delete anything or change your settings.<\/p>\n\n<p>The plugin itself sends nothing to an AI provider. Your AI tool fetches the data from your site; what happens to it there depends on the tool and its provider.<\/p><\/dd>\n<dt id=\"which%20services%20does%20the%20plugin%20contact%3F\"><h3>Which services does the plugin contact?<\/h3><\/dt>\n<dd><p>Only the ones you configure yourself. With no platform set up it writes no third-party script, image or request into your pages at all. Every address it can contact, what is transmitted and when, is listed under <em>External services<\/em> below.<\/p><\/dd>\n<dt id=\"how%20do%20i%20test%20the%20meta%20server%20events%3F\"><h3>How do I test the Meta server events?<\/h3><\/dt>\n<dd><p>Enter the test event code from the Events Manager (tab <em>Test events<\/em>) in the Meta card of the <em>Platforms<\/em> tab. Server events then show up there in real time. The code is removed automatically after 12 hours. For debugging you can make the request blocking, after which the raw Meta response is written to the debug log when <code>WP_DEBUG_LOG<\/code> is enabled:<\/p>\n\n<pre><code>add_filter( 'pxms_capi_blocking', '__return_true' );\n<\/code><\/pre><\/dd>\n<dt id=\"do%20the%20privacy%20trackers%20need%20a%20cookie%20banner%20consent%3F\"><h3>Do the privacy trackers need a cookie banner consent?<\/h3><\/dt>\n<dd><p>That is your decision, and the plugin lets you make it per provider. By default every privacy tracker runs through the same marketing consent gate as the Meta and TikTok pixels \u2013 nothing loads until the visitor accepts, and it then starts without a page reload. The <em>Load without cookie consent<\/em> switch changes that for one provider only; it does not change how any advertising platform loads. Google Ads and GA4 follow the Consent Mode v2 setting: with it they load right away, with every consent signal set to \u201cdenied\u201d.<\/p>\n\n<p>The background: Section 25 TDDDG covers storing information on, or reading it from, a visitor\u2019s device. A tracker that sets no cookie and uses no local storage is not covered by it; the GDPR level applies regardless. Whether that reasoning holds depends on the specific service and where it is hosted, and it is legally contested. Pixel Made Simple makes no claim about any third-party service being compliant \u2013 it only provides the setting.<\/p><\/dd>\n<dt id=\"which%20script%20url%20do%20i%20enter%20for%20plausible%2C%20umami%20or%20rybbit%3F\"><h3>Which script URL do I enter for Plausible, Umami or Rybbit?<\/h3><\/dt>\n<dd><p>The one from your own dashboard, copied verbatim \u2013 for example <code>https:\/\/plausible.io\/js\/script.js<\/code>, <code>https:\/\/cloud.umami.is\/script.js<\/code> or <code>https:\/\/app.rybbit.io\/api\/script.js<\/code>. Self-hosted instances use your own domain instead.<\/p>\n\n<p>The plugin deliberately does not assemble that address from a host name. All three providers have changed their paths at least once (Umami moved from <code>\/umami.js<\/code> to <code>\/script.js<\/code>, Plausible issues newer accounts a per-site tracker filename, Rybbit switched from an attribute to a query parameter). A path guessed by the plugin would eventually be silently wrong: the script loads and no data arrives.<\/p><\/dd>\n<dt id=\"do%20the%20privacy%20trackers%20show%20up%20in%20the%20event%20log%20or%20the%20consent%20statistics%3F\"><h3>Do the privacy trackers show up in the event log or the consent statistics?<\/h3><\/dt>\n<dd><p>No, and that is intentional. They are not conversions, they never go through the Conversions API, and counting them would dilute exactly the numbers you use to investigate missing advertising conversions. The event log and the consent statistics keep reporting on Meta, Google and TikTok only.<\/p><\/dd>\n<dt id=\"how%20does%20the%20plugin%20work%20with%20my%20cookie%20banner%3F\"><h3>How does the plugin work with my cookie banner?<\/h3><\/dt>\n<dd><p>The automatic cookie banner detection (on by default) checks the consent cookies of the supported banner plugins and the WP Consent API on the server. Without marketing consent the browser scripts are deferred (they listen for the banner\u2019s consent events and start right after the click on \u201cAccept\u201d) and, with the default setting \u201cServer-side events: Wait for consent\u201d, the Conversions API request is not sent. Google Ads and GA4 are the exception while Google Consent Mode v2 is on: <code>gtag.js<\/code> then loads right away with every consent signal set to \u201cdenied\u201d. Once the visitor grants marketing consent, the plugin lifts Google\u2019s three advertising signals (<code>ad_storage<\/code>, <code>ad_user_data<\/code>, <code>ad_personalization<\/code>) itself, so Google Ads can count the conversion. <code>analytics_storage<\/code> for GA4 stays your banner\u2019s decision \u2013 turn on Google Consent Mode in your banner, otherwise GA4 only measures without cookies; the <em>Cookie Banner<\/em> tab tells you when it is off. Must-Have Cookie blocks <code>gtag.js<\/code> until the next page view after \u201cAccept\u201d; if Google Ads should not miss a conversion on that first page, exclude <code>gtag.js<\/code> from its blocking. If no supported banner is detected, the <em>Cookie Banner<\/em> tab asks what to do \u2013 track everyone (your site has no banner), block until consent, or check a consent cookie you describe yourself. Until you answer, every visitor is tracked.<\/p>\n\n<p>For unsupported banners you can provide the consent result yourself:<\/p>\n\n<pre><code>add_filter( 'pxms_has_marketing_consent', function ( $consent ) { return my_marketing_consent(); } );\n<\/code><\/pre>\n\n<p>And you can suppress all tracking server-side:<\/p>\n\n<pre><code>add_filter( 'pxms_allow_tracking', function ( $allow ) { return my_consent_check(); } );\n<\/code><\/pre><\/dd>\n<dt id=\"does%20the%20plugin%20work%20with%20page%20caching%3F\"><h3>Does the plugin work with page caching?<\/h3><\/dt>\n<dd><p>The browser pixel: yes. The Conversions API is normally only triggered when PHP actually renders the page, so with aggressive full-page caching you should exclude your conversion pages from the cache \u2013 otherwise CAPI events are not sent at all, and every visitor shares the one event ID baked into the cached HTML.<\/p>\n\n<p>One exception, since 0.11.0: a URL event that participates in the handover to the confirmation page is sent from the browser and generates its event ID per visitor. That one works on a cached page. All other URL events still need the page to be excluded from the cache.<\/p>\n\n<p>Form leads are sent from the browser as well, so they work on cached pages. Since 0.17.1 that also holds when a page has been cached for days: WordPress\u2019s security check (the nonce) in a cached page expires after 12 to 24 hours, and the plugin then fetches a fresh one before it sends \u2013 for form leads and for the handover event on the confirmation page. Pages that were rendered recently send no extra request. In Pixel Made Simple Pro, click events and shop events do without a nonce altogether.<\/p>\n\n<p>Speed plugins that delay JavaScript until the first interaction (LiteSpeed Cache, WP Rocket, xSpeed and others) leave the scripts that record form leads, clicks and shop events alone since 0.19.0 \u2013 otherwise a tap on your phone number as the first interaction would get lost. The pixels of Meta, Google and TikTok stay delayable.<\/p>\n\n<p>Consent is not cached along with the page. When a cookie banner is detected, the page contains no decision \u2013 the visitor\u2019s browser checks the consent cookie on every page view, so a cached page never hands one visitor\u2019s consent to the next.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20notice%20when%20a%20pixel%20runs%20twice%3F\"><h3>Does the plugin notice when a pixel runs twice?<\/h3><\/dt>\n<dd><p>Yes, in two ways. The <em>Platforms<\/em> tab recognises the common tracking plugins (PixelYourSite, Meta for WooCommerce, Meta pixel for WordPress, Site Kit by Google, MonsterInsights, ExactMetrics, Google Analytics for WooCommerce, Google for WooCommerce, Pixel Manager for WooCommerce, TikTok for WooCommerce) and warns you when one of them sends to the same ID. And <em>Check for duplicate pixels<\/em> at the end of that tab loads a page of your site and looks for tracking code that does not come from Pixel Made Simple.<\/p>\n\n<p>Limits of the page check: the contents of a Google Tag Manager container cannot be seen, only the container itself. A pixel that a cookie banner only adds after consent is not in the page yet \u2013 unless the banner keeps it as blocked code in the HTML. One check covers one page; for a pixel that only runs on your thank-you page, enter that address. If your host blocks requests from the site to itself (password protection, a firewall, maintenance mode), the check says so instead of guessing.<\/p><\/dd>\n<dt id=\"how%20do%20i%20know%20that%20my%20access%20token%20works%3F\"><h3>How do I know that my access token works?<\/h3><\/dt>\n<dd><p>Click <em>Test connection<\/em> at the top of the Meta card in the <em>Platforms<\/em> tab \u2013 the button appears once a token is entered. The plugin sends one request with your saved token that Meta rejects on purpose after checking the token \u2013 it contains no event, so nothing is recorded. The answer says in plain words whether the token works for your pixel, belongs to a different pixel, or is invalid or revoked. The same test exists for the TikTok Events API token in Pixel Made Simple Pro.<\/p>\n\n<p>Why a test at all: server-side events are sent without waiting for the answer, so pages stay fast. The log therefore lists them as \u201cSent\u201d \u2013 whether the platform accepted them, only the test (or the live debug bar) can tell.<\/p><\/dd>\n<dt id=\"does%20a%20click%20on%20my%20phone%20number%20count%20as%20a%20call%3F\"><h3>Does a click on my phone number count as a call?<\/h3><\/dt>\n<dd><p>It counts the intent, not the call. Pixel Made Simple Pro can count a click on a phone number, an email address or a WhatsApp button as a conversion (<em>Click Events<\/em> in the <em>Events<\/em> tab). Whether the call really happens, no website can know \u2013 on a computer, a phone link often opens nothing at all. Each rule counts at most once per visit, so repeated taps do not inflate your numbers.<\/p>\n\n<p>WhatsApp chat plugins such as Joinchat and Click to Chat can report clicks to Meta and Google themselves. If that is switched on there as well, the same click counts twice \u2013 use one of the two.<\/p><\/dd>\n<dt id=\"my%20thank-you%20page%20is%20on%20a%20different%20domain.%20does%20the%20handover%20still%20work%3F\"><h3>My thank-you page is on a different domain. Does the handover still work?<\/h3><\/dt>\n<dd><p>No. <code>sessionStorage<\/code> belongs to exactly one origin, so nothing travels to another domain or subdomain \u2013 the same applies to a form inside an iframe from a different origin. In those cases both events are counted separately, exactly as before version 0.11.0. If the confirmation page is on a subdomain, moving it to a path on the main domain (<code>\/thank-you\/<\/code> instead of <code>thanks.example.com<\/code>) is enough to get the full match.<\/p><\/dd>\n<dt id=\"my%20site%20is%20multilingual.%20what%20do%20i%20enter%20as%20the%20url%20rule%3F\"><h3>My site is multilingual. What do I enter as the URL rule?<\/h3><\/dt>\n<dd><p>The rule compares the address as visitors see it, language prefix included. With Polylang or WPML and English under <code>\/en\/<\/code>, an \u201cexact path\u201d rule for <code>\/thanks\/<\/code> does not match <code>\/en\/thanks\/<\/code>. Add one rule per language, or use \u201cURL contains\u201d with <code>\/thanks\/<\/code> if the slug is the same in every language.<\/p><\/dd>\n<dt id=\"google%20ads%20shows%20no%20enhanced%20conversions%20data.%20what%20is%20missing%3F\"><h3>Google Ads shows no enhanced conversions data. What is missing?<\/h3><\/dt>\n<dd><p>Three things have to line up. In your Google Ads account, Enhanced Conversions must be enabled for that conversion action and the customer data terms accepted \u2013 without that Google discards the data silently and still counts the conversion. In the plugin, the event needs a conversion label. And for the phone number Google requires the international format: if your form collects <code>0151 \u2026<\/code> without a country code, only the email address is sent. The filter <code>pxms_normalize_phone<\/code> can add the country code.<\/p><\/dd>\n<dt id=\"which%20filters%20are%20available%3F\"><h3>Which filters are available?<\/h3><\/dt>\n<dd><ul>\n<li><code>pxms_allow_tracking<\/code> \u2013 allow or suppress tracking globally.<\/li>\n<li><code>pxms_has_marketing_consent<\/code> \u2013 override the result of the cookie banner detection (guards the browser pixel).<\/li>\n<li><code>pxms_has_server_consent<\/code> \u2013 the same for server-side signals (Conversions API, TikTok Events API). Only relevant when \u201cServer-side events\u201d is set to \u201cAlways send\u201d.<\/li>\n<li><code>pxms_consent_banner_active<\/code> \u2013 register your own banner with the detection.<\/li>\n<li><code>pxms_consent_events<\/code> \u2013 additional banner events for the frontend listener.<\/li>\n<li><code>pxms_capi_event_data<\/code> \u2013 modify a single CAPI event before it is sent (e.g. add <code>custom_data<\/code>).<\/li>\n<li><code>pxms_capi_user_data<\/code> \u2013 modify the <code>user_data<\/code> payload.<\/li>\n<li><code>pxms_normalize_phone<\/code> \u2013 adjust the normalised phone number before hashing (e.g. add a country code). Also decides whether Google gets a phone number at all: without a country code there is no valid E.164 value, and none is sent.<\/li>\n<li><code>pxms_graph_api_version<\/code> \u2013 override the Graph API version.<\/li>\n<li><code>pxms_capi_blocking<\/code> \u2013 send the CAPI request blocking (debugging).<\/li>\n<li><code>pxms_tiktok_capi_blocking<\/code> \u2013 the same for TikTok Events API requests (Pixel Made Simple Pro, debugging).<\/li>\n<li><code>pxms_client_ip<\/code> \u2013 the visitor\u2019s IP address for the Conversions API and the TikTok Events API, for a proxy the plugin does not know (Cloudflare is recognised automatically). Only take a header such as <code>X-Forwarded-For<\/code> if your own proxy sets it \u2013 otherwise every visitor can choose its value.<\/li>\n<\/ul>\n\n<p>Upgrading from \u201cLightweight Meta Pixel &amp; CAPI Tracker\u201d? These filters used to be called <code>lmpct_*<\/code>. Custom code that hooks into one of them must be updated to the <code>pxms_*<\/code> names \u2013 see the 0.6.0 changelog entry.<\/p><\/dd>\n<dt id=\"how%20do%20i%20translate%20the%20plugin%3F\"><h3>How do I translate the plugin?<\/h3><\/dt>\n<dd><p>Source strings are English. The free version gets its translations from translate.wordpress.org, and WordPress installs them automatically \u2013 its <code>\/languages<\/code> folder only holds the POT template. Pixel Made Simple Pro additionally ships the finished German translation (<code>-de_DE.po<\/code>\/<code>.mo<\/code>). Custom translations made with Loco Translate are best stored under \u201cSystem\u201d (<code>wp-content\/languages\/loco\/plugins\/<\/code>) so they survive updates.<\/p><\/dd>\n<dt id=\"what%20does%20the%20plugin%20store%2C%20and%20what%20stays%20private%3F\"><h3>What does the plugin store, and what stays private?<\/h3><\/dt>\n<dd><ul>\n<li>Personal data is only ever sent to the platforms above, never stored by the plugin. Email addresses and phone numbers from form submissions are hashed (SHA-256) in memory and discarded.<\/li>\n<li>The event log stores event names, event IDs, status codes and the <em>names<\/em> of the match keys used (e.g. <code>em, fbc<\/code>) \u2013 never the values.<\/li>\n<li>The consent statistics store <strong>aggregated daily counters only<\/strong>: one row per calendar day with three integers (sent, blocked by consent, not configured). There is no IP address, no user agent, no event ID and no timestamp below day level \u2013 the plugin does not and cannot track <em>who<\/em> declined consent. Rows older than 30 days are deleted automatically.<\/li>\n<li>The handover to the confirmation page uses the browser\u2019s <code>sessionStorage<\/code> and holds an event ID plus SHA-256 hashes \u2013 four of them since 0.11.1 (Meta and Google normalise differently), never a plain-text email address or phone number. The entry is never sent to the server, does not survive closing the tab, expires after 10 minutes and can be used exactly once. In the default consent mode it is not created at all without marketing consent.<\/li>\n<li>The first-touch attribution cookie <code>pxms_attribution<\/code> (Pro, off by default) stores UTM parameters and click IDs for 30 days in a first-party cookie.<\/li>\n<li>To limit abuse, the requests that send form leads \u2013 and in Pixel Made Simple Pro click and shop events \u2013 are counted per visitor for one minute (with IPv6 per \/64 network). The counter sits in a small table of the plugin under a salted hash of the address, never the address itself, and the daily cleanup removes it. What remains is the number of requests turned away per day, kept for 30 days.<\/li>\n<li>Please check with your data protection officer whether \u201cServer-side events: Always send\u201d is permissible for your site; the default (\u201cWait for consent\u201d) holds back server-side events as well.<\/li>\n<li>WooCommerce purchases (Pro): when an order is placed, the plugin stores the customer\u2019s consent decision with the order and \u2013 only if they consented \u2013 their <code>_fbp<\/code>\/<code>_fbc<\/code> values. The server-side fallback uses them, together with the IP address and user agent WooCommerce stores anyway, when a purchase is reported later (for example after a bank transfer arrives). This way an administrator who updates the order never sends their own data or consent in place of the customer\u2019s. The values stay with the order like WooCommerce\u2019s own customer data.<\/li>\n<\/ul><\/dd>\n<dt id=\"is%20all%20data%20removed%20on%20uninstall%3F\"><h3>Is all data removed on uninstall?<\/h3><\/dt>\n<dd><p>Yes, as soon as neither variant (free or Pro) is installed anymore. <code>uninstall.php<\/code> then deletes all plugin options including the stored access token, the event log table and the scheduled cleanup task. Switching from free to Pro (or back) keeps your configuration \u2013 both use the same option keys.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<p>The complete changelog for every release is at https:\/\/pixelmadesimple.com\/changelog\/ \u2013 this file lists the most recent ones.<\/p>\n\n<h4>0.20.1<\/h4>\n\n<p>Small fixes from the review of 0.20.0.<\/p>\n\n<ul>\n<li>Fixed: the <em>Overview<\/em> listed WooCommerce or SureCart under \u201cWhat is measured\u201d as soon as the shop was installed, even with its tracking switched off. A shop now appears there only when its switch is on; otherwise the card says \u201cShop tracking is off\u201d.<\/li>\n<li>Changed: the empty \u201cLatest events\u201d box on the <em>Overview<\/em> now says what shows up there \u2013 conversions like leads, clicks and purchases, not page views.<\/li>\n<li>Fixed: a code comment for the WordPress Plugin Check sat two lines below the database query it explains, so the check reported the query.<\/li>\n<\/ul>\n\n<h4>0.20.0<\/h4>\n\n<p>A calmer admin: a new <em>Overview<\/em> answers \u201cIs my tracking running?\u201d at a glance, every tab follows one design, and the event editors save themselves.<\/p>\n\n<ul>\n<li>New: the <em>Overview<\/em> tab opens first. One sentence says whether tracking runs, \u201cNeeds your attention\u201d lists what to fix \u2013 each with exactly one action \u2013, and you see your platforms, what is measured, consent of the last 7 days and the latest events. A fresh installation gets four setup steps instead, which you can skip.<\/li>\n<li>New: the sidebar is grouped into <em>Set up<\/em>, <em>Check<\/em> and <em>More<\/em> and shows a count on each tab instead of a dot. On a phone, a header bar with a <em>Menu<\/em> button opens the full menu.<\/li>\n<li>New: the same Google Ads conversion label for different kinds of conversions (form, page event, click, purchase) is flagged \u2013 Google would count leads and purchases as one conversion. So are two active page events with the same rule and the same Meta event, and click events without a Google Ads label while Google Ads is set up.<\/li>\n<li>Changed: the page and click event editors save themselves, like every other field. A new event stays off until its name, page and a platform are set.<\/li>\n<li>Changed: warnings stand where the decision is made, as a short amber line, instead of in yellow boxes; harmless hints are a grey card; side matters moved into the card footer. About 40 % fewer tooltips \u2013 only on fields that need one.<\/li>\n<li>Changed: <em>Cookie banner<\/em> is one card. \u201cServer events: Wait \/ Send right away\u201d is the one choice before consent; what is set automatically is listed below it.<\/li>\n<li>Changed: the <em>Log<\/em> tab shows the event log first, then the consent statistics. In the statistics, \u201cvisitor declined\u201d is grey and \u201clost \u2013 setup missing\u201d is amber, as on the overview.<\/li>\n<li>Changed: the platform cards show exactly one latest event per platform in the footer; an error of the last 24 hours replaces it. The field is now called \u201cGoogle Ads tag ID\u201d.<\/li>\n<li>Changed: the <em>AI assistants<\/em> tab connects in three steps, with ready-to-copy settings for Claude Desktop and Claude Code.<\/li>\n<li>Changed: <em>Help<\/em> sends a support email with a short system report (never tokens, IDs or error messages) and can copy it. The <em>Load without consent<\/em> switch of the privacy trackers is now called <em>Load without cookie consent<\/em>.<\/li>\n<li>Changed: wide screens show two columns where it helps (Forms, Log, AI assistants, Backup, Help).<\/li>\n<\/ul>\n\n<h4>0.19.1<\/h4>\n\n<p>Security and speed: the abuse protection of the public endpoints holds with IPv6 as well and no longer fills the options table, and form leads, clicks and shop events load less code.<\/p>\n\n<ul>\n<li>Fixed: the rate limit of the public endpoints counted every IPv6 address on its own, so one visitor could get around it from their own network. It now counts per \/64 network. The Conversions API still receives the full address.<\/li>\n<li>Changed: the rate limit now keeps its counters in a small table of the plugin instead of two entries per visitor in the options table, and counts reliably when requests arrive at the same moment.<\/li>\n<li>New: the <em>Log<\/em> tab says when the rate limit turned requests away, and the <em>Platforms<\/em> tab says when your server sees every visitor with the address of a proxy \u2013 then all visitors share one limit. Behind such a proxy, the limit for shop events is ten times higher.<\/li>\n<li>Changed: only users who may add their own JavaScript (the <code>unfiltered_html<\/code> capability) can change the script URL of Plausible, Umami or Rybbit \u2013 also through an import. On a multisite, a site administrator could otherwise load any script for all visitors. An address without <code>https:\/\/<\/code> is no longer completed with <code>http:\/\/<\/code>; it is rejected.<\/li>\n<li>Changed (Pixel Made Simple Pro): SureCart\u2019s purchase details for Google Enhanced Conversions are only handed out within an hour after payment, from your own site and within the rate limit.<\/li>\n<li>Fixed (Pixel Made Simple Pro): a SureCart purchase with a manual payment method (bank transfer, invoice) reached Google without Enhanced Conversions, because the purchase details were only handed out for paid orders. Orders in processing now count as well.<\/li>\n<li>Fixed: custom event names with <code>&amp;<\/code>, <code>\"<\/code>, <code>&lt;<\/code> or <code>&gt;<\/code> were called differently in the browser than in the Conversions API, so Meta could not deduplicate them. Both now use the same name.<\/li>\n<li>Fixed: a busy log hid errors older than about two hours from the dot in the sidebar and from \u201cLast error\u201d in the platform cards. Errors of the last 24 hours are now found reliably.<\/li>\n<li>Changed: form leads, clicks and shop events no longer load the admin interface on every request, and the AI abilities load only when an AI tool asks for them.<\/li>\n<li>Changed: smaller fixes \u2013 a value sent as a list is saved empty instead of as \u201cArray\u201d, token fragments are removed from what an AI tool sees, the event log writes and cleans up in smaller steps, and the purchase on the thank-you page waits for consent without polling.<\/li>\n<\/ul>\n\n<h4>0.19.0<\/h4>\n\n<p>Fewer wrong and fewer lost conversions: SureCart\u2019s \u201cAdd To Cart\u201d and failed or rejected form submissions no longer count as leads, confirmation pages on Divi sites report their lead again, and Google Ads now gets the consent from a detected cookie banner. Pixel Made Simple Pro tracks SureCart 4 again.<\/p>\n\n<ul>\n<li>Fixed: on SureCart product pages, every click on \u201cAdd To Cart\u201d counted as a form lead \u2013 for Meta, Google Ads and TikTok. The forms of the SureCart 4 blocks (product page, product cards, quick view, coupon, reviews) are now shop forms and never a lead, with or without Pixel Made Simple Pro.<\/li>\n<li>Fixed: Bricks forms counted as a lead as soon as they were submitted \u2013 even when Bricks then reported an error (mail failed, captcha, validation). They now count only when Bricks reports success; a redirect to a confirmation page keeps the form handover.<\/li>\n<li>Changed: with a detected cookie banner and Google Consent Mode v2, Pixel Made Simple now grants Google\u2019s three advertising signals (<code>ad_storage<\/code>, <code>ad_user_data<\/code>, <code>ad_personalization<\/code>) itself once the visitor has given marketing consent \u2013 also right after \u201cAccept\u201d without reloading. Until now it left that to the banner, and in their standard setup most banners never sent it: Google Ads stayed on \u201cdenied\u201d for every consenting visitor. <code>analytics_storage<\/code> for GA4 remains the banner\u2019s decision.<\/li>\n<li>New: the <em>Cookie Banner<\/em> tab says when your banner itself doesn\u2019t send Google Consent Mode and GA4 is set up \u2013 GA4 then only measures without cookies. Readable for CookieYes, Complianz, SureCookie, Must-Have Cookie and Real Cookie Banner.<\/li>\n<li>Fixed: on Divi sites with the default settings, a confirmation page never sent its lead \u2013 neither the pixel nor the Conversions API \u2013 and with a detected cookie banner, tracking only started on the next page after \u201cAccept\u201d. For visitors, Divi puts a placeholder where jQuery belongs, and the plugin took it for the real thing. It now waits for the real jQuery, and one plugin\u2019s error no longer stops the rest.<\/li>\n<li>Fixed: WPForms with AJAX submission counted no lead at all when jQuery loaded after the plugin\u2019s script (WPForms Lite on block themes). The plugin now picks up jQuery whenever it arrives.<\/li>\n<li>Fixed: Gravity Forms without AJAX counted no lead, and WPForms without AJAX counted rejected submissions too. Both now count the confirmation \u2013 on the same page, or after a redirect to another page of your site.<\/li>\n<li>Fixed: the Divi contact form and Forminator counted rejected submissions as leads, and Ninja Forms counted none. All three now count a successful submission only.<\/li>\n<li>Fixed: speed plugins that delay JavaScript until the first interaction (LiteSpeed Cache \u201cDelayed\u201d, xSpeed, WP Rocket and others) also held back the scripts that record form leads, clicks and shop events. A tap on your phone number as the first interaction, or a confirmation page nobody touched, got lost. These scripts are now excluded from delaying, also with Perfmatters \u201cDelay All Scripts\u201d; the pixels of Meta, Google and TikTok stay delayable as you set them.<\/li>\n<li>Fixed: page builder views (Bricks, Etch, Elementor, Oxygen, Beaver Builder, Divi, Breakdance) were tracked as visits \u2013 for editors with builder access even with <em>Do not track admins<\/em>. Only for logged-in users, so a visitor can\u2019t switch tracking off with a URL parameter.<\/li>\n<li>Fixed (Pixel Made Simple Pro): with SureCart 4, only ViewContent was sent from the browser \u2013 no AddToCart, InitiateCheckout or Purchase, and with it no Google Ads purchase conversion. The plugin now listens to SureCart\u2019s own events. InitiateCheckout is no longer sent for an empty cart.<\/li>\n<li>Fixed (Pixel Made Simple Pro): a SureCart purchase sent up to ten products from other orders to Meta and TikTok. Only the products of this checkout are sent now.<\/li>\n<li>Changed (Pixel Made Simple Pro): while SureCart tracking is on, SureCart\u2019s own Meta and Google tracking is switched off, including the scripts of the SureCart 4 blocks. It sent the same events a second time \u2013 the purchase with a different event ID, so Meta counted every purchase twice.<\/li>\n<li>Fixed (Pixel Made Simple Pro): the WooCommerce block \u201cProduct Button\u201d (the shop page of block themes) put products in the cart without an AddToCart event.<\/li>\n<li>Fixed (Pixel Made Simple Pro): GA4 never received \u201cadd to cart\u201d from a WooCommerce product page, because the page reloads right away. The event is now kept for a moment and sent to GA4 on the next page. AddToCart now carries value and currency, and GA4 checkout and purchase items carry the product name.<\/li>\n<li>Changed: when an ad blocker stops the Meta or TikTok pixel, the event log now shows \u201cServer\u201d instead of \u201cBrowser + Server\u201d, and the debug bar says the pixel didn\u2019t load.<\/li>\n<li>Changed: the frontend scripts are delivered minified \u2013 about a quarter of the size. With <code>SCRIPT_DEBUG<\/code> the readable files load.<\/li>\n<li>Changed: the AI ability <em>get-status<\/em> says when a platform is simply not set up and when you confirmed that your site has no cookie banner, so AI tools don\u2019t report them as problems.<\/li>\n<\/ul>\n\n<h4>0.18.0<\/h4>\n\n<p>AI tools such as Claude can now check your tracking \u2013 and, once you allow it, set up page events.<\/p>\n\n<ul>\n<li>New: the <em>AI assistants<\/em> tab. With WordPress 6.9 or newer, Pixel Made Simple offers its tracking status, event log, consent statistics, page events, duplicate check and connection test as WordPress Abilities. An MCP adapter on your site, such as the official MCP Adapter, makes them available to AI tools like Claude. The tab shows whether everything is ready, the address your AI tool connects to and a button to create an application password, plus a step-by-step guide with a ready-made configuration. The plugin sends nothing to an AI provider \u2013 your AI tool fetches the data itself, signed in as you, and access tokens are never included.<\/li>\n<li>New: with <em>Allow AI to create and change events<\/em> switched on (off by default), an AI tool can create page events, change them and switch them on or off \u2013 never delete them or change settings. In Pixel Made Simple Pro the same goes for click events, including the quick start for calls, email and WhatsApp.<\/li>\n<li>Fixed: findings of the WordPress Plugin Check \u2013 an error message of the duplicate check lacked its note for translators in two places, and in Pixel Made Simple Pro the SureCart event endpoint now cleans product, price and checkout IDs the way WordPress expects (a list sent instead of an ID caused a PHP warning).<\/li>\n<\/ul>\n\n<h4>0.17.2<\/h4>\n\n<p>The help on the settings page now opens from the labels themselves and says less \u2013 only what you need. In Pixel Made Simple Pro, click events can be limited to pages the same way as form leads.<\/p>\n\n<ul>\n<li>Changed: the help behind the small \u201c?\u201d now opens from the label itself \u2013 the label is dotted underlined, and the help appears on hover, on keyboard focus or when you tap it. Escape closes it. Most texts are much shorter.<\/li>\n<li>Changed: the two quick settings in the sidebar lost their icons and take less space \u2013 their explanation opens from the name, like everywhere else \u2013 and the <em>Pro<\/em> badge moved next to the version number.<\/li>\n<li>Changed: \u2713, \u2717 and ! now look the same everywhere \u2013 in the connection test, the cookie banner status, the license tab, the log and the results of the checks.<\/li>\n<li>Changed (Pixel Made Simple Pro): a click event is limited to pages like form leads \u2013 <em>Everywhere<\/em> or <em>Only on \u2026<\/em> with one path per line; it counts on every page whose address contains one of them. Before, a rule took one path with \u201cexact path\u201d or \u201cURL contains\u201d. Existing rules keep their path.<\/li>\n<li>Changed: the <em>Banner detection<\/em> card links to the list of supported cookie banners, and the <em>License<\/em> tab says below the status what the license decides.<\/li>\n<li>Fixed: the \u201cDelete?\u201d confirmation of page and click events turned unreadable \u2013 orange on orange \u2013 while the mouse was over it.<\/li>\n<li>Fixed (Pixel Made Simple Pro): the German translation did not load on WordPress 6.3 and 6.4 \u2013 the plugin stayed English there.<\/li>\n<\/ul>\n\n<h4>0.17.1<\/h4>\n\n<p>Form leads now reach the Conversions API from pages that have been in the page cache for days, and behind Cloudflare the server-side events carry the visitor\u2019s IP address instead of Cloudflare\u2019s.<\/p>\n\n<ul>\n<li>Fixed: on a page that had been cached for more than about a day, form leads and the event of a confirmation page lost their server-side part \u2013 the browser pixel fired, the Conversions API request was rejected, and the log showed nothing. WordPress\u2019s security check (the nonce) in a cached page expires after 12 to 24 hours. When a page is older than that, the plugin now fetches a fresh one before sending \u2013 already at the first click into a form, so the lead goes out without delay. Fresh pages send no extra request.<\/li>\n<li>Fixed (Pixel Made Simple Pro): the same applied to ViewContent and AddToCart on cached product pages, for WooCommerce and SureCart. These requests no longer use a nonce; like the click events, they are checked for coming from your own site and limited per visitor.<\/li>\n<li>Fixed: behind Cloudflare, many hosts pass Cloudflare\u2019s address on instead of the visitor\u2019s, so the Conversions API and the TikTok Events API received a Cloudflare address with every event \u2013 and matching suffered. The plugin now reads the visitor\u2019s address from Cloudflare\u2019s <code>CF-Connecting-IP<\/code> header, but only when the request really comes from one of Cloudflare\u2019s published address ranges: anyone can send that header. For other proxies there is the new filter <code>pxms_client_ip<\/code>.<\/li>\n<li>New: form leads and the event of a confirmation page are only accepted from your own site and are limited to 20 per visitor and minute. Click events have had this since 0.17.0; shop events in Pixel Made Simple Pro allow 60.<\/li>\n<li>New: the live debug bar says \u201cnonce expired (cached page)\u201d or \u201cthrottled (too many requests)\u201d instead of showing a red error.<\/li>\n<\/ul>\n\n<h4>0.17.0<\/h4>\n\n<p>The <em>Page Events<\/em> tab is now called <em>Events<\/em>, and <em>Cookie Banner<\/em> moved further down the sidebar. Pixel Made Simple Pro can now count clicks on your phone number, email address and WhatsApp as conversions.<\/p>\n\n<ul>\n<li>New (Pixel Made Simple Pro): click events in the <em>Events<\/em> tab. A click on a phone number (<code>tel:<\/code>), an email address (<code>mailto:<\/code>) or a WhatsApp button counts as a conversion for Meta \u2013 in the browser and via the Conversions API with the same event ID \u2013 and for Google Ads and TikTok. One click on <em>Count calls<\/em>, <em>Count email clicks<\/em> or <em>Count WhatsApp<\/em> sets it up. A rule can be limited to one number or address and to certain pages, and a CSS selector counts buttons without a link, such as \u201cBook appointment\u201d. WhatsApp buttons of chat plugins that open WhatsApp without a link, such as Joinchat and Click to Chat, count too. Each rule counts at most once per visit; when several rules match a click, only the most specific one counts. The log shows which rule a click came from, and the export includes the rules.<\/li>\n<li>Changed: the <em>Page Events<\/em> tab is now called <em>Events<\/em>. <em>Cookie Banner<\/em> moved below <em>Shop<\/em> in the sidebar \u2013 once set up, it rarely needs attention, and a dot still marks it when it does.<\/li>\n<li>Fixed: without page events, an empty list left a thin line above the \u201cNo page events yet\u201d notice.<\/li>\n<\/ul>","raw_excerpt":"Meta Pixel &amp; Conversions API, Google Ads, GA4 and TikTok. Sales and leads sent once, waiting for your cookie banner. No jQuery.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/364921","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=364921"}],"author":[{"embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/seitzdominik"}],"wp:attachment":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=364921"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=364921"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=364921"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=364921"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=364921"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=364921"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}