Saltar al contenido

GuíasPlataformas publicitarias13 min de lectura

Meta Pixel vs Conversions API vs ambos en Shopify: qué mide realmente cada uno

Qué ve el Pixel del navegador, qué envía una Conversions API solo de servidor y por qué la configuración recomendada usa ambos en Shopify.

Publicado
Revisado
Eventos del navegador, eventos del backend y una implementación combinada.

Daniil MaximkinIngeniero de producto y soluciones

Respuesta corta

Meta puede recibir los eventos de tu Shopify de tres formas: solo un Pixel del navegador, solo una Conversions API de servidor, o ambos a la vez. El Pixel ve lo que ejecuta la página, el servidor ve lo que sabe tu backend, y la configuración redundante recomendada envía ambos con un event_id compartido para que Meta funda la pareja en un solo evento contado. Cada una cubre una parte distinta del embudo.

— Daniil

Conclusiones clave

  • Un Pixel solo de navegador es la fuente que ve de forma natural los eventos a nivel de página —ViewContent, AddToCart, InitiateCheckout—, porque ocurren en el navegador del comprador.
  • Una Conversions API solo de servidor es el hogar natural de los eventos Purchase a nivel de pedido, incluidos pedidos que el navegador nunca completó, pero no puede ver eventos de página y necesita una captura del navegador para fbp y fbc.
  • La configuración redundante es la que Meta recomienda: el mismo event_name y el mismo event_id en ambas partes, recibidos dentro de la ventana de emparejamiento, para que una compra cuente una vez.
  • La deduplicación es una regla de emparejamiento, no un valor por defecto. Identificadores distintos, nombres de evento distintos, un identificador ausente en un lado o un intervalo demasiado largo dejan dos eventos.
  • Ninguna de las tres arregla el consentimiento, los bloqueadores ni una definición de conversión equivocada. Cambian lo que Meta recibe, no lo que registró Shopify.
En esta guía

Meta puede recibir los eventos de tu tienda Shopify desde un Pixel del navegador, desde una llamada del servidor a la Conversions API o desde ambos a la vez. No son tres productos que compitan: son tres niveles de cobertura sobre el mismo embudo, y las diferencias aparecen en lo que cada fuente puede ver.

Esta guía es para un comerciante de Shopify o un responsable de marketing interno que decide cómo debe recibir Meta los eventos, y para el desarrollador que lo implementa. Compara las tres opciones a nivel de mecanismo: dónde se dispara el evento, qué parámetros viajan, cómo se respeta el consentimiento, cómo funciona la deduplicación y qué te permite conciliar cada una contra los pedidos de Shopify. No elige un ganador, no cita costes ni promete mejoras en la calidad de emparejamiento; eso depende de tu tráfico, tu catálogo, tus tasas de consentimiento y tu equipo.

¿Qué mide realmente un Pixel de Meta solo en el navegador?

Un Pixel solo en el navegador mide lo que puede reportar la página del comprador: páginas vistas y las acciones a nivel de página que tu tema o un web pixel de Shopify dispara en el navegador. Ve ViewContent, AddToCart e InitiateCheckout de forma natural, y pierde cualquier evento que el navegador no llegue a ejecutar.

Instalas el código base una vez, y a partir de ahí el Pixel reporta mediante fbq('track', ...). Cada vez que el Pixel carga llama automáticamente a fbq('track', 'PageView'), así que las páginas vistas no dependen de que escribas código de evento. Los eventos estándar cubren el embudo: ViewContent en una página de producto, AddToCart cuando un artículo entra al carrito, InitiateCheckout cuando empieza el checkout y Purchase en la página de confirmación o de agradecimiento. Cada uno acepta un objeto de parámetros —content_ids, contents, currency, value, content_type—, de modo que el evento lleva el producto y su valor.

Hay dos detalles que importan más allá de disparar el evento. El Advanced Matching: los valores que pasas a fbq('init') los hashea el Pixel con SHA-256 antes de salir del navegador, así que un email con hash puede viajar sin que lo haga el valor en claro. Y el par de identificadores _fbp y _fbc: el Pixel establece un identificador de navegador (_fbp) y deriva un identificador de clic (_fbc) a partir del fbclid del clic de anuncio que trajo al visitante. Esos valores enlazan un evento del navegador con un clic.

