Tout partenaire participant à la mise en œuvre d'une intégration basée sur des offres doit d'abord terminer de configurer son compte pour une intégration basée sur un marchand ou une entité (version pilote). Ce guide vous explique comment une intégration basée sur des offres est mise en œuvre et testée, avant d'être lancée. Avant de passer aux étapes d'intégration, lisez non seulement ce guide, mais également les Règles applicables aux offres.
Offres
L'intégration basée sur des offres vous permet de transmettre des informations structurées sur des promotions et des remises appliquées à certains services à des moments précis. Une offre comprend les détails de l'offre même (pourcentage, remise, etc.), de la période de validité (heures ou jours spécifiques de la semaine, etc.) et des conditions d'application (l'offre ne peut être utilisée que pour certains services, par exemple), ainsi que des combinaisons complexes de restrictions.
Voici quelques exemples d'offres :
- Moitié prix sur les hors-d'œuvre tous les mercredis et jeudis de décembre entre 12h et 17h
- Deux desserts pour le prix d'un au dîner de la fête des Mères entre 18h et 22h
- 5 € de remise sur les entrées de brunch tous les dimanches de 10h à 14h
- 10 % de remise pour les clients sans réservation, cumulable avec 5 % de remise pour les abonnés Premium et 5 % de remise si l'utilisateur paie via votre application.
Pour qu'une offre soit incluse dans l'intégration, elle doit correspondre au modèle de données techniques et répondre à nos critères d'éligibilité. Veillez à consulter les Règles applicables aux offres pour vous assurer que votre intégration remplit les conditions requises et pour savoir que faire si une offre ne répond pas aux exigences techniques.
Mise en œuvre des offres
L'intégration des offres comprend deux flux à importer chaque jour ou à une fréquence qui garantit une grande précision (c'est-à-dire qui réduit l'obsolescence) :
OfferFeed
Nom du champ | Type | Exigence | Description |
---|---|---|---|
data | Tableau d'objets(Offer) |
Offre
Nom du champ | Type | Exigence | Description |
---|---|---|---|
offer_id | chaîne | Obligatoire | ID unique de l'offre. Obligatoire. |
entity_ids | tableau de chaînes | Liste des marchands participant à cette offre. | |
add_on_offer_applicable_to_all_entities | booléen | Si la valeur est "true", cette offre s'applique à toutes les entités de l'agrégateur. Uniquement applicable aux offres complémentaires. | |
offer_source | enum(OfferSource) | Obligatoire | Une offre peut être proposée par l'agrégateur, un marchand individuel ou même un tiers en tant que module complémentaire. Obligatoire. |
action_type | enum(ActionType) | Obligatoire | Service qui propose l'offre. Un offer_id ne peut appartenir qu'à un seul action_type. Si une offre peut être partagée entre plusieurs types de services, des offres en double avec des ID uniques doivent être créées pour chaque type de service. Obligatoire. |
offer_modes | tableau d'énumérations(OfferMode) | Obligatoire | Méthodes pour profiter de l'offre : en magasin, sur réservation, en ligne, etc. Obligatoire. |
offer_category | enum(OfferCategory) | Obligatoire | Catégorie de l'offre. Obligatoire. |
source_assigned_priority | Total | Entier non négatif ([1-100], où 1 représente la priorité la plus élevée) indiquant le niveau de priorité de l'offre attribué par la source. Lorsque plusieurs offres sont disponibles pour le même marchand, cela constitue un signal pour le classement des offres. 0 indique que la priorité n'est pas définie. | |
offer_details | object(OfferDetails) | Obligatoire | Détails de l'offre, tels que la remise, le coût de la réservation, etc. Obligatoire. |
offer_restrictions | object(OfferRestrictions) | Obligatoire | Décrit les restrictions de l'offre, par exemple si un abonnement ou un mode de paiement sont requis, si cette offre peut être combinée avec d'autres offres (et quels types), etc. Obligatoire. |
coupon | object(Coupon) | Détails d'un bon de réduction. Obligatoire pour offer_category: OFFER_CATEGORY_ADD_ON_COUPON_OFFER. | |
payment_instrument | object(PaymentInstrument) | Détails d'un mode de paiement. Obligatoire pour offer_category: OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER. | |
subscription | object(Subscription) | Détails d'un abonnement. Obligatoire pour offer_category: OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER. | |
terms | object(Terms) | Obligatoire | Conditions d'utilisation de l'offre. Obligatoire. |
validity_periods | Tableau d'objets(ValidityPeriod) | Obligatoire | Période de validité de l'offre. Décrit la période de validité de l'offre, y compris les heures de début et de fin, les jours de la semaine, etc. Obligatoire. |
offer_url | chaîne | URL de la page de l'offre du marchand. Obligatoire pour offer_category: OFFER_CATEGORY_BASE_OFFER. | |
image_url | chaîne | URL de l'image de l'offre du marchand. |
OfferDetails
Nom du champ | Type | Exigence | Description |
---|---|---|---|
offer_display_text | chaîne | Obligatoire | Texte de l'offre que le fournisseur souhaite afficher aux clients sur la page de résultats de recherche. Obligatoire. |
| oneOf(offer_specification) | Obligatoire | Un seul des champs de ce oneOf peut être défini. |
max_discount_value | object(Money) | Remise maximale dont vous pouvez bénéficier. Par exemple, 10 % de remise jusqu'à 100 €. | |
min_spend_value | object(Money) | Seuil minimal de dépenses pour bénéficier de la remise. Par exemple, 10 % de remise lorsque le prix total est de 100 € ou plus. | |
booking_cost | object(Money) | Coût de la réservation de cette offre. Par exemple, 100 $ de remise sur l'addition finale lorsqu'une table est réservée au prix de 15 $. | |
booking_cost_unit | enum(FeeUnit) | Unité du coût de la réservation. Par exemple, par personne et par transaction. | |
convenience_fee | object(Fee) | ||
booking_cost_adjustable | booléen | Indique si le coût de la réservation est ajustable, c'est-à-dire s'il est soustrait de la facture finale. Par exemple : 30 % de remise sur le dîner avec réservation. Le coût de la réservation est de 15 $, qui seront déduits de la facture finale. La facture finale sera donc : Total dépensé - 30 % - 15 $. | |
additional_fees | Tableau d'objets(AdditionalFee) | Frais supplémentaires facturés à l'utilisateur. Exemples : commodité, manipulation, etc. |
Valeur monétaire
Représente un montant associé à un type de devise.
Nom du champ | Type | Exigence | Description |
---|---|---|---|
currency_code | chaîne | Code de devise à trois lettres défini par la norme ISO 4217. | |
units | chaîne | Unités entières du montant.
Par exemple, si currencyCode est défini sur "USD" , une unité correspond à un dollar américain. | |
nanos | Total | Nombre de nano-unités (10^-9) du montant.
La valeur doit être comprise entre -999 999 999 et +999 999 999 inclus.
Si units est positif, nanos doit être positif ou nul.
Si units est égal à zéro, nanos peut être positif, nul ou négatif.
Si units est négatif, nanos doit être négatif ou nul.
Par exemple, -1,75 $ est représenté par units =-1 et nanos =-750 000 000. |
Fee
Nom du champ | Type | Exigence | Description |
---|---|---|---|
unit | enum(FeeUnit) | ||
type | enum(FeeType) | ||
| oneOf(cost) | Un seul des champs de ce oneOf peut être défini. |
MoneyRange
Nom du champ | Type | Exigence | Description |
---|---|---|---|
min_amount | object(Money) | ||
max_amount | object(Money) |
AdditionalFee
Nom du champ | Type | Exigence | Description |
---|---|---|---|
name | chaîne | Obligatoire | Nom des frais supplémentaires. Exemples : frais de commodité, frais de traitement, etc. Obligatoire. |
fee | object(Fee) |
OfferRestrictions
Nom du champ | Type | Exigence | Description |
---|---|---|---|
combinable_with_other_offers | booléen | Indique si cette offre est cumulable avec d'autres. Si la valeur est "true", les partenaires peuvent spécifier avec quelles offres celle-ci peut être combinée. Si les deux champs combinable_offer_categories et combinable_offer_ids sont définis, toute offre correspondant à l'une des conditions ci-dessus sera combinable. | |
combinable_offer_categories | tableau d'énumérations(OfferCategory) | Liste des types d'offres avec lesquels cette offre peut être combinée. Par exemple, cette offre peut être cumulable avec d'autres bons de réduction. Si combinable_with_other_offers est défini sur "true" et que ce champ n'est pas défini, tous les types seront combinables. | |
combinable_offer_ids | tableau de chaînes | Liste des offer_ids avec lesquels cette offre peut être combinée. Certaines offres ne peuvent être combinées qu'avec d'autres offer_ids spécifiques (qui peuvent être considérées comme des offres parentes). Si combinable_with_other_offers est défini sur "true" et que ce champ n'est pas défini, tous les ID d'offres seront combinables. | |
inclusions | Tableau d'objets(OfferCondition) | Liste des conditions à remplir pour que l'offre soit valide (par exemple, boissons non alcoolisées, nourriture). | |
exclusions | Tableau d'objets(OfferCondition) | Liste des conditions qui invalideraient l'offre (par exemple, buffets, offres combinées et cocktails). | |
min_guest | Total | Nombre minimal de personnes requis pour bénéficier de l'offre. | |
food_offer_restrictions | object(FoodOfferRestrictions) | Restrictions spécifiques aux offres de produits alimentaires. |
OfferCondition
Nom du champ | Type | Exigence | Description |
---|---|---|---|
description | chaîne |
FoodOfferRestrictions
Nom du champ | Type | Exigence | Description |
---|---|---|---|
meal_types | tableau d'énumérations(MealType) | Types de repas auxquels l'offre peut s'appliquer, comme le déjeuner ou le dîner. Si ce paramètre n'est pas défini, l'offre peut s'appliquer à tous les types de repas. | |
restricted_to_certain_courses | booléen | Indique si l'offre ne peut être appliquée qu'à certains cours. |
Bon de réduction
Nom du champ | Type | Exigence | Description |
---|---|---|---|
text | chaîne | Texte du bon de réduction que le fournisseur de l'offre souhaite afficher aux utilisateurs. | |
code | chaîne | Obligatoire | Un code promotionnel est requis pour bénéficier de l'offre. Obligatoire. |
PaymentInstrument
Nom du champ | Type | Exigence | Description |
---|---|---|---|
items | Tableau d'objets(PaymentInstrumentItem) | Obligatoire | Liste des instruments de paiement pouvant être utilisés pour profiter de l'offre. Obligatoire. |
provider_name | chaîne | Obligatoire | Nom du fournisseur du mode de paiement. Il peut s'agir d'un partenaire bancaire, du nom d'une banque, etc. Par exemple : American Express, HDFC, ICICI. Obligatoire. |
PaymentInstrumentItem
Nom du champ | Type | Exigence | Description |
---|---|---|---|
type | enum(PaymentInstrumentType) | Obligatoire | Type de l'instrument de paiement. Obligatoire. |
name | chaîne | Obligatoire | Nom de l'élément du mode de paiement, comme le nom de la carte de crédit. Par exemple : HDFC Infinia, American Express Platinum. Obligatoire. |
Abonnement
Nom du champ | Type | Exigence | Description |
---|---|---|---|
name | chaîne | Obligatoire | Nom de l'abonnement. Obligatoire. |
subscription_auto_added | booléen | Indique si l'abonnement est ajouté automatiquement lorsqu'un utilisateur profite de cette offre. | |
cost | object(Money) | Obligatoire | Coût de l'abonnement. Obligatoire. |
subscription_duration | object(Duration) | Obligatoire | Durée de validité de l'abonnement au prix subscription_cost. Obligatoire. |
terms_and_conditions_url | chaîne | URL des conditions d'utilisation du partenaire concernant cet abonnement. |
Durée
Nom du champ | Type | Exigence | Description |
---|---|---|---|
seconds | chaîne | Secondes signées de la période. La valeur doit être comprise entre -315 576 000 000 et +315 576 000 000 (inclus). Remarque : Ces limites sont calculées à partir de : 60 s/min * 60 min/h * 24 h/jour * 365,25 jours/an * 10 000 ans | |
nanos | Total | Fractions de secondes signées avec une précision de l'ordre de la nanoseconde pour la durée. Les durées inférieures à une seconde sont représentées par un champ seconds égal à 0 et un champ nanos positif ou négatif. Pour les durées d'une seconde ou plus, une valeur non nulle pour le champ nanos doit être du même signe que le champ seconds . La valeur doit être comprise entre -999 999 999 et +999 999 999 inclus. |
Conditions d'utilisation
Nom du champ | Type | Exigence | Description |
---|---|---|---|
url | chaîne | URL des conditions d'utilisation du partenaire. | |
restricted_to_certain_users | booléen | Indique si l'offre est réservée à certains utilisateurs. | |
terms_and_conditions | chaîne | Texte principal des conditions d'utilisation fournies par le partenaire. | |
additional_terms_and_conditions | tableau de chaînes | Conditions d'utilisation supplémentaires à celles principales du partenaire. |
ValidityPeriod
Nom du champ | Type | Exigence | Description |
---|---|---|---|
valid_period | object(ValidityRange) | Code temporel de début et de fin de validité de l'offre. Ces heures doivent représenter des jours distincts. Autrement dit, l'heure de début doit être 00h00 (début de la journée) et l'heure de fin doit être 00h00 (exclusive) le jour où la période de validité se termine. | |
time_of_day | Tableau d'objets(TimeOfDayWindow) | Spécifie l'intervalle de temps valide pour un jour donné et les jours où l'offre est disponible.
Par exemple :
Lundi : de 10h à 17h
Mardi : de 10h à 14h
Mardi : de 17h à 19h
Mercredi, jeudi, vendredi, samedi, dimanche : de 15h à 19h
Si aucune heure n'est définie, cela signifie que l'offre est disponible à tout moment pendant la période valid_period . | |
time_exceptions | Tableau d'objets(ValidTimeException) | Spécifie des exceptions aux paramètres valid_period et valid_time_of_week ci-dessus. |
ValidityRange
Plage d'horodatages ouvert-fermé.
Nom du champ | Type | Exigence | Description |
---|---|---|---|
valid_from_time | object(Timestamp) | Obligatoire | Heure de début de la plage (incluse). Obligatoire. |
valid_through_time | object(Timestamp) | Heure de fin de la période (exclusive). Si elle n'est pas définie, cela signifie que cette période n'a pas de fin. Facultatif. |
Horodatage
Nom du champ | Type | Exigence | Description |
---|---|---|---|
seconds | chaîne | Représente les secondes de l'heure UTC à partir de l'epoch Unix 1970-01-01T00:00:00Z. La valeur doit être comprise entre 0001-01-01T00:00:00Z et 9999-12-31T23:59:59Z inclus. | |
nanos | Total | Fractions de secondes non négatives avec une précision de l'ordre de la nanoseconde. Les valeurs de secondes négatives avec des fractions doivent toujours comporter des valeurs de nanosecondes non négatives comptabilisées dans le temps. La valeur doit être comprise entre 0 et 999 999 999 inclus. |
TimeOfDayWindow
L'objet TimeWindow est une entité composite qui décrit une liste de créneaux horaires pendant lesquels la commande de l'utilisateur peut être passée ou exécutée.
Nom du champ | Type | Exigence | Description |
---|---|---|---|
time_windows | object(TimeOfDayRange) | Obligatoire | Période pendant laquelle la commande peut être passée/traitée. Obligatoire. |
day_of_week | tableau d'énumérations(DayOfWeek) | Liste des jours de la semaine où les fenêtres sont appliquées. Si aucune n'est définie, cela signifie qu'elle s'applique à tous les jours de la semaine. Facultatif. |
TimeOfDayRange
Période ouvert-fermé.
Nom du champ | Type | Exigence | Description |
---|---|---|---|
open_time | object(TimeOfDay) | Heure de début de la journée de la plage (incluse). Si elle n'est pas définie, la valeur par défaut est 00:00:00. Facultatif. | |
close_time | object(TimeOfDay) | Heure de fin de la journée de la plage (exclusive). Si elle n'est pas définie, elle est définie par défaut sur 23:59:59. Facultatif. |
TimeOfDay
Nom du champ | Type | Exigence | Description |
---|---|---|---|
hours | Total | Heures de la journée au format 24 heures. Doit être supérieur ou égal à 0 et généralement inférieur ou égal à 23. Une API peut choisir d'autoriser la valeur "24:00:00" pour des cas tels que l'heure de fermeture des bureaux. | |
minutes | Total | Minutes d'une heure. Doit être supérieur ou égal à 0 et inférieur ou égal à 59. | |
seconds | Total | Secondes d'une minute. Doit être supérieur ou égal à 0 et généralement inférieur ou égal à 59. Une API peut autoriser la valeur 60 si elle autorise les secondes intercalaires. | |
nanos | Total | Fractions de secondes, en nanosecondes. Doit être supérieur ou égal à 0 et inférieur ou égal à 999 999 999. |
ValidTimeException
Nom du champ | Type | Exigence | Description |
---|---|---|---|
exceptional_period | object(ValidityRange) | Code temporel de début et de fin pour lequel l'offre n'est pas valide. Ces heures doivent représenter des jours distincts. Autrement dit, l'heure de début doit être 00h00 (début de la journée) et l'heure de fin doit être 00h00 (exclusive) le jour où la période d'exception se termine. |
OfferSource
Nom | Description |
---|---|
OFFER_SOURCE_UNSPECIFIED | |
OFFER_SOURCE_AGGREGATOR |
ActionType
Nom | Description |
---|---|
ACTION_TYPE_UNSPECIFIED | |
ACTION_TYPE_DINING |
OfferMode
Nom | Description |
---|---|
OFFER_MODE_OTHER | |
OFFER_MODE_WALK_IN | |
OFFER_MODE_FREE_RESERVATION | |
OFFER_MODE_PAID_RESERVATION | |
OFFER_MODE_ONLINE_ORDER |
OfferCategory
Catégorie de l'offre. Une offre de base est une offre standard disponible pour tous les clients, par exemple 10 % de remise pour toute dépense supérieure à 100 $. Les champs correspondants seront définis pour une offre de base limitée par un bon de réduction ou un mode de paiement. Nous proposons également des offres complémentaires telles que ADD_ON_PAYMENT_OFFER. Ces offres peuvent être ajoutées à d'autres offres pour bénéficier de remises supplémentaires.
Nom | Description |
---|---|
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
Nom | Description |
---|---|
FEE_UNIT_UNSPECIFIED | |
FEE_UNIT_PER_GUEST | |
FEE_UNIT_PER_TRANSACTION |
FeeType
Nom | Description |
---|---|
FEE_TYPE_UNSPECIFIED | |
FEE_TYPE_FIXED | |
FEE_TYPE_VARIABLE |
MealType
Nom | Description |
---|---|
MEAL_TYPE_UNSPECIFIED | |
MEAL_TYPE_BREAKFAST | |
MEAL_TYPE_LUNCH | |
MEAL_TYPE_DINNER |
PaymentInstrumentType
Nom | Description |
---|---|
PAYMENT_INSTRUMENT_TYPE_UNSPECIFIED | |
PAYMENT_INSTRUMENT_CREDIT_CARD | |
PAYMENT_INSTRUMENT_DEBIT_CARD | |
PAYMENT_INSTRUMENT_BANK_ACCOUNT | |
PAYMENT_INSTRUMENT_UPI | |
PAYMENT_INSTRUMENT_ONLINE_WALLET |
DayOfWeek
Représente un jour de la semaine.
Nom | Description |
---|---|
DAY_OF_WEEK_UNSPECIFIED | Le jour de la semaine n'est pas spécifié. |
MONDAY | Lundi |
TUESDAY | Mardi |
WEDNESDAY | Mercredi |
THURSDAY | Jeudi |
FRIDAY | Vendredi |
SATURDAY | Samedi |
SUNDAY | Dimanche |
offer_specification
La remise peut être exprimée en pourcentage ou en valeur fixe soustraite de la valeur totale. Par exemple : 1. 10 % de remise sur la facture finale. 2. 15 $ de remise sur une commande Les marchands peuvent également proposer des remises personnalisées, comme "deux pour le prix d'un", dans les champs de spécification correspondants. Obligatoire.
Nom du champ | Type | Exigence | Description |
---|---|---|---|
discount_percent | Total | Exclusivité mutuelle avec | Pourcentage de la facture bénéficiant d'une remise. [0, 100] Pour les offres 1+1 ou 50 % de réduction applicables à l'ensemble du repas (par exemple, buffet 1+1, 1+1 sur l'ensemble de l'addition, 1+1 sur le menu fixe), cette valeur peut être définie sur 50. |
discount_value | object(Money) | Exclusivité mutuelle avec | Valeur fixe de la remise. |
other_offer_detail_text | chaîne | Exclusivité mutuelle avec | Texte libre pour décrire la remise. Pour les offres spécifiques "1+1" (par exemple, 1+1 boissons, +1 plat principal, 1+1 éléments de menu sélectionnés), ces détails doivent être décrits ici. |
coût
Nom du champ | Type | Exigence | Description |
---|---|---|---|
amount | object(Money) | Exclusivité mutuelle avec | |
amount_range | object(MoneyRange) | Exclusivité mutuelle avec |
Importation du flux
Le flux offres doit être importé sur le serveur SFTP du flux Generic
. Pour obtenir des instructions, suivez le tutoriel sur l'utilisation du serveur SFTP de flux générique. Assurez-vous de définir le champ name
sur google.offer
dans votre fichier descripteur.
Fréquence de mise en ligne des vidéos
En général, Google s'attend à ce que vous importiez un flux par jour. La fréquence peut être augmentée ou diminuée en fonction de la fréquence des mises à jour des offres de votre côté pour garantir une précision élevée et constante. Contactez votre contact Google.
Il faudra attendre quelques heures avant que les données n'apparaissent sur Google.
Catégorisation des offres
OFFER_CATEGORY_BASE_OFFER
: offres pouvant être demandées indépendamment, sans être combinées à une autre offre. Par exemple :- Remises forfaitaires sur l'ensemble de la facture (par exemple, 20 % de remise)
- Offres d'abonnement (par exemple, Dessert sans frais pour les membres)
- Offres de paiement lorsqu'aucune autre offre de base n'est disponible pour le restaurant
- Offres complémentaires : offres qui nécessitent de souscrire une offre de base. Par exemple :
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
(par exemple, 10 % de remise supplémentaire avec une carte de crédit spécifique)OFFER_CATEGORY_ADD_ON_COUPON_OFFER
(par exemple, Boisson sans frais avec un code promotionnel spécifique)OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER
(par exemple, 10 % de remise supplémentaire pour les abonnés)
Autres points à noter :
- Si aucun offre de base n'est définie pour un restaurant, les offres complémentaires ne s'affichent pas.
S'il n'y a pas d'offre de base, toute offre de paiement, d'abonnement ou de bon de réduction qui peut être revendiquée sans avoir besoin d'être ajoutée à une autre offre doit être taguée comme
OFFER_CATEGORY_BASE_OFFER
.- En fonction du type, les données correspondantes pour
PaymentInstrument
,Subscription
ouCoupon
doivent être définies. - Les partenaires doivent fournir deux copies de chacune de ces offres pour couvrir les scénarios dans lesquels elles fonctionnent à la fois comme offres de base et comme offres complémentaires. Le texte de l'offre complémentaire peut ensuite être défini pour plusieurs restaurants à l'aide de
entity_ids
ouadd_on_offer_applicable_to_all_entities
.
- En fonction du type, les données correspondantes pour
- Lorsqu'un restaurant propose plusieurs offres de base cumulables, elles doivent toutes être taguées comme
OFFER_CATEGORY_BASE_OFFER
. Les offres de base de type Paiement, Abonnement ou Bon de réduction doivent également être envoyées en tant qu'offres complémentaires du type correspondant. ValidityPeriod
doit être utilisé pour activer les offres de modules complémentaires en tant qu'offres de base uniquement lorsqu'aucune offre de base n'est active.
Voici quelques exemples de scénarios :
Un restaurant propose 5 % de remise pour tout paiement avec une carte de crédit spécifique et une boisson sans frais avec un code promotionnel spécifique.
- L'offre de 5 % de réduction sur les cartes de crédit doit être envoyée en deux exemplaires, l'un tagué
OFFER_CATEGORY_BASE_OFFER
et l'autreOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
, avec les détailsPaymentInstrument
inclus. - L'offre de boisson sans frais avec un code promotionnel doit être envoyée sous la forme
OFFER_CATEGORY_ADD_ON_COUPON_OFFER
avec les informationsCoupon
incluses.
- L'offre de 5 % de réduction sur les cartes de crédit doit être envoyée en deux exemplaires, l'un tagué
Un restaurant propose 10 % de remise pour les clients sans réservation et 5 % de remise pour les paiements avec une carte de crédit spécifique. Ces deux remises peuvent être cumulées.
- L'offre de 10 % pour les clients sans réservation doit être taguée comme
OFFER_CATEGORY_BASE_OFFER
. - L'offre de 5 % de remise avec une carte de crédit doit être dupliquée. L'une doit être taguée
OFFER_CATEGORY_BASE_OFFER
et l'autreOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
.
- L'offre de 10 % pour les clients sans réservation doit être taguée comme
Un restaurant propose 10 % de remise uniquement pour le déjeuner en semaine et 5 % de remise à tout moment en payant avec une carte de crédit spécifique.
- L'offre de 10 % de remise doit être définie sur
ValidityPeriod
pour indiquer qu'elle n'est valable que pendant les heures de déjeuner du restaurant en semaine. - L'offre de 5 % de remise sur les cartes de crédit doit être envoyée en deux exemplaires.
- Une copie doit être taguée comme
OFFER_CATEGORY_BASE_OFFER
avec les détailsPaymentInstrument
inclus.ValidityPeriod
doit être défini sur "Exclure" pour les heures de déjeuner en semaine lorsque l'offre de 10 % de remise sur le déjeuner est active. - Une copie doit être taguée comme
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
et inclure les détailsPaymentInstrument
.
- Une copie doit être taguée comme
- Toutes les autres offres de paiement pour ce restaurant doivent être taguées comme
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
.
- L'offre de 10 % de remise doit être définie sur
Processus de développement et de lancement
Le portail des partenaires vous fournit des informations et des commentaires sur le développement de votre intégration. Le processus de développement se déroule ainsi :
- Vous commencez par développer votre intégration dans l'environnement de bac à sable. Utilisez une exportation de vos données de production (ou même directement celles-ci) dans l'environnement de bac à sable Google. Vous pourrez alors vous assurer de détecter tous les cas limites au stade de développement, Google pourra évaluer la qualité des données et mieux vous aider en fonction de votre modèle de données.
- Une fois que vous commencez à importer régulièrement et quotidiennement des flux marchands, services et offres complets dans l'environnement de bac à sable, notre équipe se charge de leur évaluation. Lorsque l'équipe Google vous donne son approbation, vous pouvez transférer votre code en mode production et commencer à envoyer des données de production vers l'environnement de production Google.
- Une fois que vous avez terminé de tester l'intégration dans l'environnement de production, l'équipe Google la teste également. Une fois tous les tests terminés, votre intégration peut être lancée.
Surveillance
Pour garantir une expérience utilisateur de qualité, Google vérifiera que les offres fournies sont valides, correctes et qu'elles respectent les critères de nos règles avant et après le lancement. Pour ce faire, Google utilisera à la fois des réviseurs humains et des outils d'examen automatiques. Les résultats de ces examens seront accessibles dans le tableau de bord des offres d'Action Center (production uniquement). Les résultats de cette surveillance peuvent être utilisés pour affecter le classement des offres.
Vérifications automatisées (robots d'exploration)
L'équipe Google chargée de la qualité implémente les robots d'exploration. Les robots d'exploration sont des scripts qui automatisent un navigateur Web pour effectuer des clics et extraire des informations sur les offres, uniquement à des fins de test de qualité.
Nombre de requêtes
Par exemple, si nous décidons d'envoyer 5 000 vérifications par jour, cela signifie que 5 000 fois par jour (réparties de manière uniforme tout au long de la journée, soit environ une toutes les 17 secondes), notre robot d'exploration effectue toutes les actions qu'un utilisateur régulier effectuerait :
- Commencez par effectuer une recherche sur Google, puis cliquez sur le lien du partenaire.
- Recherchez les informations sur l'offre.
- Si l'offre nécessite une réservation, l'utilisateur est redirigé vers le processus de réservation pour confirmer que l'offre est disponible à l'heure spécifiée (aucune réservation n'est effectuée).
Détection des robots d'exploration Web
Pour vous assurer que le Web scraper n'est pas banni (ce qui pourrait l'amener à conclure que les offres ne sont pas disponibles), assurez-vous que votre système lui permet d'interroger votre page à tout moment. Pour identifier notre robot d'exploration Web :
- Le User-Agent du Web Scraper contiendra la chaîne "Google-Offers" :
- Exemple : Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google-Offers) Chrome/104.0.5112.101 Safari/537.36
- Vous pouvez également vérifier si les appels proviennent de Google à l'aide de la résolution DNS inverse, comme recommandé dans Valider Googlebot et les autres robots d'exploration Google.
Dans notre cas spécifique, la résolution DNS inversée suit ce modèle :
google-proxy-***-***-***-***.google.com
.
Comportement technique
Mise en cache
Afin de réduire la charge sur le site Web du partenaire, nos robots d'exploration sont généralement configurés pour respecter tous les en-têtes de mise en cache HTTP standards présents dans la réponse. Cela signifie que pour les sites Web correctement configurés, nous évitons de récupérer à plusieurs reprises du contenu qui change rarement (par exemple, les bibliothèques JavaScript). Pour en savoir plus sur l'implémentation de la mise en cache, consultez la documentation sur la mise en cache HTTP.