Esquema del píxel de OpenAI y la API de conversiones enviando el mismo evento lead_created con un único event_id

Píxel de OpenAI y API de conversiones de ChatGPT Ads en WordPress (con consentimiento y sin duplicados)

Has lanzado tu primera campaña en ChatGPT Ads, el Gestor de anuncios registra clics y tu formulario recibe contactos, pero la columna «Conversiones» sigue a cero. O marca el doble de los que has recibido. Casi siempre es lo mismo: el píxel de OpenAI no está instalado, no se activa en la página correcta, o el píxel y la API de conversiones envían el mismo contacto con dos identificadores distintos.

Importa más de lo que parece. OpenAI usa esas conversiones para los informes y, en las campañas optimizadas a conversión, para decidir a quién mostrar tus anuncios. Si no llegan, no sabes qué te trae ChatGPT Ads; si llegan duplicadas, el coste por contacto es falso. Y en una web europea el píxel no debería ejecutarse hasta que el usuario acepte las cookies de marketing.

En resumen

  1. El píxel de OpenAI es un script (oaiq) que envía eventos como lead_created desde el navegador. Se identifica con un Pixel ID que creas en la pestaña de conversiones del Gestor de anuncios.
  2. La API de conversiones envía los mismos eventos desde tu servidor a bzr.openai.com/v1/events, con email y teléfono en SHA-256. Necesita una clave que nunca debe salir del servidor.
  3. Si usas los dos, pon el mismo event_id en ambos: OpenAI deduplica por Pixel ID + evento + ID.
  4. Por defecto el píxel asume que tiene consentimiento. En la UE conviene cargarlo desde Tag Manager solo cuando el usuario acepta las cookies de marketing.
  5. En nuestra web: píxel en GTM con activador de consentimiento, snippet PHP para la API y una cookie de 10 minutos que comparte el event_id.

Qué es el píxel de OpenAI y qué mide

Es el equivalente al píxel de Meta o a la etiqueta de Google Ads, pero para los anuncios de ChatGPT. Un pequeño script define la función global oaiq, carga el SDK desde https://bzrcdn.openai.com/sdk/oaiq.min.js y se inicializa con tu Pixel ID. Cada llamada a oaiq("measure", ...) envía un evento a OpenAI.

Los eventos son cerrados: OpenAI define los nombres estándar y el tipo de datos que acompaña a cada uno.

EventoTipo de datosCuándo se envía
page_viewedcontentsVista de una página importante
lead_createdcustomer_actionEnvío de un formulario de contacto
appointment_scheduled, registration_completedcustomer_actionCita reservada, registro completado
order_created, checkout_started, items_added, contents_viewedcontentsPasos de tienda online (con importe y moneda)
subscription_created, trial_startedplan_enrollmentSuscripciones y pruebas
customcustomCualquier otra acción, con custom_event_name
Eventos admitidos por el píxel y la API de conversiones de OpenAI (developers.openai.com, consultado en octubre de 2026).

Para una web que capta contactos, el evento que importa es lead_created con {type: "customer_action"}. Un detalle que condiciona la estrategia: según la ayuda de OpenAI, las campañas optimizadas a conversión solo admiten eventos estándar, no custom. Si mides tu formulario como evento personalizado, no podrás optimizar hacia él.

Con consentimiento, el píxel deja dos cookies de primera parte: __oppref, con el identificador del clic en el anuncio (30 días), y __obref, un identificador del navegador (365 días). El oppref es lo que permite atribuir la conversión al clic.

Píxel o API de conversiones: cuándo usar cada uno

Son dos caminos para el mismo evento. El píxel va por el navegador: captura el oppref del clic, hace correspondencia avanzada automática y le afectan los bloqueadores. La API va por tu servidor: no la bloquea nadie y le pasas email y teléfono en SHA-256, IP y user agent, pero no captura el clic por sí sola y exige código. OpenAI recomienda que los eventos web salgan del píxel y que la API no se llame nunca desde la página.

Para una pyme: empieza por el píxel bien instalado y con consentimiento. Añade la API cuando tengas volumen y quieras mejorar la calidad de los datos (OpenAI puntúa cada fuente con un «Event Quality Score» que mejora con email, teléfono, IP real y user agent). Si usas las dos, deduplicar por event_id es obligatorio.

Antes de empezar: Pixel ID, clave de API y evento de conversión

