> ## Documentation Index
> Fetch the complete documentation index at: https://restoo.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Mapeo de eventos

> Eventos y datos que Restoo Connect envía a cada plataforma de analítica y publicidad admitida.

Esta referencia documenta cómo [Restoo Connect](/es/widget/connect) traduce los [eventos nativos del widget de Restoo](/es/widget/events) a cada plataforma de analítica y publicidad admitida.

Para cada plataforma, las tablas muestran el evento nativo de Restoo, el evento o la llamada de API que produce y un enlace a un ejemplo de los datos que se envían. Los eventos estándar de cada plataforma se documentan por separado de los eventos personalizados de Restoo y de las actualizaciones de datos del cliente.

No hace falta leerla entera: ve directo a tu plataforma.

<CardGroup cols={3}>
  <Card title="Google Analytics 4" icon="chart-line" href="#google-analytics-4">
    `ga4`
  </Card>

  <Card title="Google Tag Manager" icon="tags" href="#google-tag-manager">
    `gtm`
  </Card>

  <Card title="Google Ads" icon="bullseye" href="#google-ads">
    `googleAds`
  </Card>

  <Card title="Meta Pixel" icon="meta" href="#meta-pixel">
    `metaPixel`
  </Card>

  <Card title="TikTok Pixel" icon="tiktok" href="#tiktok-pixel">
    `tiktokPixel`
  </Card>

  <Card title="OpenAI Pixel" icon="openai" href="#openai-pixel">
    `openaiPixel`
  </Card>
</CardGroup>

<Note>
  Cuando un visitante modifica una reserva que ya existe, Restoo Connect suprime
  los eventos de embudo y de conversión. Sí sigue reenviando `action_taken`,
  `customer_identified` y `customer_signed_out` a todas las plataformas, y
  `booking_updated` solo a GA4 y a Google Tag Manager. Una modificación no es una
  conversión nueva, así que nunca llega a Google Ads, Meta, TikTok ni ChatGPT Ads.
</Note>

## Modelo de captación

Restoo mide las reservas como **captación de leads**, no como ecommerce. Una reserva no se trata como una compra, sino como la captación y la cualificación de un cliente potencial.

Cada reserva creada dispara **una sola conversión**, elegida por el estado con el que nace:

| Conversión             | Se dispara cuando                                                  | Qué marca                 |
| ---------------------- | ------------------------------------------------------------------ | ------------------------- |
| **Lead**               | La reserva se crea pendiente de confirmación o en lista de espera. | Interés captado           |
| **Reserva confirmada** | La reserva se crea ya confirmada.                                  | El lead queda cualificado |

Las dos son excluyentes. Una reserva confirmada dispara la de reserva confirmada y no la de lead; una pendiente dispara la de lead y no la de reserva confirmada. Sumadas equivalen al total de reservas creadas, así que ninguna reserva se cuenta dos veces.

<Note>
  Con una política de cancelación, la reserva no existe hasta que el cliente la
  firma, así que la conversión se emite entonces y no al enviar el formulario. Si
  abandona la página de firma, no se cuenta ninguna conversión. El estado con el
  que nace la reserva decide igualmente cuál de las dos se dispara: una reserva con
  política de cancelación también puede quedar pendiente de confirmación o en
  lista de espera.
</Note>

Por el camino, Restoo emite además eventos de comportamiento —qué opciones ve un cliente, cuáles selecciona y dónde abandona— sin que nada de eso afecte a la medición de las conversiones. El envío del formulario de datos es uno de ellos: mientras la reserva no existe no hay nada que convertir.

Este enfoque tiene tres ventajas:

* **No contamina tus ingresos.** Las reservas nunca se cuentan como ventas, así que no distorsionan los informes de ingresos ni se mezclan con las ventas reales de productos, como las tarjetas regalo.
* **Refleja el negocio real.** Una reserva es una intención de visita, no una transacción cerrada, y el modelo de lead lo representa con fidelidad.
* **Las campañas optimizan bien.** Cada plataforma optimiza para captar reservas, sin sesgo hacia las reservas que casualmente llevan un anticipo.

Todas las plataformas reciben estas conversiones traducidas a su propio modelo de eventos, así que «una reserva es un lead» se mantiene coherente en todas ellas:

| Conversión         | GA4             | Google Ads          | Meta Pixel | TikTok Pixel | OpenAI Pixel            |
| ------------------ | --------------- | ------------------- | ---------- | ------------ | ----------------------- |
| Lead               | `generate_lead` | `booking_lead`      | `Lead`     | `SubmitForm` | `lead_created`          |
| Reserva confirmada | `qualify_lead`  | `booking_confirmed` | `Schedule` | `Schedule`   | `appointment_scheduled` |

El resto de esta página documenta todos los eventos que recibe cada plataforma, incluidos los de comportamiento, y los datos exactos que se envían con cada uno.

## Qué omite Restoo deliberadamente

Hay campos que quizá esperes encontrar y que no están en ninguno de los payloads documentados aquí. Es a propósito, así que conviene saberlo antes de ponerse a buscarlos.

**Los nombres del catálogo.** Las experiencias, los complementos y los elementos de un listado se identifican por ID —`best_burger:experience:7`—, nunca por su nombre.

El nombre de una experiencia es texto libre que escribe el negocio, y de ahí pueden inferirse datos de categorías especiales: un menú sin gluten apunta a la salud, una cena halal a las creencias religiosas, una experiencia temática puede apuntar a la orientación sexual. Bajo el RGPD eso exige un consentimiento explícito y aparte que este flujo no recoge, y las condiciones de Meta y de Google prohíben recibirlo: enviarlo pondría en riesgo la cuenta de publicidad.

Si tus informes necesitan etiquetas legibles, mantén tu propia tabla de equivalencias entre ID y nombre.

**Los campos del cliente que ningún destino lee.** El payload de identidad lleva solo el correo y el teléfono hasheados, porque son los dos únicos campos que consume algún destino. Antes se enviaban también un nombre, un código postal y un país, y se quitaron: el hasheo es pseudonimización, no anonimización, así que un campo que nadie lee es un dato personal expuesto sin ninguna finalidad.