Como todo ocurre en el navegador, el navegador es también el techo. El control por consentimiento detiene el Pixel para los compradores que rechazan fines de marketing; los bloqueadores de anuncios, una página que nunca llega a renderizarse o una pestaña cerrada antes de la página de confirmación no producen ningún evento. En Shopify en concreto, una compra del navegador depende de checkout_completed, que se dispara una vez por checkout —normalmente en la página de agradecimiento, o en la primera página de upsell cuando hay ofertas post-compra— y no se dispara en absoluto si esa página no carga. Las protecciones de privacidad del navegador también pueden acortar o bloquear las cookies que establece un script, _fbp incluida, y eso es una cuestión de vida útil que se comprueba, no se da por supuesta.

Lo que el Pixel del navegador te permite conciliar es un recuento de las compras que vio el navegador; un reembolso procesado después en el back office queda fuera de su vista.

// Browser: one id per purchase, derived from the order so the server can reproduce it
fbq('track', 'Purchase', {
  value: 129.00,
  currency: 'USD',
  contents: [{ id: 'SKU-123', quantity: 1 }],
  content_type: 'product'
}, { eventID: 'purchase_4512890' });

¿Qué mide realmente una Conversions API solo de servidor?

Una Conversions API solo de servidor mide lo que sabe tu backend. Envía eventos con nombre directamente a Meta desde tu infraestructura, así que reporta las compras que registra tu sistema —incluidos pedidos que el navegador nunca completó— sin depender de la página del comprador en el momento del envío.

Haces un POST de un array data al endpoint de eventos de Meta para tu Pixel, autenticándote con un token de acceso. Cada evento de servidor lleva campos obligatorios: event_name (el nombre del evento estándar o personalizado), event_time (cuándo ocurrió) y action_source, que declara dónde se produjo la conversión. Un evento de tipo website también debe enviar event_source_url y client_user_agent; sin ellos no es válido.

action_source no es decoración. Meta lo exige en todos los eventos; sus valores son website, app, email, phone_call, chat, physical_store, system_generated, business_messaging y other. Elegir el incorrecto tergiversa dónde ocurrió la conversión, y los términos de Meta te hacen responsable de su exactitud. Para una compra en un storefront de Shopify el valor honesto es website, y por eso lo acompañan event_source_url y el user agent.

Los datos de usuario son donde el servidor tiene a la vez ventajas y huecos. Puede enviar em y ph, normalizados (por ejemplo, un email sin espacios sobrantes y en minúsculas) y hasheados con SHA-256, además de external_id y client_ip_address. También puede enviar fbc y fbp, pero solo si esos valores existen. _fbc procede de un fbclid en una URL de destino y _fbp lo establece el navegador; un servidor que nunca interactúa con el navegador no tiene ninguno de los dos y no puede inventarlos. Un pipeline solo de servidor ve acciones a nivel de página como ViewContent y AddToCart solo si la página se lo indica explícitamente, porque nada más que el navegador las observa.

Hay una propiedad más que importa: la deduplicación no se aplica dentro de una misma fuente. Meta no descarta dos eventos de servidor idénticos enviados uno tras otro, ni dos eventos de navegador idénticos. La deduplicación existe solo entre un evento del navegador y su gemelo en el servidor.

Los reembolsos se comportan de otra forma aquí. Un servidor que lee el pedido y el registro de reembolsos es el lugar natural para representar un reembolso; cómo se expresa es una decisión de diseño que verificas contra la documentación de Meta.

¿Qué cambia cuando usas ambos con deduplicación por event_id?

Usar ambos convierte dos registros parciales en uno completo, pero solo cuando Meta puede emparejarlos. En la configuración redundante recomendada, el Pixel y la Conversions API envían el mismo event_name y el mismo event_id, y Meta funde la pareja en un único evento.

Meta documenta la configuración redundante —enviar todos los eventos desde ambas fuentes— como la configuración recomendada, siempre que puedas generar un event_id persistente para las dos. La regla es concreta: el eventID del Pixel debe ser igual al event_id del servidor, y el event del Pixel debe ser igual al event_name del servidor. Cuando ambos coinciden y el segundo evento llega dentro de las 48 horas siguientes al primero, Meta conserva el primero y descarta el duplicado; si los dos llegan con unos cinco minutos de diferencia, Meta prefiere el evento del navegador.

Existe un mecanismo de reserva documentado —emparejar por event_name más fbp y/o external_id— y viene con condiciones: por lo general solo funciona cuando el evento del navegador llega primero y el del servidor después, y un evento de servidor no se descarta solo porque un evento de navegador idéntico aparezca más tarde.

