Ofertas
La integración de ofertas te permite transmitir información estructurada sobre las promociones y los descuentos de los comercios que se aplican a servicios específicos en momentos determinados. 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.
- Compra un postre y obtén otro gratis para la cena del Día de la Madre, de 18:00 a 22:00
- Descuento de USD 5 en platos de entrada todos los domingos, de 10 a.m. a 2 p.m.
- 10% de descuento como oferta para clientes sin reserva, combinable 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 cumpla con los requisitos y obtener instrucciones sobre qué hacer con las ofertas que no cumplen con los requisitos técnicos.
Implementación de las ofertas
La integración de ofertas consta de dos feeds que se subirán diariamente o con una frecuencia que garantice una precisión alta (es decir, que reduzca la obsolescencia):
- Cualquiera de las siguientes:
- Feed de comercios
(con el parámetro de configuración
Merchant) - O
Feed de entidades
(con la configuración
Generic)
- Feed de comercios
(con el parámetro de configuración
- Y
Feed de ofertas
(con la configuración
Generic)
OfferFeed
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
data | array de objeto(Offer) |
Oferta
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
offer_id | string | Obligatorio | Es el ID único de la oferta. 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. 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. Obligatorio. |
offer_modes | Array de enum(OfferMode) | Obligatorio | Son los métodos por los que se puede acceder a la oferta: sin reserva, con reserva, en línea, etcétera. Se requiere este campo. |
offer_category | enum(OfferCategory) | Obligatorio | Es la categoría de la oferta. 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 clasificarlas. El 0 representaría que no se estableció la prioridad. | |
offer_details | objeto(OfferDetails) | Obligatorio | Son los detalles de la oferta, como el descuento, el costo de la reserva, etcétera (obligatorio). |
offer_restrictions | objeto(OfferRestrictions) | Obligatorio | Describe cómo se restringe la oferta, es decir, si se requiere un instrumento de suscripción o pago, si esta oferta se puede combinar con otras (y de qué tipos), etcétera. Es obligatorio. |
coupon | objeto(Coupon) | Son los detalles de un cupón. Obligatorio para offer_category: OFFER_CATEGORY_ADD_ON_COUPON_OFFER. | |
payment_instrument | objeto(PaymentInstrument) | Son los detalles de un instrumento de pago. Es obligatorio para offer_category: OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER. | |
subscription | objeto(Subscription) | Son los detalles de una suscripción. Se requiere para offer_category: OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER. | |
terms | objeto(Terms) | Obligatorio | Términos y Condiciones de la oferta Obligatorio. |
validity_periods | array de objeto(ValidityPeriod) | Obligatorio | Es el período de validez de la oferta. Describe el período de validez de la oferta, incluidas las horas 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 ofertas del comercio. Se requiere para offer_category: OFFER_CATEGORY_BASE_OFFER. | |
tags | array de enum(OfferTag) | Son las etiquetas especiales asociadas con la oferta. Se usa para identificar ofertas especiales, como "Festive", "Top Rated", "Most booked", etcétera. | |
brand_id | string | Identifica la marca asociada con la oferta. Si no se establece, se usa la marca predeterminada. | |
availability_level | enum(AvailabilityLevel) | Es el nivel de disponibilidad de la oferta. |
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 desea mostrar a los clientes en la página de resultados de búsqueda. Ten en cuenta que es posible que esto no sea exactamente lo que se muestra a los usuarios, y que usemos otros metadatos para reescribirlo o reformularlo. Obligatorio. |
| oneOf(offer_specification) | Obligatorio | Solo se puede establecer uno de los campos de este oneOf. |
max_discount_value | objeto(Money) | Es el descuento máximo que se puede obtener. Por ejemplo, un 10% de descuento hasta USD 100. | |
min_spend_value | objeto(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 | objeto(Money) | Es el costo para reservar esta oferta. Por ejemplo, USD 100 de descuento en la factura 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 o por transacción. | |
convenience_fee | objeto(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 objetos(AdditionalFee) | Son las tarifas adicionales que se cobran al usuario. Ejemplos: cargos por conveniencia, gestión, entrega, empaquetado, cargos de servicio, etcétera | |
offer_discount_type | enum(OfferDiscountType) | Es el tipo de descuento. | |
gift_card_info | objeto(GiftCardInfo) | Son detalles específicos de las ofertas de tarjetas de regalo. |
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 ISO 4217. | |
units | número | 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 de este oneOf. |
MoneyRange
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
min_amount | objeto(Money) | ||
max_amount | objeto(Money) |
AdditionalFee
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
name | string | Obligatorio | Es el nombre de la tarifa adicional. Ejemplos: Comisión por servicio, tarifa de preparación, etcétera. Obligatorio. |
fee | objeto(Fee) |
GiftCardInfo
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
| oneOf(denomination_type) | Solo se puede establecer uno de los campos en este oneOf. |
FixedDenominations
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
amounts | array de objeto(Money) | Es una lista de todas las denominaciones discretas disponibles (p.ej., [100, 500, 1000]). |
OfferRestrictions
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
combinable_with_other_offers | booleano | Indica si esta oferta se puede combinar con otras. Cuando se establece como 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 no se establece este campo, 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, se podrán combinar todos los ID de la oferta. | |
inclusions | array de objetos(OfferCondition) | Lista de condiciones que se deben cumplir para que la oferta sea válida (p.ej., bebidas sin alcohol, comida). | |
exclusions | array de objeto(OfferCondition) | Lista de condiciones que invalidarían la oferta (p.ej., buffet, ofertas combinadas y cocteles). | |
min_guest | número | Es la cantidad mínima de personas necesarias para aprovechar la oferta. Nota: Este campo solo se aplica a las reservas de restaurantes y no se debe usar para otras verticales. | |
food_offer_restrictions | objeto(FoodOfferRestrictions) | Son restricciones específicas para las ofertas de comida. | |
max_redemption_count | número | Son las restricciones específicas de la cantidad de veces que se puede usar esta oferta. El valor de 0 especificaría que no hay límites. Por ejemplo, un valor de 3 significaría que el usuario puede utilizar esta oferta 3 veces. | |
max_total_discount_value | objeto(Money) | Es el descuento máximo que se puede aprovechar en varias transacciones de esta oferta. | |
special_conditions | array de cadenas | Son las condiciones especiales de esta oferta que se deben mostrar al usuario. Ejemplos: "Solo válido para el pago en [área]", "No incluye pagos en línea", "El cupón de regalo SE PUEDE usar durante la oferta". |
OfferCondition
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
description | string |
FoodOfferRestrictions
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
meal_types | array de enum(MealType) | Son los tipos de comida 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. Obligatorio. |
PaymentInstrument
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
items | array de objeto(PaymentInstrumentItem) | Obligatorio | Es la lista de instrumentos de pago que se pueden usar para aprovechar la oferta. Obligatorio. |
provider_name | string | 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. |
PaymentInstrumentItem
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
type | enum(PaymentInstrumentType) | Obligatorio | Es el tipo de instrumento de pago. Obligatorio. |
name | string | Obligatorio | Es el nombre del elemento del instrumento de pago, como el nombre de la tarjeta de crédito. Por ejemplo, HDFC Infinia o American Express Platinum. Obligatorio. |
Suscripción
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
name | string | Obligatorio | Es el nombre de la suscripción. Obligatorio. |
subscription_auto_added | booleano | Indica si la suscripción se agrega automáticamente cuando un usuario aprovecha esta oferta. | |
cost | objeto(Money) | Obligatorio | Es el costo de la suscripción. Obligatorio. |
subscription_duration | objeto(Duration) | Obligatorio | Indica durante cuánto tiempo es válida la suscripción con el valor de subscription_cost. Obligatorio. |
terms_and_conditions_url | string | URL de los Términos y Condiciones del socio relevantes para esta suscripción. |
Duración
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
seconds | número | Son los segundos firmados del período. Debe ser de -315,576,000,000 a +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 | Fracciones con signo de un segundo con una resolución de nanosegundos del intervalo
de tiempo. Las duraciones de menos de un segundo se representan con un campo seconds de 0
y un campo nanos positivo o negativo. En el caso de las duraciones
de un segundo o más, un valor distinto de cero para el campo nanos debe tener
el mismo signo que el campo seconds. Deben ser valores de -999,999,999
a +999,999,999 inclusive. |
Condiciones
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
url | string | 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 C.G. proporcionado por el socio. | |
additional_terms_and_conditions | array de cadenas | Términos y condiciones adicionales a los principales del socio. |
ValidityPeriod
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
valid_period | objeto(ValidityRange) | La marca de tiempo de inicio y finalización de la validez de la oferta. 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 objetos(TimeOfDayWindow) | Especifica el intervalo de tiempo válido en un día determinado y qué días están disponibles para la oferta. Para los períodos que cruzan la medianoche (p. ej., de las 10 p.m. a las 2 a.m.), usa ventanas separadas para cada día: una que finalice a las 11:59:59 p.m. y otra que comience a las 12:00 a.m. del día siguiente.
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ércoles, jueves, viernes, sábado y domingo: De 3 p.m. a 7 p.m.
Si no se establece ninguno, significa que la oferta está disponible en todo momento dentro de
valid_period. | |
time_exceptions | array de objetos(ValidTimeException) | Especifica excepciones a los parámetros valid_period y valid_time_of_week anteriores | |
date_exceptions | array de objetos(Date) | Especifica excepciones en días para los parámetros valid_period y time_of_day anteriores | |
validity_scope | enum(ValidityScope) | Especifica el alcance del período de validez. | |
validity_duration_in_days | número | Es la duración (en días) de la validez del cupón una vez que se compra. |
ValidityRange
Es un rango de marcas de tiempo cerrado-abierto.
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
valid_from_time | objeto(Timestamp) | Obligatorio | La hora de inicio del rango (inclusive). Obligatorio. |
valid_through_time | objeto(Timestamp) | Es la 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 | número | Representa los segundos del horario UTC desde el tiempo Unix 1970-01-01T00:00:00Z. Debe estar entre -62135596800 y 253402300799 inclusive (lo que corresponde a 0001-01-01T00:00:00Z a 9999-12-31T23:59:59Z). | |
nanos | número | Fracciones no negativas de un segundo a una resolución de nanosegundos. Este campo es la parte de nanosegundos de la duración, no una alternativa a los segundos. Los valores de segundos negativos con fracciones deben seguir teniendo valores de nanosegundos no negativos que cuenten hacia adelante en el tiempo. Deben ser valores 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 | objeto(TimeOfDayRange) | Obligatorio | Es el período en el que se puede realizar o completar el pedido. 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. | |
day_of_month | array de objeto(DayOfMonthRange) | Son los días del mes en los que se aplican los períodos. Si no se establece ninguno, significa que se aplica a todos los días del mes. Opcional. |
TimeOfDayRange
Es un período que incluye una fecha y hora de inicio y una fecha y hora de finalización.
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
open_time | objeto(TimeOfDay) | Es un valor de hora que indica la hora de inicio del día del intervalo (inclusive). Si no se configura, significa las 00:00:00. Opcional. | |
close_time | objeto(TimeOfDay) | Un valor de hora que indica la hora de finalización del día del rango (exclusivo). Si no se establece, significa que es 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, debe ser menor o igual que 23. Una API puede optar por permitir el valor "24:00:00" para situaciones como el horario de cierre de la empresa. | |
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 intercalares. | |
nanos | número | Fracciones de segundos, en nanosegundos. Debe ser mayor o igual que 0 y menor o igual que 999,999,999. |
DayOfMonthRange
Es un rango de días del mes que se aplica a todos los meses del año.
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
valid_from_day | número | Obligatorio | Es el día de inicio del período (inclusive). Obligatorio. |
valid_through_day | número | Es el día de finalización del período (inclusive). Si no se configura, significa que este rango representa un solo día (valid_from_day). Opcional. |
ValidTimeException
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
exceptional_period | objeto(ValidityRange) | 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. |
Fecha
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
year | número | Año de la fecha. Debe ser entre 1 y 9999, o bien 0 para especificar una fecha sin año. | |
month | número | Mes del año. Debe ser del 1 al 12 o 0 para especificar un año sin un mes ni un día. | |
day | número | Día del mes. Debe ser entre 1 y 31 y ser válido para el año y el mes o bien 0 para especificar un año solo o un año y un mes en los que el día no sea significativo. |
OfferSource
| Nombre | Descripción |
|---|---|
OFFER_SOURCE_UNSPECIFIED | |
OFFER_SOURCE_AGGREGATOR |
ActionType
Representa el modo de cumplimiento de la oferta. Si una oferta se puede compartir en varios modos de cumplimiento, se espera que se creen ofertas duplicadas para cada modo de cumplimiento.
| Nombre | Descripción |
|---|---|
ACTION_TYPE_UNSPECIFIED | |
ACTION_TYPE_FOOD_DELIVERY | La oferta se aplica a los servicios de entrega de comida. |
ACTION_TYPE_FOOD_TAKEOUT | La oferta se aplica a los pedidos de comida para llevar o retirar. |
ACTION_TYPE_DINING | La oferta es para comer en las instalaciones del restaurante. |
ACTION_TYPE_APPOINTMENT | La oferta se aplica a los servicios de reserva de citas. |
ACTION_TYPE_SHOPPING_IN_STORE | La oferta se aplica a las compras sin conexión y en la tienda. |
OfferMode
Especifica el método o canal a través del cual el usuario puede aprovechar la oferta.
| Nombre | Descripción |
|---|---|
OFFER_MODE_OTHER | Se usa para los métodos de entrega que no se incluyen en otros modos específicos. |
OFFER_MODE_WALK_IN | La oferta está disponible para visitas en las instalaciones sin reserva previa. |
OFFER_MODE_FREE_RESERVATION | La oferta se aplica cuando un usuario realiza una reserva que no requiere una tarifa por adelantado. |
OFFER_MODE_PAID_RESERVATION | La oferta se aplica cuando un usuario realiza una reserva que requiere un pago por adelantado. |
OFFER_MODE_ONLINE_ORDER | La oferta es válida para pedidos realizados a través de un sitio web o una plataforma digital. |
OFFER_MODE_GIFT_CARD_PURCHASE | Indica que la compra de una tarjeta de regalo es el paso principal requerido para adquirir la oferta. |
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 la inversión superior 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 | No se debe usar el valor de enumeración UNSPECIFIED o predeterminado en los feeds. |
OFFER_CATEGORY_BASE_OFFER | |
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER | |
OFFER_CATEGORY_ADD_ON_COUPON_OFFER | |
OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER | |
OFFER_CATEGORY_ADD_ON_FEE_REDUCTION_OFFER |
FeeUnit
| Nombre | Descripción |
|---|---|
FEE_UNIT_UNSPECIFIED | No se debe usar el valor de enum UNSPECIFIED ni el predeterminado en los feeds. |
FEE_UNIT_PER_GUEST | |
FEE_UNIT_PER_TRANSACTION |
FeeType
| Nombre | Descripción |
|---|---|
FEE_TYPE_UNSPECIFIED | No se debe usar el valor de enumeración UNSPECIFIED o predeterminado en los feeds. |
FEE_TYPE_FIXED | |
FEE_TYPE_VARIABLE |
OfferDiscountType
| Nombre | Descripción |
|---|---|
OFFER_DISCOUNT_TYPE_UNSPECIFIED | |
OFFER_DISCOUNT_TYPE_INSTANT_DISCOUNT | |
OFFER_DISCOUNT_TYPE_CASHBACK | |
OFFER_DISCOUNT_TYPE_REWARD_POINT |
MealType
| Nombre | Descripción |
|---|---|
MEAL_TYPE_UNSPECIFIED | No se debe usar el valor de enum UNSPECIFIED o predeterminado en los feeds. |
MEAL_TYPE_BREAKFAST | |
MEAL_TYPE_LUNCH | |
MEAL_TYPE_DINNER |
PaymentInstrumentType
| Nombre | Descripción |
|---|---|
PAYMENT_INSTRUMENT_TYPE_UNSPECIFIED | No se debe usar el valor de enumeración UNSPECIFIED o predeterminado en los feeds. |
PAYMENT_INSTRUMENT_CREDIT_CARD | |
PAYMENT_INSTRUMENT_DEBIT_CARD | |
PAYMENT_INSTRUMENT_BANK_ACCOUNT | |
PAYMENT_INSTRUMENT_UPI | |
PAYMENT_INSTRUMENT_ONLINE_WALLET | |
PAYMENT_INSTRUMENT_NETBANKING |
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 |
ValidityScope
El alcance del período de validez, es decir, exactamente a qué acciones se aplica este período de validez.
| Nombre | Descripción |
|---|---|
VALIDITY_SCOPE_UNSPECIFIED | |
VALIDITY_SCOPE_CLAIM | |
VALIDITY_SCOPE_REDEEM |
OfferTag
| Nombre | Descripción |
|---|---|
OFFER_TAG_UNSPECIFIED | No se debe usar el valor de enum UNSPECIFIED o predeterminado en los feeds. |
OFFER_TAG_NEW_YEAR_SPECIAL | |
OFFER_TAG_VALENTINES_SPECIAL |
AvailabilityLevel
Indica el estado de stock o disponibilidad de una oferta.
| Nombre | Descripción |
|---|---|
AVAILABILITY_LEVEL_UNSPECIFIED | |
AVAILABILITY_LEVEL_LOW | Indica que la oferta tiene poca disponibilidad. Se recomienda a los usuarios que la canjeen antes de que se agote el stock. Es posible que agreguemos los niveles MEDIO y ALTO más adelante. |
offer_specification
El descuento puede ser un porcentaje o un valor fijo que se resta del valor total. Por ejemplo: 1. Un 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. 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] Para las ofertas de 2x1 o de un 50% de descuento que se aplican a toda la comida (p.ej., buffet de 2x1, 2x1 en toda la cuenta, 2x1 en el menú fijo), este valor se puede establecer en 50. |
discount_value | objeto(Money) | Es mutuamente excluyente con | Es el valor fijo del descuento. |
other_offer_detail_text | string | Mutuamente excluyente con | Texto de formato libre para describir el descuento. En el caso de ofertas específicas de 1+1 (p.ej., 1+1 bebidas, +1 plato principal, 1+1 productos del menú seleccionados), estos detalles se deben describir aquí. |
costo
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
amount | objeto(Money) | Mutuamente excluyente con | |
amount_range | objeto(MoneyRange) | Es mutuamente excluyente con |
denomination_type
| Nombre del campo | Tipo | Requisito | Descripción |
|---|---|---|---|
fixed_denominations | objeto(FixedDenominations) | Mutuamente excluyente con | Se usa cuando la tarjeta de regalo está disponible en importes fijos específicos. |
custom_range | objeto(MoneyRange) | Es mutuamente excluyente con | Se usa cuando la marca permite que los usuarios elijan un valor nominal personalizado (flexible) dentro de un rango definido. |
Carga del feed
El feed de ofertas se debe subir al servidor SFTP del feed de Generic. Sigue el tutorial sobre cómo usar el servidor SFTP de feeds genéricos para obtener instrucciones y usa el conjunto name establecido en google.offer en tu archivo de 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 con tu POC de Google.
Los datos tardarán unas horas en aparecer en Google.
Clasificación de ofertas
OFFER_CATEGORY_BASE_OFFER: Son 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 gratis con la membresía)
- Ofertas de pago en los casos en que no haya otras ofertas básicas para el restaurante
- Nota: Las ofertas de exención o reducción de tarifas en toda la plataforma no deben establecerse como ofertas base.
- Ofertas de complemento: Son ofertas que requieren que se canjee 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)OFFER_CATEGORY_ADD_ON_FEE_REDUCTION_OFFER(p.ej., entrega gratuita o tarifa reducida)
Otras consideraciones:
- Las ofertas de exención o reducción de tarifas en toda la plataforma no deben establecerse como ofertas base (
OFFER_CATEGORY_BASE_OFFER). Solo deben establecerse comoOFFER_CATEGORY_ADD_ON_FEE_REDUCTION_OFFERpara complementar otra oferta base activa. - Si un restaurante no tiene configurada 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 reclamar 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,SubscriptionoCoupon. - Los socios deben proporcionar 2 copias de cada una de estas ofertas para cubrir situaciones en las que funcionan como ofertas básicas y como ofertas de complemento. Luego, se puede establecer la copia de la oferta de complemento para varios restaurantes con
entity_idsoadd_on_offer_applicable_to_all_entities.
- Según el tipo, se deben establecer los datos pertinentes para
- Cuando un restaurante tiene varias ofertas base que se pueden acumular, todas las ofertas base deben etiquetarse como
OFFER_CATEGORY_BASE_OFFER, y las ofertas base que son ofertas de pago, suscripción o cupón deben enviarse, además, como el tipo de oferta de complemento correspondiente. ValidityPeriodse debe usar para activar ofertas de complemento como ofertas básicas solo cuando no haya una oferta básica activa.- Consolidación de ofertas idénticas por instrumento de pago: Si varios instrumentos de pago comparten el mismo valor de descuento exacto (por ejemplo, las tarjetas de crédito, las tarjetas de débito y Net Banking ofrecen un 5% de descuento), agrúpalos en un solo objeto
Offerconsolidado en lugar de enviar ofertas duplicadas separadas. Para ello, completa la listapayment_instrument.itemscon todos los instrumentos de pago aplicables. Esto reduce el desorden del diseño en la interfaz de Google y evita posibles disminuciones en la clasificación debido a restricciones duplicadas excesivas.
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 un 5% de descuento con tarjeta de crédito se debe enviar en 2 copias, una etiquetada como
OFFER_CATEGORY_BASE_OFFERy otra comoOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER, con los detalles dePaymentInstrumentincluidos. - La oferta de bebida gratis con un código de cupón se debe enviar como
OFFER_CATEGORY_ADD_ON_COUPON_OFFERcon los detalles deCouponincluidos.
- La oferta de un 5% de descuento con tarjeta de crédito se debe enviar en 2 copias, una etiquetada como
Un restaurante ofrece un 10% de descuento para los clientes sin reserva y un 5% de descuento cuando pagan con una tarjeta de crédito específica. Ambos descuentos se pueden combinar.
- La oferta del 10% para clientes sin cita previa se debe etiquetar como
OFFER_CATEGORY_BASE_OFFER. - La oferta de la tarjeta de crédito con un 5% de descuento debe tener 2 copias, una etiquetada como
OFFER_CATEGORY_BASE_OFFERy otra comoOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER.
- La oferta del 10% para clientes sin cita previa se debe etiquetar 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 del 10% de descuento debe tener
ValidityPeriodestablecido para indicar que solo se aplica durante el horario de almuerzo del restaurante los días de semana. - La oferta de un 5% de descuento con tarjetas de crédito se debe enviar en 2 copias.
- Una copia se debe etiquetar como
OFFER_CATEGORY_BASE_OFFERcon los detalles dePaymentInstrumentincluidos.ValidityPerioddebe configurarse para excluir el horario de almuerzo de los días de semana cuando la oferta de 10% de descuento en el almuerzo esté activa - Una copia debe etiquetarse como
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFERcon los detalles dePaymentInstrumentincluidos.
- Una copia se debe etiquetar como
- Todas las demás ofertas de pago de este restaurante deben etiquetarse como
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER.
- La oferta del 10% de descuento debe tener
Proceso de desarrollo y lanzamiento
Durante la 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 usar una exportación de producción (o incluso datos de producción directamente) en el entorno de 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 brinde una mejor asistencia 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 proporcione la aprobación, podrás enviar tu código 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á. Una vez que se completen todas las pruebas, se lanzará tu integración.
Supervisión
Para garantizar una buena experiencia del usuario, Google verificará que las ofertas proporcionadas sean válidas, correctas y cumplan con nuestros criterios de política antes y después del lanzamiento. Para ello, Google utilizará una combinación de revisiones manuales y automáticas. Se podrá acceder al resultado de estas revisiones en el panel de ofertas del Action Center (solo en producción). El resultado de esta supervisión podría usarse para afectar la clasificación de las ofertas.
Asegúrate de que la página tarde menos de 5 segundos en cargarse por completo con las ofertas. De lo contrario, se considerará un error y se marcará como Bad link.
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 la oferta, solo con fines de prueba 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, continuará hacia el flujo de reserva para confirmar que la oferta esté disponible en el horario especificado (no se realizará ninguna reserva).
Detección de web scrapers
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, sigue estos pasos:
- El usuario-agente del web scraper contendrá la cadena "Google-Offers":
- Ejemplo: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google-Offers) Chrome/104.0.5112.101 Safari/537.36
- También puedes verificar si las llamadas provienen de Google con un DNS inverso, como se recomienda en "Verifica 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 configurarse 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é, lee esta documentación sobre el almacenamiento en caché de HTTP.