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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
data | array de object(Offer) |
Oferta
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
offer_id | string | Obligatorio | Es el ID único de la oferta. Es obligatorio. |
entity_ids | Array de cadenas | Es la lista de comercios que participan en esta oferta. | |
add_on_offer_applicable_to_all_entities | booleano | Si es verdadero, esta oferta se aplica a todas las entidades del agregador. Solo se aplica a las ofertas de complementos. | |
offer_source | enum(OfferSource) | Obligatorio | El agregador, un comercio individual o incluso un tercero pueden proporcionar una oferta como complemento. Es obligatorio. |
action_type | enum(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_modes | array 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_category | enum(OfferCategory) | Obligatorio | Es la categoría de la oferta. Es obligatorio. |
source_assigned_priority | nú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_details | object(OfferDetails) | Obligatorio | Son los detalles de la oferta, como el descuento, el costo de la reserva, etcétera. Se requiere este campo. |
offer_restrictions | object(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. |
coupon | object(Coupon) | Son los detalles de un cupón. Se requiere para offer_category: OFFER_CATEGORY_ADD_ON_COUPON_OFFER. | |
payment_instrument | object(PaymentInstrument) | Son los detalles de un instrumento de pago. Se requiere para offer_category: OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER. | |
subscription | object(Subscription) | Son los detalles de una suscripción. Se requiere para offer_category: OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER. | |
terms | object(Terms) | Obligatorio | Términos y condiciones de la oferta. Es obligatorio. |
validity_periods | array 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_url | string | Es la URL de la página de la oferta del comercio. Se requiere para offer_category: OFFER_CATEGORY_BASE_OFFER. | |
image_url | string | Es la URL de la imagen de la oferta del comercio. |
OfferDetails
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
offer_display_text | string | 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_value | object(Money) | Es el descuento máximo que se puede obtener. Por ejemplo, un 10% de descuento hasta USD 100. | |
min_spend_value | object(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_cost | object(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_unit | enum(FeeUnit) | Es la unidad del costo de la reserva. Por ejemplo, por persona y por transacción. | |
convenience_fee | object(Fee) | ||
booking_cost_adjustable | booleano | 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_fees | array 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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
currency_code | string | Es el código de moneda de tres letras definido en la norma ISO 4217. | |
units | string | La unidad entera del importe.
Por ejemplo, si currencyCode es "USD" , 1 unidad es un dólar estadounidense. | |
nanos | nú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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
unit | enum(FeeUnit) | ||
type | enum(FeeType) | ||
| oneOf(cost) | Solo se puede establecer uno de los campos en este oneOf. |
MoneyRange
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
min_amount | object(Money) | ||
max_amount | object(Money) |
AdditionalFee
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
name | string | Obligatorio | Es el nombre del cargo adicional. Ejemplos: Tarifa por conveniencia, tarifa por gestión, etc. Obligatorio. |
fee | object(Fee) |
OfferRestrictions
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
combinable_with_other_offers | booleano | 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_categories | array 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_ids | Array 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. | |
inclusions | array de object(OfferCondition) | Lista de condiciones que se deben cumplir para que la oferta sea válida (p.ej., bebidas sin alcohol y comida). | |
exclusions | array de object(OfferCondition) | Lista de condiciones que invalidarían la oferta (p.ej., bufé, ofertas de combo y cocteles). | |
min_guest | número | Es la cantidad mínima de personas necesarias para aprovechar la oferta. | |
food_offer_restrictions | object(FoodOfferRestrictions) | Son restricciones específicas para las ofertas de comida. |
OfferCondition
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
description | string |
FoodOfferRestrictions
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
meal_types | array 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_courses | booleano | Indica si la oferta solo se puede aplicar a ciertos cursos. |
Cupón
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
text | string | Es el texto del cupón que el proveedor de la oferta quiere mostrar a los usuarios. | |
code | string | Obligatorio | Se requiere un código de cupón para canjear la oferta. Es obligatorio. |
PaymentInstrument
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
items | array de object(PaymentInstrumentItem) | Obligatorio | Es la lista de instrumentos de pago que se pueden usar para aprovechar la oferta. Es obligatorio. |
provider_name | string | 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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
type | enum(PaymentInstrumentType) | Obligatorio | Es el tipo de instrumento de pago. Es obligatorio. |
name | string | 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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
name | string | Obligatorio | Es el nombre de la suscripción. Es obligatorio. |
subscription_auto_added | booleano | Indica si la suscripción se agrega automáticamente cuando un usuario aprovecha esta oferta. | |
cost | object(Money) | Obligatorio | Es el costo de la suscripción. Es obligatorio. |
subscription_duration | object(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_url | string | URL de los términos y condiciones del socio pertinentes para esta suscripción. |
Duración
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
seconds | string | 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 | |
nanos | nú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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
url | string | Es la URL de los Términos y Condiciones del socio. | |
restricted_to_certain_users | booleano | Indica si la oferta está restringida a ciertos usuarios. | |
terms_and_conditions | string | Es el texto principal de los CyC proporcionado por el socio. | |
additional_terms_and_conditions | Array de cadenas | Son los términos y condiciones que se suman a los principales del socio. |
ValidityPeriod
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
valid_period | object(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_day | array 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_exceptions | array 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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
valid_from_time | object(Timestamp) | Obligatorio | Es la hora de inicio del rango (inclusive). Es obligatorio. |
valid_through_time | object(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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
seconds | string | 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. | |
nanos | nú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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
time_windows | object(TimeOfDayRange) | Obligatorio | Es el período durante el cual se puede realizar o completar el pedido. Es obligatorio. |
day_of_week | array 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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
open_time | object(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_time | object(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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
hours | nú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. | |
minutes | número | Minutos de una hora. Debe ser mayor o igual que 0 y menor o igual que 59. | |
seconds | nú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. | |
nanos | número | Fracciones de segundos, en nanosegundos. Debe ser mayor o igual que 0 y menor o igual que 999,999,999. |
ValidTimeException
Nombre del campo | Tipo | Requisito | Descripción |
---|---|---|---|
exceptional_period | object(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
Nombre | Descripción |
---|---|
OFFER_SOURCE_UNSPECIFIED | |
OFFER_SOURCE_AGGREGATOR |
ActionType
Nombre | Descripción |
---|---|
ACTION_TYPE_UNSPECIFIED | |
ACTION_TYPE_DINING |
OfferMode
Nombre | Descripció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.
Nombre | Descripció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
Nombre | Descripción |
---|---|
FEE_UNIT_UNSPECIFIED | |
FEE_UNIT_PER_GUEST | |
FEE_UNIT_PER_TRANSACTION |
FeeType
Nombre | Descripción |
---|---|
FEE_TYPE_UNSPECIFIED | |
FEE_TYPE_FIXED | |
FEE_TYPE_VARIABLE |
MealType
Nombre | Descripción |
---|---|
MEAL_TYPE_UNSPECIFIED | |
MEAL_TYPE_BREAKFAST | |
MEAL_TYPE_LUNCH | |
MEAL_TYPE_DINNER |
PaymentInstrumentType
Nombre | Descripció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.
Nombre | Descripción |
---|---|
DAY_OF_WEEK_UNSPECIFIED | No se especifica el día de la semana. |
MONDAY | Lunes |
TUESDAY | Martes |
WEDNESDAY | Miércoles |
THURSDAY | Jueves |
FRIDAY | Viernes |
SATURDAY | Sábado |
SUNDAY | Domingo |
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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
discount_percent | número | Es mutuamente excluyente con | 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_value | object(Money) | Es mutuamente excluyente con | Es el valor fijo del descuento. |
other_offer_detail_text | string | Es mutuamente excluyente con | 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 campo | Tipo | Requisito | Descripción |
---|---|---|---|
amount | object(Money) | Es mutuamente excluyente con | |
amount_range | object(MoneyRange) | Es mutuamente excluyente con |
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
oCoupon
. - 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
oadd_on_offer_applicable_to_all_entities
.
- Según el tipo, se deben establecer los datos pertinentes para
- 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 comoOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
, con los detalles dePaymentInstrument
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 deCoupon
incluidos.
- La oferta de la tarjeta de crédito con un 5% de descuento se debe enviar en 2 copias, una etiquetada como
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 comoOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
.
- La oferta del 10% para clientes sin reserva debe etiquetarse como
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 dePaymentInstrument
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 dePaymentInstrument
incluidos.
- Una copia debe etiquetarse como
- Todas las demás ofertas de pago para este restaurante deben etiquetarse como
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
.
- La oferta de descuento del 10% debe tener
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.