Todo se crea en el Gestor de anuncios de ChatGPT Ads, en la pestaña de conversiones (OpenAI la llama «Conversions»). Necesitas tres cosas:

  1. Una fuente de datos de tipo web (el píxel). Al crearla obtienes el Pixel ID, el mismo para el píxel y para la API.
  2. Una clave de API de conversiones, solo si vas a usar la API. Guárdala en el servidor (nosotros, en wp-config.php), nunca en Tag Manager. No la confundas con la «Advertiser API key», que sirve para gestión e informes.
  3. Un evento de conversión («event setting»): nombre, tipo lead_created, ventana de atribución y fuente de datos asociada. Es lo que después eliges como objetivo de la campaña.

Si no ves la pestaña de conversiones

A fecha de octubre de 2026 el acceso a ChatGPT Ads en Europa se gestiona a través del equipo de OpenAI o de partners. Si no aparece la opción de crear fuentes de datos o claves, pídela a tu contacto de OpenAI. En cómo anunciarse en ChatGPT Ads desde España explicamos el alta.

Instalar el píxel de OpenAI con Google Tag Manager

OpenAI no publica una plantilla oficial para Tag Manager (hay plantillas de la comunidad, no mantenidas por OpenAI). Lo más transparente es una etiqueta HTML personalizado con el snippet oficial del Gestor de anuncios, igual que hacemos con el píxel de Meta.

Paso 1. Etiqueta base

Etiqueta de tipo HTML personalizado con el snippet de instalación. Simplificado, hace esto (copia siempre el código oficial de tu cuenta, no este esquema):

<script>
  // Esquema simplificado del snippet oficial de OpenAI
  window.oaiq = window.oaiq || function () {
    (window.oaiq.q = window.oaiq.q || []).push(arguments);
  };
  var s = document.createElement("script");
  s.async = true;
  s.src = "https://bzrcdn.openai.com/sdk/oaiq.min.js";
  document.head.appendChild(s);

  oaiq("init", { pixelId: "TU-PIXEL-ID", debug: false });
  oaiq("measure", "page_viewed", { type: "contents" });
</script>
  • Activación: «Una vez por página», para que el SDK no se cargue dos veces si el activador se repite.
  • Activador: el evento de consentimiento de marketing, no «All Pages». Lo explicamos en la siguiente sección.

Paso 2. Etiqueta del evento lead_created

Segunda etiqueta HTML personalizado, activada con la vista de la página de gracias (en nuestra web, ruta /gracias/) y secuenciada tras la base («Activar una etiqueta antes de que se active esta») para que el píxel ya esté inicializado:

<script>
  var eid = "{{Cookie - mg_oai_eid}}"; // vacío si no hay cookie
  oaiq("measure", "lead_created",
    { type: "customer_action" },
    eid ? { event_id: eid } : undefined
  );
</script>

{{Cookie - mg_oai_eid}} es una variable de GTM de tipo «Cookie de primera parte». Si no usas la API de conversiones, omite el cuarto parámetro; si la usas, ese event_id es lo que evita el doble recuento.

La página de gracias tiene que ser limpia

Si se puede abrir sin enviar el formulario (enlazada, indexada o recargada), enviarás lead_created de más. Mantenla fuera del menú, con noindex y accesible solo tras el envío. Es el mismo problema que en conversiones duplicadas en Google Ads.

Consentimiento: el detalle que casi nadie cuenta

La documentación del píxel es clara en un punto que sorprende: el consentimiento es true por defecto. Si pegas el snippet tal cual, el píxel escribe sus cookies y envía eventos desde la primera carga, acepte el usuario o no. OpenAI ofrece dos llamadas: oaiq("consent", false) antes del init para bloquearlo y oaiq("consent", true) cuando el usuario acepta. Mientras está en false no se envía nada, y los eventos bloqueados no se reenvían después.

Para usuarios de España o de la UE, __oppref y __obref son cookies de publicidad: según la guía de cookies de la AEPD, requieren consentimiento previo e informado. No es asesoramiento legal, pero sí la base de nuestra decisión técnica. Hay dos formas de cumplirlo:

  • A. API de consentimiento del píxel. Cargarlo siempre con consent false y pasar a true cuando el banner lo indique. El script se descarga aunque el usuario rechace y dependes de que el SDK respete la bandera.
  • B. No cargar el píxel hasta el consentimiento. Activador de GTM con el evento de consentimiento de marketing del banner. Si el usuario rechaza, nada se descarga ni se escribe.

Nosotros usamos la opción B. Cookiebot, cargado desde GTM con consentimiento por defecto denegado, lanza el evento cookie_consent_marketing cuando el usuario acepta las cookies de marketing. Ese evento activa la etiqueta base del píxel de OpenAI y la del de Meta. En Cookiebot con Tag Manager y modo de consentimiento detallamos la configuración.

