Antes de iniciar a integração de ofertas, os parceiros precisam concluir a configuração da conta para uma etapa de integração baseada em comerciante ou entidade (piloto). Neste guia, detalharemos como implementar, testar e lançar esse recurso. Leia esta visão geral e as políticas de ofertas para prosseguir com as etapas de integração.
Ofertas
Com a integração de ofertas, você exibe informações estruturadas sobre promoções e descontos de comerciantes aplicados a serviços específicos em horários determinados. As ofertas incluem a oferta real (porcentagem de desconto, desconto em moeda etc.), as janelas de validade (horários ou dias da semana específicos etc.) e os usos aplicáveis (a oferta só pode ser usada em determinados serviços), além de combinações complexas de restrições.
Exemplos de ofertas:
- Aperitivos pela metade do preço às quartas e quintas de dezembro, das 12h às 17h.
- Compre uma sobremesa e ganhe outra para o jantar do dia das mães das 18h às 22h.
- R$ 5 de desconto em entradas de brunch todos os domingos, das 10h às 14h.
- 10% de desconto como oferta sem agendamento, combinável com 5% de desconto para assinantes premium e 5% de desconto se o usuário pagar pelo seu app.
Para que uma oferta possa ser incluída na integração, ela precisa seguir o modelo de dados técnicos e atender aos nossos requisitos de qualificação. Consulte nossas políticas de ofertas para garantir a conformidade e saber como lidar com itens que não se encaixam nos requisitos técnicos.
Implementação de ofertas
A integração de ofertas consiste em dois feeds que são enviados diariamente ou com uma frequência que garante alta precisão (ou seja, reduz a defasagem):
OfferFeed
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
data | matriz de objeto(Offer) |
Oferta
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
offer_id | string | Obrigatório | ID exclusivo da oferta. Obrigatório. |
entity_ids | matriz de strings | Lista de comerciantes que estão participando desta oferta. | |
add_on_offer_applicable_to_all_entities | booleano | Se for "true", a oferta será aplicável a todas as entidades do agregador. Aplicável somente a ofertas complementares. | |
offer_source | enum(OfferSource) | Obrigatório | Uma oferta pode ser fornecida pelo agregador, por um comerciante individual ou até mesmo por um terceiro como um complemento. Obrigatório. |
action_type | enum(ActionType) | Obrigatório | O serviço que está oferecendo a promoção. Um offer_id pode pertencer a apenas um action_type. Se uma oferta puder ser compartilhada em vários tipos de serviço, será necessário criar ofertas duplicadas com IDs exclusivos para cada tipo de serviço. Obrigatório. |
offer_modes | matriz de enum(OfferMode) | Obrigatório | Os métodos de aproveitamento da oferta: sem reserva, com reserva, on-line etc. Obrigatório. |
offer_category | enum(OfferCategory) | Obrigatório | A categoria da oferta. Obrigatório. |
source_assigned_priority | número | Número inteiro não negativo ([1 a 100], em que 1 representa a prioridade mais alta) que indica o nível de prioridade da oferta atribuída pela fonte. Quando várias ofertas estão disponíveis para o mesmo comerciante, isso é um indicador para a classificação delas. "0" representa que a prioridade não está definida. | |
offer_details | object(OfferDetails) | Obrigatório | Detalhes da oferta, como desconto, custo da reserva etc. Obrigatório. |
offer_restrictions | object(OfferRestrictions) | Obrigatório | Descreve como a oferta é restrita, ou seja, se é necessário ter uma assinatura/instrumento de pagamento, se ela pode ser combinada com outras ofertas (e quais tipos) etc. Obrigatório. |
coupon | object(Coupon) | Detalhes de um cupom. Obrigatório para offer_category: OFFER_CATEGORY_ADD_ON_COUPON_OFFER. | |
payment_instrument | object(PaymentInstrument) | Detalhes de um instrumento de pagamento. Obrigatório para offer_category: OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER. | |
subscription | object(Subscription) | Detalhes de uma assinatura. Obrigatório para offer_category: OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER. | |
terms | object(Terms) | Obrigatório | Termos e Condições da oferta. Obrigatório. |
validity_periods | matriz de objeto(ValidityPeriod) | Obrigatório | O período de validade da oferta. Descreve o período em que a oferta é válida, incluindo horários de início e término, dias da semana etc. Obrigatório. |
offer_url | string | URL da página de oferta do comerciante. Obrigatório para offer_category: OFFER_CATEGORY_BASE_OFFER. | |
image_url | string | URL da imagem da oferta do comerciante. |
OfferDetails
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
offer_display_text | string | Obrigatório | O texto da oferta que o provedor quer mostrar aos clientes na página de resultados da pesquisa. Obrigatório. |
| oneOf(offer_specification) | Obrigatório | Apenas um dos campos neste "oneOf" pode ser definido. |
max_discount_value | object(Money) | O desconto máximo que pode ser aproveitado. Por exemplo, 10% de desconto em até R $100. | |
min_spend_value | object(Money) | O valor mínimo de gasto para aproveitar o desconto. Por exemplo, 10% de desconto quando o preço total for de US $100 ou mais. | |
booking_cost | object(Money) | O custo para reservar esta oferta. Por exemplo, R$ 100 de desconto na conta final quando uma mesa é reservada ao custo de R $15. | |
booking_cost_unit | enum(FeeUnit) | A unidade do custo da reserva. Por exemplo, por pessoa, por transação. | |
convenience_fee | object(Fee) | ||
booking_cost_adjustable | booleano | Se o custo da reserva é ajustável, ou seja, se ele é subtraído da fatura final. Por exemplo: 30% de desconto no jantar com reserva. O custo para reservar é de US $15, que será aplicado à fatura final. Portanto, a fatura final é: Total gasto - 30% - US$ 15 | |
additional_fees | matriz de objeto(AdditionalFee) | Taxas extras cobradas do usuário. Exemplos: conveniência, manuseio etc. |
Dinheiro
Representa um montante em dinheiro com o respectivo tipo de moeda.
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
currency_code | string | O código de moeda de três letras definido no ISO 4217. | |
units | string | As unidades inteiras do montante.
Por exemplo, se currencyCode for "USD" , então 1 unidade equivalerá a um dólar americano. | |
nanos | número | Número de unidades nano (10^-9) do montante.
É necessário que o valor fique entre -999.999.999 e +999.999.999 (inclusive os dois limites).
Se units for positivo, nanos será positivo ou zero.
Se units for zero, nanos poderá ser positivo, zero ou negativo.
Se units for negativo, nanos será negativo ou zero.
Por exemplo,US $-1,75 é representado como units =-1 e nanos =-750.000.000. |
Fee
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
unit | enum(FeeUnit) | ||
type | enum(FeeType) | ||
| oneOf(cost) | Apenas um dos campos neste "oneOf" pode ser definido. |
MoneyRange
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
min_amount | object(Money) | ||
max_amount | object(Money) |
AdditionalFee
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
name | string | Obrigatório | O nome da taxa adicional. Exemplos: taxa de conveniência, taxa de manuseio etc. Obrigatório. |
fee | object(Fee) |
OfferRestrictions
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
combinable_with_other_offers | booleano | Se esta oferta pode ser combinada com outras. Quando definido como "true", os parceiros podem especificar com quais ofertas esta pode ser combinada. Se combinable_offer_categories e combinable_offer_ids estiverem definidos, qualquer oferta que corresponda a uma das condições acima poderá ser combinada. | |
combinable_offer_categories | matriz de enum(OfferCategory) | Lista de tipos de ofertas que podem ser combinadas com esta. Por exemplo, esta oferta pode ser combinada com outros cupons. Se "combinable_with_other_offers" for verdadeiro e esse campo não estiver definido, todos os tipos poderão ser combinados. | |
combinable_offer_ids | matriz de strings | Lista de "offer_ids" que podem ser combinados com esta oferta. Algumas ofertas só podem ser combinadas com determinados outros offer_ids específicos (podem ser consideradas ofertas principais). Se "combinable_with_other_offers" for verdadeiro e esse campo não estiver definido, todos os IDs de oferta poderão ser combinados. | |
inclusions | matriz de objeto(OfferCondition) | Lista de condições que precisam ser atendidas para que a oferta seja válida (por exemplo, bebidas não alcoólicas, comida). | |
exclusions | matriz de objeto(OfferCondition) | Lista de condições que invalidariam a oferta (por exemplo, buffet, combos e coquetéis). | |
min_guest | número | O número mínimo de pessoas necessárias para aproveitar a oferta. | |
food_offer_restrictions | object(FoodOfferRestrictions) | Restrições específicas a ofertas de alimentos. |
OfferCondition
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
description | string |
FoodOfferRestrictions
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
meal_types | matriz de enum(MealType) | Os tipos de refeição a que a oferta pode ser aplicada, como almoço ou jantar. Se não for definido, a oferta poderá ser aplicada a todos os tipos de refeição. | |
restricted_to_certain_courses | booleano | Se a oferta só pode ser aplicada a determinados cursos. |
Cupom
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
text | string | O texto do cupom que o provedor da oferta quer mostrar aos usuários. | |
code | string | Obrigatório | É necessário um código de cupom para resgatar a oferta. Obrigatório. |
PaymentInstrument
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
items | matriz de objeto(PaymentInstrumentItem) | Obrigatório | Lista de instrumentos de pagamento que podem ser usados para aproveitar a oferta. Obrigatório. |
provider_name | string | Obrigatório | Nome do provedor do instrumento de pagamento. Pode ser um parceiro bancário, o nome de um banco etc. Por exemplo: American Express, HDFC, ICICI. Obrigatório. |
PaymentInstrumentItem
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
type | enum(PaymentInstrumentType) | Obrigatório | Tipo do instrumento de pagamento. Obrigatório. |
name | string | Obrigatório | Nome do item do instrumento de pagamento, como o nome do cartão de crédito. Por exemplo: HDFC Infinia, American Express Platinum. Obrigatório. |
Assinatura
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
name | string | Obrigatório | O nome da assinatura. Obrigatório. |
subscription_auto_added | booleano | Indica se a assinatura é adicionada automaticamente quando um usuário aproveita esta oferta. | |
cost | object(Money) | Obrigatório | O custo da assinatura. Obrigatório. |
subscription_duration | object(Duration) | Obrigatório | Por quanto tempo a assinatura é válida no subscription_cost. Obrigatório. |
terms_and_conditions_url | string | URL dos Termos e Condições do parceiro relevantes para esta assinatura. |
Duração
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
seconds | string | Segundos assinados do período. Precisa estar entre -315.576.000.000 e +315.576.000.000 (inclusive). Observação: esses limites são calculados com base em: 60 s/min * 60 min/h * 24 h/dia * 365,25 dias/ano * 10.000 anos | |
nanos | número | Frações assinadas de um segundo com resolução de nanossegundos do período. Durações menores que um segundo são representadas com um campo 0
seconds e um campo nanos positivo ou negativo. Para durações de um segundo ou mais, um valor diferente de zero para o campo nanos precisa ter o mesmo sinal do campo seconds . Precisa estar entre -999.999.999 e +999.999.999 (inclusive). |
Termos
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
url | string | URL dos Termos e Condições do parceiro. | |
restricted_to_certain_users | booleano | Se a oferta é restrita a determinados usuários. | |
terms_and_conditions | string | Texto principal dos Termos e Condições fornecido pelo parceiro. | |
additional_terms_and_conditions | matriz de strings | Termos e condições além dos T&C principais do parceiro. |
ValidityPeriod
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
valid_period | object(ValidityRange) | O carimbo de data/hora de início e término da validade da oferta. Esses horários precisam representar dias distintos. Ou seja, o horário de início precisa ser 00:00 (início do dia) e o horário de término precisa ser 00:00 (exclusivo) no dia em que o período de validade termina. | |
time_of_day | matriz de objeto(TimeOfDayWindow) | Especifica o intervalo de tempo válido em um determinado dia e quais dias estão disponíveis para a oferta.
Por exemplo:
Segunda-feira: das 10h às 17h
Terça-feira: das 10h às 14h
Terça-feira: das 17h às 19h
Quarta, quinta, sexta, sábado e domingo: das 15h às 19h
Se nenhum horário for definido, isso significa que a oferta está disponível o tempo todo dentro de valid_period . | |
time_exceptions | matriz de objeto(ValidTimeException) | Especifica exceções para valid_period e valid_time_of_week acima. |
ValidityRange
Um intervalo de carimbos de data/hora fechado.
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
valid_from_time | object(Timestamp) | Obrigatório | O horário de início do intervalo (inclusivo). Obrigatório. |
valid_through_time | object(Timestamp) | O horário de término do intervalo (exclusivo). Se não for definido, significa que esse período nunca termina. Opcional. |
Carimbo de data/hora
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
seconds | string | Representa os segundos do horário UTC desde a época Unix 1970-01-01T00:00:00Z. Precisa ser de 0001-01-01T00:00:00Z a 9999-12-31T23:59:59Z (inclusive). | |
nanos | número | Frações não negativas de um segundo com resolução de nanossegundos. Os valores de segundos negativos com frações ainda precisam ter valores em nanossegundos não negativos que representam períodos posteriores. O valor precisa ser de 0 a 999.999.999 (inclusive). |
TimeOfDayWindow
O objeto TimeWindow é uma entidade composta que descreve uma lista de períodos em que o pedido do usuário pode ser feito ou atendido.
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
time_windows | object(TimeOfDayRange) | Obrigatório | O período em que o pedido pode ser feito/atendido. Obrigatório. |
day_of_week | matriz de enum(DayOfWeek) | A lista de dias da semana em que as janelas são aplicadas. Se nenhum for definido, isso significa que ele se aplica a todos os dias da semana. Opcional. |
TimeOfDayRange
Um período fechado.
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
open_time | object(TimeOfDay) | Um horário que indica o início do dia do período (inclusive). Se não for definido, significa 00:00:00. Opcional. | |
close_time | object(TimeOfDay) | Um Time que indica o horário de término do dia do intervalo (exclusivo). Se não for definido, o horário será 23:59:59. Opcional. |
TimeOfDay
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
hours | número | Horas de um dia no formato de 24 horas. Precisa ser maior ou igual a 0 e geralmente menor ou igual a 23. Uma API pode permitir o valor "24:00:00" para o horário de fechamento da empresa, por exemplo. | |
minutes | número | Minutos de uma hora. Precisa ser maior ou igual a 0 e menor ou igual a 59. | |
seconds | número | Segundos de um minuto. Precisa ser maior ou igual a 0 e normalmente menor ou igual a 59. Será possível usar o valor 60 caso a API permita segundos bissextos. | |
nanos | número | Frações de segundos, em nanossegundos. Precisa ser maior ou igual a 0 e menor ou igual a 999.999.999. |
ValidTimeException
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
exceptional_period | object(ValidityRange) | O carimbo de data/hora de início e fim em que a oferta não é válida. Esses horários precisam representar dias distintos. Ou seja, o horário de início precisa ser 00:00 (início do dia) e o horário de término precisa ser 00:00 (exclusivo) no dia em que o período de exceção termina. |
OfferSource
Nome | Descrição |
---|---|
OFFER_SOURCE_UNSPECIFIED | |
OFFER_SOURCE_AGGREGATOR |
ActionType
Nome | Descrição |
---|---|
ACTION_TYPE_UNSPECIFIED | |
ACTION_TYPE_DINING |
OfferMode
Nome | Descrição |
---|---|
OFFER_MODE_OTHER | |
OFFER_MODE_WALK_IN | |
OFFER_MODE_FREE_RESERVATION | |
OFFER_MODE_PAID_RESERVATION | |
OFFER_MODE_ONLINE_ORDER |
OfferCategory
Categoria da oferta. Uma oferta básica é uma oferta padrão disponível para todos os clientes, como 10% de desconto em gastos acima de US $100. Uma oferta básica restrita por um cupom ou instrumento de pagamento terá os respectivos campos definidos. Também temos ofertas de complemento x, como ADD_ON_PAYMENT_OFFER. Essas ofertas podem ser adicionadas a outras para ganhar mais descontos.
Nome | Descrição |
---|---|
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
Nome | Descrição |
---|---|
FEE_UNIT_UNSPECIFIED | |
FEE_UNIT_PER_GUEST | |
FEE_UNIT_PER_TRANSACTION |
FeeType
Nome | Descrição |
---|---|
FEE_TYPE_UNSPECIFIED | |
FEE_TYPE_FIXED | |
FEE_TYPE_VARIABLE |
MealType
Nome | Descrição |
---|---|
MEAL_TYPE_UNSPECIFIED | |
MEAL_TYPE_BREAKFAST | |
MEAL_TYPE_LUNCH | |
MEAL_TYPE_DINNER |
PaymentInstrumentType
Nome | Descrição |
---|---|
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 um dia da semana.
Nome | Descrição |
---|---|
DAY_OF_WEEK_UNSPECIFIED | O dia da semana não é especificado. |
MONDAY | Segunda-feira |
TUESDAY | Terça-feira |
WEDNESDAY | Quarta-feira |
THURSDAY | Quinta-feira |
FRIDAY | Sexta-feira |
SATURDAY | Sábado |
SUNDAY | Domingo |
offer_specification
O desconto pode ser uma porcentagem ou um valor fixo subtraído do valor total. Por exemplo: 1. 10% de desconto na conta final. 2. US$ 15 de desconto em um pedido. Os comerciantes também podem oferecer descontos personalizados, como "compre um e ganhe outro sem custo financeiro", nos campos de especificação relevantes. Obrigatório.
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
discount_percent | número | Mutuamente exclusivo com | Porcentagem da fatura com desconto. [0, 100] Para promoções de 1+1 ou 50% de desconto aplicáveis a toda a refeição (por exemplo, buffet 1+1, 1+1 na conta inteira, 1+1 no menu fixo), esse valor pode ser definido como 50. |
discount_value | object(Money) | Mutuamente exclusivo com | Valor fixo do desconto. |
other_offer_detail_text | string | Mutuamente exclusivo com | Texto em formato livre para descrever o desconto. Para ofertas específicas de 1+1 (por exemplo, 1+1 bebidas, +1 prato principal, 1+1 itens selecionados do menu), esses detalhes devem ser descritos aqui. |
custo
Nome do campo | Tipo | Requisito | Descrição |
---|---|---|---|
amount | object(Money) | Mutuamente exclusivo com | |
amount_range | object(MoneyRange) | Mutuamente exclusivo com |
Upload do feed
O feed de ofertas precisa ser enviado para o servidor SFTP de feeds Generic
. Siga o tutorial Como usar o servidor SFTP genérico de feeds para instruções e use o name
definido como google.offer
no arquivo descritor.
Frequência de envio
Em geral, o Google espera um upload de feed por dia. A frequência pode ser aumentada ou diminuída dependendo da frequência de atualizações de ofertas no seu lado para garantir uma precisão consistentemente alta. Consulte seu contato principal do Google.
Os dados vão levar algumas horas para aparecer no Google.
Categorização de ofertas
OFFER_CATEGORY_BASE_OFFER
: ofertas que podem ser reivindicadas de forma independente sem serem combinadas com outras. Isso inclui o seguinte:- Descontos fixos em toda a conta (por exemplo, 20% de desconto)
- Ofertas de assinatura (por exemplo, Sobremesa sem custo financeiro com assinatura)
- Ofertas de pagamento em casos em que não há outras ofertas básicas para o restaurante
- Ofertas complementares: ofertas que exigem o resgate de uma oferta básica. São elas:
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
(ex., Mais 10% de desconto com cartão de crédito específico)OFFER_CATEGORY_ADD_ON_COUPON_OFFER
(ex., Bebida sem custo financeiro com um código de cupom específico)OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER
(ex., Mais 10% de desconto para assinantes)
Outras considerações:
- Quando um restaurante não tem uma oferta básica definida, as ofertas complementares não são exibidas.
Se não houver uma oferta básica, qualquer oferta de pagamento, assinatura ou cupom que possa ser reivindicada sem precisar ser adicionada a outra oferta precisa ser marcada como
OFFER_CATEGORY_BASE_OFFER
.- Dependendo do tipo, os dados relevantes para
PaymentInstrument
,Subscription
ouCoupon
precisam ser definidos. - Os parceiros precisam fornecer duas cópias de cada uma dessas ofertas para cobrir
cenários em que elas funcionam como ofertas básicas e complementares. O texto da oferta de complemento pode ser definido para vários restaurantes usando
entity_ids
ouadd_on_offer_applicable_to_all_entities
.
- Dependendo do tipo, os dados relevantes para
- Quando um restaurante tem várias ofertas básicas que podem ser combinadas, todas elas precisam ser marcadas como
OFFER_CATEGORY_BASE_OFFER
. Além disso, as ofertas básicas de pagamento, assinatura ou cupom precisam ser enviadas como o tipo de oferta complementar relevante. - O
ValidityPeriod
deve ser usado para ativar ofertas de complemento como ofertas básicas apenas quando não houver uma oferta básica ativa.
Cenários de exemplo:
Um restaurante oferece 5% de desconto ao pagar com um cartão de crédito específico e uma bebida sem custo financeiro com um código de cupom específico.
- A oferta de 5% de desconto no cartão de crédito deve ser enviada em duas cópias, uma marcada como
OFFER_CATEGORY_BASE_OFFER
e outra comoOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
com os detalhes dePaymentInstrument
incluídos. - A oferta de bebida sem custo financeiro com um código de cupom precisa ser enviada como
OFFER_CATEGORY_ADD_ON_COUPON_OFFER
com os detalhes deCoupon
incluídos.
- A oferta de 5% de desconto no cartão de crédito deve ser enviada em duas cópias, uma marcada como
Um restaurante oferece 10% de desconto para clientes sem reserva e 5% de desconto para pagamentos com um cartão de crédito específico. Os dois descontos podem ser combinados.
- A oferta de 10% para clientes sem hora marcada precisa ser marcada como
OFFER_CATEGORY_BASE_OFFER
. - A oferta de 5% de desconto no cartão de crédito precisa ter duas cópias, uma marcada como
OFFER_CATEGORY_BASE_OFFER
e outra comoOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
.
- A oferta de 10% para clientes sem hora marcada precisa ser marcada como
Um restaurante oferece 10% de desconto apenas no almoço durante a semana e 5% de desconto a qualquer hora ao pagar com um cartão de crédito específico.
- O desconto de 10% precisa ter
ValidityPeriod
definido para indicar apenas durante o horário de almoço do restaurante em dias úteis. - A oferta de 5% de desconto no cartão de crédito precisa ser enviada em duas cópias.
- Uma cópia precisa ser marcada como
OFFER_CATEGORY_BASE_OFFER
com os detalhes dePaymentInstrument
incluídos.ValidityPeriod
deve ser definido para excluir o horário de almoço nos dias de semana quando a oferta de 10% de desconto no almoço estiver ativa. - Uma cópia precisa ser marcada como
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
com os detalhes dePaymentInstrument
incluídos.
- Uma cópia precisa ser marcada como
- Todas as outras ofertas de pagamento para este restaurante devem ser marcadas como
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
.
- O desconto de 10% precisa ter
Processo de desenvolvimento e lançamento
Durante a integração, o portal de parceiros vai ajudar você com informações e feedback com base no seu desenvolvimento. O processo de desenvolvimento segue estas etapas:
- A integração começará no ambiente de sandbox. É preciso usar uma exportação de produção (ou até mesmo dados de produção diretamente) no ambiente de sandbox do Google. Assim, você garante que seu desenvolvimento identifique todos os casos extremos, e o Google consegue avaliar a qualidade dos dados e auxiliar no processo com base no modelo.
- Quando você envia os feeds completos de serviços, transações e comerciantes diariamente ao ambiente de sandbox do Google, a equipe do Google consegue avaliá-los. Assim que receber nossa aprovação, você poderá enviar seu código para produção e transmitir os dados de produção para o ambiente do Google correspondente.
- Depois que você testar a integração de produção, a equipe do Google fará outro teste. A integração será iniciada após esse processo.
Monitoramento
Para garantir uma boa experiência do usuário, o Google vai verificar se as ofertas fornecidas são válidas, corretas e atendem aos critérios da nossa política antes e depois do lançamento. Para isso, o Google vai usar uma combinação de análise humana e automatizada. O resultado dessas análises vai estar disponível no Painel de ofertas da Central de ações (somente produção). O resultado desse monitoramento pode ser usado para afetar a classificação das ofertas.
Verificações automatizadas (rastreadores)
A equipe de qualidade do Google implementa rastreadores. Os rastreadores são scripts que automatizam um navegador da Web para realizar alguns cliques e extrair informações de ofertas, apenas para fins de teste de qualidade.
Número de consultas
Por exemplo, se decidirmos enviar 5.000 verificações por dia, isso significa que 5.000 vezes por dia (distribuídas uniformemente ao longo do dia, ou seja, aproximadamente uma a cada 17 segundos), nosso rastreador realiza todas as ações a seguir que um usuário comum faria:
- Comece na Pesquisa Google e clique no link do parceiro.
- Procure as informações da oferta.
- Se a oferta exigir uma reserva, ela vai continuar para o fluxo de reserva e confirmar se está disponível no horário especificado (nenhuma reserva será feita).
Detecção de web scraper
Para garantir que o web scraper não seja banido (o que pode levar à conclusão de que as ofertas não estão disponíveis), verifique se o sistema permite que nosso web scraper consulte sua página a qualquer momento. Para identificar nosso web scraper:
- O user agent do web scraper vai conter a string "Google-Offers":
- Exemplo:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google-Offers) Chrome/104.0.5112.101 Safari/537.36
- Você também pode verificar se as chamadas vêm do Google usando o DNS reverso, conforme recomendado em "Como verificar o Googlebot e outros rastreadores do Google".
No nosso caso específico, a resolução de DNS reverso segue este padrão:
google-proxy-***-***-***-***.google.com
.
Comportamento técnico
Armazenamento em cache
Para reduzir a carga no site do parceiro, nossos rastreadores geralmente são configurados para respeitar todos os cabeçalhos de cache HTTP padrão presentes na resposta. Isso significa que, para sites configurados corretamente, evitamos buscar repetidamente conteúdo que muda raramente, como bibliotecas JavaScript. Para mais detalhes sobre como implementar o armazenamento em cache, leia esta documentação sobre cache HTTP.