Trackity for WooCommerce

Changelog

1.0.20

  • Fix: Capture Reddit _rdt_uuid first-party identity cookie and include it in CAPI events as user.uuid — enables Reddit to match anonymous page_viewed and add_to_cart events that have no email and no active click ID.

1.0.19

  • Fix: Purchase eventId sent by the browser pixel now uses the fully-scoped woocommerce_order.created_<host>_<orderId> format, matching the server CAPI path — enables platform-level purchase deduplication on Meta, TikTok, Pinterest, Snapchat, and Reddit.
  • Fix: Checkout event IDs (begin_checkout, checkout_contact_info_submitted, payment_info_submitted) now use a sessionStorage-scoped ID instead of the raw WooCommerce cart token. The session ID is cleared after purchase so subsequent checkouts in the same browser session generate a fresh ID and are no longer silently dropped by the DB unique constraint.

1.0.18

  • Fix: Browser-pixel event IDs for begin_checkout, checkout_contact_info_submitted, and payment_info_submitted now use the cart token as a stable anchor (<cart_token>, <cart_token>_contact, <cart_token>_payment) on both PHP and JavaScript sides — previously PHP generated a random ID on every call, causing duplicate CAPI conversions when both paths fired.
  • Fix: Purchase eventID sent by the browser pixel is now the WooCommerce order ID, matching the server CAPI path — enables platform-level deduplication on Meta, TikTok, Pinterest, Reddit, and Snapchat.
  • Fix: PHP handle_add_to_cart no longer sends a redundant server-side pixel event. The browser JS covers this reliably; PHP had no stable shared ID, which caused double-counting on every add-to-cart.
  • Fix: build_common_payload now unsets eventId and transactionId from $extra before the generic merge loop, preventing sanitized values from being silently overwritten by unsanitized originals.

1.0.17

  • Fix: Compact cart blob now encodes the real click-capture timestamp alongside each click ID (value|timestamp format). The server transformer reads this timestamp so time-decay attribution uses the actual click time instead of the synthetic “order creation − 1 hour” fallback. Older plugin versions without the timestamp continue to work unchanged via the fallback.

1.0.16

  • Fix: Device fingerprint migration now handles both the fp_ prefix strip and short hashes from pre-padStart versions — old values trigger a fresh 8-character base-36 regeneration rather than carrying forward a length-mismatched hash.
  • Fix: conversionValidation.botInfo is now an object { isBot, signals, confidence } matching the Shopify pixel shape, instead of a raw signals array.

1.0.15

  • Fix: WC Store API cart refresh now aborts after 3 seconds and falls back to DOM scraping, preventing begin_checkout from hanging if the Store API is slow or unavailable.

1.0.14

Attribution & click ID
* Fix: _gcl_gb cookie now correctly assigned to wbraid when the value starts with WB, and gbraid otherwise — prevents mis-attribution of web-to-app Google campaigns.
* Fix: Meta _fbp/_fbc cookies now stored in the v2 nested blob with a 90-day expiry when real click evidence exists, so returning Meta visitors retain full attribution context across sessions.
* Fix: Meta _fbp/_fbc now also included for returning visitors who originally clicked a Meta ad in a prior session — stored v2 blob’s fbclid entry used as cross-session click evidence.
* Fix: Snapchat URL click params extended with scid alias; Taboola extended with tabclid; Snapchat _scid and TikTok _ttp cookies now captured into the v2 nested blob.
* Fix: Snapchat, Reddit, and Twitter referrer platform entries added to cross-platform sharing detection.

Event payloads
* Fix: productCollections in product_viewed now sends a flat string array (e.g. [“Shoes”, “Sale”]) matching the Shopify pixel shape.
* Fix: attributionData field now included in all event payloads — active-window-filtered view of the v2 blob with daysRemaining/hoursRemaining per entry.
* Fix: productViewTiming in add_to_cart now sends the full object shape ({ productId, viewTimestamp, addToCartTimestamp, millisecondsBetween }).
* Fix: funnelTiming in begin_checkout now includes millisecondsBetween alias.
* Fix: trackityClientId field added to common event payload alongside clientId.
* Fix: Product URL in product_viewed now strips query parameters.
* Fix: lidc added to LinkedIn URL click params.

