Shopify

Server-side tracking for Shopify. No apps. No checkout restrictions. No signal loss.

Shopify merchants lose tracking data at every turn: checkout.shopify.com breaks cookies, theme apps bloat page load by seconds, and Shopify's new checkout extensibility model restricts third-party scripts. Datafly Signal replaces all of it with a single 4.2KB script and server-side webhooks.

800KB+

Average tag payload

Typical Shopify store loads 800KB+ of third-party analytics JavaScript before the first meaningful paint.

40%+

Safari mobile users

Safari dominates mobile shopping. ITP caps client-side cookies at 7 days, fragmenting every returning visitor.

Broken

Checkout domain cookies

checkout.shopify.com is a different domain. Client-side cookies set on your storefront do not carry over.

15+

Apps per typical store

Each Shopify app injects its own JavaScript. 15 apps is typical for a mid-market store, each adding load time.

Why Shopify tracking is uniquely broken

Shopify's architecture creates tracking challenges that other platforms don't have. These are structural problems, not configuration issues.

Checkout domain breaks tracking

checkout.shopify.com is a separate domain. Client-side cookies from your storefront never reach checkout. Post-purchase attribution dies at the most critical moment.

App bloat kills performance

Each Shopify app injects its own scripts, stylesheets, and tracking pixels. 15 apps means seconds of extra load time, tanking Core Web Vitals and conversion rates.

Checkout extensibility limits

Shopify's new checkout model restricts third-party JavaScript execution. Analytics tags that worked in legacy checkout may stop working entirely as Shopify migrates merchants.

How Signal works with Shopify

A dual-track architecture that captures the complete customer journey — storefront browsing via Datafly.js and checkout completions via Shopify webhooks — then links them server-side.

Track 1: Storefront

Install Datafly.js as a single script via your Shopify theme or custom pixel. 4.2KB gzipped. Collects all storefront interactions.

  • page_view on every navigation
  • product_viewed on PDP load
  • add_to_cart from buy buttons
  • collection_viewed on listing pages
  • search on search interactions

Track 2: Webhooks

Shopify webhooks deliver checkout and order events directly to Signal server-to-server. No browser involved. No checkout domain problem.

  • orders/paid on purchase completion
  • checkouts/create on checkout start
  • refunds/create on order refund
  • orders/fulfilled on shipment
  • customers/create on registration

Cross-domain identity resolution. Signal's Identity Hub links storefront sessions to webhook events using customer email, enabling complete attribution from first page view to purchase — even across checkout.shopify.com. Zero reliance on Shopify apps for analytics.

End-to-end architecture

Two data sources, one processing pipeline, every vendor delivered server-to-server.

Storefront

Datafly.js

4.2KB gzipped

Checkout + Orders

Shopify Webhooks

Server-to-server

Datafly Signal

Identity resolution + Pipeline transformation + Delivery

GA4

Meta CAPI

TikTok

Google Ads

Pipeline as Code

One webhook, multiple destinations

This pipeline config transforms a Shopify orders/paid webhook into both a GA4 purchase event and a Meta CAPI Purchase event simultaneously. Identity is resolved server-side by linking the customer email from the webhook back to the storefront session.

  • Single webhook triggers multiple vendor deliveries
  • Customer email resolves to stored storefront session IDs
  • GA4 gets session_id and _ga cookie from identity link
  • Meta CAPI gets _fbp, _fbc, IP, and user agent from identity link
  • All PII automatically SHA-256 hashed for Meta
  • Line items mapped to vendor-specific product formats
shopify-order-paid.yamlYAML
# shopify-order-paid.yaml — Webhook to GA4 + Meta CAPI
name: shopify_order_paid
trigger:
  event: webhook
  conditions:
    - field: source
      operator: equals
      value: shopify
    - field: topic
      operator: equals
      value: orders/paid

pipelines:
  # GA4 Measurement Protocol — purchase event
  - integration: google-analytics-4
    transform:
      mapping:
        - source: id
          target: transaction_id
        - source: total_price
          target: value
        - source: currency
          target: currency
        - source: line_items
          target: items
          transform: array_map
          fields:
            - source: sku
              target: item_id
            - source: title
              target: item_name
            - source: price
              target: price
            - source: quantity
              target: quantity
      enrichments:
        - type: identity_link
          source: customer.email
          resolve: session_id
        - type: vendor_id
          vendor: ga4
          cookie: _ga
    output:
      format: ga4_measurement_protocol
      event_name: purchase
      validate: true

  # Meta Conversions API — Purchase event
  - integration: meta-conversions-api
    transform:
      static:
        - target: event_name
          value: Purchase
        - target: action_source
          value: website
      mapping:
        - source: total_price
          target: custom_data.value
        - source: currency
          target: custom_data.currency
        - source: line_items
          target: custom_data.content_ids
          transform: pluck
          field: sku
      user_data:
        - source: customer.email
          target: em
          transform: sha256_normalise
        - source: customer.phone
          target: ph
          transform: sha256_normalise
        - source: customer.first_name
          target: fn
          transform: sha256_normalise
        - source: customer.last_name
          target: ln
          transform: sha256_normalise
      enrichments:
        - type: identity_link
          source: customer.email
          resolve: [_fbp, _fbc, client_ip, user_agent]
    output:
      format: meta_conversions_api
      validate: true

What you can remove

Signal replaces the client-side JavaScript from all of these Shopify apps and services. One 4.2KB script instead of 625KB+ of third-party code.

Google Analytics app

80KB

Meta Pixel app

60KB

TikTok Pixel app

45KB

Google Ads conversion tag

50KB

Hotjar

120KB

Lucky Orange

90KB

Klaviyo tracking

50KB

Snapchat Pixel

35KB

Pinterest Tag

40KB

Triple Whale Pixel

55KB

Before

625KB+

10 separate scripts

After

4.2KB

One script, all vendors

Remove the tag bloat from your Shopify store

See how Datafly Signal replaces 15+ analytics apps with a single 4.2KB script and server-side webhooks. Faster pages, complete attribution, zero checkout restrictions.