Descripción general

Los socios que participan en la integración de ofertas deben completar el paso de configuración de la cuenta para una integración basada en el comerciante o la entidad (piloto) antes de comenzar. En esta guía, se detallarán la implementación, las pruebas y el lanzamiento de la integración de ofertas. Lee esta descripción general y las políticas de ofertas antes de completar los pasos de la integración.

Ofertas

La integración de ofertas te permite retransmitir información estructurada sobre promociones y descuentos de los comercios que se aplica a servicios determinados en momentos específicos. Las ofertas se componen de la oferta real (porcentaje de descuento, descuento en dólares…), los períodos de validez (horas específicas, días de la semana…) y los usos aplicables (la oferta solo se puede usar en ciertos servicios), así como de combinaciones complejas de restricciones.

Ejemplos de ofertas:

  • Aperitivos a mitad de precio los miércoles y jueves de diciembre, de 12 p.m. a 5 p.m.
  • Dos por uno en postres para la cena del Día de la Madre, de 6 p.m. a 10 p.m.
  • Descuento de USD 5 en platos de entrada todos los domingos, de 10 a.m. a 2 p.m.
  • Un 10% de descuento como oferta para clientes sin reserva, que se puede combinar con un 5% de descuento para suscriptores premium y un 5% de descuento si el usuario paga a través de tu app.

Para que una oferta se incluya en la integración, debe ajustarse al modelo de datos técnicos y cumplir con nuestros requisitos de elegibilidad. Asegúrate de revisar nuestras políticas de ofertas para garantizar que tu integración satisfaga nuestras estipulaciones y para obtener instrucciones sobre qué hacer con las ofertas que no se ajusten a los requisitos técnicos.

Implementación de las ofertas

La integración de ofertas consta de dos feeds que se subirán a diario o con una frecuencia que garantice una alta precisión (es decir, que reduzca la obsolescencia):

OfferFeed

Nombre del campoTipoRequisitoDescripción
dataarray de object
(Offer)

Oferta

Nombre del campoTipoRequisitoDescripción
offer_idstring

Obligatorio

Es el ID único de la oferta. Es obligatorio.
entity_idsArray de cadenas

Es la lista de comercios que participan en esta oferta.
add_on_offer_applicable_to_all_entitiesbooleano

Si es verdadero, esta oferta se aplica a todas las entidades del agregador. Solo se aplica a las ofertas de complementos.
offer_sourceenum
(OfferSource)

Obligatorio

El agregador, un comercio individual o incluso un tercero pueden proporcionar una oferta como complemento. Es obligatorio.
action_typeenum
(ActionType)

Obligatorio

Es el servicio que proporciona la oferta. Un offer_id solo puede pertenecer a un action_type. Si una oferta se puede compartir en varios tipos de servicios, se espera que se creen ofertas duplicadas con IDs únicos para cada tipo de servicio. Es obligatorio.
offer_modesarray de enum
(OfferMode)

Obligatorio

Son los métodos por los que se puede acceder a la oferta: en la tienda, con reserva, en línea, etcétera. Se requiere este campo.
offer_categoryenum
(OfferCategory)

Obligatorio

Es la categoría de la oferta. Es obligatorio.
source_assigned_prioritynúmero

Es un número entero no negativo ([1-100], donde 1 representa la prioridad más alta) que indica el nivel de prioridad de la oferta asignada por la fuente. Cuando haya varias ofertas disponibles para el mismo comercio, esto será un indicador para clasificar las ofertas. El valor 0 representaría que no se estableció la prioridad.
offer_detailsobject
(OfferDetails)

Obligatorio

Son los detalles de la oferta, como el descuento, el costo de la reserva, etcétera. Se requiere este campo.
offer_restrictionsobject
(OfferRestrictions)

Obligatorio

Describe cómo se restringe la oferta, es decir, si se requiere un instrumento de pago o una suscripción, si esta oferta se puede combinar con otras (y qué tipos), etcétera. Se requiere este campo.
couponobject
(Coupon)

Son los detalles de un cupón. Se requiere para offer_category: OFFER_CATEGORY_ADD_ON_COUPON_OFFER.
payment_instrumentobject
(PaymentInstrument)