Checkout & purchase
* Fix: payment_info_submitted now re-fires at order submit with the final payment method when the customer changed it after the initial event.
* Fix: checkout_contact_info_submitted now fires on WooCommerce block checkout themes — email field selector extended to check #email, .wc-block-components-text-input input[type=”email”], and input[name=”email”].
* Fix: emitPurchase now writes a permanent per-order dedup key (_trackity_purchase_<orderId>) to localStorage before firing, preventing re-fire if the order-received page is revisited after the 24-hour TTL expires.
* Fix: begin_checkout cart context now refreshed from the live WC Store API (/wp-json/wc/store/v1/cart) after coupon application, capturing server-side discount and shipping changes DOM scraping misses. Falls back to DOM parsing when unavailable.

Storage & deduplication
* Fix: Flat tracking blob now dual-written under _trackity_tracking_params (Shopify-compatible key) in addition to trackity_wc_tracking_data.
* Fix: Per-click-ID _utm, _traffic, and _device localStorage sub-keys now written alongside each captured click ID (e.g. _trackity_gclid_utm), matching Shopify pixel.
* Fix: _trackity_attribution legacy flat blob now written to localStorage on every page load for server-side fallback readers.
* Fix: Expired individual _trackity_* localStorage keys cleaned up when their parent v2 entry expires.
* Fix: Storage keys renamed to match Shopify pixel: _trackity_device_fingerprint, _trackity_sent_events.
* Fix: In-memory dedup cache added as fast path before localStorage reads (max 100 entries), mirroring Shopify pixel’s trackingDedupeCache.

Device fingerprint
* Fix: Device fingerprint no longer prefixed with fp_ — bare hash matches Shopify pixel format, enabling cross-platform device matching. Existing fp_* values migrated automatically.
* Fix: Fingerprint hash now uses padStart(8, ‘0’) producing a consistent 8-character base-36 string identical to Shopify pixel output.

Bot detection & conversion validation
* Fix: Bot signal names aligned — headless_ua → headless, empty_languages → no_languages.
* Fix: conversionValidation shape now matches Shopify: { hasValidValue, hasRealisticTiming, hasSuspiciousBehavior, isLikelyValid, botInfo }.

Observability
* Fix: Structured pixel health logging via pixelLog() — sends errors, purchase confirmations, and API failures to /pixel-events/logs, matching Shopify pixel’s log-to-server behaviour.

1.0.13

  • Fix: Meta _fbp/_fbc cookies now included for returning visitors who originally clicked a Meta ad in a prior session — the stored v2 blob’s fbclid entry is checked as cross-session click evidence, covering ITP-cleared cookie scenarios.
  • Fix: Snapchat _scid browser-identity cookie now captured into the v2 nested blob on pages without a URL ScCid param, so the server’s attribution extractor finds Snapchat context for returning visitors.
  • Fix: TikTok _ttp pixel token now captured into the v2 nested blob alongside ttclid, matching Meta’s _fbp handling for browser identity.
  • Fix: checkout_contact_info_submitted now fires correctly on WooCommerce block checkout themes — email field selector extended to also check #email, .wc-block-components-text-input input[type=”email”], and input[name=”email”] in addition to #billing_email.
  • Fix: payment_info_submitted now re-fires at order submit with the final selected payment method when the customer changed their method after the initial event, preventing the server from recording a stale payment method.

1.0.12

  • Fix: productViewTiming in add_to_cart now sends the full object shape ({ productId, viewTimestamp, addToCartTimestamp, millisecondsBetween }) matching the Shopify pixel, so server-side funnel analysis reads the same field names from both platforms.
  • Fix: funnelTiming in begin_checkout now includes millisecondsBetween alias alongside millisecondsFromAddToCart for server parity.
  • Fix: Flat tracking blob now dual-written under _trackity_tracking_params key (Shopify-compatible) in addition to the existing trackity_wc_tracking_data key.
  • Fix: Product URL in product_viewed now strips query parameters, matching Shopify pixel behaviour.
  • Fix: trackityClientId field added to common event payload alongside clientId to disambiguate Trackity visitor ID from any Shopify browser client ID.
  • Fix: lidc added to LinkedIn URL click params.
  • Fix: Expired individual _trackity_* localStorage keys now cleaned up when their parent v2 entry expires.

1.0.11

  • Stable tag bump to ensure deployment of all v1.0.10 fixes.