Lo que exige la deduplicación, entonces, es un identificador estable que ambas partes puedan producir por separado. Un número de pedido o un transaction ID es lo habitual, porque el navegador puede leerlo en la página de confirmación y el servidor ya lo tiene. Lo que la rompe es cualquier desacuerdo: un identificador generado de nuevo en cada carga de página, un identificador presente en un lado y ausente en el otro, una diferencia de mayúsculas o de escritura en el nombre del evento (purchase frente a Purchase), un intervalo mayor que la ventana de emparejamiento o una configuración en la que solo una fuente está activa. Cada caso deja dos eventos, y dos eventos se leen como dos compras.

Events Manager muestra el resultado. Test Events muestra los eventos entrantes con su origen; una pareja emparejada se presenta como deduplicada en lugar de como dos conversiones separadas, y el detalle del evento muestra cómo llegó cada una. El panel agregado solo muestra totales, y los totales ocultan la duplicación que estás buscando.

{
  "data": [{
    "event_name": "Purchase",
    "event_time": 1690000000,
    "event_id": "purchase_4512890",
    "action_source": "website",
    "event_source_url": "https://store.example/checkout/thank-you",
    "user_data": {
      "em": ["<sha256 of the normalized email>"],
      "fbp": "fb.1.1690000000.1234567890",
      "fbc": "fb.1.1690000000.AbCdEfGh"
    },
    "custom_data": { "value": 129.00, "currency": "USD" }
  }]
}

Comparación lado a lado

La tabla compara las tres opciones según los criterios que deciden la mayoría de implementaciones en Shopify. Describe contrapartidas en lugar de clasificarlas, y no incluye precios de proveedores.

CriterioSolo Pixel del navegadorSolo Conversions APIAmbos, con event_id
Origen del eventoEl navegador del comprador, en la páginaTu servidor o backendAmbos, describiendo la misma acción
Cobertura de compra y reembolsoCompra cuando se ejecuta la página de confirmación; reembolsos no vistosCompras del back office; reembolsos representables desde los datos del pedidoCompra cubierta dos veces y fundida en una; los reembolsos siguen siendo una decisión de diseño
DeduplicaciónNo aplica — una sola fuenteNo aplica — una sola fuenteEmparejar por event_id y event_name
Gestión del consentimientoControlado en el navegador por la herramienta de consentimientoTu pipeline debe llevar la señal de consentimiento y suprimir los eventos rechazadosAmbas partes deben respetar la misma señal
Propiedad de los datosLos datos del evento los ensambla y los envía el navegadorLos datos del evento los ensambla y los envía tu infraestructuraDividida: el navegador captura, el servidor reenvía
Dependencia / lock-inDepende de que la página se ejecute y de las protecciones del navegadorDepende de tu endpoint, tu token y tu esquema de identificadoresDepende de que ambas partes sigan de acuerdo
Carga de mantenimientoBaja, hasta que un cambio de privacidad o de tema rompe la rutaEl esquema de identificadores, los reintentos y la monitorización son tuyosLa más alta — dos rutas que deben coincidir
Para quién encajaTiendas con suficiente señal de navegador y ninguna otra fuente de MetaTiendas cuya pérdida está en el navegador y que pueden mantener un pipelineTiendas que quieren cobertura de todo el embudo y una sola compra contada

Tabla de decisión

Empareja la tienda que tienes delante con un punto de partida. Son valores por defecto para casos comunes, no reglas.

Si tu situación es…Elige…
Optimizas solo para Purchase y la ruta del navegador ya lo cubreSolo Pixel del navegador
Quieres señales de embudo superior (view, add to cart) además de las comprasPixel del navegador más Conversions API, deduplicados por event_id
Necesitas compras que el navegador nunca completó —pedidos manuales, checkouts fuera del sitio, algunos upsellsConversions API, manteniendo el Pixel del navegador para los eventos de página
Otro sistema ya envía un Purchase a Meta (un canal de ventas o una app)Decide qué única ruta es dueña de Purchase y luego deduplica el resto con un event_id compartido
Necesitas controlar qué parámetros de usuario viajan y cuándo el consentimiento bloquea el envíoConversions API, normalmente mediante recogida server-side
No puedes mantener un identificador que sobreviva a las recargasSolo Pixel del navegador, y acepta sus límites de cobertura
Meta y Shopify no coinciden en los totalesPrimero la conciliación — el desajuste puede ser de reglas de recuento, no de cobertura

Cuándo no usar cada opción

Un Pixel solo de navegador es la opción equivocada cuando la pérdida es de transporte; una configuración solo de servidor lo es cuando nadie mantiene el esquema de identificadores; usar ambos lo es cuando nadie consigue que los identificadores coincidan. Ninguna de las tres es un atajo para el consentimiento.

