Implementación

Esquema de POST

La solicitud POST que se envía al webhook estará en formato JSON con el siguiente esquema:

Carga útil de Proto del webhook

// Represent user lead data for single column
message UserLeadColumnData {
  // Human-readable text of the field type (e.g.: Full Name,  What is your
  // preferred dealership?). This field might not always be populated.
  optional string column_name = 1;

  // Column value based on column type
  oneof column_value {
    string string_value = 2;
  }
  // Column ID. Populated for all types of fields. (e.g.: FULL_NAME)
  optional string column_id = 3;
}

// Message to construct webhook JSON payload
message WebhookLead {
  // Unique ID to represent lead
  optional string lead_id = 1;
  // User inputted data per column
  repeated UserLeadColumnData user_column_data = 2;
  // API version
  optional string api_version = 3;
  // Form ID to which lead belonged to.
  optional int64 form_id = 4;
  // Campaign ID that the lead form is associated with
  optional int64 campaign_id = 5;
  // Key to be used by advertiser to verify the request
  // is from Google.
  optional string google_key = 6;
  // Denotes if the lead is a test lead.
  optional bool is_test = 7;
  // Click ID for the lead submission.
  optional string gcl_id = 8;
  // Adgroup ID which generated the lead.
  optional int64 adgroup_id = 9;
  // Creative ID which generated the lead.
  optional int64 creative_id = 10;
  // Asset group ID represents the container for holding assets, associated
  // URLs, hints and criteria that will be used to select assets and for
  // optimization. This field is only populated for Performance Max campaigns.
  int64 asset_group_id = 11;
  // Lead stage at the time of delivery.
  string lead_stage = 12 [(datapol.semantic_type) = ST_NOT_REQUIRED];
  // Lead submit time in ISO-8601 format. Ex- 2024-09-26T12:30:00Z
  string lead_submit_time = 13 [(datapol.semantic_type) = ST_NOT_REQUIRED];
}

Descripción del campo

Campo Descripción
lead_id Es una cadena única que identifica un cliente potencial determinado.

Control de recomendaciones: Úsalo para anular la duplicación de los clientes potenciales que se reciben. Será único en todos los formularios. Cuando informes problemas relacionados con un cliente potencial específico, se requerirá este ID.

api_version Es la versión de la API a la que pertenece este esquema de clientes potenciales. Se usará cuando se migre a un esquema nuevo y se puede ignorar por el momento.
form_id Es el ID único de cada formulario configurado en Google Ads. El producto actual permite adjuntar un formulario a nivel de la campaña (en lugar de adjuntarlo a nivel del grupo de anuncios o del anuncio).

Implicaciones: Los clientes potenciales solo se pueden segmentar a nivel de form_id (es decir, a nivel de la campaña).

Los clientes deben usar un número entero de 8 bytes para procesar.

campaign_id Es el ID de la campaña de Google Ads o el ID de la línea de pedido (Display & Video 360) del formulario de clientes potenciales adjunto.

Los clientes deben usar un número entero de 8 bytes para procesar.

adgroup_id El ID del grupo de anuncios de Google Ads se usa para distinguir el grupo de anuncios específico en la campaña. (Solo disponible para los clientes potenciales de los anuncios de video y discovery)

Los clientes deben usar un número entero de 8 bytes para procesar.

creative_id El ID de la creatividad de Google Ads se usa para distinguir la creatividad específica en el grupo de anuncios. (Solo disponible para los clientes potenciales de los anuncios de video y discovery)

Los clientes deben usar un número entero de 8 bytes para procesar.

gcl_id ID de clic de Google, un parámetro único que se usa para hacer un seguimiento de cada clic en un anuncio
google_key Es una clave que configura el anunciante con cada formulario.

Sugerencia de procesamiento: Antes de procesar un cliente potencial recibido a través de un webhook, validar google_key es lo mismo que configurarlo en Google Ads para tener más confianza en que el cliente potencial es válido. Mantén esta clave confidencial y actualízala en Google Ads si hay motivos para creer que se filtró de forma generalizada.

