=== Datalayer Tracking via DATA Reshape for WooCommerce === Contributors: rwky Donate link: https://www.paypal.me/eduardvd Tags: datareshape, first-party-tracking, datalayer-tracking, woocommerce-tracking Requires at least: 6.0 Tested up to: 6.9 Requires PHP: 7.4 WC requires at least: 8.2 WC tested up to: 10.7 Stable tag: 0.9 Requires Plugins: woocommerce WC HPOS compatible: yes License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html Official WooCommerce integration for DATA Reshape — first-party ecommerce event tracking delivered from your own subdomain. == Description == DATA Reshape for WooCommerce is a bridge between your WooCommerce store and the DATA Reshape platform. It emits structured ecommerce events (`product_viewed`, `product_added_to_cart`, `cart_viewed`, `checkout_started`, `checkout_completed`, plus the mid-funnel checkout steps) into DATA Reshape's `reshape.push()` queue, and DATA Reshape's loader — served from a tracking subdomain you control — handles delivery and routing onward to GA4, Meta, TikTok, and every other destination you have connected. Because the loader is served first-party, events are not blocked by ad blockers, ITP, or the usual third-party-script defences that break conventional `gtag`/`fbq`/`ttq` setups. You do not need to fire those calls in parallel — DATA Reshape routes a single event to every connected destination with the correct platform-specific name and field mapping. This plugin does not replace analytics tools like Google Analytics or Meta Pixel; it replaces the *fragile transport layer* underneath them. Event processing, routing, and deduplication all happen inside DATA Reshape. An active [DATA Reshape](https://datareshape.ro) plan is required to use this plugin. All tracking logic, integrations, and event delivery are managed through the DATA Reshape platform. = What's coming next: API Events = A second tab in the settings UI ("API Events") is reserved for data that *can't* flow through the storefront browser at all — admin-recorded phone-call orders, sales agent activity, and historical customer/order backfill imported into DATA Reshape via API. This is **not** a CAPI-style server-side mirror of the browser events (those already get through reliably thanks to the first-party loader); it covers genuinely different data sources. Configuration UI is dormant in this version and will be wired up in a later release. == Features == = Core Features = - Global enable/disable for the integration - DATA Reshape library integration - Subdomain tracking support - Fully compatible with WooCommerce HPOS (High-Performance Order Storage) = Events = - Product Viewed - Product Added to Cart (AJAX + POST + GET fallbacks) - Product Removed from Cart - Cart Viewed - Checkout Started - Checkout Steps (Billing Address Added, Shipping Detail Added, Payment Method Selected — legacy checkout only) - Checkout Completed - Consent integration — DATA Reshape natively detects most CMPs (Cookiebot, OneTrust, Termly, etc.) and Google Consent Mode v2, with no plugin-side wiring required - Single "Grant consent by default" toggle for stores that don't run a CMP — fires DATA Reshape's native `consent_updated` push at session start so events process immediately - `drswc_consent_payload` filter for stores that want to drive the consent object explicitly from PHP - Plain user data in reshape payloads (DATA Reshape hashes server-side) = Advanced Tracking = - Spec-shaped products with `price_base` + `price`; `tax_included` / `tax_percent` only when WooCommerce tax is enabled - Variations carry `parent_id` / `parent_name` / `parent_sku` / `parent_url` - Order-level and product-level coupons emitted in dedicated `coupons[]` arrays - Shipping methods and payment methods emitted as structured arrays on Checkout Completed - Categories emitted as both `category` (primary) and `categories[]` with `name`+`id` - Stock status, product type, creation timestamp, image, and gallery images = Extensibility = - `drswc_event_payload` — filter the full event envelope before push - `drswc_product_payload` — inject GTIN/MPN/EAN, predicted values, custom properties per product - `drswc_user_payload` — augment user identity (`pre_purchase` or `purchase` source) - `drswc_consent_payload` — replace or inject the consent object = Reliability Enhancements = - Handles non-AJAX add-to-cart flows - Handles redirect-based add-to-cart (?add-to-cart=) - Cache-safe identity hydration — PII never inlined into cacheable HTML - Sticky user identity model (loader caches first-seen user, subsequent events inherit) - Safe execution timing for low overhead == Installation == 1. Upload the plugin to the `/wp-content/plugins/` directory 2. Activate the plugin through the 'Plugins' screen in WordPress 3. Ensure WooCommerce is installed and active 4. Open the settings from either **WooCommerce → Settings → DATA Reshape** or **Marketing → DATA Reshape** (the page lives under WooCommerce Settings; the Marketing entry is a shortcut) 5. Fill in your tracking subdomain and library ID (provided by DATA Reshape), enable the integration, and turn on the events you want emitted == Configuration == = Integration Setup = - Enable Integration (master switch) - Tracking Subdomain (the first-party host serving DATA Reshape's loader) - Library ID - Built-in "Check tracking endpoint" health check = Events = - Master switch for browser-delivered events - Per-event toggles (so events you handle via custom code can be disabled individually) - "Grant consent by default" toggle — off by default (let DATA Reshape auto-detect your CMP / Google Consent Mode); on if you don't run a CMP and want events processed immediately = API Events = - Reserved for the upcoming admin-recorded events sync (phone-call orders, etc.) and historical customer/order backfill. Not yet active. == Frequently Asked Questions == = Does this plugin support GA4? = Indirectly — events are pushed to DATA Reshape's `window.reshape` queue, and DATA Reshape routes them to GA4 and every other connected destination with the correct platform-specific event name and field mapping. You do not need to fire `gtag`, `fbq`, or `ttq` calls in parallel. = Does it work without AJAX add-to-cart? = Yes. It includes fallback mechanisms for redirect-based add-to-cart flows (native WooCommerce redirect to cart after adding a product). = Does it support the block-based Cart/Checkout? = The plugin's core events (Product Viewed, Add to Cart, Cart Viewed, Checkout Started, Checkout Completed) work on both legacy and block checkouts. The mid-funnel events (Billing Address Added, Shipping Detail Added, Payment Method Selected) currently fire on the legacy (shortcode-based) checkout only — block-based checkout support is planned for a later release. = Does it support server-side / CAPI-style event mirroring? = No, and it intentionally doesn't need to. DATA Reshape's tracking library is served from a first-party subdomain on your own site, so browser events get through reliably without being blocked by ad blockers or browser privacy features. The forthcoming "API Events" tab is for a different purpose: syncing data that doesn't flow through the storefront browser at all — admin-recorded phone-call orders and historical customer/order backfill. = Will this slow down my website? = No. The plugin is designed with performance in mind and uses lightweight, conditional execution; if anything, your setup should see a boost in speed compared to clasic integrationg (Meta, TikTok and Google). = Is deduplication handled? = Deduplication is handled by DATA Reshape. The plugin focuses on exposing accurate and complete data for DATA Reshape to pickup and process onward. == Screenshots == 1. Initial dashboard with general settings (Integration setup tab) 2. Events configuration tab == Changelog == = 0.9 = - Fix: Add-to-cart now tracks reliably on themes that hijack the single-product form with their own AJAX (Woodmart, custom builders, etc.). A new product-page click handler on the standard `.single_add_to_cart_button` fires the event before the theme's submit logic runs, regardless of which AJAX library or endpoint the theme uses. Built-in 3-second JS dedup prevents double-fire when both this path and the legacy AJAX-listener path would trigger. - Fix: Listing add-to-cart with WooCommerce's "Redirect to cart page after successful addition" option enabled — the `?add-to-cart=` link redirected to the cart page before any client-side hook could fire, so the event was lost. A new server-side `woocommerce_add_to_cart` action hook now stashes the pending event in session so it emits on the cart page after the redirect. - Fix: Variable products on classic (non-AJAX) single-product pages now emit the chosen variation as `products[0].id` instead of the parent product id. The POST capture path was previously ignoring `variation_id`. - Internal: the new server-side hook is intentionally gated on non-AJAX, non-REST, non-admin contexts so AJAX flows (already covered client-side) don't double-fire. = 0.8 = - Consent integration overhauled. The legacy "Google Consent Mode granted by default" toggle (emitted a `gtag('consent', 'update', ...)` block) and the per-event envelope `consent_default_grant` toggle have both been removed. A single new "Grant consent by default" toggle now fires DATA Reshape's native `consent_updated` push at session start — DATA Reshape detects most CMPs and Google Consent Mode v2 on its own, so this toggle defaults to OFF. - Tax fields (`tax_included`, `tax_percent`) are now omitted entirely from product, coupon, and shipping payloads when WooCommerce tax is disabled (previously emitted as `tax_included: false`). - Settings tabs renamed for clarity: "Browser events" → "Events", "Server-side events" → "API Events". The API Events tab is reserved for admin-recorded events (e.g. phone-call orders) and historical customer/order backfill — not a CAPI-style server-side mirror of browser events. - Settings also reachable under Marketing → DATA Reshape (shortcut to the canonical WooCommerce → Settings → DATA Reshape page). - Field labels simplified: "Server-side API endpoint" / "Server-side API key" → "API endpoint" / "API key". - Internal: narrative inline comments moved to CLAUDE.md; no functional impact. = 0.7 = - Hard cutover from `window.dataLayer` to DATA Reshape's `window.reshape` API. Event names updated to the new spec (product_viewed, product_added_to_cart, cart_viewed, checkout_started, checkout_completed, etc.). - Mid-funnel checkout events on legacy checkout: billing_address_added, shipping_detail_added, payment_method_selected. - "Grant consent by default" and "Track checkout steps" toggles added. - Identity emission tightened — `user` object sent only when logged in or in checkout with confirmed contact data. - Variations carry parent_* fields; products emit categories[], stock status, type, created_at, image, gallery. - Pricing decoupled from coupons — `price` / `price_base` are the buyer-visible regular / sale prices; coupons land in dedicated `coupons[]` arrays. - New filters: `drswc_event_payload`, `drswc_product_payload`, `drswc_user_payload`, `drswc_consent_payload`. = 0.6 = - PII cache leak fix extended to cart/checkout pages (in addition to thankyou). - HPOS and Cart/Checkout Blocks compatibility declared. = 0.5 = - Fixed PII leak on page-cached thankyou pages (LiteSpeed et al.) — identity now hydrated client-side from cookies. - Removed browser-side SHA256 hashing — DATA Reshape hashes server-side. - On-save tracking endpoint health check plus on-demand re-check button. - wp.org update-available pill in the settings header. - Loader URL tags the installed plugin version (`&wp=`). = 0.4 = - Fresh-install checkbox defaults flipped to off. - Admin warning notice when the plugin is active but not configured. = 0.3 = - AJAX add-to-cart detection works with third-party plugins (QuadLayers etc.) and themes whose buttons don't expose `data-product_id`. - Removed the in-page dataLayer debug overlay. = 0.1 = - Initial release. == Upgrade Notice == = 0.9 = Fixes three add-to-cart tracking gaps: (a) themes that wrap the single-product submit in their own AJAX (Woodmart, custom builders); (b) listing add-to-cart with the "Redirect to cart page" WooCommerce option enabled; (c) variable products on classic single-product pages now emit the chosen variation instead of the parent. No configuration required. = 0.8 = **Have your technician roll this update out.** It changes the datalayer structure and the consent integration in ways that affect downstream destinations and any custom code reading from `window.reshape` / `window.drswcConsent`. Specifically: the old "Google Consent Mode granted by default" toggle no longer exists — sites that had it on must enable the new "Grant consent by default" toggle (Events tab) if they want events processed without waiting for a CMP signal; otherwise DATA Reshape's native CMP / Google Consent Mode v2 detection takes over. The `tax_included` / `tax_percent` fields are absent entirely (instead of `false`) when WooCommerce tax is disabled. After upgrade, verify in DATA Reshape that events still arrive as expected. = 0.7 = Breaking: migrates from `window.dataLayer` + `wc_*` event names to DATA Reshape's `window.reshape.push()` API with spec-defined names. Custom GTM tags reading the old `wc_*` events from this plugin's dataLayer will need updating. Verify in DATA Reshape that events are arriving after upgrade. = 0.6 = Extends the 0.5 PII cache-leak fix to cart/checkout pages and declares HPOS + Cart/Checkout Blocks compatibility. = 0.5 = Fixes a PII cache leak on page-cached thankyou pages (notably LiteSpeed). Identity is now hydrated client-side from cookies so cached HTML carries no PII. = 0.4 = Fresh-install checkbox defaults flipped to off (existing sites unaffected). Admin warning notice when the integration is active but not configured. = 0.3 = AJAX add-to-cart detection improved (QuadLayers et al.); in-page debug overlay removed. = 0.1 = Initial release.