Son los detalles de un instrumento de pago. Se requiere para offer_category: OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER.
subscriptionobject
(Subscription)

Son los detalles de una suscripción. Se requiere para offer_category: OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER.
termsobject
(Terms)

Obligatorio

Términos y condiciones de la oferta. Es obligatorio.
validity_periodsarray de object
(ValidityPeriod)

Obligatorio

Es el período de validez de la oferta. Describe el período para el que es válida la oferta, incluidos los horarios de inicio y finalización, los días de la semana, etcétera. Es obligatorio.
offer_urlstring

Es la URL de la página de la oferta del comercio. Se requiere para offer_category: OFFER_CATEGORY_BASE_OFFER.
image_urlstring

Es la URL de la imagen de la oferta del comercio.

OfferDetails

Nombre del campoTipoRequisitoDescripción
offer_display_textstring

Obligatorio

Es el texto de la oferta que el proveedor de la oferta quiere mostrar a los clientes en la página de resultados de la búsqueda. Es obligatorio.
oneOf
(offer_specification)

Obligatorio

Solo se puede establecer uno de los campos en este oneOf.
max_discount_valueobject
(Money)

Es el descuento máximo que se puede obtener. Por ejemplo, un 10% de descuento hasta USD 100.
min_spend_valueobject
(Money)

Es el valor de inversión mínimo para aprovechar el descuento. Por ejemplo, un 10% de descuento cuando el precio total es de USD 100 o más.
booking_costobject
(Money)

Es el costo para reservar esta oferta. Por ejemplo, USD 100 de descuento en la cuenta final cuando se reserva una mesa por USD 15.
booking_cost_unitenum
(FeeUnit)

Es la unidad del costo de la reserva. Por ejemplo, por persona y por transacción.
convenience_feeobject
(Fee)

booking_cost_adjustablebooleano

Indica si el costo de la reserva es ajustable, es decir, si se resta de la factura final. Por ejemplo, 30% de descuento en la cena con reserva. El costo de la reserva es de USD 15 y se aplicará a la factura final. Por lo tanto, la factura final es: Total invertido - 30% - USD 15
additional_feesarray de object
(AdditionalFee)

Son las comisiones adicionales que se cobran al usuario. Ejemplos: comodidad, manipulación, etcétera

Dinero

Representa un importe de dinero con su tipo de moneda.

Nombre del campoTipoRequisitoDescripción
currency_codestring

Es el código de moneda de tres letras definido en la norma ISO 4217.
unitsstring

La unidad entera del importe. Por ejemplo, si currencyCode es "USD", 1 unidad es un dólar estadounidense.
nanosnúmero

Número de unidades nano (10^-9) del importe. Debe ser un valor entre -999,999,999 y +999,999,999. Si units es positivo, nanos debe ser positivo o cero. Si units es cero, nanos puede ser positivo, cero o negativo. Si units es negativo, nanos debe ser negativo o cero. Por ejemplo, –$1.75 se representa como units=-1 y nanos=-750,000,000.

Tarifas

Nombre del campoTipoRequisitoDescripción
unitenum
(FeeUnit)

typeenum
(FeeType)

oneOf
(cost)

Solo se puede establecer uno de los campos en este oneOf.

MoneyRange

Nombre del campoTipoRequisitoDescripción
min_amountobject
(Money)

max_amountobject
(Money)

AdditionalFee

Nombre del campoTipoRequisitoDescripción
namestring

Obligatorio

Es el nombre del cargo adicional. Ejemplos: Tarifa por conveniencia, tarifa por gestión, etc. Obligatorio.
feeobject
(Fee)

OfferRestrictions

Nombre del campoTipoRequisitoDescripción
combinable_with_other_offersbooleano

Indica si esta oferta se puede combinar con otras. Cuando es verdadero, los socios pueden especificar con qué ofertas se puede combinar esta oferta. Si se configuran combinable_offer_categories y combinable_offer_ids, cualquier oferta que coincida con una de las condiciones anteriores se podrá combinar.
combinable_offer_categoriesarray de enum
(OfferCategory)