**El dinero en las conversiones.** Las conversiones no llevan `value` ni `currency`: consulta [Modelo de captación](#modelo-de-captación).

<Note>
  Estos campos se eliminan en el origen, no destino a destino. Todos los eventos
  del widget se emiten a la página que lo incrusta, así que cualquier script de
  terceros que se ejecute ahí puede leerlos. Filtrar dentro de un destino
  protegería a Meta y a TikTok dejando ese canal completamente abierto.
</Note>

## Google Analytics 4

Con `ga4` activado, Restoo Connect llama a `gtag("event", eventName, data)`. Se usan los nombres de evento estándar de GA4 cuando hay un equivalente adecuado. Los eventos propios de Restoo usan el prefijo `restoo_`.

Todas las llamadas llevan `send_to` con el measurement ID de la propiedad [configurada en tu cuenta](/es/widget/integrations#google-analytics-4), así que los eventos llegan a esa propiedad y a ningún otro destino configurado en la página. En los ejemplos de abajo se omite, porque es el mismo en todos.

### Eventos estándar

Estos eventos usan nombres definidos por GA4. La tabla enlaza al payload exacto que se envía en cada correspondencia, incluidos los parámetros adicionales de Restoo.

| Evento de Restoo                                                                  | Evento estándar de GA4 enviado                                                                                     | Datos enviados                                                                             |
| --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
| [`booking_start_submitted`](/es/widget/events#embudo-de-reserva)                  | `search`                                                                                                           | [Datos del inicio de reserva](#datos-ga4-del-inicio-de-reserva)                            |
| [`booking_item_list_viewed`](/es/widget/events#eventos-de-listado-de-elementos)   | `view_item_list`                                                                                                   | [Datos del listado](#datos-ga4-del-listado-de-elementos)                                   |
| [`booking_item_selected`](/es/widget/events#eventos-de-listado-de-elementos)      | `select_item`                                                                                                      | [Datos del listado](#datos-ga4-del-listado-de-elementos)                                   |
| [`booking_item_detail_viewed`](/es/widget/events#eventos-de-listado-de-elementos) | `view_item`                                                                                                        | [Datos del detalle](#datos-ga4-del-detalle-de-un-elemento)                                 |
| [`booking_details_form_started`](/es/widget/events#embudo-de-reserva)             | `form_start`                                                                                                       | [Datos del formulario y de la reserva](#datos-ga4-del-formulario-de-datos-y-de-la-reserva) |
| [`booking_details_form_submitted`](/es/widget/events#embudo-de-reserva)           | `form_submit`                                                                                                      | [Datos del formulario y de la reserva](#datos-ga4-del-formulario-de-datos-y-de-la-reserva) |
| [`booking_created`](/es/widget/events#embudo-de-reserva)                          | `qualify_lead` si `booking.status` es `CONFIRMED`; `generate_lead` si es `REQUESTED` o `PENDING_WAIT_LIST_BOOKING` | [Datos de la reserva](#datos-ga4-del-formulario-de-datos-y-de-la-reserva)                  |
| [`action_taken`](/es/widget/events#acciones)                                      | `select_content` cuando la acción lo justifica                                                                     | [Datos de la acción](#datos-ga4-de-las-acciones)                                           |
| [`customer_identified`](/es/widget/events#cliente)                                | `login`                                                                                                            | [Datos del cliente](#datos-ga4-del-cliente)                                                |

Para el significado de estos parámetros de evento y de elemento, consulta la [referencia de eventos recomendados](https://developers.google.com/analytics/devguides/collection/ga4/reference/events) y la [documentación de ecommerce](https://developers.google.com/analytics/devguides/collection/ga4/ecommerce) de Google.

### Eventos personalizados de Restoo

Estos eventos no tienen un equivalente directo en GA4. Sus nombres usan el prefijo `restoo_` para que se puedan identificar como eventos personalizados.

| Evento de Restoo                                                        | Evento personalizado de GA4 enviado                                       | Datos enviados                                                                             |
| ----------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| [`booking_start_viewed`](/es/widget/events#embudo-de-reserva)           | `restoo_booking_start_viewed`                                             | [Datos del inicio de reserva](#datos-ga4-del-inicio-de-reserva)                            |
| [`booking_details_form_viewed`](/es/widget/events#embudo-de-reserva)    | `restoo_booking_details_form_viewed`                                      | [Datos del formulario y de la reserva](#datos-ga4-del-formulario-de-datos-y-de-la-reserva) |
| [`booking_conditions_viewed`](/es/widget/events#embudo-de-reserva)      | `restoo_booking_conditions_viewed`                                        | [Datos de la reserva](#datos-ga4-del-formulario-de-datos-y-de-la-reserva)                  |
| [`booking_conditions_accepted`](/es/widget/events#embudo-de-reserva)    | `restoo_booking_conditions_accepted`                                      | [Datos de la reserva](#datos-ga4-del-formulario-de-datos-y-de-la-reserva)                  |
| [`booking_cp_viewed`](/es/widget/events#embudo-de-reserva)              | `restoo_booking_cp_viewed`                                                | [Datos de la reserva](#datos-ga4-del-formulario-de-datos-y-de-la-reserva)                  |
| [`booking_cp_acknowledged`](/es/widget/events#embudo-de-reserva)        | `restoo_booking_cp_acknowledged`                                          | [Datos de la reserva](#datos-ga4-del-formulario-de-datos-y-de-la-reserva)                  |
| [`booking_cp_accepted`](/es/widget/events#embudo-de-reserva)            | `restoo_booking_cp_accepted`                                              | [Datos de la reserva](#datos-ga4-del-formulario-de-datos-y-de-la-reserva)                  |
| [`booking_updated`](/es/widget/events#embudo-de-reserva)                | `restoo_booking_updated`                                                  | [Datos de la reserva](#datos-ga4-del-formulario-de-datos-y-de-la-reserva)                  |
| [`booking_no_availability_viewed`](/es/widget/events#embudo-de-reserva) | `restoo_booking_no_availability_viewed`                                   | [Datos de reserva y disponibilidad](#datos-ga4-de-falta-de-disponibilidad)                 |
| [`action_taken`](/es/widget/events#acciones)                            | `restoo_action_taken`                                                     | [Datos de la acción](#datos-ga4-de-las-acciones)                                           |
| [`customer_identified`](/es/widget/events#cliente)                      | `restoo_customer_identified` cuando hay un correo o un teléfono hasheados | [Datos del cliente](#datos-ga4-del-cliente)                                                |
| [`customer_signed_out`](/es/widget/events#cliente)                      | `restoo_customer_signed_out`                                              | [Datos del cliente](#datos-ga4-del-cliente)                                                |

Los campos `booking_*`, `action_*` y `availability_outcome` son también parámetros personalizados. Consulta los [parámetros de eventos personalizados de GA4](https://developers.google.com/analytics/devguides/collection/ga4/event-parameters) para saber cómo exponerlos en los informes.

`generate_lead` y `qualify_lead` no incluyen `value` ni `currency`: una reserva se modela como un lead, no como una compra de ecommerce.

### Datos GA4 del inicio de reserva

Cuando se muestra la página de inicio de reserva, Restoo Connect envía el evento personalizado sin parámetros:

```js theme={null}
gtag("event", "restoo_booking_start_viewed", {});
```

Enviar un número de comensales y una fecha válidos manda un `search`, con un término de búsqueda sintético:

```js theme={null}
gtag("event", "search", {
  search_term: "pax_4_day_friday_shift_dinner",
});
```

El término de búsqueda describe el número total de comensales, el día de la semana y el turno, sin incluir una fecha exacta ni datos personales. Su formato es `pax_{guests}_day_{weekday}_shift_{shift}`; los niños se cuentan dentro del número de comensales.

### Datos GA4 del listado de elementos

```js theme={null}
gtag("event", "view_item_list", {
  item_list_id: "best_burger:booking_experiences",
  item_list_name: "best_burger:booking_experiences",
  items: [
    {
      item_id: "best_burger:experience:7",
      item_list_id: "best_burger:booking_experiences",
      item_list_name: "best_burger:booking_experiences",
      item_category: "experience",
      price: 65,
    },
  ],
});
```

`select_item` envía la misma estructura **más** la cantidad que eligió el cliente: `quantity` lleva el número de tickets de la experiencia, o las unidades del complemento. Un listado que se muestra todavía no tiene cantidad, así que `view_item_list` nunca la incluye. Los ID de listado están acotados a la cuenta y al tipo de listado.

| Tipo de listado       | Campos incluidos en cada elemento                                                 |
| --------------------- | --------------------------------------------------------------------------------- |
| `booking_experiences` | `item_category: "experience"`, `price` y `quantity` en `select_item`              |
| `booking_time_slots`  | `item_category: "time_slot"`, `item_date`, `item_time`, `item_floor_plan_area_id` |
| `booking_add_ons`     | `item_category: "add_on"`, `price` y `quantity` en `select_item`                  |

Los precios se convierten de la unidad más pequeña de la divisa a unidades decimales.

### Datos GA4 del detalle de un elemento

```js theme={null}
gtag("event", "view_item", {
  item_list_id: "best_burger:booking_experiences",
  item_list_name: "best_burger:booking_experiences",
  items: [
    {
      item_id: "best_burger:experience:7",
      item_category: "experience",
      item_list_id: "best_burger:booking_experiences",
    },
  ],
});
```

Para una zona, `item_category` es `floor_plan_area`.

### Datos GA4 del formulario de datos y de la reserva

Los tres eventos del formulario de datos del cliente —`restoo_booking_details_form_viewed` cuando se muestra, `form_start` cuando el cliente empieza a rellenarlo y `form_submit` cuando lo envía— incluyen los mismos identificadores fijos de formulario y el contexto actual de la reserva:

```js theme={null}
gtag("event", "form_submit", {
  form_id: "booking_details_form",
  form_name: "Booking details form",
  booking_account_id: "best-burger",
  booking_business_name: "Best Burger",
  booking_status: "CONFIRMED",
  booking_shift_type_id: "DINNER",
  booking_shift_type_name: "Dinner",
  booking_date: "2026-07-25",
  booking_weekday: "saturday",
  booking_time: "20:30:00",
  booking_pax: 2,
  booking_pax_children: 0,
  booking_is_time_limited: false,
  booking_floor_plan_area_name: "Terrace",
  booking_cancellation_policy_type: "PREPAYMENT",
});
```

`generate_lead`, `qualify_lead` y el resto de eventos de reserva propios de Restoo reciben los mismos campos de reserva, sin `form_id` ni `form_name`. Los campos cuyo valor de origen es `null` o `undefined` se omiten.

Consulta [BookingFunnel](/es/widget/events#bookingfunnel) para los campos de reserva de origen, y [BookingStatus](/getting-started/enums#bookingstatus), [ShiftType](/getting-started/enums#shifttype) y [CancellationPolicyType](/getting-started/enums#cancellationpolicytype) para las definiciones de los enumerados.

### Datos GA4 de falta de disponibilidad

```js theme={null}
gtag("event", "restoo_booking_no_availability_viewed", {
  booking_account_id: "best-burger",
  booking_business_name: "Best Burger",
  booking_status: "CONFIRMED",
  booking_date: "2026-07-25",
  booking_weekday: "saturday",
  booking_pax: 4,
  booking_pax_children: 0,
  booking_is_time_limited: false,
  availability_outcome: "SHIFT_FULL",
});
```

Consulta [AvailabilityOutcome](/getting-started/enums#availabilityoutcome) para los valores posibles y su significado.

### Datos GA4 de las acciones

`action_taken` emite siempre el evento propio de Restoo:

```js theme={null}
gtag("event", "restoo_action_taken", {
  action_category: "contact",
  action_option: "whatsapp",
});
```

Además, emite `select_content` cuando se trata de un canal de contacto concreto:

```js theme={null}
gtag("event", "select_content", {
  content_type: "contact_method",
  content_id: "contact_whatsapp",
});
```

En una alternativa por falta de disponibilidad, `content_type` es `availability_fallback` y `content_id` es la opción seleccionada. Abrir el menú de contacto (`option: "open"`) o usar una acción genérica de un solo paso (`option: "click"`) no emite el `select_content` de contacto.

### Datos GA4 del cliente

Antes de enviar los eventos de identificación, Restoo Connect define el correo y el teléfono hasheados disponibles como `user_data` global:

```js theme={null}
gtag("set", "user_data", {
  sha256_email_address: "ff8d9819fc0e12bf...",
  sha256_phone_number: "7f4597251b6a9f2c...",
});

gtag("event", "restoo_customer_identified", {});
gtag("event", "login", { method: "form" });
```

`restoo_customer_identified` se envía solo cuando hay un correo o un teléfono hasheados disponibles; `login` se envía siempre. Cuando el cliente identificado no tiene ninguno de los dos, `user_data` se define como `{}` para no dejar atrás la identidad de un visitante anterior. Al cerrar sesión, Restoo Connect limpia siempre `user_data` —esa eliminación no necesita consentimiento— y, cuando se cumple el requisito de consentimiento de esta propiedad, envía además `restoo_customer_signed_out`:

```js theme={null}
gtag("set", "user_data", {});
gtag("event", "restoo_customer_signed_out", {});
```

El `user_data` global no son datos de evento. GA4 solo los ingiere cuando la propiedad tiene activada la [recogida de datos proporcionados por el usuario](https://support.google.com/analytics/answer/14077171).

## Google Tag Manager

Con `gtm` activado, Restoo Connect envía objetos a `window.dataLayer`. Los nombres de los eventos son los mismos que en el destino directo de GA4, pero los datos de la reserva se anidan bajo `restoo` y los de los elementos, bajo `ecommerce`.

### Eventos estándar

Estos eventos del `dataLayer` reflejan la correspondencia estándar de GA4. Se pueden usar como triggers de evento personalizado para GA4 o para otras etiquetas de GTM.

| Evento de Restoo                                                                  | Evento estándar enviado al `dataLayer`                                                                             | Datos enviados                                                                               |
| --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
| [`booking_start_submitted`](/es/widget/events#embudo-de-reserva)                  | `search`                                                                                                           | [Envío del inicio de reserva](#envíos-gtm-del-inicio-de-reserva)                             |
| [`booking_item_list_viewed`](/es/widget/events#eventos-de-listado-de-elementos)   | `view_item_list`                                                                                                   | [Envío del listado](#envíos-gtm-de-elementos)                                                |
| [`booking_item_selected`](/es/widget/events#eventos-de-listado-de-elementos)      | `select_item`                                                                                                      | [Envío del listado](#envíos-gtm-de-elementos)                                                |
| [`booking_item_detail_viewed`](/es/widget/events#eventos-de-listado-de-elementos) | `view_item`                                                                                                        | [Envío del detalle](#envíos-gtm-de-elementos)                                                |
| [`booking_details_form_started`](/es/widget/events#embudo-de-reserva)             | `form_start`                                                                                                       | [Envío del formulario de datos](#envíos-gtm-del-formulario-de-datos-y-de-la-reserva)         |
| [`booking_details_form_submitted`](/es/widget/events#embudo-de-reserva)           | `form_submit`                                                                                                      | [Envíos del formulario y de la reserva](#envíos-gtm-del-formulario-de-datos-y-de-la-reserva) |
| [`booking_created`](/es/widget/events#embudo-de-reserva)                          | `qualify_lead` si `booking.status` es `CONFIRMED`; `generate_lead` si es `REQUESTED` o `PENDING_WAIT_LIST_BOOKING` | [Envío de la reserva](#envíos-gtm-del-formulario-de-datos-y-de-la-reserva)                   |
| [`action_taken`](/es/widget/events#acciones)                                      | `select_content` cuando la acción lo justifica                                                                     | [Envíos de la acción](#envíos-gtm-de-las-acciones)                                           |
| [`customer_identified`](/es/widget/events#cliente)                                | `login`                                                                                                            | [Envíos del cliente](#envíos-gtm-del-cliente)                                                |

### Eventos personalizados de Restoo

Estos eventos no tienen un equivalente estándar directo. Sus nombres usan el prefijo `restoo_`. Los eventos con datos adicionales los guardan bajo la clave `restoo`.

| Evento de Restoo                                                        | Evento personalizado enviado al `dataLayer`                        | Datos enviados                                                                             |
| ----------------------------------------------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
| [`booking_start_viewed`](/es/widget/events#embudo-de-reserva)           | `restoo_booking_start_viewed`                                      | [Envío del inicio de reserva](#envíos-gtm-del-inicio-de-reserva)                           |
| [`booking_details_form_viewed`](/es/widget/events#embudo-de-reserva)    | `restoo_booking_details_form_viewed`                               | [Envío del formulario de datos](#envíos-gtm-del-formulario-de-datos-y-de-la-reserva)       |
| [`booking_conditions_viewed`](/es/widget/events#embudo-de-reserva)      | `restoo_booking_conditions_viewed`                                 | [Envío completo de la reserva](#envíos-gtm-de-reserva-específicos-de-restoo)               |
| [`booking_conditions_accepted`](/es/widget/events#embudo-de-reserva)    | `restoo_booking_conditions_accepted`                               | [Envío completo de la reserva](#envíos-gtm-de-reserva-específicos-de-restoo)               |
| [`booking_cp_viewed`](/es/widget/events#embudo-de-reserva)              | `restoo_booking_cp_viewed`                                         | [Envío completo de la reserva](#envíos-gtm-de-reserva-específicos-de-restoo)               |
| [`booking_cp_acknowledged`](/es/widget/events#embudo-de-reserva)        | `restoo_booking_cp_acknowledged`                                   | [Envío completo de la reserva](#envíos-gtm-de-reserva-específicos-de-restoo)               |
| [`booking_cp_accepted`](/es/widget/events#embudo-de-reserva)            | `restoo_booking_cp_accepted`                                       | [Envío completo de la reserva](#envíos-gtm-de-reserva-específicos-de-restoo)               |
| [`booking_updated`](/es/widget/events#embudo-de-reserva)                | `restoo_booking_updated`                                           | [Envío completo de la reserva](#envíos-gtm-de-reserva-específicos-de-restoo)               |
| [`booking_no_availability_viewed`](/es/widget/events#embudo-de-reserva) | `restoo_booking_no_availability_viewed`                            | [Envío completo de reserva y disponibilidad](#envíos-gtm-de-reserva-específicos-de-restoo) |
| [`action_taken`](/es/widget/events#acciones)                            | `restoo_action_taken`                                              | [Envíos de la acción](#envíos-gtm-de-las-acciones)                                         |
| [`customer_identified`](/es/widget/events#cliente)                      | `restoo_customer_identified` cuando hay datos de cruce disponibles | [Envíos del cliente](#envíos-gtm-del-cliente)                                              |
| [`customer_signed_out`](/es/widget/events#cliente)                      | `restoo_customer_signed_out`                                       | [Envíos del cliente](#envíos-gtm-del-cliente)                                              |

Consulta la [documentación del data layer](https://developers.google.com/tag-platform/tag-manager/datalayer) de Google para saber cómo procesa GTM el campo `event` y el resto de variables de cada envío. Los objetos `restoo` anidados son variables propias de Restoo que puedes exponer con definiciones de variable de capa de datos en GTM.

### Envíos GTM del inicio de reserva

```js theme={null}
window.dataLayer.push({
  event: "restoo_booking_start_viewed",
});

window.dataLayer.push({
  event: "search",
  search_term: "pax_4_day_friday_shift_dinner",
});
```

El término de búsqueda usa el mismo valor sintético documentado en [Datos GA4 del inicio de reserva](#datos-ga4-del-inicio-de-reserva).

### Envíos GTM de elementos

```js theme={null}
window.dataLayer.push({
  event: "view_item_list",
  ecommerce: {
    item_list_id: "best_burger:booking_experiences",
    item_list_name: "best_burger:booking_experiences",
    items: [
      {
        item_id: "best_burger:experience:7",
        item_list_id: "best_burger:booking_experiences",
        item_list_name: "best_burger:booking_experiences",
        item_category: "experience",
        price: 65,
      },
    ],
  },
});
```

`select_item` usa el mismo objeto `ecommerce`. `view_item` usa los [datos GA4 del detalle de un elemento](#datos-ga4-del-detalle-de-un-elemento) bajo `ecommerce`.

### Envíos GTM del formulario de datos y de la reserva

```js theme={null}
window.dataLayer.push({
  event: "form_submit",
  form_id: "booking_details_form",
  form_name: "Booking details form",
  restoo: {
    booking_account_id: "best-burger",
    booking_business_name: "Best Burger",
    booking_status: "CONFIRMED",
    booking_date: "2026-07-25",
    booking_weekday: "saturday",
    booking_time: "20:30:00",
    booking_pax: 2,
    booking_pax_children: 0,
    booking_is_time_limited: false,
  },
});

window.dataLayer.push({
  event: "generate_lead",
  restoo: {
    booking_account_id: "best-burger",
    booking_business_name: "Best Burger",
    booking_status: "REQUESTED",
    booking_date: "2026-07-25",
    booking_weekday: "saturday",
    booking_time: "20:30:00",
    booking_pax: 2,
    booking_pax_children: 0,
    booking_is_time_limited: false,
  },
});
```

`restoo_booking_details_form_viewed` y `form_start` usan la primera estructura, cambiando solo el `event`. `qualify_lead` usa la segunda con `event: "qualify_lead"` y `booking_status: "CONFIRMED"`. El conjunto completo de campos de reserva está en [Datos GA4 del formulario de datos y de la reserva](#datos-ga4-del-formulario-de-datos-y-de-la-reserva).

### Envíos GTM de reserva específicos de Restoo

Los eventos propios de Restoo incluyen un contexto de reserva más completo. El nombre del evento cambia según la tabla de correspondencias; la estructura `restoo` es siempre la misma.

```js theme={null}
window.dataLayer.push({
  event: "restoo_booking_conditions_viewed",
  restoo: {
    booking_account_id: "best-burger",
    booking_business_name: "Best Burger",
    booking_status: "CONFIRMED",
    booking_shift_type_id: "DINNER",
    booking_shift_type_name: "Dinner",
    booking_date: "2026-07-25",
    booking_weekday: "saturday",
    booking_time: "20:30:00",
    booking_floor_plan_area_id: "best_burger:floor_plan_area:3",
    booking_floor_plan_area_name: "Terrace",
    booking_pax: 2,
    booking_pax_children: 0,
    booking_experience_id: "best_burger:experience:7",
    booking_experience_price_per_ticket: 65,
    booking_experience_currency: "EUR",
    booking_experience_tickets: 2,
    booking_add_ons: [
      {
        id: "best_burger:add_on:12",
        quantity: 2,
        unit_price: 25,
        currency: "EUR",
      },
    ],
    booking_is_time_limited: false,
    booking_cancellation_policy_type: "PREPAYMENT",
    booking_cancellation_policy_amount: 30,
    booking_cancellation_policy_amount_type: "PER_PAX",
    booking_cancellation_policy_fee_amount: 60,
    booking_cancellation_policy_charged_amount: 60,
    booking_cancellation_policy_notice_hours: 24,
    booking_cancellation_policy_currency: "EUR",
    booking_amount: 180,
    booking_currency: "EUR",
  },
});
```

Los campos que no aplican están presentes como `null`, salvo `booking_add_ons`, que es un array vacío cuando no se ha añadido nada. Los campos monetarios usan unidades decimales de la divisa. Consulta [CancellationPolicyAmountType](/getting-started/enums#cancellationpolicyamounttype) para los tipos de importe posibles.

`restoo_booking_no_availability_viewed` añade `availability_outcome` a ese mismo objeto `restoo`.

### Envíos GTM de las acciones

```js theme={null}
window.dataLayer.push({
  event: "restoo_action_taken",
  restoo: {
    action_category: "contact",
    action_option: "whatsapp",
  },
});

window.dataLayer.push({
  event: "select_content",
  content_type: "contact_method",
  content_id: "contact_whatsapp",
});
```

El segundo envío es condicional y sigue las mismas reglas que los [datos GA4 de las acciones](#datos-ga4-de-las-acciones).

### Envíos GTM del cliente

```js theme={null}
window.dataLayer.push({
  event: "restoo_customer_identified",
  user_data: {
    sha256_email_address: "ff8d9819fc0e12bf...",
    sha256_phone_number: "7f4597251b6a9f2c...",
  },
});

window.dataLayer.push({
  event: "login",
  method: "form",
});
```

Si no hay un correo o un teléfono hasheados disponibles, el primer evento se sustituye por `window.dataLayer.push({ user_data: {} })`; `login` se emite igualmente.

Al cerrar sesión son **dos envíos separados**, y no uno con las dos claves. La limpieza de `user_data` va sin `event` y ocurre siempre, porque retirar un dato no necesita permiso; el evento va aparte y solo cuando se cumple el requisito de consentimiento propio de GTM:

```js theme={null}
window.dataLayer.push({ user_data: {} });
window.dataLayer.push({ event: "restoo_customer_signed_out" });
```

Importa para tus etiquetas: una variable de capa de datos que lea `user_data` en el evento de cierre no encuentra la clave en ese envío, porque llegó en el anterior.

<Note>
  Antes de cada envío de evento, Restoo Connect limpia primero los campos
  transitorios `restoo`, `ecommerce`, de formulario, de búsqueda, de contenido y
  `method`, para que no se reutilicen valores de un evento anterior. `user_data`
  persiste hasta que se sustituye o se limpia.
</Note>

## Google Ads

Con `googleAds` activado, Restoo Connect envía las conversiones mediante `gtag("event", "conversion", data)` y gestiona los datos hasheados del cliente mediante `gtag("set", "user_data", data)`.

### Conversiones estándar

Todos los eventos de conversión usan el nombre de evento estándar `conversion` de Google Ads. `booking_lead`, `booking_confirmed` y `contact` identifican la acción de conversión configurada, no son nombres de eventos personalizados enviados a Google Ads.

| Evento de Restoo                                         | Llamada estándar a Google Ads                                                                                                                                       | Datos enviados                                                           |
| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| [`booking_created`](/es/widget/events#embudo-de-reserva) | `gtag("event", "conversion", …)` para `booking_confirmed` si `booking.status` es `CONFIRMED`, o para `booking_lead` si es `REQUESTED` o `PENDING_WAIT_LIST_BOOKING` | [Datos de la conversión](#datos-de-conversión-de-google-ads)             |
| [`action_taken`](/es/widget/events#acciones)             | `gtag("event", "conversion", …)` para `contact` cuando se elige un canal concreto                                                                                   | [Datos de la conversión de contacto](#datos-de-conversión-de-google-ads) |

### Actualizaciones de datos del cliente

Estas llamadas actualizan los datos de cruce globales; no son eventos ni conversiones.

| Evento de Restoo                                   | Llamada a Google Ads           | Datos enviados                                        |
| -------------------------------------------------- | ------------------------------ | ----------------------------------------------------- |
| [`customer_identified`](/es/widget/events#cliente) | `gtag("set", "user_data", …)`  | [Datos del cliente](#datos-del-cliente-en-google-ads) |
| [`customer_signed_out`](/es/widget/events#cliente) | `gtag("set", "user_data", {})` | [Datos del cliente](#datos-del-cliente-en-google-ads) |

Consulta la [guía de configuración de conversiones](https://support.google.com/google-ads/answer/12718882) de Google para saber cómo interpreta Google Ads las acciones de conversión, y la [documentación de conversiones mejoradas](https://support.google.com/google-ads/answer/13258081) para los datos de cruce del cliente.

Restoo Connect no envía eventos personalizados de Restoo a Google Ads.

### Datos de conversión de Google Ads

Cada conversión envía únicamente su destino configurado:

```js theme={null}
gtag("event", "conversion", {
  send_to: "AW-123456789/abc123DEF456",
});
```

Las conversiones no llevan `value`, ni `currency`, ni `transaction_id`. La referencia de la propia reserva sería el ID de transacción natural, pero esa referencia es también la llave a los datos personales del cliente, así que nunca sale del widget.

### Datos del cliente en Google Ads

```js theme={null}
gtag("set", "user_data", {
  sha256_email_address: "ff8d9819fc0e12bf...",
  sha256_phone_number: "7f4597251b6a9f2c...",
});
```

Al cerrar sesión, o cuando el cliente identificado no tiene un correo o un teléfono hasheados, Restoo Connect envía `gtag("set", "user_data", {})`. Los datos del cliente enriquecen una conversión cuando están disponibles, pero no son imprescindibles para que se dispare.

### Configurar los destinos de conversión

<Steps>
  <Step title="Crea las acciones de conversión">
    En Google Ads, ve a **Objetivos → Conversiones → Nueva acción de conversión →
    Sitio web**. Crea las acciones `booking_lead`, `booking_confirmed` y `contact`
    que quieras medir y elige la configuración manual con la etiqueta de Google.
    Usa esto como descripción de cada acción de conversión:

    | Acción              | Se dispara cuando                                                                                                                                                                      |
    | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `booking_lead`      | Se crea una reserva pendiente de confirmación o en lista de espera: estado `REQUESTED` o `PENDING_WAIT_LIST_BOOKING` (consulta [BookingStatus](/getting-started/enums#bookingstatus)). |
    | `booking_confirmed` | Se crea una reserva con estado `CONFIRMED`.                                                                                                                                            |
    | `contact`           | El cliente pulsa una acción de contacto: teléfono, correo o WhatsApp.                                                                                                                  |

    Cada reserva dispara una sola de las dos primeras. Configura las dos aunque
    tu local confirme al instante: un horario que se cubra pasa a solicitud o a
    lista de espera, y sin `booking_lead` esas reservas no se medirían.
  </Step>

  <Step title="Copia el ID de conversión y cada etiqueta">
    Abre la **configuración de la etiqueta** de la acción de conversión y copia su
    ID de conversión y su etiqueta. Consulta [cómo encontrar el ID y la
    etiqueta](https://support.google.com/google-ads/answer/7548399). El ID de
    conversión es de la cuenta y es el mismo para las tres acciones; la etiqueta
    es distinta en cada una.
  </Step>

  <Step title="Asígnalos en tu cuenta de Restoo">
    Pega el ID de conversión una vez, y cada etiqueta en la acción a la que
    corresponde, en la [configuración de tu integración de Google
    Ads](/es/widget/integrations#google-ads).

    Solo se emiten las acciones que tienen su etiqueta configurada, y una página no
    puede redirigirlas a otro sitio: `connect` solo admite `false`, para
    [desactivar un destino
    entero](/es/widget/connect#desactivar-un-destino-en-una-instalación).
  </Step>
</Steps>

## Meta Pixel

Con `metaPixel` activado, Restoo Connect envía los eventos mediante `fbq("trackSingle", pixelId, eventName, data)` —y `fbq("trackSingleCustom", …)` para los personalizados— y gestiona el Advanced Matching reinicializando tu pixel mediante `fbq("init", pixelId, userData)`. El ID del pixel [se declara en tu cuenta de Restoo](/es/widget/integrations#meta-pixel) y es obligatorio para poder activar este destino.

### Eventos estándar

Todos los eventos de medición que se envían a Meta usan nombres de evento estándar del Meta Pixel.

| Evento de Restoo                                                                  | Evento estándar de Meta enviado                                                                       | Datos enviados                                                       |
| --------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| [`booking_start_submitted`](/es/widget/events#embudo-de-reserva)                  | `Search`                                                                                              | [Datos de búsqueda](#datos-de-búsqueda-y-de-contenido-de-meta)       |
| [`booking_item_detail_viewed`](/es/widget/events#eventos-de-listado-de-elementos) | `ViewContent`                                                                                         | [Contenido del elemento](#datos-de-búsqueda-y-de-contenido-de-meta)  |
| [`booking_details_form_viewed`](/es/widget/events#embudo-de-reserva)              | `ViewContent`                                                                                         | [Contenido de la reserva](#datos-de-búsqueda-y-de-contenido-de-meta) |
| [`booking_created`](/es/widget/events#embudo-de-reserva)                          | `Schedule` si `booking.status` es `CONFIRMED`; `Lead` si es `REQUESTED` o `PENDING_WAIT_LIST_BOOKING` | [Contenido de la reserva](#datos-de-lead-y-schedule-de-meta)         |
| [`action_taken`](/es/widget/events#acciones)                                      | `Contact` cuando se elige un canal concreto                                                           | [Datos de contacto](#datos-de-contacto-y-de-cliente-de-meta)         |

### Eventos personalizados de Restoo

Las etapas del embudo van como eventos personalizados y no como eventos estándar: los eventos estándar de Meta son optimizables, y ninguna de estas etapas es una conversión. Meta no las cuenta como conversión salvo que crees una conversión personalizada sobre ellas (consulta [eventos estándar y personalizados](https://www.facebook.com/business/help/964258670337005)).

Todas se envían con `fbq("trackSingleCustom", pixelId, …)`.

| Evento de Restoo                                                                | Evento personalizado de Meta enviado | Datos enviados                                                                |
| ------------------------------------------------------------------------------- | ------------------------------------ | ----------------------------------------------------------------------------- |
| [`booking_start_viewed`](/es/widget/events#embudo-de-reserva)                   | `RestooBookingStartViewed`           | [Sin parámetros](#datos-de-búsqueda-y-de-contenido-de-meta)                   |
| [`booking_no_availability_viewed`](/es/widget/events#embudo-de-reserva)         | `RestooBookingNoAvailabilityViewed`  | [Contenido de la reserva y motivo](#datos-de-falta-de-disponibilidad-de-meta) |
| [`booking_item_list_viewed`](/es/widget/events#eventos-de-listado-de-elementos) | `RestooBookingItemListViewed`        | [Contenido del listado](#datos-de-listado-de-meta)                            |
| [`booking_item_selected`](/es/widget/events#eventos-de-listado-de-elementos)    | `RestooBookingItemSelected`          | [Contenido del listado](#datos-de-listado-de-meta)                            |
| [`booking_details_form_started`](/es/widget/events#embudo-de-reserva)           | `RestooBookingDetailsFormStarted`    | [Contenido de la reserva](#datos-de-lead-y-schedule-de-meta)                  |
| [`booking_details_form_submitted`](/es/widget/events#embudo-de-reserva)         | `RestooBookingDetailsFormSubmitted`  | [Contenido de la reserva](#datos-de-lead-y-schedule-de-meta)                  |
| [`booking_conditions_viewed`](/es/widget/events#embudo-de-reserva)              | `RestooBookingConditionsViewed`      | [Contenido de la reserva](#datos-de-lead-y-schedule-de-meta)                  |
| [`booking_conditions_accepted`](/es/widget/events#embudo-de-reserva)            | `RestooBookingConditionsAccepted`    | [Contenido de la reserva](#datos-de-lead-y-schedule-de-meta)                  |
| [`booking_cp_viewed`](/es/widget/events#embudo-de-reserva)                      | `RestooBookingCpViewed`              | [Contenido de la reserva](#datos-de-lead-y-schedule-de-meta)                  |
| [`booking_cp_acknowledged`](/es/widget/events#embudo-de-reserva)                | `RestooBookingCpAcknowledged`        | [Contenido de la reserva](#datos-de-lead-y-schedule-de-meta)                  |
| [`booking_cp_accepted`](/es/widget/events#embudo-de-reserva)                    | `RestooBookingCpAccepted`            | [Contenido de la reserva](#datos-de-lead-y-schedule-de-meta)                  |

### Actualizaciones de datos del cliente

Las dos llamadas necesitan el ID del pixel [configurado en tu cuenta](/es/widget/integrations#meta-pixel). Actualizan los datos de Advanced Matching de Meta; no son eventos del pixel.

| Evento de Restoo                                   | Llamada a Meta                                                         | Datos enviados                                               |
| -------------------------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------ |
| [`customer_identified`](/es/widget/events#cliente) | `fbq("init", pixelId, …)` cuando hay un correo o un teléfono hasheados | [Datos del cliente](#datos-de-contacto-y-de-cliente-de-meta) |
| [`customer_signed_out`](/es/widget/events#cliente) | `fbq("init", pixelId, {})`                                             | [Datos del cliente](#datos-de-contacto-y-de-cliente-de-meta) |

Consulta la [referencia de eventos del pixel](https://developers.facebook.com/docs/meta-pixel/reference) de Meta para el significado y los parámetros esperados de sus eventos estándar.

De `action_taken` solo viaja el contacto por un canal concreto. El resto de acciones —añadir al calendario, invitar, cómo llegar, recomendar, compartir, modificar, cancelar— ocurren cuando la reserva ya está hecha, así que no alimentan ninguna audiencia ni cuentan como conversión: se quedan en GA4 y en GTM.

### Datos de búsqueda y de contenido de Meta

Cuando se muestra la página de inicio de reserva, Restoo Connect envía el evento personalizado sin parámetros:

```js theme={null}
fbq("trackSingleCustom", "123456789012345", "RestooBookingStartViewed", {});
```

Enviar un número de comensales y una fecha válidos manda un `Search`, con un término de búsqueda sintético; el detalle de una experiencia manda un `ViewContent`:

```js theme={null}
fbq("trackSingle", "123456789012345", "Search", {
  search_string: "pax_4_day_friday_shift_dinner",
});

fbq("trackSingle", "123456789012345", "ViewContent", {
  content_ids: ["best_burger:experience:7"],
  content_type: "product",
});
```

El formulario de datos del cliente envía también `ViewContent`, con el contenido de la reserva:

```js theme={null}
fbq("trackSingle", "123456789012345", "ViewContent", {
  content_ids: [
    "best-burger",
    "best_burger:experience:7",
    "best_burger:add_on:12",
  ],
  content_type: "product",
  content_name: "Best Burger",
});
```

El `content_ids` de la reserva contiene el ID de la cuenta seguido de los ID de la experiencia y de los complementos seleccionados.

### Datos de listado de Meta

```js theme={null}
fbq("trackSingleCustom", "123456789012345", "RestooBookingItemListViewed", {
  content_ids: ["best_burger:experience:7", "best_burger:experience:9"],
  content_type: "product",
});
```

`RestooBookingItemSelected` envía la misma estructura con los elementos que eligió el cliente. Ninguno de los dos lleva `content_name` ni cantidades: los ID de los elementos son lo único que necesitan la atribución y las audiencias.

### Datos de falta de disponibilidad de Meta

```js theme={null}
fbq(
  "trackSingleCustom",
  "123456789012345",
  "RestooBookingNoAvailabilityViewed",
  {
    content_ids: ["best-burger"],
    content_type: "product",
    content_name: "Best Burger",
    availability_outcome: "SHIFT_FULL",
  },
);
```

Lleva el contenido de la reserva tal como está en el momento de la búsqueda, así que `content_ids` puede contener solo el ID de la cuenta. Consulta [AvailabilityOutcome](/getting-started/enums#availabilityoutcome) para los valores posibles y su significado.

### Datos de Lead y Schedule de Meta

```js theme={null}
fbq("trackSingle", "123456789012345", "Lead", {
  content_ids: [
    "best-burger",
    "best_burger:experience:7",
    "best_burger:add_on:12",
  ],
  content_type: "product",
  content_name: "Best Burger",
});
```

`Schedule` y los eventos personalizados del formulario de datos, de las condiciones y de la política de cancelación reciben el mismo contenido.

Los eventos de Meta no llevan precios, ni `value`, ni `currency`, ni ID de evento. Como no hay ID de evento, Meta no puede cruzar estos eventos con una integración de servidor de la [Conversions API](https://www.facebook.com/business/help/AboutConversionsAPI), así que no reportes las mismas reservas por las dos vías: consulta [Evitar conversiones duplicadas](/es/widget/bidding-optimization#evitar-conversiones-duplicadas-entre-ga4-google-ads-y-gtm).

### Datos de contacto y de cliente de Meta

```js theme={null}
fbq("trackSingle", "123456789012345", "Contact", {
  method: "whatsapp",
});

fbq("init", "123456789012345", {
  em: "ff8d9819fc0e12bf...",
  ph: "7f4597251b6a9f2c...",
});
```

`em` y `ph` contienen hashes SHA-256 normalizados. La llamada de identificación solo se hace cuando hay al menos un valor hasheado disponible. Al cerrar sesión, Restoo Connect envía `fbq("init", pixelId, {})`.

## TikTok Pixel

Con `tiktokPixel` activado, Restoo Connect envía los eventos mediante `ttq.instance(pixelId).track(eventName, data)` y gestiona los datos de cruce del cliente mediante `ttq.instance(pixelId).identify(data)`. Las dos van acotadas al pixel [configurado en tu cuenta](/es/widget/integrations#tiktok-pixel), así que una página con más de un pixel instalado solo los recibe en ese.

### Eventos estándar

Todos los eventos de medición que se envían a TikTok usan nombres de evento estándar del TikTok Pixel.

| Evento de Restoo                                                                  | Evento estándar de TikTok enviado                                                                           | Datos enviados                                                         |
| --------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| [`booking_start_submitted`](/es/widget/events#embudo-de-reserva)                  | `Search`                                                                                                    | [Datos de búsqueda](#datos-de-búsqueda-y-de-contenido-de-tiktok)       |
| [`booking_item_detail_viewed`](/es/widget/events#eventos-de-listado-de-elementos) | `ViewContent`                                                                                               | [Contenido del elemento](#datos-de-búsqueda-y-de-contenido-de-tiktok)  |
| [`booking_details_form_viewed`](/es/widget/events#embudo-de-reserva)              | `ViewContent`                                                                                               | [Contenido de la reserva](#datos-de-búsqueda-y-de-contenido-de-tiktok) |
| [`booking_created`](/es/widget/events#embudo-de-reserva)                          | `Schedule` si `booking.status` es `CONFIRMED`; `SubmitForm` si es `REQUESTED` o `PENDING_WAIT_LIST_BOOKING` | [Contenido de la reserva](#datos-de-submitform-y-schedule-de-tiktok)   |
| [`action_taken`](/es/widget/events#acciones)                                      | `Contact` cuando se elige un canal concreto                                                                 | [Datos de contacto](#datos-de-contacto-y-de-cliente-de-tiktok)         |

<Note>
  TikTok renombró `SubmitForm` como `Lead` y mantiene el nombre antiguo
  operativo, convirtiéndolo en su backend. Restoo envía `SubmitForm`, que es el
  que sigue en la referencia de eventos estándar, y en tus informes y en tu
  optimización lo verás como `Lead`. Consulta [los eventos estándar
  actualizados](https://ads.tiktok.com/help/article/how-to-adopt-tiktoks-updated-standard-events).
</Note>

### Eventos personalizados de Restoo

Las etapas del embudo van como eventos personalizados y no como eventos estándar: ninguna de ellas es una conversión. TikTok usa los eventos personalizados para informes y audiencias, pero no se pueden elegir como objetivo de optimización de campaña (consulta [eventos personalizados](https://ads.tiktok.com/help/article/custom-events)).

| Evento de Restoo                                                                | Evento personalizado de TikTok enviado | Datos enviados                                                                  |
| ------------------------------------------------------------------------------- | -------------------------------------- | ------------------------------------------------------------------------------- |
| [`booking_start_viewed`](/es/widget/events#embudo-de-reserva)                   | `RestooBookingStartViewed`             | [Sin parámetros](#datos-de-búsqueda-y-de-contenido-de-tiktok)                   |
| [`booking_no_availability_viewed`](/es/widget/events#embudo-de-reserva)         | `RestooBookingNoAvailabilityViewed`    | [Contenido de la reserva y motivo](#datos-de-falta-de-disponibilidad-de-tiktok) |
| [`booking_item_list_viewed`](/es/widget/events#eventos-de-listado-de-elementos) | `RestooBookingItemListViewed`          | [Contenido del listado](#datos-de-listado-de-tiktok)                            |
| [`booking_item_selected`](/es/widget/events#eventos-de-listado-de-elementos)    | `RestooBookingItemSelected`            | [Contenido del listado](#datos-de-listado-de-tiktok)                            |
| [`booking_details_form_started`](/es/widget/events#embudo-de-reserva)           | `RestooBookingDetailsFormStarted`      | [Contenido de la reserva](#datos-de-submitform-y-schedule-de-tiktok)            |
| [`booking_details_form_submitted`](/es/widget/events#embudo-de-reserva)         | `RestooBookingDetailsFormSubmitted`    | [Contenido de la reserva](#datos-de-submitform-y-schedule-de-tiktok)            |
| [`booking_conditions_viewed`](/es/widget/events#embudo-de-reserva)              | `RestooBookingConditionsViewed`        | [Contenido de la reserva](#datos-de-submitform-y-schedule-de-tiktok)            |
| [`booking_conditions_accepted`](/es/widget/events#embudo-de-reserva)            | `RestooBookingConditionsAccepted`      | [Contenido de la reserva](#datos-de-submitform-y-schedule-de-tiktok)            |
| [`booking_cp_viewed`](/es/widget/events#embudo-de-reserva)                      | `RestooBookingCpViewed`                | [Contenido de la reserva](#datos-de-submitform-y-schedule-de-tiktok)            |
| [`booking_cp_acknowledged`](/es/widget/events#embudo-de-reserva)                | `RestooBookingCpAcknowledged`          | [Contenido de la reserva](#datos-de-submitform-y-schedule-de-tiktok)            |
| [`booking_cp_accepted`](/es/widget/events#embudo-de-reserva)                    | `RestooBookingCpAccepted`              | [Contenido de la reserva](#datos-de-submitform-y-schedule-de-tiktok)            |

### Actualizaciones de datos del cliente

Estas llamadas actualizan los datos de cruce de TikTok; no son eventos del pixel.

| Evento de Restoo                                   | Llamada a TikTok                                                                 | Datos enviados                                                 |
| -------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------- |
| [`customer_identified`](/es/widget/events#cliente) | `ttq.instance(pixelId).identify(…)` cuando hay un correo o un teléfono hasheados | [Datos del cliente](#datos-de-contacto-y-de-cliente-de-tiktok) |
| [`customer_signed_out`](/es/widget/events#cliente) | `ttq.instance(pixelId).identify({})`                                             | [Datos del cliente](#datos-de-contacto-y-de-cliente-de-tiktok) |

Consulta la [referencia de eventos estándar](https://ads.tiktok.com/help/article/standard-events-parameters) y la [referencia de parámetros](https://ads.tiktok.com/help/article/about-parameters) de TikTok para el significado y el formato esperado de sus campos estándar.

De `action_taken` solo viaja el contacto por un canal concreto. El resto de acciones —añadir al calendario, invitar, cómo llegar, recomendar, compartir, modificar, cancelar— ocurren cuando la reserva ya está hecha, así que no alimentan ninguna audiencia ni cuentan como conversión: se quedan en GA4 y en GTM.

### Datos de búsqueda y de contenido de TikTok

Cuando se muestra la página de inicio de reserva, Restoo Connect envía el evento personalizado sin parámetros:

```js theme={null}
ttq.instance("C1234567890ABCDEFGHI").track("RestooBookingStartViewed", {});
```

Enviar un número de comensales y una fecha válidos manda un `Search`, con un término de búsqueda sintético; el detalle de una experiencia manda un `ViewContent`:

```js theme={null}
ttq.instance("C1234567890ABCDEFGHI").track("Search", {
  search_string: "pax_4_day_friday_shift_dinner",
});

ttq.instance("C1234567890ABCDEFGHI").track("ViewContent", {
  content_ids: ["best_burger:experience:7"],
  content_type: "product",
});
```

El formulario de datos del cliente envía también `ViewContent`, con el contenido de la reserva:

```js theme={null}
ttq.instance("C1234567890ABCDEFGHI").track("ViewContent", {
  content_ids: [
    "best-burger",
    "best_burger:experience:7",
    "best_burger:add_on:12",
  ],
  content_type: "product",
  content_name: "Best Burger",
});
```

### Datos de listado de TikTok

```js theme={null}
ttq.instance("C1234567890ABCDEFGHI").track("RestooBookingItemListViewed", {
  content_ids: ["best_burger:experience:7", "best_burger:experience:9"],
  content_type: "product",
});
```

`RestooBookingItemSelected` envía la misma estructura con los elementos que eligió el cliente. Ninguno de los dos lleva `content_name` ni cantidades: los ID de los elementos son lo único que necesitan la atribución y las audiencias.

### Datos de falta de disponibilidad de TikTok

```js theme={null}
ttq
  .instance("C1234567890ABCDEFGHI")
  .track("RestooBookingNoAvailabilityViewed", {
    content_ids: ["best-burger"],
    content_type: "product",
    content_name: "Best Burger",
    availability_outcome: "SHIFT_FULL",
  });
```

Lleva el contenido de la reserva tal como está en el momento de la búsqueda, así que `content_ids` puede contener solo el ID de la cuenta. Consulta [AvailabilityOutcome](/getting-started/enums#availabilityoutcome) para los valores posibles y su significado.

### Datos de SubmitForm y Schedule de TikTok

```js theme={null}
ttq.instance("C1234567890ABCDEFGHI").track("SubmitForm", {
  content_ids: [
    "best-burger",
    "best_burger:experience:7",
    "best_burger:add_on:12",
  ],
  content_type: "product",
  content_name: "Best Burger",
});
```

`Schedule` y los eventos personalizados del formulario de datos, de las condiciones y de la política de cancelación reciben el mismo contenido.

Los eventos de TikTok no llevan precios, ni `value`, ni `currency`, ni ID de evento. Igual que con Meta, eso significa que estos eventos no se pueden cruzar con una integración de servidor de la Events API: consulta [Evitar conversiones duplicadas](/es/widget/bidding-optimization#evitar-conversiones-duplicadas-entre-ga4-google-ads-y-gtm).

### Datos de contacto y de cliente de TikTok

```js theme={null}
ttq.instance("C1234567890ABCDEFGHI").track("Contact", {
  method: "whatsapp",
});

ttq.instance("C1234567890ABCDEFGHI").identify({
  email: "ff8d9819fc0e12bf...",
  phone_number: "7f4597251b6a9f2c...",
});
```

`email` y `phone_number` contienen hashes SHA-256 normalizados. La identificación solo se envía cuando hay al menos un valor disponible. Al cerrar sesión, Restoo Connect envía `ttq.instance(pixelId).identify({})`.

## OpenAI Pixel

Con `openaiPixel` activado, Restoo Connect envía los eventos al pixel de ChatGPT Ads mediante `oaiq("measureSingle", pixelId, eventName, data, options)` y fija los datos de cruce del cliente mediante `oaiq("init", { pixelId, user })`. Las dos van acotadas al pixel [configurado en tu cuenta](/es/widget/integrations#openai-pixel), así que una página con más de un pixel inicializado solo los recibe en ese: `measure`, la llamada que reparte a todos, no se usa.

En este destino el nombre del evento y la forma de sus datos van por separado: cada evento estándar exige un `data.type` concreto, y el SDK **descarta el evento entero** si `data` lleva un campo que no documenta para ese tipo. Los datos de las tablas de abajo son exactamente los que caben.

### Eventos estándar

| Evento de Restoo                                                                  | Evento estándar de OpenAI enviado                                                                                          | Datos enviados                                               |
| --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| [`booking_item_list_viewed`](/es/widget/events#eventos-de-listado-de-elementos)   | `contents_viewed`                                                                                                          | [Contenido del listado](#datos-de-listado-del-openai-pixel)  |
| [`booking_item_detail_viewed`](/es/widget/events#eventos-de-listado-de-elementos) | `contents_viewed`                                                                                                          | [Contenido del elemento](#datos-de-listado-del-openai-pixel) |
| [`booking_item_selected`](/es/widget/events#eventos-de-listado-de-elementos)      | `items_added`                                                                                                              | [Contenido del listado](#datos-de-listado-del-openai-pixel)  |
| [`booking_created`](/es/widget/events#embudo-de-reserva)                          | `appointment_scheduled` si `booking.status` es `CONFIRMED`; `lead_created` si es `REQUESTED` o `PENDING_WAIT_LIST_BOOKING` | [Datos de conversión](#datos-de-conversión-del-openai-pixel) |

<Note>
  ChatGPT Ads no tiene un evento estándar de búsqueda ni uno de formulario, así
  que la búsqueda de disponibilidad y el formulario de datos, que en Meta y TikTok
  son `Search` y `ViewContent`, aquí van como eventos personalizados.
</Note>

### Eventos personalizados de Restoo

Las etapas del embudo van como eventos personalizados —el evento `custom`, con el nombre en `custom_event_name`— y no como eventos estándar: ninguna de ellas es una conversión. ChatGPT Ads los admite para medición, pero [no como objetivo de optimización](https://developers.openai.com/ads/conversion-optimized-campaigns) de una campaña. El contacto también va personalizado, porque ningún evento estándar lo describe. Llevan el prefijo `restoo_` porque comparten pixel con los eventos personalizados que envíe tu propio sitio.

| Evento de Restoo                                                        | `custom_event_name` enviado                 | Datos enviados                                                        |
| ----------------------------------------------------------------------- | ------------------------------------------- | --------------------------------------------------------------------- |
| [`booking_start_viewed`](/es/widget/events#embudo-de-reserva)           | `restoo_booking_start_viewed`               | [Sin contenido](#datos-de-reserva-del-openai-pixel)                   |
| [`booking_start_submitted`](/es/widget/events#embudo-de-reserva)        | `restoo_booking_start_submitted`            | [Contenido de la reserva](#datos-de-reserva-del-openai-pixel)         |
| [`booking_no_availability_viewed`](/es/widget/events#embudo-de-reserva) | `restoo_booking_no_availability_viewed`     | [Contenido de la reserva](#datos-de-reserva-del-openai-pixel)         |
| [`booking_details_form_viewed`](/es/widget/events#embudo-de-reserva)    | `restoo_booking_details_form_viewed`        | [Contenido de la reserva](#datos-de-reserva-del-openai-pixel)         |
| [`booking_details_form_started`](/es/widget/events#embudo-de-reserva)   | `restoo_booking_details_form_started`       | [Contenido de la reserva](#datos-de-reserva-del-openai-pixel)         |
| [`booking_details_form_submitted`](/es/widget/events#embudo-de-reserva) | `restoo_booking_details_form_submitted`     | [Contenido de la reserva](#datos-de-reserva-del-openai-pixel)         |
| [`booking_conditions_viewed`](/es/widget/events#embudo-de-reserva)      | `restoo_booking_conditions_viewed`          | [Contenido de la reserva](#datos-de-reserva-del-openai-pixel)         |
| [`booking_conditions_accepted`](/es/widget/events#embudo-de-reserva)    | `restoo_booking_conditions_accepted`        | [Contenido de la reserva](#datos-de-reserva-del-openai-pixel)         |
| [`booking_cp_viewed`](/es/widget/events#embudo-de-reserva)              | `restoo_booking_cp_viewed`                  | [Contenido de la reserva](#datos-de-reserva-del-openai-pixel)         |
| [`booking_cp_acknowledged`](/es/widget/events#embudo-de-reserva)        | `restoo_booking_cp_acknowledged`            | [Contenido de la reserva](#datos-de-reserva-del-openai-pixel)         |
| [`booking_cp_accepted`](/es/widget/events#embudo-de-reserva)            | `restoo_booking_cp_accepted`                | [Contenido de la reserva](#datos-de-reserva-del-openai-pixel)         |
| [`action_taken`](/es/widget/events#acciones)                            | `contact` cuando se elige un canal concreto | [Datos de contacto](#datos-de-contacto-y-de-cliente-del-openai-pixel) |

### Actualizaciones de datos del cliente

Estas llamadas fijan los datos de cruce del pixel; no son eventos.

| Evento de Restoo                                   | Llamada a OpenAI                                                               | Datos enviados                                                        |
| -------------------------------------------------- | ------------------------------------------------------------------------------ | --------------------------------------------------------------------- |
| [`customer_identified`](/es/widget/events#cliente) | `oaiq("init", { pixelId, user })` cuando hay un correo o un teléfono hasheados | [Datos del cliente](#datos-de-contacto-y-de-cliente-del-openai-pixel) |
| [`customer_signed_out`](/es/widget/events#cliente) | `oaiq("init", { pixelId, user: {} })`                                          | [Datos del cliente](#datos-de-contacto-y-de-cliente-del-openai-pixel) |

Consulta los [eventos admitidos](https://developers.openai.com/ads/supported-events) y la [referencia del pixel](https://developers.openai.com/ads/measurement-pixel) de OpenAI para el significado y el formato esperado de sus campos.

De `action_taken` solo viaja el contacto por un canal concreto. El resto de acciones —añadir al calendario, invitar, cómo llegar, recomendar, compartir, modificar, cancelar— ocurren cuando la reserva ya está hecha, así que no alimentan ninguna audiencia ni cuentan como conversión: se quedan en GA4 y en GTM.

### Datos de reserva del OpenAI Pixel

Cuando se muestra la página de inicio de reserva, Restoo Connect envía el evento personalizado sin contenido:

```js theme={null}
oaiq(
  "measureSingle",
  "AbC123dEf456GhI789JkL0",
  "custom",
  { type: "custom" },
  { custom_event_name: "restoo_booking_start_viewed" },
);
```

El resto de etapas llevan el contenido de la reserva tal como está en ese momento: el negocio, con los comensales como cantidad, y, si los hay, la experiencia con sus entradas y los complementos con sus unidades. Al buscar disponibilidad o no encontrarla, la reserva aún no tiene experiencia ni complementos, así que solo va el negocio.

```js theme={null}
oaiq(
  "measureSingle",
  "AbC123dEf456GhI789JkL0",
  "custom",
  {
    type: "custom",
    contents: [
      { id: "best-burger", name: "Best Burger", content_type: "product", quantity: 4 },
      { id: "best_burger:experience:7", content_type: "product", quantity: 4 },
      { id: "best_burger:add_on:12", content_type: "product", quantity: 2 },
    ],
  },
  { custom_event_name: "restoo_booking_details_form_viewed" },
);
```

Solo el negocio lleva `name`; los demás elementos se identifican por su ID, por lo que se explica en [qué omite Restoo deliberadamente](#qué-omite-restoo-deliberadamente). Ningún elemento lleva `amount` ni `currency`.

Dos datos que Meta y TikTok sí reciben no viajan a este destino: el término de búsqueda sintético de `Search` y el `availability_outcome` de la falta de disponibilidad. No son campos que el SDK documente, y llevarlos descartaría el evento entero.

### Datos de listado del OpenAI Pixel

```js theme={null}
oaiq("measureSingle", "AbC123dEf456GhI789JkL0", "contents_viewed", {
  type: "contents",
  contents: [
    { id: "best_burger:experience:7", content_type: "product" },
    { id: "best_burger:experience:9", content_type: "product" },
  ],
});
```

`items_added` envía la misma estructura con los elementos que eligió el cliente, y el detalle de un elemento envía `contents_viewed` con ese único elemento. Ninguno lleva `name` ni cantidades: los ID de los elementos son lo único que necesitan la atribución y las audiencias.

### Datos de conversión del OpenAI Pixel

```js theme={null}
oaiq("measureSingle", "AbC123dEf456GhI789JkL0", "appointment_scheduled", {
  type: "customer_action",
});
```

`lead_created` envía exactamente lo mismo. El tipo `customer_action`, que es el que exigen estos dos eventos, no admite `contents`, así que la conversión no lleva los ID de la reserva: van en las etapas del embudo que la preceden.

Los eventos del OpenAI Pixel no llevan precios, ni `amount`, ni `currency`, ni ID de evento. Igual que con Meta y TikTok, eso significa que no se pueden cruzar con una integración de servidor de la Conversions API de OpenAI: consulta [Evitar conversiones duplicadas](/es/widget/bidding-optimization#evitar-conversiones-duplicadas-entre-ga4-google-ads-y-gtm).

### Datos de contacto y de cliente del OpenAI Pixel

```js theme={null}
oaiq(
  "measureSingle",
  "AbC123dEf456GhI789JkL0",
  "custom",
  { type: "custom" },
  { custom_event_name: "contact" },
);

oaiq("init", {
  pixelId: "AbC123dEf456GhI789JkL0",
  user: {
    email_sha256: "ff8d9819fc0e12bf...",
    phone_number_sha256: "7f4597251b6a9f2c...",
  },
});
```

El contacto no lleva el canal: un evento `custom` no admite campos propios en el pixel. `email_sha256` y `phone_number_sha256` contienen hashes SHA-256 normalizados; el del teléfono es el del formato MSISDN, el mismo que recibe Meta (consulta [Identidad del cliente](/es/widget/consent#identidad-del-cliente)). La identificación solo se envía cuando hay al menos un valor disponible. Al cerrar sesión, Restoo Connect envía `oaiq("init", { pixelId, user: {} })`, que retira la identidad del pixel.

## Siguientes pasos

<CardGroup cols={2}>
  <Card title="Pujas y optimización" icon="bullseye" href="/es/widget/bidding-optimization">
    Elige hacia qué eventos optimizar las campañas en cada plataforma.
  </Card>

  <Card title="Consentimiento" icon="shield-check" href="/es/widget/consent">
    Qué necesita cada destino para recibir un evento, señal a señal.
  </Card>
</CardGroup>