No elijas solo navegador cuando:

  • La mayoría de las compras ocurren después de una página que suele fallar al cargar, o dentro de un flujo post-compra.
  • Tus campañas necesitan eventos de embudo superior atribuidos de forma coherente y tu ruta de navegador está muy bloqueada.
  • Quieres una comprobación cruzada del recuento de compras, que una sola fuente no puede darte.

No elijas solo servidor cuando:

  • Tus campañas necesitan ViewContent y AddToCart para públicos de catálogo o de retargeting; el servidor no puede verlos salvo que la página se los envíe.
  • No tienes forma de capturar fbclid ni los identificadores del navegador, así que fbp y fbc estarán ausentes y el enlace con el clic se pierde.
  • Nadie va a hacerse cargo del token, los reintentos y la monitorización. Una ruta de servidor falla en silencio.

No elijas ambos cuando:

  • Nadie puede definir un identificador estable que produzcan las dos partes. Dos fuentes sin emparejar inflan los recuentos más que una fuente imperfecta.
  • La segunda fuente es un sistema que no puedes cambiar —una app de canal que genera su propio identificador—. Consolida en lugar de añadir una tercera.

Y ninguna de las tres arregla:

  • El consentimiento. Una ruta de servidor bien construida sigue suprimiendo eventos para los visitantes que rechazaron. (Esto cubre la implementación técnica, no asesoramiento legal.)
  • Una definición de conversión equivocada o un evento de compra ausente.
  • La brecha estructural entre el recuento de Meta y los pedidos de Shopify — eso es conciliación de pedidos, no una fuente de eventos nueva.

Cómo verifico esto en implementaciones reales

Verifico contando y emparejando, no leyendo paneles: confirmo las fuentes activas, observo un evento real en Test Events de Meta, compruebo los identificadores y concilio el recuento contra una exportación de pedidos de Shopify.

  1. Haz inventario de todas las fuentes que pueden enviar eventos a Meta. Canal de ventas, apps, web pixel, código del tema, pipeline de servidor. La duplicación empieza con una fuente que nadie recordaba.
  2. Observa un evento en directo. Usa Test Events de Events Manager y envía un evento de servidor con un test_event_code para que aparezca junto al del navegador. DebugView es la superficie de GA4 y no muestra eventos de Meta.
  3. Comprueba la clave, no solo la llegada. Confirma que el eventID del navegador y el event_id del servidor son la misma cadena, y que ambos nombres de evento coinciden exactamente. Una pareja deduplicada es la señal; dos conversiones separadas son el bug.
  4. Confirma la cobertura en ambas partes. Verifica que ViewContent, AddToCart e InitiateCheckout llegan desde el navegador, y que Purchase llega desde las dos fuentes para el mismo pedido.
  5. Confirma que los identificadores viajan. Donde hubo una captura en el navegador, comprueba que fbp y fbc están presentes en el evento de servidor; donde no la hubo, no des nada por supuesto.
  6. Concilia contra un periodo cerrado. Compara el recuento de eventos Purchase con una exportación de pedidos de Shopify para una ventana fija.
  7. Comprueba el consentimiento en ambos sentidos. Con el consentimiento de marketing rechazado, confirma que no se dispara nada; concédelo y confirma que los eventos fluyen.

Modos de fallo habituales

La mayoría de los fallos no son exóticos: un identificador que cambia, un nombre de evento que no coincide, un parámetro que el servidor nunca recibió o una segunda fuente que nadie recordaba.

  • Un identificador regenerado en cada carga de página. Un event_id construido en el render a partir de un UUID nuevo o una marca temporal nunca puede coincidir con el gemelo del servidor.
  • Un identificador derivado solo en una parte. El Pixel y el servidor envían cadenas distintas para el mismo pedido, así que Meta ve dos.
  • Deriva del nombre del evento. Purchase en un lado, purchase o un nombre personalizado en el otro. Los identificadores pueden coincidir a la perfección y aun así falla.
  • Un identificador ausente en una parte. No hay nada con lo que emparejar.
  • Un envío de servidor retrasado que aterriza fuera de la ventana de emparejamiento.
  • Una segunda fuente que sigue activa tras una migración, y cada mitad genera su propio identificador.
  • Un evento de servidor marcado como website sin event_source_url ni client_user_agent, que no es un evento website válido.
  • fbp/fbc dados por supuestos en lugar de capturados. El servidor los tiene solo si el navegador se los pasó.
  • Consentimiento respetado en el navegador pero no en el pipeline de servidor.