Es la lista de tipos de ofertas con los que se puede combinar esta oferta. Por ejemplo, esta oferta se puede combinar con otros cupones. Si combinable_with_other_offers es verdadero y este campo no está configurado, se podrán combinar todos los tipos.
combinable_offer_idsArray de cadenas

Es la lista de offer_ids con los que se puede combinar esta oferta. Algunas ofertas solo se pueden combinar con otros offer_ids específicos (se pueden considerar ofertas principales). Si combinable_with_other_offers es verdadero y este campo no está configurado, todos los IDs de oferta se podrán combinar.
inclusionsarray de object
(OfferCondition)

Lista de condiciones que se deben cumplir para que la oferta sea válida (p.ej., bebidas sin alcohol y comida).
exclusionsarray de object
(OfferCondition)

Lista de condiciones que invalidarían la oferta (p.ej., bufé, ofertas de combo y cocteles).
min_guestnúmero

Es la cantidad mínima de personas necesarias para aprovechar la oferta.
food_offer_restrictionsobject
(FoodOfferRestrictions)

Son restricciones específicas para las ofertas de comida.

OfferCondition

Nombre del campoTipoRequisitoDescripción
descriptionstring

FoodOfferRestrictions

Nombre del campoTipoRequisitoDescripción
meal_typesarray de enum
(MealType)

Tipos de comidas a los que se puede aplicar la oferta, como almuerzo o cena. Si no se configura, la oferta se puede aplicar a todos los tipos de comidas.
restricted_to_certain_coursesbooleano

Indica si la oferta solo se puede aplicar a ciertos cursos.

Cupón

Nombre del campoTipoRequisitoDescripción
textstring

Es el texto del cupón que el proveedor de la oferta quiere mostrar a los usuarios.
codestring

Obligatorio

Se requiere un código de cupón para canjear la oferta. Es obligatorio.

PaymentInstrument

Nombre del campoTipoRequisitoDescripción
itemsarray de object
(PaymentInstrumentItem)

Obligatorio

Es la lista de instrumentos de pago que se pueden usar para aprovechar la oferta. Es obligatorio.
provider_namestring

Obligatorio

Es el nombre del proveedor del instrumento de pago. Puede ser un socio bancario, el nombre de un banco, etcétera. Por ejemplo: American Express, HDFC, ICICI. Es obligatorio.

PaymentInstrumentItem

Nombre del campoTipoRequisitoDescripción
typeenum
(PaymentInstrumentType)

Obligatorio

Es el tipo de instrumento de pago. Es obligatorio.
namestring

Obligatorio

Nombre del elemento del instrumento de pago, como el nombre de la tarjeta de crédito. Por ejemplo: HDFC Infinia, American Express Platinum. Es obligatorio.

Suscripción

Nombre del campoTipoRequisitoDescripción
namestring

Obligatorio

Es el nombre de la suscripción. Es obligatorio.
subscription_auto_addedbooleano

Indica si la suscripción se agrega automáticamente cuando un usuario aprovecha esta oferta.
costobject
(Money)

Obligatorio

Es el costo de la suscripción. Es obligatorio.
subscription_durationobject
(Duration)

Obligatorio

Es el período durante el que la suscripción es válida al precio de subscription_cost. Es obligatorio.
terms_and_conditions_urlstring

URL de los términos y condiciones del socio pertinentes para esta suscripción.

Duración

Nombre del campoTipoRequisitoDescripción
secondsstring

Son los segundos firmados del período. Debe estar entre -315,576,000,000 y +315,576,000,000, inclusive. Nota: Estos límites se calculan de la siguiente manera: 60 s/min × 60 min/h × 24 h/día × 365.25 días/año × 10,000 años
nanosnúmero

Son fracciones de segundo firmadas con una resolución de nanosegundos del período. Las duraciones inferiores a un segundo se representan con un campo seconds igual a 0 y un campo nanos positivo o negativo. Para duraciones de un segundo o más, el valor del campo nanos debe tener el mismo signo que el campo seconds. Debe ser un valor entre -999,999,999 y +999,999,999, inclusive.

Condiciones

Nombre del campoTipoRequisitoDescripción
urlstring

Es la URL de los Términos y Condiciones del socio.
restricted_to_certain_usersbooleano

