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
- El píxel de OpenAI es un script (
oaiq) que envía eventos comolead_createddesde el navegador. Se identifica con un Pixel ID que creas en la pestaña de conversiones del Gestor de anuncios. - 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. - Si usas los dos, pon el mismo
event_iden ambos: OpenAI deduplica por Pixel ID + evento + ID. - 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.
- 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.
En este artículo
- Qué es el píxel de OpenAI y qué mide
- Píxel o API de conversiones: cuándo usar cada uno
- Antes de empezar: Pixel ID, clave de API y evento
- Instalar el píxel de OpenAI con Google Tag Manager
- Consentimiento: el detalle que casi nadie cuenta
- API de conversiones desde WordPress
- Deduplicar con event_id
- Nuestro caso en migoramarketing.es
- Cómo comprobar que funciona
- Checklist final
- Preguntas frecuentes
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.
| Evento | Tipo de datos | Cuándo se envía |
|---|---|---|
page_viewed | contents | Vista de una página importante |
lead_created | customer_action | Envío de un formulario de contacto |
appointment_scheduled, registration_completed | customer_action | Cita reservada, registro completado |
order_created, checkout_started, items_added, contents_viewed | contents | Pasos de tienda online (con importe y moneda) |
subscription_created, trial_started | plan_enrollment | Suscripciones y pruebas |
custom | custom | Cualquier otra acción, con custom_event_name |
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:
- 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.
- 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. - 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 falsey pasar atruecuando 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.

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 elevent_iddel 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; entoncessource_urles 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_agenty, 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-2671pasa a14155552671. Un móvil español escrito como612 345 678se enviaría como34612345678. - 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, alterartimestamp_mso reenviar un evento con otroid: 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:

- El formulario se envía y WordPress lo procesa.
- El snippet PHP comprueba el consentimiento, genera un
event_idúnico, envíalead_createda la API y guarda el ID en la cookiemg_oai_eid(10 minutos). - El usuario es redirigido a
/gracias/. GTM lee la cookie con una variable de primera parte. - La etiqueta del píxel dispara
lead_createdcon ese mismoevent_id. - 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):
| Pieza | Cómo lo tenemos |
|---|---|
| Contenedor y banner | GTM GTM-56S92MFC (plugin GTM4WP); Cookiebot cargado solo desde GTM, consentimiento por defecto denegado |
| Píxel base de OpenAI | HTML 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 conversiones | Snippet 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ón | Cookie mg_oai_eid de 10 minutos con el event_id compartido |
| Otras plataformas | El mismo envío se mide en Google Ads y GA4 por la vista de /gracias/ y en Meta con Lead |


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
- 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.
- 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. - Modo debug. Inicializa con
debug: truemientras pruebas; el SDK escribe en la consola. Quítalo al publicar. - Formulario de prueba con consentimiento aceptado. En Red deberías ver el
measuredelead_createdcon elevent_idde la cookiemg_oai_eid. - Comprueba la API. Registra temporalmente el código de respuesta de
wp_remote_post; convalidate_only: truepruebas sin guardar eventos. - 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ón | Estado deseado |
|---|---|
Pixel ID y evento lead_created | Fuente de datos web y evento estándar creados en el Gestor de anuncios |
| Etiqueta base en GTM | HTML personalizado, «Una vez por página», activador de consentimiento de marketing |
Etiqueta lead_created | Vista de la página de gracias, secuenciada tras la base, con event_id |
| Página de gracias | Sin enlaces, noindex, solo tras el envío |
| Clave de la API | Solo en el servidor, nunca en GTM |
| Datos personales | Email y teléfono normalizados y en SHA-256; IP y user agent del visitante |
| Deduplicación | Mismo id en la API y event_id en el píxel |
| Consentimiento | Nada 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. 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.
Fuentes oficiales consultadas
- OpenAI for Developers: Measurement Pixel (instalación, consentimiento, cookies)
- OpenAI for Developers: Conversions API (endpoint, campos, hash y deduplicación)
- OpenAI for Developers: Supported Events
- OpenAI for Developers: Conversion Setup API
- Ayuda de OpenAI: Medición de conversiones
- Ayuda de OpenAI: Troubleshooting conversion tracking for ChatGPT Ads
- Ayuda de OpenAI: Understanding and improving event quality
- Ayuda de OpenAI: Conversion-optimized Campaigns
- WordPress Developer Resources: wp_remote_post()
- AEPD: Guía sobre el uso de las cookies