is_test Este campo tiene semántica "opcional". Si el valor es verdadero, trata este cliente potencial como cliente potencial de prueba. Si el valor es falso o si el campo no está presente, trata este cliente potencial como un cliente potencial de producción válido.
user_column_data Es una tupla clave-valor repetida que transmite los datos enviados por el usuario.
  • user_column_data.column_id: Es el tipo de datos que envió el usuario.
  • User_column_data.column_value: Para cada tipo de datos, se completará un tipo de valor según el tipo de datos. Todos nuestros tipos de datos actuales tienen el valor user_column_data.string_value.
  • user_column_data.column_name: Es el texto legible del tipo de datos que envió el usuario. Es posible que este campo no siempre se complete. Usa column_id en su lugar.
user_column_data.column_id Contenido de User_column_data.string_value user_column_data.column_name (obsoleto)
"FULL_NAME" Nombre completo del usuario. "Nombre completo"
"FIRST_NAME" Es el nombre del usuario. "Nombre"
"LAST_NAME" Es el apellido del usuario. "Apellido"
"EMAIL" Es el correo electrónico del usuario. "Correo electrónico del usuario"
"PHONE_NUMBER" Teléfono del usuario en formato E.164, p.ej., "+11234567890". "Teléfono del usuario"
"PHONE_NUMBER_VERIFIED" Indica si se verificó el número de teléfono del usuario. "Se verificó el número de teléfono"
"POSTAL_CODE" Es el código postal del usuario. "Código postal"
"COMPANY_NAME" Nombre de la empresa del usuario. "Nombre de la empresa"
"JOB_TITLE" Es el cargo del usuario. "Título del empleo"
"WORK_EMAIL" Es el correo electrónico laboral del usuario. "Correo electrónico del trabajo"
"WORK_PHONE" Es el teléfono del trabajo del usuario. "Teléfono del trabajo"
"STREET_ADDRESS" Es la dirección del usuario. "Dirección"
"CITY" Ciudad del usuario. "Ciudad"
"REGION" Región del usuario. "Región"
"COUNTRY" País del usuario. "País"
"VEHICLE_MODEL" ¿Qué modelo le interesa? N/A
"VEHICLE_TYPE" ¿Qué tipo de vehículo le interesa? N/A
"PREFERRED_DEALERSHIP" Seleccione su concesionario preferido N/A
"VEHICLE_PURCHASE_TIMELINE" ¿Cuándo planea comprar un vehículo? N/A
"VEHICLE_CONDITION" ¿Le interesa un vehículo nuevo o usado? N/A
"VEHICLE_OWNERSHIP" ¿Tiene un vehículo? “N/A”
"VEHICLE_PAYMENT_TYPE" ¿Qué opción de propiedad del vehículo le interesa? N/A
"COMPANY_SIZE" ¿De qué tamaño es su empresa? N/A
"ANNUAL_SALES" ¿Cuál es su volumen anual de ventas? N/A
"YEARS_IN_BUSINESS" ¿Cuántos años lleva en el negocio? N/A
"JOB_DEPARTMENT" ¿En qué departamento trabaja? N/A
"JOB_ROLE" ¿Cuál es su puesto de trabajo? N/A
"EDUCATION_PROGRAM" ¿Qué programa le interesa? N/A
"EDUCATION_COURSE" ¿Qué curso le interesa? N/A
"PRODUCT" ¿Qué producto le interesa? N/A
"SERVICE" ¿Qué servicio le interesa? N/A
"OFFER" ¿Qué oferta le interesa? N/A
"CATEGORY" ¿Qué categoría le interesa? N/A
"PREFERRED_CONTACT_METHOD" Seleccione su forma de contacto preferida N/A
"PREFERRED_LOCATION" Seleccione su ubicación preferida N/A
"PREFERRED_CONTACT_TIME" ¿Cuál es el mejor horario para contactarlo? N/A
"PURCHASE_TIMELINE" ¿Cuándo pretende realizar una compra? N/A
"YEARS_OF_EXPERIENCE" ¿Cuántos años de experiencia laboral tiene? N/A
"JOB_INDUSTRY" ¿En qué industria trabajas? N/A
"LEVEL_OF_EDUCATION" ¿Cuál es su último grado de estudios? N/A
"PROPERTY_TYPE" ¿Qué tipo de propiedad busca? N/A
"REALTOR_HELP_GOAL" ¿Para qué necesita la ayuda de un agente inmobiliario? N/A
"PROPERTY_COMMUNITY" ¿Qué comunidad le interesa? N/A
"PRICE_RANGE" ¿Qué intervalo de precios busca? N/A
"NUMBER_OF_BEDROOMS" ¿Cuántas habitaciones desea? N/A
"FURNISHED_PROPERTY" ¿Busca una propiedad completamente amoblada? N/A
"PETS_ALLOWED_PROPERTY" ¿Busca propiedades donde se permitan mascotas? N/A
"NEXT_PLANNED_PURCHASE" ¿Cuál es el próximo producto que planea comprar? N/A
"EVENT_SIGNUP_INTEREST" ¿Le gustaría registrarse en un evento? N/A
"PREFERRED_SHOPPING_PLACES" ¿Dónde le interesa realizar compras? N/A
"FAVORITE_BRAND" ¿Cuál es su marca favorita? N/A
"TRANSPORTATION_COMMERCIAL_LICENSE_TYPE" ¿Qué tipo de licencia comercial válida tiene? N/A
"EVENT_BOOKING_INTEREST" ¿Te interesa reservar un evento? N/A
"DESTINATION_COUNTRY" ¿Cuál es su país de destino? N/A
"DESTINATION_CITY" ¿Cuál es la ciudad de destino? N/A
"DEPARTURE_COUNTRY" ¿Cuál es su país de origen? N/A
"DEPARTURE_CITY" ¿Cuál es su ciudad de origen? N/A
"DEPARTURE_DATE" ¿Cuál es su fecha de salida? N/A
"RETURN_DATE" ¿Cuál es su fecha de regreso? N/A
"NUMBER_OF_TRAVELERS" ¿Con cuántas personas viajará? N/A
"TRAVEL_BUDGET" ¿Qué presupuesto de viaje tiene? N/A
"TRAVEL_ACCOMMODATION" ¿Dónde desea alojarse durante su viaje? N/A
asset_group_id Este campo solo se propaga para las campañas de máximo rendimiento. Indica el ID del contenedor que contiene el formulario de clientes potenciales.