Indica si la oferta está restringida a ciertos usuarios.
terms_and_conditionsstring

Es el texto principal de los CyC proporcionado por el socio.
additional_terms_and_conditionsArray de cadenas

Son los términos y condiciones que se suman a los principales del socio.

ValidityPeriod

Nombre del campoTipoRequisitoDescripción
valid_periodobject
(ValidityRange)

Es la marca de tiempo de inicio y finalización para la que la oferta es válida. Estas horas deben representar días distintos, es decir, la hora de inicio debe ser las 00:00 (comienzo del día) y la hora de finalización debe ser las 00:00 (exclusiva) del día en que finaliza el período de validez.
time_of_dayarray de object
(TimeOfDayWindow)

Especifica el intervalo de tiempo válido en un día determinado y los días en los que está disponible la oferta. Por ejemplo: Lunes: de 10 a.m. a 5 p.m. Martes: de 10 a.m. a 2 p.m. Martes: de 5 p.m. a 7 p.m. Mié., jue., vie., sáb. y dom.: de 3 p.m. a 7 p.m. Si no se establece ninguno, significa que la oferta está disponible durante todo el período de valid_period.
time_exceptionsarray de object
(ValidTimeException)

Especifica excepciones a los campos valid_period y valid_time_of_week anteriores.

ValidityRange

Es un rango de marcas de tiempo cerrado.

Nombre del campoTipoRequisitoDescripción
valid_from_timeobject
(Timestamp)

Obligatorio

Es la hora de inicio del rango (inclusive). Es obligatorio.
valid_through_timeobject
(Timestamp)

Hora de finalización del rango (exclusiva). Si no se establece, significa que este período nunca termina. Opcional.

Marca de tiempo

Nombre del campoTipoRequisitoDescripción
secondsstring

Representa los segundos de la hora UTC desde la época Unix 1970-01-01T00:00:00Z. Debe ser de 0001-01-01T00:00:00Z a 9999-12-31T23:59:59Z inclusive.
nanosnúmero

Fracciones no negativas de un segundo a una resolución de nanosegundos. Los valores de segundos negativos con fracciones deben tener valores de nanosegundos no negativos que se cuentan hacia adelante en el tiempo. Debe ser de 0 a 999,999,999 inclusive.

TimeOfDayWindow

El objeto TimeWindow es una entidad compuesta que describe una lista de ventanas en las que se puede realizar o completar el pedido del usuario.

Nombre del campoTipoRequisitoDescripción
time_windowsobject
(TimeOfDayRange)

Obligatorio

Es el período durante el cual se puede realizar o completar el pedido. Es obligatorio.
day_of_weekarray de enum
(DayOfWeek)

Es la lista de días de la semana en los que se aplican los períodos. Si no se establece ninguno, significa que se aplica a todos los días de la semana. Opcional.

TimeOfDayRange

Es un período de tiempo cerrado.

Nombre del campoTipoRequisitoDescripción
open_timeobject
(TimeOfDay)

Es un objeto Time que indica la hora de inicio del día del rango (inclusive). Si no se configura, significa las 00:00:00. Opcional.
close_timeobject
(TimeOfDay)

Es un objeto Time que indica la hora de finalización del día del rango (exclusivo). Si no se configura, significa las 23:59:59. Opcional.

TimeOfDay

Nombre del campoTipoRequisitoDescripción
hoursnúmero

Horas de un día en formato de 24 horas. Debe ser mayor o igual que 0 y, por lo general, menor o igual que 23. Una API puede permitir el valor "24:00:00" para casos como el horario de cierre de empresas.
minutesnúmero

Minutos de una hora. Debe ser mayor o igual que 0 y menor o igual que 59.
secondsnúmero

Segundos de un minuto. Debe ser mayor o igual que 0 y, por lo general, debe ser menor o igual que 59. Una API puede permitir el valor 60 si permite segundos bisiestos.
nanosnúmero

Fracciones de segundos, en nanosegundos. Debe ser mayor o igual que 0 y menor o igual que 999,999,999.

ValidTimeException

Nombre del campoTipoRequisitoDescripción
exceptional_periodobject
(ValidityRange)

