{"id":312311,"date":"2026-05-15T21:40:52","date_gmt":"2026-05-15T21:40:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/layersync-for-woocommerce\/"},"modified":"2026-05-25T08:37:02","modified_gmt":"2026-05-25T08:37:02","slug":"layersync-conversion-tracking","status":"publish","type":"plugin","link":"https:\/\/srd.wordpress.org\/plugins\/layersync-conversion-tracking\/","author":23498530,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.24.0","stable_tag":"1.24.0","tested":"6.9.4","requires":"6.5","requires_php":"8.0","requires_plugins":null,"header_name":"LayerSync \u2013 Conversion Tracking, Pixel Manager, and Server-Side API","header_author":"LayerSync","header_description":"Conversion tracking for online stores. Pixel injection plus server-side Conversion API delivery to supported analytics and ad platforms through the LayerSync SaaS. Built for WooCommerce.","assets_banners_color":"e1d6fc","last_updated":"2026-05-25 08:37:02","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/layersynchub.com","header_author_uri":"","rating":5,"author_block_rating":0,"active_installs":0,"downloads":300,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.17.0":{"tag":"1.17.0","author":"layersync","date":"2026-05-15 21:45:00"},"1.18.0":{"tag":"1.18.0","author":"layersync","date":"2026-05-17 18:59:51"},"1.18.1":{"tag":"1.18.1","author":"layersync","date":"2026-05-17 19:24:05"},"1.18.2":{"tag":"1.18.2","author":"layersync","date":"2026-05-17 19:45:44"},"1.19.0":{"tag":"1.19.0","author":"layersync","date":"2026-05-19 16:13:46"},"1.20.0":{"tag":"1.20.0","author":"layersync","date":"2026-05-19 22:19:28"},"1.20.1":{"tag":"1.20.1","author":"layersync","date":"2026-05-20 21:07:50"},"1.20.2":{"tag":"1.20.2","author":"layersync","date":"2026-05-21 13:28:25"},"1.21.0":{"tag":"1.21.0","author":"layersync","date":"2026-05-23 17:10:12"},"1.22.0":{"tag":"1.22.0","author":"layersync","date":"2026-05-23 20:54:49"},"1.22.1":{"tag":"1.22.1","author":"layersync","date":"2026-05-24 14:01:33"},"1.24.0":{"tag":"1.24.0","author":"layersync","date":"2026-05-25 08:37:02"}},"upgrade_notice":{"1.17.0":"<p>Renamed plugin, hardened public events endpoint, moved every inline script to the WP enqueue API, and added several smaller compliance fixes for the WordPress.org Plugin Directory review.<\/p>","1.16.0":"<p>Initial release.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3533447,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3533447,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3533447,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3533447,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.17.0","1.18.0","1.18.1","1.18.2","1.19.0","1.20.0","1.20.1","1.20.2","1.21.0","1.22.0","1.22.1","1.24.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[986,7855,985,1005,286],"plugin_category":[45],"plugin_contributors":[263122],"plugin_business_model":[],"class_list":["post-312311","plugin","type-plugin","status-publish","hentry","plugin_tags-conversion-tracking","plugin_tags-facebook-pixel","plugin_tags-google-ads","plugin_tags-google-analytics","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-layersync","plugin_committers-layersync"],"banners":{"banner":"https:\/\/ps.w.org\/layersync-conversion-tracking\/assets\/banner-772x250.png?rev=3533447","banner_2x":"https:\/\/ps.w.org\/layersync-conversion-tracking\/assets\/banner-1544x500.png?rev=3533447","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/layersync-conversion-tracking\/assets\/icon-128x128.png?rev=3533447","icon_2x":"https:\/\/ps.w.org\/layersync-conversion-tracking\/assets\/icon-256x256.png?rev=3533447","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<h4>Overview<\/h4>\n\n<p>LayerSync is server-side conversion tracking for WooCommerce. It captures ecommerce events and forwards them through the LayerSync SaaS to nine ad and analytics platforms via their server-side APIs \u2014 Meta (Conversions API), Google Analytics 4 (Measurement Protocol), Google Ads (Enhanced Conversions), TikTok (Events API), Pinterest, Snapchat, LinkedIn, Reddit, and X (Twitter).<\/p>\n\n<p>Configuration lives in the LayerSync dashboard, so there's no Google Tag Manager server container, no custom tracking subdomain, no external hosting to manage. The plugin handles WooCommerce; LayerSync handles per-platform delivery.<\/p>\n\n<h4>Why Server-Side Tracking<\/h4>\n\n<p>Browser pixels are increasingly blocked by ad-blockers and degraded by Safari\/iOS tracking-prevention. Sending the same events server-to-server restores conversion data your ad platforms use to optimize. LayerSync ships WooCommerce events over HMAC-signed HTTPS to the LayerSync hub, which calls each platform's CAPI with a shared <code>event_id<\/code> so browser and server halves are deduplicated automatically.<\/p>\n\n<h4>What's Included<\/h4>\n\n<p><strong>Nine ad platforms, one plugin<\/strong> \u2014 Meta CAPI, GA4 MP, Google Ads Enhanced Conversions, TikTok Events API, Pinterest CAPI, Snapchat CAPI, LinkedIn CAPI, Reddit CAPI, X CAPI. Browser pixels + server-side CAPI for all of them, with automatic deduplication.<\/p>\n\n<p><strong>WooCommerce funnel coverage<\/strong> \u2014 view item, add to cart, view cart, begin checkout, add payment info, purchase, refund. HPOS-compatible. Triple-fallback purchase capture (<code>payment_complete<\/code> + <code>checkout_order_processed<\/code> + <code>woocommerce_thankyou<\/code>) so custom checkouts still fire.<\/p>\n\n<p><strong>Lead-form auto-detect<\/strong> \u2014 Contact Form 7, WPForms, Ninja Forms, Formidable Forms, and WooCommerce checkout forms.<\/p>\n\n<p><strong>Browser-side recovery engine<\/strong> \u2014 save-first localStorage queue, priority-aware overflow (purchases never dropped), cross-tab serialization, exponential backoff with jitter, multi-day retention (up to 30 days for purchases), <code>sendBeacon<\/code> on page exit.<\/p>\n\n<p><strong>Privacy &amp; compliance<\/strong> \u2014 per-event consent snapshot, default-denied mode, CMP integration via <code>window.LayerSync.setConsent()<\/code>, SHA-256 PII hashing, IP anonymization, GDPR \/ UK ICO \/ CCPA-aware (Meta Limited Data Use, Do-Not-Sell drop mode).<\/p>\n\n<p><strong>Operational visibility<\/strong> (via the LayerSync hub) \u2014 real-time event status, per-platform delivery success rates, anomaly detection, Slack\/PagerDuty\/email digest alerts (paid plans).<\/p>\n\n<h4>Free vs Paid Plans<\/h4>\n\n<p><strong>Free<\/strong> includes browser pixels for all 9 platforms, server-side CAPI to one platform of your choice, 1 site, 1 team seat, 10,000 events\/month, WooCommerce + lead-form auto-tracking, event quality scoring, real-time event log.<\/p>\n\n<p><strong>Paid plans<\/strong> add: server-side CAPI to all 9 platforms, higher event quotas, multiple sites, team seats, Slack\/PagerDuty alerts, anomaly detection, audience builder, ROI dashboard, user journeys, customer profiles, automatic conversion recovery, custom event definitions, white-label (enterprise), custom ingest domain (enterprise).<\/p>\n\n<p><a href=\"https:\/\/layersynchub.com\/pricing\">Compare Plans<\/a><\/p>\n\n<h4>For Developers<\/h4>\n\n<p>LayerSync exposes a JavaScript API, a same-origin REST endpoint, and WordPress hooks for custom event tracking.<\/p>\n\n<p><strong>JavaScript API:<\/strong><\/p>\n\n<pre><code>window.LayerSync.track('lead', {email: 'user@example.com', value: 25.00, currency: 'USD'});\nwindow.LayerSync.setConsent({ad_storage: 'granted', ad_user_data: 'granted'});\n<\/code><\/pre>\n\n<p><strong>REST endpoint<\/strong> (same-origin, nonce-protected, survives ad-blockers and corporate firewalls):<\/p>\n\n<pre><code>POST \/wp-json\/layersync\/v1\/events\n<\/code><\/pre>\n\n<p><strong>WordPress filter hooks:<\/strong> <code>layersync_event_payload<\/code>, <code>layersync_event_before_enqueue<\/code>, <code>layersync_event_after_delivery<\/code>, <code>layersync_consent<\/code>.<\/p>\n\n<p>Full API documentation: <a href=\"https:\/\/layersynchub.com\/docs\">layersynchub.com\/docs<\/a>.<\/p>\n\n<h4>Compatibility<\/h4>\n\n<p>Works alongside Cookiebot, CookieYes, OneTrust, Borlabs Cookie, Complianz, and any CMP that supports a JS consent callback. Compatible with WP Rocket, LiteSpeed Cache, W3 Total Cache, Cloudflare, and other major caching\/CDN solutions.<\/p>\n\n<h4>Getting Started<\/h4>\n\n<ol>\n<li>Sign up at <a href=\"https:\/\/layersynchub.com\">layersynchub.com<\/a> and create your first site.<\/li>\n<li>Install and activate LayerSync from the WordPress plugin directory.<\/li>\n<li>Visit <strong>LayerSync \u2192 Settings<\/strong> in wp-admin and paste your API key, API secret, and Site ID.<\/li>\n<li>Click <strong>Test connection<\/strong> \u2014 once green, configure your platforms (Meta Pixel ID, GA4 Measurement ID, etc.) in the LayerSync dashboard.<\/li>\n<li>Events start firing within seconds; check the <strong>Live Events<\/strong> tab to confirm.<\/li>\n<\/ol>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to external third-party services to provide its functionality. Below is a complete list of all external services, when they are called, what data is transmitted, and links to their terms of service and privacy policies.<\/p>\n\n<p><strong>LayerSync SaaS Hub (Always Active):<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> LayerSync (https:\/\/layersynchub.com)<\/li>\n<li><strong>Purpose:<\/strong> Receives every WooCommerce \/ form \/ page event from your site and dispatches matching Conversions API calls to each connected ad platform. Stores the order ledger for conversion recovery, the queue table for outage survivability, and provides the configuration dashboard for your platforms.<\/li>\n<li><strong>What data is sent:<\/strong> Event name, timestamp, hashed user data (email, phone, name SHA-256), product\/order data (SKU, value, currency, quantity), browser-side context (page URL, referrer, user agent, IP \u2014 IP can be anonymized in settings), <code>event_id<\/code> for deduplication, consent snapshot<\/li>\n<li><strong>When it's sent:<\/strong> When a tracked event occurs (page view, product view, add to cart, purchase, refund, lead, etc.). Browser-side: sent via the same-origin REST proxy. Server-side: sent from PHP via WordPress HTTP API.<\/li>\n<li><strong>Service provider:<\/strong> LayerSync<\/li>\n<li><strong>Terms of Service:<\/strong> https:\/\/layersynchub.com\/terms<\/li>\n<li><strong>Privacy Policy:<\/strong> https:\/\/layersynchub.com\/privacy<\/li>\n<\/ul>\n\n<p><strong>When You Enable Meta Pixel \/ Conversions API:<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> Meta (Facebook) Graph API<\/li>\n<li><strong>Purpose:<\/strong> Send conversion events to Meta for ad optimization<\/li>\n<li><strong>What data is sent:<\/strong> Event name, timestamp, hashed user email\/phone, click ID (<code>fbclid<\/code> \/ <code>fbp<\/code> \/ <code>fbc<\/code>), product SKU, revenue, IP, user agent, Pixel ID<\/li>\n<li><strong>When it's sent:<\/strong> Automatically when a tracked event occurs and Meta is enabled in your LayerSync dashboard<\/li>\n<li><strong>Service provider:<\/strong> Meta Platforms, Inc.<\/li>\n<li><strong>Terms of Service:<\/strong> https:\/\/www.facebook.com\/legal\/terms<\/li>\n<li><strong>Privacy Policy:<\/strong> https:\/\/www.facebook.com\/privacy\/policy<\/li>\n<\/ul>\n\n<p><strong>When Loading Meta Pixel Script (If Enabled):<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> Facebook Connect CDN<\/li>\n<li><strong>Purpose:<\/strong> Load fbevents.js for browser-side Meta Pixel<\/li>\n<li><strong>What data is sent:<\/strong> Standard HTTP request data (IP, user agent, referrer)<\/li>\n<li><strong>When it's sent:<\/strong> On every page load when Meta browser tracking is enabled<\/li>\n<li><strong>Script URL:<\/strong> https:\/\/connect.facebook.net\/en_US\/fbevents.js<\/li>\n<\/ul>\n\n<p><strong>When You Enable Google Analytics 4 \/ Google Ads:<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> Google Analytics 4 Measurement Protocol + Google Ads API<\/li>\n<li><strong>Purpose:<\/strong> Send analytics + conversion events to Google for reporting and ad optimization<\/li>\n<li><strong>What data is sent:<\/strong> Event name, page URL, referrer, session ID, client ID, IP, user agent, device info, hashed user data for Enhanced Conversions<\/li>\n<li><strong>Service provider:<\/strong> Google LLC<\/li>\n<li><strong>Terms of Service:<\/strong> https:\/\/marketingplatform.google.com\/about\/analytics\/terms\/us\/<\/li>\n<li><strong>Privacy Policy:<\/strong> https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p><strong>When Loading Google Tag Script (If Enabled):<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> Google Tag Manager CDN<\/li>\n<li><strong>Purpose:<\/strong> Load gtag.js for browser-side GA4 + Google Ads tracking<\/li>\n<li><strong>Script URL:<\/strong> https:\/\/www.googletagmanager.com\/gtag\/js<\/li>\n<\/ul>\n\n<p><strong>When You Enable TikTok Events API:<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> TikTok Business API<\/li>\n<li><strong>Purpose:<\/strong> Send conversion events to TikTok for ad optimization<\/li>\n<li><strong>Script URL (if browser pixel enabled):<\/strong> https:\/\/analytics.tiktok.com\/i18n\/pixel\/events.js<\/li>\n<li><strong>Privacy Policy:<\/strong> https:\/\/www.tiktok.com\/legal\/privacy-policy<\/li>\n<\/ul>\n\n<p><strong>When You Enable Pinterest Conversions API:<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> Pinterest Tag + Conversions API<\/li>\n<li><strong>Purpose:<\/strong> Send conversion events to Pinterest for ad optimization<\/li>\n<li><strong>Script URL (if browser pixel enabled):<\/strong> https:\/\/s.pinimg.com\/ct\/core.js<\/li>\n<li><strong>Privacy Policy:<\/strong> https:\/\/policy.pinterest.com\/en\/privacy-policy<\/li>\n<\/ul>\n\n<p><strong>When You Enable Snapchat Conversions API:<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> Snap Pixel + Conversions API<\/li>\n<li><strong>Purpose:<\/strong> Send conversion events to Snapchat for ad optimization<\/li>\n<li><strong>Script URL (if browser pixel enabled):<\/strong> https:\/\/sc-static.net\/scevent.min.js<\/li>\n<li><strong>Privacy Policy:<\/strong> https:\/\/snap.com\/en-US\/privacy\/privacy-policy<\/li>\n<\/ul>\n\n<p><strong>When You Enable LinkedIn Insight Tag + Conversions API:<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> LinkedIn Marketing API<\/li>\n<li><strong>Purpose:<\/strong> Send conversion events to LinkedIn for ad optimization<\/li>\n<li><strong>Script URL (if browser pixel enabled):<\/strong> https:\/\/snap.licdn.com\/li.lms-analytics\/insight.min.js<\/li>\n<li><strong>Privacy Policy:<\/strong> https:\/\/www.linkedin.com\/legal\/privacy-policy<\/li>\n<\/ul>\n\n<p><strong>When You Enable Reddit Pixel + Conversion API:<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> Reddit Ads API<\/li>\n<li><strong>Purpose:<\/strong> Send conversion events to Reddit for ad optimization<\/li>\n<li><strong>Script URL (if browser pixel enabled):<\/strong> https:\/\/www.redditstatic.com\/ads\/pixel.js<\/li>\n<li><strong>Privacy Policy:<\/strong> https:\/\/www.reddit.com\/policies\/privacy-policy<\/li>\n<\/ul>\n\n<p><strong>When You Enable X (Twitter) Pixel + Conversion API:<\/strong><\/p>\n\n<ul>\n<li><strong>Service:<\/strong> X Ads API<\/li>\n<li><strong>Purpose:<\/strong> Send conversion events to X for ad optimization<\/li>\n<li><strong>Script URL (if browser pixel enabled):<\/strong> https:\/\/static.ads-twitter.com\/uwt.js<\/li>\n<li><strong>Privacy Policy:<\/strong> https:\/\/x.com\/en\/privacy<\/li>\n<\/ul>\n\n<p><strong>Important Notes:<\/strong><\/p>\n\n<ul>\n<li><strong>No automatic data sharing:<\/strong> LayerSync does NOT send any data to ad platforms unless you explicitly enable them in your LayerSync dashboard<\/li>\n<li><strong>Consent-aware:<\/strong> LayerSync respects user consent state via the <code>window.LayerSync.setConsent()<\/code> API and only fires browser pixels and server events after consent is granted<\/li>\n<li><strong>You control the data:<\/strong> You choose which platforms to enable, what events to track, and what user data to include (emails, phones, etc.)<\/li>\n<li><strong>Required account:<\/strong> This plugin requires a LayerSync account to operate. The plugin alone does not function without API credentials from layersynchub.com.<\/li>\n<\/ul>\n\n<h3>Privacy Policy<\/h3>\n\n<p>LayerSync sends the following data to the LayerSync SaaS hub (https:\/\/layersynchub.com):<\/p>\n\n<p><strong>Per-Event Data:<\/strong><\/p>\n\n<ul>\n<li>Event name (e.g. <code>purchase<\/code>, <code>add_to_cart<\/code>)<\/li>\n<li>Timestamp<\/li>\n<li>Page URL and referrer<\/li>\n<li>User agent<\/li>\n<li>IP address (configurable \u2014 can be anonymized)<\/li>\n<li><code>event_id<\/code> for deduplication<\/li>\n<li>Visitor consent snapshot at the moment of the event<\/li>\n<li>LayerSync first-party visitor ID (<code>layersync_uid<\/code> cookie \u2014 UUIDv4, 2-year sliding expiry)<\/li>\n<\/ul>\n\n<p><strong>For E-Commerce Events:<\/strong><\/p>\n\n<ul>\n<li>Product SKU, title, category, image URL, price, currency, quantity<\/li>\n<li>Order ID, total, currency (for purchase \/ refund events)<\/li>\n<\/ul>\n\n<p><strong>For Lead \/ Form Events:<\/strong><\/p>\n\n<ul>\n<li>Form ID, submission ID, field values you've configured as trackable<\/li>\n<\/ul>\n\n<p><strong>Hashed User Data (when available, hashed BEFORE leaving your server):<\/strong><\/p>\n\n<ul>\n<li>Email (SHA-256)<\/li>\n<li>Phone (SHA-256)<\/li>\n<li>First name (SHA-256)<\/li>\n<li>Last name (SHA-256)<\/li>\n<li>City, state, zip, country (SHA-256)<\/li>\n<\/ul>\n\n<p>LayerSync hashes PII server-side before forwarding to any ad platform.<\/p>\n\n<p><strong>External Data Sharing (Only When You Enable Each Platform):<\/strong><\/p>\n\n<p>Per-platform data forwarding is documented in the <strong>External services<\/strong> section above. No data is sent to any ad platform unless you explicitly enable it in your LayerSync dashboard.<\/p>\n\n<p><strong>Privacy Controls:<\/strong><\/p>\n\n<ul>\n<li><strong>IP Anonymization:<\/strong> Available in Settings \u2192 Privacy.<\/li>\n<li><strong>Consent Integration:<\/strong> Respects <code>window.LayerSync.setConsent({...})<\/code> for Cookiebot, CookieYes, OneTrust, Borlabs Cookie, Complianz, and custom consent managers.<\/li>\n<li><strong>Default-denied mode:<\/strong> Treats all visitors as consent-denied until a CMP signals otherwise \u2014 suitable for EU\/UK traffic.<\/li>\n<li><strong>Right to delete:<\/strong> Send a <code>POST \/api\/v1\/privacy\/delete<\/code> request to LayerSync with the visitor's <code>external_id<\/code> (or hashed email \/ phone) and all matching events, audit rows, customer profile entries, landing signals, and delivery records are removed.<\/li>\n<\/ul>\n\n<p><strong>Your Responsibilities:<\/strong><\/p>\n\n<ul>\n<li>Disclose LayerSync's data flow in your site's privacy policy<\/li>\n<li>Obtain user consent before tracking, where required by law<\/li>\n<li>Configure data retention and privacy settings appropriately<\/li>\n<li>Honor user data-deletion requests via the LayerSync privacy API<\/li>\n<\/ul>\n\n<h3>Support<\/h3>\n\n<ul>\n<li><a href=\"https:\/\/layersynchub.com\/docs\">Documentation<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.org\/support\/plugin\/layersync-conversion-tracking\">Support<\/a><\/li>\n<li><a href=\"https:\/\/layersynchub.com\/contact\">Contact us<\/a><\/li>\n<\/ul>\n\n<h3>Trademarks &amp; Third-Party Services<\/h3>\n\n<p>LayerSync integrates with various third-party analytics and advertising platforms. All trademarks, service marks, and company names mentioned in this plugin are the property of their respective owners.<\/p>\n\n<p><strong>Third-Party Platforms:<\/strong><\/p>\n\n<ul>\n<li>Meta, Facebook, Instagram, and Facebook Pixel are trademarks of Meta Platforms, Inc.<\/li>\n<li>Google, Google Analytics, Google Ads, and GA4 are trademarks of Google LLC.<\/li>\n<li>TikTok is a trademark of ByteDance Ltd.<\/li>\n<li>Pinterest is a trademark of Pinterest, Inc.<\/li>\n<li>Snapchat is a trademark of Snap Inc.<\/li>\n<li>LinkedIn is a trademark of Microsoft Corporation.<\/li>\n<li>X (Twitter) is a trademark of X Corp.<\/li>\n<li>Reddit is a trademark of Reddit, Inc.<\/li>\n<li>WooCommerce is a trademark of Automattic, Inc.<\/li>\n<\/ul>\n\n<p><strong>Integration Requirements:<\/strong><\/p>\n\n<ul>\n<li>Users must have active accounts with third-party platforms to use their respective features<\/li>\n<li>API access requires platform-specific credentials and compliance with their terms of service<\/li>\n<li>Data transmission follows each platform's API specifications and privacy policies<\/li>\n<li>Users are responsible for compliance with each platform's terms of service<\/li>\n<\/ul>\n\n<p>LayerSync is an independent plugin and SaaS, and is not officially affiliated with, endorsed by, or sponsored by any of the companies mentioned above. All product names, logos, brands, and trademarks are property of their respective owners.<\/p>\n\n<p><strong>Data Privacy:<\/strong> LayerSync forwards event data to enabled ad platforms only with user consent. No data is transmitted to any third party unless explicitly configured by the site administrator.<\/p>\n\n<!--section=installation-->\n<h4>From WordPress Admin<\/h4>\n\n<ol>\n<li>Go to <strong>Plugins \u2192 Add New<\/strong><\/li>\n<li>Search for <strong>\"LayerSync\"<\/strong><\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong><\/li>\n<\/ol>\n\n<h4>Manual Upload<\/h4>\n\n<ol>\n<li>Download the ZIP from WordPress.org<\/li>\n<li>Go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong><\/li>\n<li>Upload the ZIP, install, and activate<\/li>\n<\/ol>\n\n<h4>After Activation<\/h4>\n\n<ol>\n<li>Sign up at <a href=\"https:\/\/layersynchub.com\">layersynchub.com<\/a> if you haven't already<\/li>\n<li>Create a site in your LayerSync dashboard and copy your API key, API secret, and Site ID<\/li>\n<li>Go to <strong>LayerSync \u2192 Settings<\/strong> in wp-admin<\/li>\n<li>Paste your credentials and click <strong>Test connection<\/strong><\/li>\n<li>Once green, configure your ad platforms (Meta Pixel ID, GA4 Measurement ID, etc.) in your LayerSync dashboard<\/li>\n<li>Events start firing automatically; verify in the <strong>Live Events<\/strong> tab<\/li>\n<\/ol>\n\n<p>WooCommerce is recommended but not required \u2014 without WC, the plugin runs in pixel-only mode (no add-to-cart \/ purchase hooks, but browser pixels still fire and lead-form tracking works).<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20does%20layersync%20improve%20roas%20and%20lower%20cpa%3F\"><h3>How does LayerSync improve ROAS and lower CPA?<\/h3><\/dt>\n<dd><p>When browser-side pixels miss conversions (due to iOS 14+, ad blockers, or cookie restrictions), ad platforms optimize on incomplete data and your cost-per-acquisition rises. LayerSync fixes this by sending conversion events <strong>server-to-server<\/strong> to every connected platform via their respective Conversions API. Browser and server events are deduplicated automatically using a shared <code>event_id<\/code>, so platforms see more of your real conversions without double-counting. More complete data means better optimization and improved Return on Ad Spend.<\/p><\/dd>\n<dt id=\"how%20do%20i%20set%20up%20meta%20pixel%20with%20server-side%20tracking%3F\"><h3>How do I set up Meta Pixel with server-side tracking?<\/h3><\/dt>\n<dd><ol>\n<li>Install and activate LayerSync<\/li>\n<li>Sign up at <a href=\"https:\/\/layersynchub.com\">layersynchub.com<\/a> and create your site<\/li>\n<li>In your LayerSync dashboard, go to <strong>Platforms \u2192 Meta<\/strong> and paste your Pixel ID + Conversions API Access Token (both from Meta Events Manager)<\/li>\n<li>Save and click <strong>Test Connection<\/strong><\/li>\n<\/ol>\n\n<p>LayerSync automatically fires both the browser Meta Pixel and Meta Conversions API events server-to-server. They're deduplicated using a shared <code>event_id<\/code>. User data (email, phone, name, address) is SHA-256 hashed and sent as Advanced Matching parameters for maximum Event Match Quality (EMQ). No Google Tag Manager server container required.<\/p><\/dd>\n<dt id=\"what%20is%20server-side%20tracking%20and%20why%20do%20i%20need%20it%3F\"><h3>What is server-side tracking and why do I need it?<\/h3><\/dt>\n<dd><p>Server-side tracking sends conversion events directly from your server to ad platforms \u2014 instead of relying only on browser JavaScript pixels. This matters because:<\/p>\n\n<ul>\n<li><strong>Ad blockers<\/strong> block ~40% of browser tracking pixels<\/li>\n<li><strong>iOS 14+ App Tracking Transparency<\/strong> reduced Meta Pixel reported conversions by 30\u201340%<\/li>\n<li><strong>Safari ITP<\/strong> limits first-party cookies to 7 days, causing session data loss<\/li>\n<li><strong>Browser privacy features<\/strong> increasingly restrict third-party tracking<\/li>\n<\/ul>\n\n<p>With server-side tracking, your conversion data bypasses all browser restrictions. Ad platforms see your real sales, optimize better, and your ROAS improves.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20layersync%20account%3F\"><h3>Do I need a LayerSync account?<\/h3><\/dt>\n<dd><p>Yes. This plugin connects WordPress to the LayerSync SaaS, which performs the actual server-to-server dispatch to each ad platform. The LayerSync account is what configures which platforms are enabled, stores your API credentials encrypted, and runs the queue + recovery worker. A free plan is available.<\/p><\/dd>\n<dt id=\"how%20many%20ad%20platforms%20does%20layersync%20support%3F\"><h3>How many ad platforms does LayerSync support?<\/h3><\/dt>\n<dd><p>Nine: Meta (Facebook &amp; Instagram), Google Ads, Google Analytics 4, TikTok, Pinterest, Snapchat, LinkedIn, Reddit, and X (Twitter). All nine are server-side, all nine are available on paid plans. The free plan supports browser pixels for all 9 and server-side CAPI for one of your choice.<\/p><\/dd>\n<dt id=\"does%20layersync%20work%20with%20woocommerce%3F\"><h3>Does LayerSync work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. LayerSync automatically tracks the full WooCommerce funnel: product view \u2192 add to cart \u2192 view cart \u2192 begin checkout \u2192 add payment info \u2192 purchase \u2192 refund. Order metadata (value, SKU, currency, quantity, category) is captured automatically. HPOS-compatible. Triple-fallback purchase hook (payment_complete + checkout_processed + thankyou) ensures no transaction is missed.<\/p><\/dd>\n<dt id=\"what%20about%20easy%20digital%20downloads%2C%20surecart%2C%20memberpress%3F\"><h3>What about Easy Digital Downloads, SureCart, MemberPress?<\/h3><\/dt>\n<dd><p>The current release covers WooCommerce and any custom integration via the JavaScript \/ REST APIs. Support for additional ecommerce platforms is on the roadmap.<\/p><\/dd>\n<dt id=\"does%20layersync%20slow%20down%20my%20website%3F\"><h3>Does LayerSync slow down my website?<\/h3><\/dt>\n<dd><p>No. The browser tracking script loads asynchronously (non-blocking), events are batched server-side, the same-origin REST proxy is lightweight, and the plugin uses indexed database tables. Compatible with WP Rocket, LiteSpeed Cache, W3 Total Cache, Cloudflare, and other caching\/CDN solutions. The browser-side recovery queue uses localStorage with strict size limits \u2014 no measurable impact on page load.<\/p><\/dd>\n<dt id=\"does%20layersync%20work%20with%20high-performance%20order%20storage%20%28hpos%29%3F\"><h3>Does LayerSync work with High-Performance Order Storage (HPOS)?<\/h3><\/dt>\n<dd><p>Yes. LayerSync is fully compatible with WooCommerce HPOS. WC order data is read via the standard <code>wc_get_order()<\/code> API which abstracts over both storage modes.<\/p><\/dd>\n<dt id=\"is%20layersync%20gdpr%20and%20ccpa%20compliant%3F\"><h3>Is LayerSync GDPR and CCPA compliant?<\/h3><\/dt>\n<dd><p>Yes. The plugin captures per-event consent state and respects it during retries. There's an admin toggle for \"default to denied until consent\" suitable for EU\/UK traffic. CMPs integrate via <code>window.LayerSync.setConsent({ad_storage: 'granted', ad_user_data: 'granted', ad_personalization: 'granted'})<\/code>. PII (email, phone, name, address) is SHA-256 hashed server-side before any platform handoff. IP anonymization is supported.<\/p><\/dd>\n<dt id=\"does%20layersync%20support%20google%20consent%20mode%20v2%3F\"><h3>Does LayerSync support Google Consent Mode v2?<\/h3><\/dt>\n<dd><p>Yes \u2014 via the <code>setConsent()<\/code> API. Pass the v2 fields (<code>ad_user_data<\/code>, <code>ad_personalization<\/code>) and LayerSync forwards them to Google's gtag in the correct shape.<\/p><\/dd>\n<dt id=\"does%20layersync%20support%20meta%20limited%20data%20use%20%28ldu%29%20for%20california%20traffic%3F\"><h3>Does LayerSync support Meta Limited Data Use (LDU) for California traffic?<\/h3><\/dt>\n<dd><p>Yes. The Privacy tab has an LDU toggle. When enabled, every Meta server event ships with <code>data_processing_options: ['LDU']<\/code> so California-resident traffic is CCPA-compliant.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20layersync%27s%20saas%20goes%20down%3F\"><h3>What happens if LayerSync's SaaS goes down?<\/h3><\/dt>\n<dd><p>Browser pixels keep firing directly to ad platforms (they're independent of the LayerSync hub). Server-side events queue in your WordPress database for up to 30 days for critical events (purchases, refunds), 7 days for high-value funnel events (add-to-cart, begin-checkout, lead), and shorter windows for behavioral events. When LayerSync recovers, the queue drains automatically without intervention.<\/p><\/dd>\n<dt id=\"can%20i%20track%20custom%20events%3F\"><h3>Can I track custom events?<\/h3><\/dt>\n<dd><p>Yes. Use the JavaScript API:<\/p>\n\n<pre><code>window.LayerSync.track('button_click', {button_name: 'Download PDF', value: 0});\n<\/code><\/pre>\n\n<p>Or the REST endpoint from your own PHP code:<\/p>\n\n<pre><code>POST \/wp-json\/layersync\/v1\/events\n<\/code><\/pre>\n\n<p>Custom event definitions per site (with per-platform name mapping) are available on paid plans.<\/p><\/dd>\n<dt id=\"can%20i%20export%20my%20data%3F\"><h3>Can I export my data?<\/h3><\/dt>\n<dd><p>Yes. Every report in the LayerSync dashboard has a CSV export. You can also pull data programmatically via the REST API on paid plans.<\/p><\/dd>\n<dt id=\"does%20layersync%20replace%20my%20existing%20pixel%20plugins%3F\"><h3>Does LayerSync replace my existing pixel plugins?<\/h3><\/dt>\n<dd><p>Yes. The plugin loads each platform's pixel SDK directly from the platform CDN with hashed Advanced Matching set at init time. You can disable any other Meta\/Google\/TikTok pixel plugins. Don't run two plugins that load the same pixel \u2014 both will fire, doubling your conversion counts.<\/p><\/dd>\n<dt id=\"can%20i%20use%20layersync%20on%20client%20sites%20%2F%20agency%20white-label%3F\"><h3>Can I use LayerSync on client sites \/ agency white-label?<\/h3><\/dt>\n<dd><p>Yes. The free WordPress plugin can be installed on unlimited sites. Each site connects to one LayerSync account. Agencies running multiple client stores use the Growth or Enterprise tiers, which include white-label branding, custom ingest domain, and multi-site management from a single dashboard.<\/p><\/dd>\n<dt id=\"what%27s%20the%20difference%20between%20free%20and%20paid%20plans%3F\"><h3>What's the difference between Free and Paid plans?<\/h3><\/dt>\n<dd><p><strong>Free<\/strong> includes: browser pixels for all 9 platforms, server-side CAPI to one platform of your choice, 1 site, 1 team seat, 10K events\/month, WooCommerce + lead-form auto-tracking, event quality scoring, real-time event log.<\/p>\n\n<p><strong>Paid plans<\/strong> add: server-side CAPI to all 9 platforms, higher event quotas, multiple sites, team seats, Slack\/PagerDuty alerts, anomaly detection, audience builder, ROI dashboard, user journeys, customer profiles, automatic conversion recovery, custom event definitions, white-label (enterprise), custom ingest domain (enterprise).<\/p>\n\n<p><a href=\"https:\/\/layersynchub.com\/pricing\">Compare Plans<\/a><\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.24.0<\/h4>\n\n<ul>\n<li>Admin information architecture rewrite. The single tabbed page is replaced by 11 native WordPress submenus under the LayerSync sidebar entry \u2014 Overview, Setup, Platforms, Events &amp; Quality, Campaign Truth, Recovery &amp; Revenue, Audiences &amp; Identity, Leads &amp; Forms, Scripts &amp; Integrations, Diagnostics &amp; Logs, and Settings. Every existing <code>?tab=<\/code> URL 301-redirects to its new location with a one-shot \"We moved this page\" notice; bookmarks keep working.<\/li>\n<li>Action Scheduler queue dispatch with dead-letter status, manual replay controls, configurable retention (default 30 days), and full audit log of every queue state transition. Replaces the prior WP-Cron loop without changing the deterministic <code>event_id<\/code> formula or browser\/server pairing guarantees.<\/li>\n<li>Microsoft Advertising (Bing UET) support \u2014 UET browser events for view_item \/ add_to_cart \/ begin_checkout \/ purchase \/ lead \/ sign_up, <code>msclkid<\/code> capture, SHA-256 enhanced-conversions field hashing, consent-gated dispatch.<\/li>\n<li>Google Analytics 4 Data API reconciliation. Compares WooCommerce orders, LayerSync queue rows, and GA4 purchases and classifies each into match \/ missing in GA4 \/ duplicate in GA4 \/ value mismatch buckets, configurable lag window default 48h.<\/li>\n<li>WP Consent API bridge with auto-detection for 7 popular CMPs (Complianz, Cookiebot, CookieYes, Borlabs, iubenda, OneTrust, Moove). Resolved Consent Mode v2 state rides every event and gates server-side dispatch + PII stripping.<\/li>\n<li>Form-submission lead tracking added for Gravity Forms, Fluent Forms, and Elementor Forms (in addition to the existing CF7 \/ WPForms \/ Ninja \/ Formidable support).<\/li>\n<li>Identity Quality scoring with per-platform weighted identifier tables for 10 ad platforms.<\/li>\n<li>Bot detection scoring with 7 reason codes (datacenter IP, Apple Private Relay, bad user-agent, velocity spike, no-JS, impossible journey, repeated event_id), merchant safe-list, and reporting that excludes bot traffic from ad-platform dispatch.<\/li>\n<li>Historical backfill worker with 30 \/ 90 \/ 180 \/ 365-day windows, dry-run mode, and Action Scheduler-batched processing.<\/li>\n<li>Safe External Scripts manager \u2014 page targeting (all \/ product \/ category \/ cart \/ checkout \/ thank-you \/ custom), consent targeting, trigger rules, and 7 hard-blocked dangerous patterns (eval, new Function, document.write, innerHTML=, document.cookie, LayerSync REST URLs, <code>layersync_<\/code> identifiers).<\/li>\n<li>Signal Doctor \u2014 per-event weak-match diagnosis with actionable fix copy per ad platform.<\/li>\n<li>Platform Overclaim Shield \u2014 multi-platform claim-conflict detection on the same order with evidence-based confidence scoring.<\/li>\n<li>Consent-Recovery Graph \u2014 every conversion classified into 7 buckets (browser\/server matched, server-only recovered, consent limited, bot excluded, failed then retried, missing identity, platform rejected).<\/li>\n<li>Accessibility \u2014 WAI-ARIA tablist on every sub-tab nav, skip-to-main-content link, breadcrumbs with <code>aria-current=\"page\"<\/code>, status badges wrapped in <code>role=\"status\"<\/code>, and visible <code>:focus-visible<\/code> outlines across every interactive element.<\/li>\n<li>No schema migrations introduced. 33 new PHPUnit tests added; full suite 719 tests \/ 0 failures.<\/li>\n<\/ul>\n\n<h4>1.22.1<\/h4>\n\n<ul>\n<li>Fixed popup tracking events (popup_impression, popup_visible, popup_cta_click, etc.) returning HTTP 403 for logged-in users. Root cause: WordPress's REST API processes requests without X-WP-Nonce as user ID 0, but the nonce was being created with the logged-in user's ID \u2014 causing wp_verify_nonce to fail on the server. The public event proxy nonce is now always created with user ID 0 context, matching the REST verification context for all visitor types.<\/li>\n<\/ul>\n\n<h4>1.22.0<\/h4>\n\n<ul>\n<li>Added lightweight browser-side bot probe to every browser event payload. Collects passive signals (webdriver flag, pointer\/scroll\/keyboard interaction, screen size, timezone, page-time) using one-shot passive event listeners \u2014 no fingerprinting, no impact on page load. The probe is stripped from all outbound platform payloads and used only by the LayerSync server-side bot classifier to more accurately distinguish real visitors from automated traffic.<\/li>\n<\/ul>\n\n<h4>1.21.0<\/h4>\n\n<ul>\n<li>Improved GA4 ecommerce tracking accuracy across WooCommerce stores.<\/li>\n<li>Added global initial page_view coverage before contextual ecommerce events.<\/li>\n<li>Fixed home page tracking to avoid invalid GA4 view_item events.<\/li>\n<li>Improved purchase payloads so value excludes tax and shipping while sending tax, shipping, currency, transaction_id, and items separately.<\/li>\n<li>Added valid view_item_list item payloads for shop and category pages.<\/li>\n<li>Added remove_from_cart tracking improvements for classic WooCommerce and BeTheme cart flows.<\/li>\n<li>Added duplicate guards for add_payment_info and add_shipping_info.<\/li>\n<li>Added item_category coverage across key ecommerce events.<\/li>\n<li>Added refund item enrichment.<\/li>\n<li>Added form_start, form_submit, and generate_lead tracking with AJAX form support for supported form plugins.<\/li>\n<li>Improved select_item payloads with item_category, item_list_id, item_list_name, and index.<\/li>\n<li>Added X (Twitter) browser pixel and Conversion API support: UWT pixel with Conversion Event ID resolution, server-side CAPI delivery for purchase, add_to_cart, and begin_checkout, consent-aware identity (twclid \/ hashed email \/ hashed phone), and referrer-based attribution for t.co \/ twitter.com \/ x.com traffic.<\/li>\n<li>Fixed X pixel events not firing after initial page load due to an incorrect event-forwarding reference in the deduplication wrapper.<\/li>\n<li>Fixed X page_view custom conversion not registering in X Events Manager \u2014 the pixel auto-fires PageView from twq('config'), so an explicit conversion event for page_view caused X deduplication to suppress the custom conversion.<\/li>\n<li>Fixed Snapchat uuid_c1 (_scid first-party cookie) not reaching the Snap pixel on anonymous visits or when ad_user_data consent was denied separately from ad_storage. The cookie ID is now forwarded independently, gated only on ad_storage.<\/li>\n<\/ul>\n\n<h4>1.20.3<\/h4>\n\n<ul>\n<li>Fixed popups targeting the Home page or Blog never showing: the popup runtime now normalizes the pixel's page-type names (home, post, archive) to the popup builder's vocabulary (homepage, blog).<\/li>\n<\/ul>\n\n<h4>1.20.2<\/h4>\n\n<ul>\n<li>Security hardening and release-readiness improvements.<\/li>\n<li>Added uninstall cleanup for LayerSync plugin data and scheduled hooks.<\/li>\n<li>Improved consent-safe runtime behavior.<\/li>\n<li>Improved queue retry reliability and UTC-safe scheduling.<\/li>\n<li>Improved catalog sync completion handling.<\/li>\n<li>Improved WordPress.org readiness checks.<\/li>\n<\/ul>\n\n<h4>1.20.1<\/h4>\n\n<ul>\n<li>GA4 campaign attribution: the plugin now forwards first-party campaign context to GA4 \u2014 source \/ medium \/ campaign plus first-touch, last-touch and last-paid-touch, returning-visitor and touch-count signals \u2014 as <code>ls_*<\/code> parameters and GA4's native campaign fields. Google Ads auto-tagging is respected (native fields are suppressed when a Google click ID is present).<\/li>\n<li>Original landing URL lock: the true first landing URL is captured at the earliest point in the page, before redirects or SPA navigation can overwrite it, so first-touch attribution stays accurate.<\/li>\n<li>Privacy hardening: landing URLs and referrers are sanitized to strip PII and WooCommerce order keys \/ checkout tokens before they reach GA4 or LayerSync, while UTMs and ad click IDs are preserved.<\/li>\n<li>Test traffic is flagged (<code>ls_test<\/code>) so internal\/QA visits can be excluded from reporting.<\/li>\n<li>Meta Pixel payloads now omit non-product <code>content_type<\/code> values for homepage ViewContent and click-to-contact events, avoiding Meta's invalid parameter warning while preserving <code>content_name<\/code>.<\/li>\n<\/ul>\n\n<h4>1.20.0<\/h4>\n\n<ul>\n<li>GA4 Direct Browser Mode: choose how GA4 events reach Google \u2014 Direct (LayerSync fires gtag itself, no GTM needed), GTM \/ dataLayer only, or Measurement Protocol only. Set per site on the Platforms page. Existing installs default to Direct, preserving current behavior.<\/li>\n<li>Controlled page_view: in Direct mode the plugin emits <code>gtag('config', \u2026, { send_page_view:false })<\/code> and fires a single page_view with full params (page_location, page_referrer, page_title, page_path, page_type, content_group, language, engagement_time_msec), plus SPA support for history-based navigation.<\/li>\n<li>Full GA4 funnel coverage from the browser: select_item, view_cart, remove_from_cart, add_shipping_info, add_payment_info, view_promotion, select_promotion, login, and sign_up now fire alongside the existing commerce events.<\/li>\n<li>GA4 session capture: reads the <code>_ga_&lt;MID&gt;<\/code> session cookie (both the legacy GS1 and current GS2 formats) on the browser AND server side, so events attach to the correct GA4 session. A short best-effort wait on high-value events (purchase, sign_up, login, lead) improves session attribution without delaying normal page traffic.<\/li>\n<li>Consent Mode: per-site Strict (denied-by-default until the CMP grants) or Standard (defers to your existing consent setup). Enhanced Conversions \/ GA4 user-provided data are now explicit, off-by-default opt-ins and only attach to conversion events.<\/li>\n<li>GA4 User-ID is restricted to signed-in WordPress users only.<\/li>\n<li>New diagnostics in the Live Events drawer: missing\/invalid client_id, missing\/invalid session_id, missing transaction_id on purchase, missing currency when value is set, items missing id and name, browser+GTM duplicate-source risk, and consent-denied.<\/li>\n<li>Google Ads, LinkedIn, and X delivery paths are code-validated locally with unit tests but still require live staging credential validation before public enablement.<\/li>\n<\/ul>\n\n<h4>1.19.0<\/h4>\n\n<ul>\n<li>New popup builder runtime: targets your existing LayerSync audiences, renders inside Shadow DOM so the merchant's theme can't break it, evaluates audience + trigger + frequency + consent locally per visit. Supports modal, slide-corner, and bar layouts with per-device (desktop \/ tablet \/ mobile) position overrides.<\/li>\n<li>Live cart-items block: pulls the visitor's current WooCommerce cart via the Store API and renders the actual products (image, name, qty, line price, subtotal) inside the popup. Empty carts auto-suppress the popup so you never reminder a customer who already checked out.<\/li>\n<li>WhatsApp CTA: when a popup CTA is set to the WhatsApp action, the runtime opens <code>wa.me\/&lt;number&gt;<\/code> with a pre-composed message built from the popup heading + the visitor's live cart contents, so they arrive on WhatsApp with a ready-to-send order summary.<\/li>\n<li>Popup tracking: every popup interaction (impression, visible, CTA click, submit, close reason, conversion) fires through the existing WP-proxy endpoint into LayerSync events \u2014 same pipeline as commerce events, so popups show up in Live Events, ROI Insights, and audience targeting with no extra setup.<\/li>\n<\/ul>\n\n<h4>1.18.2<\/h4>\n\n<ul>\n<li>One-time backfill: marks every order whose server purchase event was already delivered as \"pixel-rendered\" so 1.18.1's once-per-order guard takes effect immediately on legacy orders. Without this, each pre-1.18.1 order would cost one stray browser purchase fire on its first thank-you-page revisit before the guard kicked in. Runs asynchronously via WP-Cron in batches of 200 so admin page loads stay snappy on stores with thousands of orders.<\/li>\n<\/ul>\n\n<h4>1.18.1<\/h4>\n\n<ul>\n<li>Fixed duplicate purchase events fired by the browser pixel on order-received page revisits. The thank-you page URL is permanent \u2014 customers bookmark it, merchants revisit to test, and WC's payment redirect can reload it \u2014 so without a guard, every revisit re-fired the same purchase event_id, inflating dashboard funnel and revenue numbers. The pixel now sets a <code>_layersync_purchase_pixel_rendered<\/code> order meta on first render and silently skips on subsequent visits, mirroring the existing server-side <code>_layersync_purchase_sent<\/code> guard.<\/li>\n<\/ul>\n\n<h4>1.18.0<\/h4>\n\n<ul>\n<li>Homepage now fires a <code>view_content<\/code> event in addition to <code>page_view<\/code>, so Meta and TikTok have an explicit top-of-funnel signal for cold-start audience optimization.<\/li>\n<li>Click-to-contact CTAs are auto-tracked: clicks on <code>tel:<\/code>, <code>sms:<\/code>, <code>mailto:<\/code>, WhatsApp (<code>wa.me<\/code>, <code>api.whatsapp.com<\/code>), and Messenger links fire a <code>contact<\/code> event mapped to Meta <code>Contact<\/code> and TikTok <code>Contact<\/code>. Captures intent signals from off-site CTAs without any merchant setup.<\/li>\n<li>Pixel <code>firePixelEvent<\/code> now passes <code>content_name<\/code> through to Meta and TikTok for non-product events so Pixel Helper and attribution dashboards label them meaningfully; Meta <code>content_type<\/code> is reserved for product\/product_group payloads.<\/li>\n<\/ul>\n\n<h4>1.17.0<\/h4>\n\n<ul>\n<li>Renamed plugin to better describe what it does: \"LayerSync for WooCommerce \u2013 Conversion Tracking, Server-Side API, Pixel Manager, GA4\".<\/li>\n<li>Hardened the public events endpoint: same-origin nonce check, per-IP rate limit, body-size cap, and a block on <code>purchase<\/code> \/ <code>refund<\/code> events (those flow only through the WooCommerce server hook now).<\/li>\n<li>Refactored every inline <code>&lt;script&gt;<\/code> to ship through <code>wp_add_inline_script<\/code> against registered handles, in line with the WordPress Plugin Directory's enqueue-API guideline.<\/li>\n<li>Replaced closure-based <code>register_setting()<\/code> sanitize callbacks with named static methods so static-analysis tools can resolve them.<\/li>\n<li>Scoped the \"Not connected\" admin notice to the Dashboard, Plugins list, and WooCommerce Settings only \u2014 no more banner on every admin page.<\/li>\n<li>CSV queue export now neutralizes leading <code>=<\/code>, <code>+<\/code>, <code>-<\/code>, <code>@<\/code> characters to prevent spreadsheet formula injection when an admin opens the file.<\/li>\n<li>Declared <code>Requires Plugins: woocommerce<\/code>; bumped <code>Requires at least<\/code> to 6.5.<\/li>\n<\/ul>\n\n<h4>1.16.0<\/h4>\n\n<p>Initial public release.<\/p>\n\n<ul>\n<li>Browser pixel injection for 9 ad platforms: Meta (Facebook &amp; Instagram), Google Tag (GA4), Google Ads, TikTok, Snapchat, Pinterest, Reddit, X (Twitter), and LinkedIn.<\/li>\n<li>Server-side Conversions API forwarding via the LayerSync hub \u2014 one connection, every platform.<\/li>\n<li>Same-origin REST proxy keeps event delivery working through ad-blockers and corporate firewalls.<\/li>\n<li>Browser-side resilience: events queue locally during outages and drain automatically when connectivity returns.<\/li>\n<li>Lead-form tracking for Contact Form 7, WPForms, Ninja Forms, and Formidable.<\/li>\n<li>Privacy-first: per-event consent capture, CMP integration via <code>window.LayerSync.setConsent({...})<\/code>, IP anonymization, and SHA-256 PII hashing before any platform handoff.<\/li>\n<li>Catalog sync to LayerSync for one product feed URL consumed by every connected platform.<\/li>\n<\/ul>","raw_excerpt":"Conversion tracking for online stores. Pixel injection plus server-side Conversion API delivery, built for WooCommerce.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/312311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=312311"}],"author":[{"embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/layersync"}],"wp:attachment":[{"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=312311"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=312311"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=312311"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=312311"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=312311"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/srd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=312311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}