Esquema: por defecto el píxel de OpenAI envía eventos desde la primera carga; con el activador de consentimiento de Tag Manager solo se carga tras aceptar las cookies de marketing
Por defecto el píxel mide desde la primera carga. Con el activador de consentimiento, nada se ejecuta hasta que el usuario acepta.

La API de conversiones no es un atajo

Enviar el contacto desde el servidor no elimina la necesidad de consentimiento: sigues tratando datos personales (email, teléfono, IP) con fines publicitarios. La ayuda de OpenAI pide respetar las decisiones de consentimiento y no retirar los controles para «subir» las cifras. Por eso nuestro snippet PHP también comprueba el consentimiento antes de enviar.

API de conversiones de OpenAI desde WordPress

La API es una petición POST a https://bzr.openai.com/v1/events?pid=TU-PIXEL-ID con la cabecera Authorization: Bearer TU-CLAVE. El cuerpo lleva un array events (hasta 1.000 por lote; si uno falla, falla el lote). Cada evento necesita:

  • id: tu identificador único del evento. Debe coincidir con el event_id del píxel.
  • type: lead_created.
  • timestamp_ms: hora real de la acción en milisegundos Unix, dentro de los últimos 7 días y no más de 10 minutos en el futuro.
  • action_source: web; entonces source_url es obligatoria (con esquema y dominio).
  • data: {"type": "customer_action"}.
  • user (opcional, pero es lo que da valor a la API): emails_sha256, phone_numbers_sha256, ip_address, user_agent y, si lo tienes, obref (valor de la cookie __obref, sin hash).

Normalizar y hashear antes de enviar

  • Email: quitar espacios y pasar a minúsculas. Después SHA-256 en hexadecimal (64 caracteres en minúsculas).
  • Teléfono: conservar el prefijo de país; quitar espacios, paréntesis, puntos, guiones, el + inicial y los ceros iniciales. Deben quedar entre 8 y 15 dígitos. Ejemplo de la documentación: +1 (415) 555-2671 pasa a 14155552671. Un móvil español escrito como 612 345 678 se enviaría como 34612345678.
  • IP y user agent: en claro y los del visitante, no los de tu servidor. OpenAI lo señala como factor de calidad.

Ejemplo simplificado en PHP

Ejemplo ilustrativo y reducido de lo que hace nuestro snippet. Engánchalo a la acción que tu plugin de formularios ejecuta al procesar un envío (en nuestro caso, Kadence Advanced Form). No es un plugin de producción: falta validar campos, gestionar errores y adaptar la lectura del consentimiento a tu banner.

<?php
// Ejemplo ilustrativo. La clave vive en wp-config.php:
// define( 'MG_OAI_PIXEL_ID', '...' ); define( 'MG_OAI_API_KEY', '...' );

function mg_oai_norm_phone( $tel ) {
    $d = ltrim( preg_replace( '/\D+/', '', (string) $tel ), '0' ); // solo dígitos
    if ( strlen( $d ) === 9 ) { $d = '34' . $d; }                    // número español sin prefijo
    return ( strlen( $d ) >= 8 && strlen( $d ) <= 15 ) ? $d : '';
}

function mg_oai_enviar_lead( $email, $tel ) {
    // 1. Solo con consentimiento de marketing (cookie del banner).
    if ( ! mg_hay_consentimiento_marketing() ) { return; }

    // 2. Un event_id único, compartido con el píxel mediante una cookie corta.
    $event_id = wp_generate_uuid4();
    setcookie( 'mg_oai_eid', $event_id, time() + 600, '/', '', true, false );

    $user = array(
        'ip_address' => $_SERVER['REMOTE_ADDR'],
        'user_agent' => $_SERVER['HTTP_USER_AGENT'],
    );
    $email = strtolower( trim( (string) $email ) );
    if ( is_email( $email ) ) { $user['emails_sha256'] = array( hash( 'sha256', $email ) ); }
    $tel = mg_oai_norm_phone( $tel );
    if ( $tel ) { $user['phone_numbers_sha256'] = array( hash( 'sha256', $tel ) ); }
    if ( ! empty( $_COOKIE['__obref'] ) ) { $user['obref'] = sanitize_text_field( $_COOKIE['__obref'] ); }

    $evento = array(
        'id'            => $event_id,
        'type'          => 'lead_created',
        'timestamp_ms'  => (int) round( microtime( true ) * 1000 ),
        'action_source' => 'web',
        'source_url'    => home_url( '/' ),
        'data'          => array( 'type' => 'customer_action' ),
        'user'          => $user,
    );

    // 3. Envío desde el servidor; la clave nunca llega al navegador.
    wp_remote_post(
        'https://bzr.openai.com/v1/events?pid=' . MG_OAI_PIXEL_ID,
        array(
            'timeout' => 5,
            'headers' => array(
                'Authorization' => 'Bearer ' . MG_OAI_API_KEY,
                'Content-Type'  => 'application/json',
            ),
            'body'    => wp_json_encode( array( 'events' => array( $evento ) ) ),
        )
    );
}