Es la marca de tiempo de inicio y finalización para la que la oferta no es válida. Estas horas deben representar días distintos, es decir, la hora de inicio debe ser las 00:00 (comienzo del día) y la hora de finalización debe ser las 00:00 (exclusiva) del día en que finaliza el período de excepción.

OfferSource

NombreDescripción
OFFER_SOURCE_UNSPECIFIED
OFFER_SOURCE_AGGREGATOR

ActionType

NombreDescripción
ACTION_TYPE_UNSPECIFIED
ACTION_TYPE_DINING

OfferMode

NombreDescripción
OFFER_MODE_OTHER
OFFER_MODE_WALK_IN
OFFER_MODE_FREE_RESERVATION
OFFER_MODE_PAID_RESERVATION
OFFER_MODE_ONLINE_ORDER

OfferCategory

Es la categoría de la oferta. Una oferta base es una oferta estándar disponible para todos los clientes, como un 10% de descuento en compras superiores a USD 100. Una oferta básica restringida por un cupón o un instrumento de pago tendrá establecidos los campos correspondientes. También tenemos ofertas de complementos, como ADD_ON_PAYMENT_OFFER. Estas ofertas se pueden agregar a otras para obtener descuentos adicionales.

NombreDescripción
OFFER_CATEGORY_UNSPECIFIED
OFFER_CATEGORY_BASE_OFFER
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
OFFER_CATEGORY_ADD_ON_COUPON_OFFER
OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER

FeeUnit

NombreDescripción
FEE_UNIT_UNSPECIFIED
FEE_UNIT_PER_GUEST
FEE_UNIT_PER_TRANSACTION

FeeType

NombreDescripción
FEE_TYPE_UNSPECIFIED
FEE_TYPE_FIXED
FEE_TYPE_VARIABLE

MealType

NombreDescripción
MEAL_TYPE_UNSPECIFIED
MEAL_TYPE_BREAKFAST
MEAL_TYPE_LUNCH
MEAL_TYPE_DINNER

PaymentInstrumentType

NombreDescripción
PAYMENT_INSTRUMENT_TYPE_UNSPECIFIED
PAYMENT_INSTRUMENT_CREDIT_CARD
PAYMENT_INSTRUMENT_DEBIT_CARD
PAYMENT_INSTRUMENT_BANK_ACCOUNT
PAYMENT_INSTRUMENT_UPI
PAYMENT_INSTRUMENT_ONLINE_WALLET

DayOfWeek

Representa un día de la semana.

NombreDescripción
DAY_OF_WEEK_UNSPECIFIEDNo se especifica el día de la semana.
MONDAYLunes
TUESDAYMartes
WEDNESDAYMiércoles
THURSDAYJueves
FRIDAYViernes
SATURDAYSábado
SUNDAYDomingo

offer_specification

El descuento puede ser un porcentaje o un valor fijo que se resta del valor total. Por ejemplo: 1. 10% de descuento en la factura final 2. USD 15 de descuento en un pedido Los comercios también pueden ofrecer descuentos personalizados, como "compra uno y llévate uno gratis", a través de los campos de especificación pertinentes. Es obligatorio.

Nombre del campoTipoRequisitoDescripción
discount_percentnúmero

Es mutuamente excluyente con discount_value y other_offer_detail_text.

Es el porcentaje de la factura que se descuenta. [0, 100] En el caso de las ofertas de 1+1 o de un 50% de descuento que se aplican a toda la comida (p.ej., bufé de 1+1, 1+1 en toda la cuenta, 1+1 en el menú fijo), este valor se puede establecer en 50.
discount_valueobject
(Money)

Es mutuamente excluyente con discount_percent y other_offer_detail_text.

Es el valor fijo del descuento.
other_offer_detail_textstring

Es mutuamente excluyente con discount_percent y discount_value.

Texto de formato libre para describir el descuento. Aquí se deben describir los detalles de las ofertas específicas de 1+1 (p.ej., 1+1 en bebidas, +1 en plato principal, 1+1 en elementos del menú seleccionados).

costo

Nombre del campoTipoRequisitoDescripción
amountobject
(Money)

Es mutuamente excluyente con amount_range.

amount_rangeobject
(MoneyRange)

Es mutuamente excluyente con amount.