Limitaciones

Cada opción tiene un techo marcado por lo que llega hasta ella. Un Pixel del navegador no puede reportar lo que el navegador nunca ejecuta; una configuración solo de servidor no puede ver eventos de página que nadie le contó; usar ambos no se concilia solo, porque la deduplicación depende de identificadores que tú mantienes correctos.

Ninguna de estas opciones cambia las reglas de recuento de Meta ni los totales de pedidos de Shopify. fbp y fbc ayudan al enlace cuando están presentes, pero una ruta de servidor sin una captura del navegador no los tendrá. La configuración redundante añade además mantenimiento: dos rutas que deben coincidir, indefinidamente. Y las obligaciones de consentimiento y minimización de datos se aplican a las tres, esté donde esté ensamblado el evento. Usadas por lo que son —un punto de observación sobre el embudo—, son complementarias.

Alternativas

Si el problema no es qué fuente de eventos, sino qué le ocurre a la petición de camino a Meta, la respuesta está una capa más abajo: la recogida server-side mediante un endpoint de primera parte, descrita en el servicio de tracking server-side y sopesada con honestidad en Tracking server-side: beneficios, límites y arquitectura.

Si lo que eliges es un pipeline de Meta y no una fuente de eventos, la comparación de proveedores está en Meta Conversions API en Shopify: app nativa, Stape o server-side GTM. Si el síntoma es que Meta reporta de más, empieza por el diagnóstico de deduplicación de Meta CAPI y por la mecánica de Deduplicación en Meta CAPI: cómo funciona realmente event_id. Para el lado de Google de la misma tienda, consulta Arreglar el evento purchase de GA4 en Shopify y Por qué los ingresos de GA4 no cuadran con Shopify. Los conceptos de fondo están en event ID, calidad de emparejamiento de eventos y Consent Mode v2.

Si la guía no lo resolvióEUR 375

Hago esta conciliación en tu tienda en solo lectura, por EUR 375 — veredicto por escrito dos días laborables después del kickoff.

Solicitar un Health Check

Preguntas

Preguntas que responde esta guía

¿Sigo necesitando el Pixel del navegador si envío una Conversions API desde el servidor?

Normalmente sí, y la propia guía de Meta apunta en esa dirección. El navegador ve los eventos a nivel de página que el servidor no puede observar —ViewContent, AddToCart, InitiateCheckout— y captura los identificadores fbp y fbc que vienen de la visita y del clic de anuncio. Un pipeline solo de servidor los pierde salvo que la página le pase la información. El patrón recomendado es usar ambos, deduplicados con un event_id compartido.

¿Qué tiene que coincidir exactamente para que la deduplicación funcione?

Dos pares de campos. El eventID del Pixel debe ser igual al event_id del servidor, y el event del Pixel debe ser igual al event_name del servidor. Cuando ambos coinciden y el segundo evento llega dentro de la ventana de emparejamiento de Meta, se conserva uno y se descarta el otro. Si incluyes event_name más fbp y/o external_id de forma coherente, puedes recurrir a ese método, pero por lo general solo funciona cuando el evento del navegador llega primero.

¿Puedo enviar la Conversions API sin fbp ni fbc?

Puedes enviar el evento, pero esos campos estarán ausentes y falta el enlace con el clic que habría aportado el navegador. fbc procede de un fbclid en la URL de destino y fbp lo establece el Pixel en el navegador; un servidor que nunca interactúa con el navegador no tiene ninguno de los dos y no puede inventarlos. Si los quieres en los eventos de servidor, el navegador tiene que capturarlos y pasarlos.

¿Cómo compruebo en Events Manager si la deduplicación funciona?

Usa Test Events en lugar del panel agregado. Envía un evento de servidor con un test_event_code para que aparezca junto al evento del navegador, y confirma después que la pareja aparece como deduplicada y no como dos conversiones separadas, con el eventID del navegador y el event_id del servidor leídos como la misma cadena. La vista de totales oculta la duplicación; Test Events y el detalle del evento exponen cómo llegó cada evento.

Daniil Maximkin

Hola, soy Daniil.

Trabajo contigo desde la definición del problema hasta la implementación y la entrega. Hablas con quien hace el trabajo. Trabajo en inglés y ruso.

¿Lo has intentado y sigues atascado?

Describe tu tarea

La primera respuesta es gratis, en un día laborable. O escribe directamente: next@taskfordaniel.com