wp_remote_post es la función nativa de WordPress para peticiones HTTP. Si tu hosting está detrás de un proxy o CDN, REMOTE_ADDR puede ser la IP del proxy; usa la cabecera que documente tu proveedor. En pruebas, añade "validate_only": true al cuerpo para que OpenAI valide sin guardar.

Qué no hacer

  • Llamar a la API desde JavaScript en la página (expondrías la clave) o enviar email y teléfono sin hash.
  • Inventar un oppref, alterar timestamp_ms o reenviar un evento con otro id: contaría como conversión nueva.

Deduplicar píxel y API con event_id

Cuando un contacto llega por los dos caminos, OpenAI lo une si coinciden el Pixel ID, el nombre del evento y el identificador (event_id en el píxel, id en la API). Se queda con el primero y descarta el resto. Si los identificadores no coinciden, son dos conversiones.

El reto práctico es generar el ID en un sitio y usarlo en el otro. En WordPress el envío se procesa en el servidor y la página de gracias se carga después en el navegador, así que el servidor manda:

Esquema del flujo: el formulario se procesa en WordPress, que envía lead_created a la API con un event_id y deja una cookie; la página de gracias dispara el píxel con el mismo event_id y OpenAI cuenta una sola conversión
El servidor genera el ID, lo envía a la API y lo deja en una cookie corta; el píxel lo lee en la página de gracias.
  1. El formulario se envía y WordPress lo procesa.
  2. El snippet PHP comprueba el consentimiento, genera un event_id único, envía lead_created a la API y guarda el ID en la cookie mg_oai_eid (10 minutos).
  3. El usuario es redirigido a /gracias/. GTM lee la cookie con una variable de primera parte.
  4. La etiqueta del píxel dispara lead_created con ese mismo event_id.
  5. OpenAI recibe dos eventos con la misma clave y cuenta uno.

Diez minutos de cookie cubren la redirección y una posible recarga de la página de gracias, y evitan que un ID viejo se reutilice en otro contacto. Si el usuario rechazó las cookies, ni el servidor envía ni el píxel se carga. Si vienes de Meta, es el mismo concepto que su eventID.

Nuestro caso en migoramarketing.es

Tenemos una campaña propia de ChatGPT Ads que lleva a la landing /chatgpt-ads/. La medición está montada así (comprobado en octubre de 2026):

PiezaCómo lo tenemos
Contenedor y bannerGTM GTM-56S92MFC (plugin GTM4WP); Cookiebot cargado solo desde GTM, consentimiento por defecto denegado
Píxel base de OpenAIHTML personalizado, activador cookie_consent_marketing, «Una vez por página»
Evento lead_created (píxel)HTML personalizado en la vista de /gracias/, secuenciado tras la base, event_id leído de la cookie mg_oai_eid
API de conversionesSnippet PHP propio enganchado al envío del formulario (Kadence Advanced Form); email y teléfono en SHA-256, IP y user agent; clave en wp-config.php
DeduplicaciónCookie mg_oai_eid de 10 minutos con el event_id compartido
Otras plataformasEl mismo envío se mide en Google Ads y GA4 por la vista de /gracias/ y en Meta con Lead
Lista de etiquetas de Google Tag Manager con el píxel base de OpenAI y el evento lead_created, con sus activadores de consentimiento y página de gracias
Nuestras dos etiquetas del píxel de OpenAI en Tag Manager: la base se activa con el consentimiento de marketing y el evento con la vista de la página de gracias.
Pestaña de conversiones del Gestor de anuncios de ChatGPT Ads con la fuente de datos web y el evento lead_created
La fuente de datos (píxel) y el evento lead_created en nuestro Gestor de anuncios de ChatGPT Ads.

Por qué código propio y no un plugin: los plugins para el píxel de OpenAI son recientes y ninguno de los que revisamos compartía el event_id con el píxel ni respetaba nuestro banner. Son unas pocas líneas de PHP sin dependencias, y sabemos qué datos salen de la web.