1.0.10

  • Fix: AJAX add-to-cart from shop/category/homepage listings now sends a fully enriched add_to_cart payload (title, price, SKU, type, image). PHP builds a productCache map of all visible products on archive pages; JS initializes window.trackityWooProductCache from it so the added_to_cart handler can enrich events without a prior product-page visit.

1.0.9

  • Fix: begin_checkout checkout payload now built via shopifyCheckoutFromCart() instead of an inline object, giving lineItems the correct Shopify variant shape (variant.price.amount, finalLinePrice) consistent with the purchase event and including discountApplications and giftCards automatically.
  • Fix: Cart totals and applied coupons in begin_checkout now reflect post-AJAX state — wireCartContextRefresh hooks into WooCommerce’s updated_cart_totals event to refresh CONFIG.pageContext.cart from the live DOM after coupon application without a page reload.

1.0.8

  • Fix: discountApplications, giftCards, and customer.acceptsMarketing fields now included in purchase event checkout payload (emitPurchase was building its own inline checkout object that was missing these fields added to buildCheckoutFromOrder in earlier versions).
  • Fix: giftCards field added to all three checkout builders (buildCheckoutFromCart, buildCheckoutFromOrder, mergeCheckout) to ensure consistent payload shape across begin_checkout and purchase paths.
  • Fix: cartId and lineItemCount now included in add_to_cart event; falls back to collectTrackingData().cart_token when pageContext.cart is null (product pages), so the cart token is captured even when the full cart context is unavailable.

1.0.7

  • Fix: Fallback UUID generation now produces RFC-4122 v4 format (was trk_<random> which is incompatible with Shopify pixel UUID format).
  • Fix: Device fingerprint now appends _fallback_<timestamp> when fewer than 3 browser signals are available, matching Shopify pixel behaviour.
  • Fix: Flat tracking data now written to both localStorage and sessionStorage simultaneously (matching Shopify pixel’s dual-write approach).
  • Fix: Per-click-ID individual storage keys (_trackity_{param}, _trackity_{param}_expiry, _trackity_{param}_creation) now written alongside the v2 blob so server-side code reading individual keys finds them.
  • Fix: Attribution parameter cleanup now runs on a config-driven 24-hour periodic interval in addition to the one-shot page-load timer.

1.0.6

  • Fix: JSON payloads now serialized with a circular-reference guard and function stripper, preventing rare serialization errors from WooCommerce plugin-injected objects.
  • Fix: cartId and lineItemCount now included in add_to_cart payloads, matching Shopify pixel behaviour.
  • Fix: giftCards field added to checkout and purchase payloads (always empty array — WooCommerce has no native gift card mechanism).

1.0.5

  • Improvement: Attribution tracking params now include per-platform extended metadata (conversion window max, engaged-view window, cookie expiry) alongside the standard attribution window days.
  • Improvement: Add-to-cart AJAX handler enriches payload from cached product data on archive/collection pages where full product context is not in the page.
  • Improvement: Discount codes and customer marketing consent flag are now forwarded in the checkout and purchase payloads.
  • Improvement: Product categories are forwarded as collections in the product-viewed payload.
  • Improvement: Storage read now retries up to two times on transient failure before returning null.
  • Fix: fbclid validation updated to accept 10–14 character identifiers with mixed alphanumeric content.
  • Fix: Klaviyo attribution window and click-id params (kx_email, _kx) are now captured and stored in the tracking blob.

1.0.4

  • Fix: Meta _fbp/_fbc cookies now only forwarded when genuine click evidence exists, preventing non-Meta traffic from being attributed to Meta.
  • Fix: add_to_cart events are no longer deduplicated, matching Shopify pixel behaviour.
  • Fix: purchase event now sends a minimal fallback payload if the main handler throws, ensuring conversions are never silently lost.
  • Fix: add_to_cart, begin_checkout, and purchase events now retry up to 2 times with exponential backoff on network failure.
  • Fix: pixel API key now passed to storefront JS config for request authentication.

1.0.0

Initial release.

Plugin Website
Visit website

Author
trackity
Version:
1.0.20
Last Updated
July 28, 2026
Requires
WordPress 5.8
Tested Up To
WordPress 6.9.5
Requires PHP
7.4

Share Post

Join our newsletter.

Get insights into what’s happening at ChangelogWP right in your inbox. We don’t believe in spam.