R
Interview Deckreact · next.js · senior/staff
0·0·122
System Design

Shopify Web Pixel API — Tracking Moderno

API sandboxed para coletar eventos da loja Shopify. Substituta moderna de ScriptTag.

Web Pixel API é a forma moderna de instrumentar tracking em lojas Shopify (substituiu ScriptTag em 2023). Você cria um app pixel que roda em um sandbox isolado (Web Worker), recebe eventos pré-definidos da Shopify (`product_viewed`, `cart_updated`, `checkout_completed`), e despacha para seu collector. Vantagens: performance (não bloqueia main thread), segurança (sandboxado), confiabilidade (Shopify garante o ciclo de vida do evento mesmo em checkout).

Problema
ScriptTag (legado): injetava `<script>` no global da loja — podia conflitar com tema, quebrar com mudanças, e era cancelado pelo browser no unload da página de checkout (perda de eventos de purchase). Performance ruim em mobile (script bloqueia).
Solução
Web Pixel app instalado pelo merchant, roda em sandbox isolado. Eventos vêm pré-formatados do Shopify (schema padronizado). Inclui `checkout_completed` que dispara confiavelmente após purchase. Você só implementa o handler: receber evento → enviar para seu collector com batching/retry.
Tip
Em 2025, Web Pixel é a única forma oficial e suportada de instrumentar tracking em lojas Shopify novas. Para lojas legadas usando GTM ou analytics injetados via theme.liquid: migrar para Web Pixel reduz perda de eventos em ~5-10% (especialmente no checkout). Cada pixel é instalado como app pelo merchant.
// extensions/tracker/src/index.ts
// Web Pixel app — roda em sandbox isolado
import { register } from '@shopify/web-pixels-extension'

register(({ analytics, browser, settings }) => {
  const collectorUrl = settings.collector_url
  const apiKey = settings.api_key

  // Fila local com batching
  const queue: any[] = []
  let timer: any = null

  const flush = () => {
    if (queue.length === 0) return
    const batch = queue.splice(0)
    browser.sendBeacon(collectorUrl, JSON.stringify({ apiKey, events: batch }))
    timer = null
  }

  const enqueue = (event: any) => {
    queue.push({
      event_id: crypto.randomUUID(),
      timestamp: event.timestamp,
      name: event.name,
      data: event.data,
    })
    if (queue.length >= 10) flush()
    else if (!timer) timer = setTimeout(flush, 3000)
  }

  // Eventos de produto
  analytics.subscribe('product_viewed', enqueue)
  analytics.subscribe('product_added_to_cart', enqueue)
  analytics.subscribe('collection_viewed', enqueue)

  // Eventos de checkout (CRÍTICOS — flush imediato)
  analytics.subscribe('checkout_started', e => { enqueue(e); flush() })
  analytics.subscribe('checkout_completed', e => { enqueue(e); flush() })

  // Custom event opcional
  analytics.subscribe('custom_event', enqueue)
})

// extensions/tracker/shopify.extension.toml
// type = "web_pixel_extension"
// name = "Custom Tracker"
// settings = [
//   { key = "collector_url", type = "url" },
//   { key = "api_key", type = "string" }
// ]
Q.Quais eventos a Web Pixel API expõe?
A.Standard events: page_viewed, product_viewed, collection_viewed, search_submitted, product_added_to_cart, cart_viewed, checkout_started, checkout_address_info_submitted, checkout_contact_info_submitted, checkout_shipping_info_submitted, checkout_payment_info_submitted, checkout_completed. Schema unificado (event_name, timestamp, data). DOM events customizados: você pode emitir manualmente via `analytics.publish()`.
Q.Como funciona o sandbox do Web Pixel?
A.O código do pixel roda em um iframe ou Web Worker isolado — sem acesso ao DOM da loja, sem acesso a outras Web Pixels, sem `window` global. APIs disponíveis: `analytics.subscribe(event, handler)`, `fetch` (com CSP restrita), `localStorage` próprio do sandbox. Resultado: pixel não consegue corromper a loja nem se intrometer em outros pixels.
Q.Como migrar de ScriptTag para Web Pixel?
A.1) Criar um app Shopify do tipo `web_pixel_extension`. 2) Implementar o handler subscribing aos eventos relevantes. 3) Merchant instala o app no admin. 4) Decomissionar o ScriptTag antigo (remover do app, ele se desinstala automaticamente). Resultados: ~5-10% mais eventos capturados, especialmente em checkout. Custo: migração leva 1-2 sprints dependendo da complexidade do tracking atual.
115/122← →