Cómo comprobar que funciona

  1. Vista previa de Tag Manager. Rechaza las cookies y comprueba que no se activa ninguna etiqueta de OpenAI. Acepta y comprueba que la base se activa una sola vez. Si la vista previa falla, mira Tag Assistant no conecta.
  2. Pestaña Red del navegador. Filtra por openai.com: carga del SDK y envíos. OpenAI avisa de que el «activada» de GTM no demuestra que el evento haya salido; mira la petición real.
  3. Modo debug. Inicializa con debug: true mientras pruebas; el SDK escribe en la consola. Quítalo al publicar.
  4. Formulario de prueba con consentimiento aceptado. En Red deberías ver el measure de lead_created con el event_id de la cookie mg_oai_eid.
  5. Comprueba la API. Registra temporalmente el código de respuesta de wp_remote_post; con validate_only: true pruebas sin guardar eventos.
  6. Espera. Las conversiones tardan 24–48 horas en aparecer en el Gestor de anuncios, y una prueba sin clic previo en un anuncio no se atribuye a ninguna campaña: que OpenAI acepte el evento no significa que lo cuente.

Checklist final

ComprobaciónEstado deseado
Pixel ID y evento lead_createdFuente de datos web y evento estándar creados en el Gestor de anuncios
Etiqueta base en GTMHTML personalizado, «Una vez por página», activador de consentimiento de marketing
Etiqueta lead_createdVista de la página de gracias, secuenciada tras la base, con event_id
Página de graciasSin enlaces, noindex, solo tras el envío
Clave de la APISolo en el servidor, nunca en GTM
Datos personalesEmail y teléfono normalizados y en SHA-256; IP y user agent del visitante
DeduplicaciónMismo id en la API y event_id en el píxel
ConsentimientoNada se envía (ni píxel ni API) sin aceptar cookies de marketing

Sigue con: la guía de Google Tag Manager en WordPress y cómo medir también los clics en WhatsApp y en el teléfono. Si prefieres que te lo dejemos instalado, mira cómo trabajamos ChatGPT Ads.

Preguntas frecuentes

¿Dónde consigo el Pixel ID y la clave de la API de conversiones de OpenAI?

En el Gestor de anuncios de ChatGPT Ads, en la pestaña de conversiones. Al crear una fuente de datos de tipo web obtienes el Pixel ID; en la misma pestaña se crea la clave de la API de conversiones. Si no ves estas opciones, tu cuenta aún no las tiene habilitadas: pídelo a tu contacto de OpenAI.

¿Puedo instalar el píxel de OpenAI en WordPress sin Tag Manager?

Sí, pegando el snippet en la cabecera con un plugin de scripts. Pero entonces debes gestionar el consentimiento a mano con oaiq(«consent», false) y oaiq(«consent», true), y añadir el evento lead_created por otro camino. Con Tag Manager todo queda bajo la misma regla de consentimiento que el resto de píxeles.

¿Es obligatorio usar la API de conversiones?

No. El píxel basta para empezar y es la vía que OpenAI recomienda para eventos web. La API mejora la correspondencia (email, teléfono, IP) y resiste bloqueadores, pero exige código en el servidor y deduplicación por event_id. Añádela cuando el volumen lo justifique.

¿Qué pasa si envío el mismo lead por píxel y por API con IDs distintos?

OpenAI los cuenta como dos conversiones. Solo deduplica cuando coinciden Pixel ID, nombre de evento e identificador. Por eso en nuestro caso el servidor genera el ID y lo deja en una cookie para que el píxel use el mismo.

¿El píxel de OpenAI necesita consentimiento de cookies en España?

Escribe cookies de publicidad (__oppref y __obref) y envía datos para atribuir conversiones a anuncios. Según la guía de cookies de la AEPD, ese tipo de cookies requiere consentimiento previo. Además, el píxel asume consentimiento por defecto, así que hay que bloquearlo activamente. No es asesoramiento legal: consúltalo con quien lleve tu cumplimiento.

¿Quieres que lo montemos en tu web?

Instalamos el píxel de OpenAI con Tag Manager y consentimiento, configuramos la API de conversiones si tiene sentido para tu volumen y lo dejamos deduplicado y verificado. Lo mismo que tenemos en nuestra web, hablando directamente con quien lo configura.

Miguel Ángel Cebrián, fundador de Migora Marketing

Miguel Ángel Cebrián

Fundador de Migora Marketing. Tiene 7 certificaciones oficiales de Google (Búsqueda, Display, Medición, Vídeo, Shopping con IA, Optimización de conversiones y Google Analytics). Configura y revisa a diario Google Tag Manager, GA4, Google Ads y el píxel de Meta, empezando por nuestra propia web.

Sigue leyendo