Carga del feed

El feed de ofertas se debe subir al servidor SFTP del feed Generic. Sigue el instructivo sobre cómo usar el servidor SFTP de feed genérico para obtener instrucciones y usa el valor name establecido en google.offer en tu archivo descriptor.

Frecuencia de carga

En general, Google espera 1 carga de feed por día. La frecuencia puede aumentar o disminuir según la frecuencia de las actualizaciones de ofertas de tu lado para garantizar una precisión alta y constante. Consulta a tu POC de Google.

Los datos tardarán algunas horas en aparecer en Google.

Categorización de ofertas

  • OFFER_CATEGORY_BASE_OFFER: Son las ofertas que se pueden reclamar de forma independiente sin combinarse con ninguna otra oferta. Incluye lo siguiente:
    • Descuentos fijos en toda la factura (p.ej., 20% de descuento)
    • Ofertas de suscripción (p.ej., Postre de cortesía con la membresía)
    • Ofertas de pago en los casos en que no haya otras ofertas básicas para el restaurante
  • Ofertas de complemento: Son ofertas que requieren que se reclame una oferta básica. Estos son algunos de ellos:
    • OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER (p. ej., 10% de descuento adicional con una tarjeta de crédito específica)
    • OFFER_CATEGORY_ADD_ON_COUPON_OFFER (p. ej., Bebida gratis con un código de cupón específico)
    • OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER (p. ej., 10% de descuento adicional para suscriptores)

Otras consideraciones

  • Cuando un restaurante no tiene establecida una oferta básica, no se mostrarán las ofertas de complemento. Si no hay una oferta base, cualquier oferta de pago, suscripción o cupón que se pueda canjear sin necesidad de agregarse a otra oferta debe etiquetarse como OFFER_CATEGORY_BASE_OFFER.
    • Según el tipo, se deben establecer los datos pertinentes para PaymentInstrument, Subscription o Coupon.
    • Los socios deben proporcionar 2 copias de cada una de estas ofertas para cubrir situaciones en las que funcionan como ofertas básicas y ofertas complementarias. Luego, se puede establecer la copia de la oferta de complemento para varios restaurantes con entity_ids o add_on_offer_applicable_to_all_entities.
  • Cuando un restaurante tiene varias ofertas básicas que se pueden combinar, todas las ofertas básicas deben etiquetarse como OFFER_CATEGORY_BASE_OFFER, y las ofertas básicas que sean de pago, de suscripción o de cupón deben enviarse también como el tipo de oferta complementaria pertinente.
  • ValidityPeriod se debe usar para activar ofertas de complemento como ofertas básicas solo cuando no haya una oferta básica activa.

Situaciones de ejemplo:

  • Un restaurante ofrece un 5% de descuento cuando se paga con una tarjeta de crédito específica y una bebida gratis con un código de cupón específico.

    • La oferta de la tarjeta de crédito con un 5% de descuento se debe enviar en 2 copias, una etiquetada como OFFER_CATEGORY_BASE_OFFER y otra como OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER, con los detalles de PaymentInstrument incluidos.
    • La oferta de bebida gratis con un código de cupón se debe enviar como OFFER_CATEGORY_ADD_ON_COUPON_OFFER con los detalles de Coupon incluidos.
  • Un restaurante ofrece un 10% de descuento para los clientes que llegan sin reserva y un 5% de descuento cuando pagan con una tarjeta de crédito específica, y ambos descuentos se pueden combinar.

    • La oferta del 10% para clientes sin reserva debe etiquetarse como OFFER_CATEGORY_BASE_OFFER.
    • La oferta de tarjeta de crédito con un 5% de descuento debe tener 2 copias, una etiquetada como OFFER_CATEGORY_BASE_OFFER y otra como OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER.
  • Un restaurante ofrece un 10% de descuento solo para el almuerzo los días de semana y un 5% de descuento en cualquier momento cuando se paga con una tarjeta de crédito específica.

    • La oferta de descuento del 10% debe tener ValidityPeriod configurado para indicar que solo se aplica durante el horario de almuerzo del restaurante los días de semana.
    • La oferta de descuento del 5% con tarjeta de crédito se debe enviar en 2 copias.
      • Una copia debe etiquetarse como OFFER_CATEGORY_BASE_OFFER con los detalles de PaymentInstrument incluidos. ValidityPeriod de should se debe configurar para excluir las horas de almuerzo los días de semana cuando la oferta de almuerzo con un 10% de descuento esté activa.
      • Una copia debe etiquetarse como OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER con los detalles de PaymentInstrument incluidos.
    • Todas las demás ofertas de pago para este restaurante deben etiquetarse como OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER.