Los clientes deben usar un número entero de 8 bytes para procesar.

lead_stage Indica la etapa del cliente potencial en el momento de la entrega. Este campo es útil para hacer un seguimiento de la etapa del embudo o el estado de conversión de un cliente potencial.
lead_submit_time Indica la fecha y hora en que el usuario envió el formulario. Se representa en formato ISO-8601. Ex- 2024-09-26T12:30:00Z

Campos no reconocidos y compatibilidad con versiones futuras

Para garantizar que la integración de tu webhook siga siendo sólida y se pueda adaptar a las mejoras futuras, es una práctica recomendada estándar diseñar tu analizador de JSON para que ignore correctamente cualquier campo dentro de la carga útil del webhook que tu sistema no consuma o reconozca de forma explícita.

Recomendación clave: Configura tu lógica de análisis de JSON para que solo procese los campos que necesitas específicamente para tu aplicación. No escribas código que espere un conjunto fijo de campos o que falle si hay campos nuevos e inesperados en la carga útil.

Por qué es importante:

  • Compatibilidad con versiones futuras: En futuras actualizaciones, Google puede agregar campos nuevos y opcionales a la carga útil del webhook para proporcionar datos más enriquecidos o nuevas funciones. Si tu analizador es demasiado estricto (p.ej., falla en propiedades desconocidas), tu integración podría fallar cuando Google lance este tipo de cambios que no interrumpen la integración.
  • Mantenimiento simplificado: Al enfocarte solo en los puntos de datos que usas de forma activa, el código de integración sigue siendo más simple y fácil de mantener.

La mayoría de las bibliotecas modernas de análisis de JSON ofrecen opciones para ignorar las propiedades desconocidas de forma predeterminada o se pueden configurar para que lo hagan.

Manejo de clientes potenciales

Los controladores de clientes potenciales deben responder con los siguientes códigos HTTP:

Respuesta HTTP Cuerpo de la respuesta (JSON) ¿Se puede reintentar el error?
200 {} N/A
4XX {"message: Free form error text, describing what was wrong with request"} No
5XX {"message: Intermittent retraible error optional message"}

Duplicados

No se garantiza que un solo cliente potencial se entregue exactamente una vez, por lo que el webhook de procesamiento de clientes potenciales debe controlar los duplicados de forma correcta.