Proceso de desarrollo y lanzamiento

A lo largo de tu integración, el Partner Portal podrá ayudarte con información y comentarios basados en tu desarrollo. El proceso de desarrollo seguirá este flujo:

  • En primer lugar, la integración se desarrollará en el entorno de zona de pruebas. Debes utilizar una exportación del entorno de producción (o incluso datos de producción directamente) en la zona de pruebas de Google. Esto ayuda a garantizar que tu desarrollo detecte todos los casos extremos y permite que Google evalúe la calidad de los datos y te asista mejor en función de tu modelo de datos.
  • Una vez que ya subas los feeds completos de comercios, servicios y ofertas a diario y de forma coherente al entorno de zona de pruebas de Google, el equipo de Google los evaluará. Una vez que el equipo de Google apruebe tu código, podrás enviarlo a producción y comenzar a enviar datos de producción al entorno de producción de Google.
  • Una vez que hayas probado completamente la integración de producción, el equipo de Google también lo hará. Tras completar todas las pruebas, se lanzará la integración.

Supervisión

Para garantizar una buena experiencia del usuario, Google verificará que las ofertas proporcionadas sean válidas, correctas y cumplan con los criterios de nuestras políticas antes y después del lanzamiento. Para ello, Google utilizará una combinación de revisiones manuales y automáticas. El resultado de estas revisiones estará disponible en el Panel de ofertas del Centro de acciones (solo en producción). El resultado de esta supervisión se puede usar para afectar la clasificación de las ofertas.

Verificaciones automatizadas (rastreadores)

El equipo de calidad de Google implementa rastreadores. Los rastreadores son secuencias de comandos que automatizan un navegador web para realizar algunos clics y extraer información de ofertas, solo con fines de pruebas de calidad.

Cantidad de consultas

Por ejemplo, si decidimos enviar 5,000 verificaciones por día, significa que, 5,000 veces al día (distribuidas de manera uniforme a lo largo del día, es decir, aproximadamente una cada 17 segundos), nuestro rastreador realiza todas las siguientes acciones que realizaría un usuario normal:

  • Comienza desde la Búsqueda de Google y haz clic en el vínculo del socio.
  • Busca la información de la oferta.
  • Si la oferta requiere una reserva, se continuará con el flujo de reserva para confirmar que la oferta está disponible en el horario especificado (no se realizará ninguna reserva).

Detección de extractores de contenido web

Para asegurarte de que no se prohíba el acceso al extractor web (lo que podría llevarlo a concluir que las ofertas no están disponibles), asegúrate de que tu sistema permita que nuestro extractor web consulte tu página en todo momento. Para identificar nuestro rastreador web, haz lo siguiente:

  • El User-Agent del rastreador web contendrá la cadena "Google-Offers":
    • Ejemplo: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, como Gecko; Google-Offers) Chrome/104.0.5112.101 Safari/537.36
  • También puedes verificar si las llamadas provienen de Google con el DNS inverso, como se recomienda en "Verificación de Googlebot y otros rastreadores de Google". En nuestro caso específico, la resolución de DNS inversa sigue este patrón: google-proxy-***-***-***-***.google.com.

Comportamiento técnico

Almacenamiento en caché

Para reducir la carga en el sitio web del socio, nuestros rastreadores suelen estar configurados para respetar todos los encabezados de almacenamiento en caché HTTP estándar presentes en la respuesta. Esto significa que, en el caso de los sitios web configurados correctamente, evitamos recuperar repetidamente el contenido que cambia con poca frecuencia (p.ej., las bibliotecas de JavaScript). Para obtener más detalles sobre cómo implementar el almacenamiento en caché, consulta esta documentación sobre el almacenamiento en caché HTTP.