Partner, die Angebote nutzen möchten, müssen zuerst die Kontoeinrichtung für eine Händler- oder Entitätsintegration (Pilotprojekt) abschließen. Hier wird beschrieben, wie die Integration implementiert, getestet und eingeführt wird. Lies dir diese Übersicht und die Richtlinien für Angebote durch, bevor du mit den Integrationsschritten beginnst.
Angebote
Mit dieser Integration kannst du strukturierte Informationen zu Angeboten und Rabatten von Händlern weitergeben, die für bestimmte Dienstleistungen zu bestimmten Zeiten verfügbar sind. Angebote bestehen aus dem tatsächlichen Angebot (z. B. Rabatt in Prozent oder Euro), Gültigkeitszeiträumen (z. B. bestimmte Zeiten oder Wochentage) und den jeweiligen Verwendungszwecken (das Angebot gilt nur für bestimmte Dienstleistungen) sowie komplexen Kombinationen von Einschränkungen.
Beispiele für Angebote:
- Halber Preis für Vorspeisen mittwochs und donnerstags von 12:00 bis 17:00 Uhr im Dezember
- Zwei Desserts zum Preis von einem am Muttertag von 18:00 bis 22:00 Uhr
- 5 € Rabatt auf eine Vorspeise beim Sonntagsbrunch von 10:00 bis 14:00 Uhr
- 10% Rabatt als Walk-in-Angebot, kombinierbar mit 5% Rabatt für Premium-Abonnenten und 5% Rabatt, wenn der Nutzer über Ihre App bezahlt.
Damit Angebote in die Integration aufgenommen werden können, müssen sie unsere Eignungskriterien und technischen Anforderungen erfüllen. Bitte lies dir unsere Richtlinien für Angebote durch. Dort wird auch erklärt, was zu tun ist, wenn Angebote nicht den technischen Anforderungen entsprechen.
Implementierung von Angeboten
Die Angebotsintegration besteht aus zwei Feeds, die täglich oder in einer Häufigkeit hochgeladen werden, die eine hohe Genauigkeit gewährleistet (d. h. die Aktualität erhöht):
OfferFeed
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
data | Array von Objekt(Offer) |
Angebot
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
offer_id | String | Erforderlich | Eindeutige ID des Angebots. Erforderlich. |
entity_ids | String-Array | Liste der Händler, die an diesem Angebot teilnehmen. | |
add_on_offer_applicable_to_all_entities | boolean | Wenn „true“, gilt dieses Angebot für alle Rechtssubjekte unter dem Aggregator. Gilt nur für Add-on-Angebote. | |
offer_source | enum(OfferSource) | Erforderlich | Ein Angebot kann vom Aggregator, einem einzelnen Händler oder sogar von einem Drittanbieter als Add-on bereitgestellt werden. Erforderlich. |
action_type | enum(ActionType) | Erforderlich | Der Dienst, der das Angebot bereitstellt. Eine offer_id kann nur zu einem action_type gehören. Wenn ein Angebot für mehrere Diensttypen freigegeben werden kann, müssen für jeden Diensttyp doppelte Angebote mit eindeutigen IDs erstellt werden. Erforderlich. |
offer_modes | Array von Enum(OfferMode) | Erforderlich | Die Methoden, mit denen das Angebot genutzt werden kann – z. B. ohne Reservierung, mit Reservierung, online usw. Erforderlich. |
offer_category | enum(OfferCategory) | Erforderlich | Die Kategorie des Angebots. Erforderlich. |
source_assigned_priority | Zahl | Nicht negative Ganzzahl ([1–100], wobei 1 die höchste Priorität darstellt), die das von der Quelle zugewiesene Prioritätsniveau des Angebots angibt. Wenn mehrere Angebote für denselben Händler verfügbar sind, ist dies ein Signal für das Ranking von Angeboten. Der Wert 0 gibt an, dass die Priorität nicht festgelegt ist. | |
offer_details | object(OfferDetails) | Erforderlich | Details des Angebots, z. B. Rabatt, Buchungskosten usw. Erforderlich. |
offer_restrictions | object(OfferRestrictions) | Erforderlich | Beschreibt, wie das Angebot eingeschränkt ist, z.B. ob ein Abo oder Zahlungsmittel erforderlich ist, ob dieses Angebot mit anderen Angeboten kombiniert werden kann (und mit welchen Typen) usw. Erforderlich. |
coupon | object(Coupon) | Details zu einem Gutschein. Erforderlich für offer_category: OFFER_CATEGORY_ADD_ON_COUPON_OFFER. | |
payment_instrument | object(PaymentInstrument) | Details zu einem Zahlungsmittel. Erforderlich für offer_category: OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER. | |
subscription | object(Subscription) | Details eines Abos. Erforderlich für offer_category: OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER. | |
terms | object(Terms) | Erforderlich | Nutzungsbedingungen des Angebots. Erforderlich. |
validity_periods | Array von Objekt(ValidityPeriod) | Erforderlich | Der Gültigkeitszeitraum des Angebots. Beschreibt, für welchen Zeitraum das Angebot gilt, einschließlich Start- und Endzeit, Wochentage usw. Erforderlich. |
offer_url | String | URL zur Angebotsseite des Händlers. Erforderlich für offer_category: OFFER_CATEGORY_BASE_OFFER. | |
image_url | String | URL zum Angebotsbild des Händlers. |
OfferDetails
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
offer_display_text | String | Erforderlich | Der Angebotstext, den der Angebotsanbieter Kunden auf der Suchergebnisseite präsentieren möchte. Erforderlich. |
| oneOf(offer_specification) | Erforderlich | Es kann nur eines der Felder in diesem „oneOf“ festgelegt werden. |
max_discount_value | object(Money) | Der maximale Rabatt, der in Anspruch genommen werden kann. Beispiel: 10% Rabatt auf bis zu 100 $. | |
min_spend_value | object(Money) | Der Mindestbetrag, der ausgegeben werden muss, um den Rabatt zu erhalten. Beispiel: 10% Rabatt bei einem Gesamtpreis von mindestens 100 $. | |
booking_cost | object(Money) | Die Kosten für die Buchung dieses Angebots. Beispiel: 100 $ Rabatt auf die Endabrechnung, wenn ein Tisch für 15 $reserviert wird. | |
booking_cost_unit | enum(FeeUnit) | Die Einheit der Buchungskosten. Zum Beispiel pro Person und pro Transaktion. | |
convenience_fee | object(Fee) | ||
booking_cost_adjustable | boolean | Gibt an, ob die Buchungskosten angepasst werden können, d.h., ob sie von der endgültigen Rechnung abgezogen werden. Beispiel: 30% Rabatt auf das Abendessen mit Reservierung. Die Reservierung kostet 15 $, die auf die endgültige Rechnung angerechnet werden. Die endgültige Rechnung sieht also so aus: Gesamtausgaben – 30 % – 15 $ | |
additional_fees | Array von Objekt(AdditionalFee) | Zusätzliche Gebühren, die dem Nutzer in Rechnung gestellt werden. Beispiele: Komfort, Handhabung usw. |
Geld
Stellt einen Geldbetrag mit Währungstyp dar
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
currency_code | String | Der aus drei Buchstaben bestehende Währungscode gemäß ISO 4217 | |
units | String | Die ganzen Einheiten des Betrags.
Beispiel: Wenn currencyCode "USD" ist, dann entspricht eine Einheit 1 US-Dollar. | |
nanos | Zahl | Anzahl der Nanoeinheiten (10^-9) des Betrags.
Der Wert muss im Bereich von -999.999.999 bis +999.999.999 liegen.
Wenn units positiv ist, muss nanos positiv oder null sein.
Wenn units null ist, kann nanos positiv, null oder negativ sein.
Wenn units negativ ist, muss nanos negativ oder null sein.
-1,75 $ wird z. B. als units = −1 und nanos = −750.000.000 dargestellt. |
Gebühr
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
unit | enum(FeeUnit) | ||
type | enum(FeeType) | ||
| oneOf(cost) | Es kann nur eines der Felder in diesem „oneOf“ festgelegt werden. |
MoneyRange
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
min_amount | object(Money) | ||
max_amount | object(Money) |
AdditionalFee
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
name | String | Erforderlich | Der Name der zusätzlichen Gebühr. Beispiele: Zahlungsgebühr, Bearbeitungsgebühr usw. Erforderlich. |
fee | object(Fee) |
OfferRestrictions
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
combinable_with_other_offers | boolean | Ob dieses Angebot mit anderen Angeboten kombiniert werden kann. Wenn „true“, können Partner angeben, mit welchen Angeboten dieses Angebot kombiniert werden kann. Wenn sowohl „combinable_offer_categories“ als auch „combinable_offer_ids“ festgelegt sind, ist jedes Angebot, das einer der oben genannten Bedingungen entspricht, kombinierbar. | |
combinable_offer_categories | Array von Enum(OfferCategory) | Liste der Angebotstypen, mit denen dieses Angebot kombiniert werden kann. Dieses Angebot kann beispielsweise mit anderen Gutscheinen kombiniert werden. Wenn „combinable_with_other_offers“ auf „true“ gesetzt ist und dieses Feld nicht festgelegt ist, sind alle Typen kombinierbar. | |
combinable_offer_ids | String-Array | Liste der offer_ids, mit denen dieses Angebot kombiniert werden kann. Einige Angebote können nur mit bestimmten anderen offer_ids kombiniert werden, die als übergeordnete Angebote betrachtet werden können. Wenn „combinable_with_other_offers“ auf „true“ gesetzt ist und dieses Feld nicht festgelegt ist, können alle Angebots-IDs kombiniert werden. | |
inclusions | Array von Objekt(OfferCondition) | Liste der Bedingungen, die erfüllt sein müssen, damit das Angebot gültig ist (z.B. alkoholfreie Getränke, Speisen). | |
exclusions | Array von Objekt(OfferCondition) | Liste der Bedingungen, die das Angebot ungültig machen (z.B. Buffet, Kombiangebote und Cocktails). | |
min_guest | Zahl | Die Mindestanzahl von Personen, die erforderlich ist, um das Angebot in Anspruch zu nehmen. | |
food_offer_restrictions | object(FoodOfferRestrictions) | Einschränkungen für Essensangebote |
OfferCondition
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
description | String |
FoodOfferRestrictions
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
meal_types | Array von Enum(MealType) | Die Mahlzeitentypen, auf die das Angebot angewendet werden kann, z. B. Mittag- oder Abendessen. Wenn nicht festgelegt, kann das Angebot auf alle Mahlzeitentypen angewendet werden. | |
restricted_to_certain_courses | boolean | Gibt an, ob das Angebot nur auf bestimmte Kurse angewendet werden kann. |
Gutschein
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
text | String | Der Gutscheintext, den der Angebotsanbieter Nutzern präsentieren möchte. | |
code | String | Erforderlich | Zum Einlösen des Angebots ist ein Gutscheincode erforderlich. Erforderlich. |
PaymentInstrument
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
items | Array von Objekt(PaymentInstrumentItem) | Erforderlich | Liste der Zahlungsmittel, die für das Angebot verwendet werden können. Erforderlich. |
provider_name | String | Erforderlich | Name des Anbieters des Zahlungsmittels. Kann ein Bankpartner, der Name einer Bank usw. sein, z. B. American Express, HDFC, ICICI. Erforderlich. |
PaymentInstrumentItem
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
type | enum(PaymentInstrumentType) | Erforderlich | Typ des Zahlungsmittels. Erforderlich. |
name | String | Erforderlich | Name des Zahlungsmittels, z. B. der Name der Kreditkarte. Beispiele: HDFC Infinia, American Express Platinum. Erforderlich. |
Abo
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
name | String | Erforderlich | Der Name des Abos. Erforderlich. |
subscription_auto_added | boolean | Gibt an, ob das Abo automatisch hinzugefügt wird, wenn ein Nutzer dieses Angebot in Anspruch nimmt. | |
cost | object(Money) | Erforderlich | Die Kosten des Abos. Erforderlich. |
subscription_duration | object(Duration) | Erforderlich | Wie lange das Abo zum angegebenen Abopreis gültig ist. Erforderlich. |
terms_and_conditions_url | String | URL zu den Nutzungsbedingungen des Partners, die für dieses Abo gelten. |
Dauer
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
seconds | String | Signierte Sekunden des Zeitraums. Muss zwischen -315.576.000.000 und +315.576.000.000 (einschließlich) liegen. Hinweis: Diese Grenzen werden so berechnet: 60 Sek./Min. × 60 Min./Std. × 24 Std./Tag × 365,25 Tage/Jahr × 10.000 Jahre | |
nanos | Zahl | Signierte Sekundenbruchteile mit Nanosekunden-Auflösung des Zeitraums. Dauern von weniger als einer Sekunde werden mit dem Feld „0“ seconds und einem positiven oder negativen Feld nanos dargestellt. Bei Zeiträumen von einer Sekunde oder mehr muss ein Wert ungleich null für das Feld nanos dasselbe Vorzeichen wie das Feld seconds haben. Muss zwischen -999.999.999 und +999.999.999 liegen. |
Nutzungsbedingungen
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
url | String | URL zu den Nutzungsbedingungen des Partners. | |
restricted_to_certain_users | boolean | Gibt an, ob das Angebot auf bestimmte Nutzer beschränkt ist. | |
terms_and_conditions | String | Primärer Nutzungsbedingungen-Text, der vom Partner bereitgestellt wird. | |
additional_terms_and_conditions | String-Array | Zusätzliche Nutzungsbedingungen des Partners. |
ValidityPeriod
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
valid_period | object(ValidityRange) | Der Start- und Endzeitstempel, für den das Angebot gültig ist. Diese Zeiten müssen unterschiedliche Tage darstellen. Das heißt, die Startzeit muss 00:00 Uhr (Tagesbeginn) und die Endzeit 00:00 Uhr (exklusiv) am Tag des Gültigkeitsendes sein. | |
time_of_day | Array von Objekt(TimeOfDayWindow) | Gibt das gültige Zeitintervall an einem bestimmten Tag und die Tage an, an denen das Angebot verfügbar ist.
Beispiel:
Montag: 10:00 bis 17:00 Uhr
Dienstag: 10:00 bis 14:00 Uhr
Dienstag: 17:00 bis 19:00 Uhr
Mi, Do, Fr, Sa, So: 15:00 bis 19:00 Uhr
Wenn nichts festgelegt ist, ist das Angebot während des gesamten Zeitraums von valid_period verfügbar. | |
time_exceptions | Array von Objekt(ValidTimeException) | Gibt Ausnahmen für die oben genannten „valid_period“ und „valid_time_of_week“ an. |
ValidityRange
Ein Zeitraum mit Start und Ende.
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
valid_from_time | object(Timestamp) | Erforderlich | Der Beginn des Bereichs (einschließlich). Erforderlich. |
valid_through_time | object(Timestamp) | Die Endzeit des Bereichs (ausschließlich). Wenn das Feld nicht festgelegt ist, endet dieser Zeitraum nie. Optional. |
Zeitstempel
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
seconds | String | Stellt Sekunden der UTC-Zeit seit der Unix-Epoche 1970-01-01T00:00:00Z dar. Der Wert muss einschließlich zwischen 0001-01-01T00:00:00Z und 9999-12-31T23:59:59Z liegen. | |
nanos | Zahl | Nicht negative Sekundenbruchteile Nanosekunden-Auflösung. Negative Sekundenwerte mit Bruchteilen müssen weiterhin nicht negative Nano-Werte haben, die zeitlich vorwärts gezählt werden. Der Wert muss einschließlich zwischen 0 und 999.999.999 liegen. |
TimeOfDayWindow
Das TimeWindow-Objekt ist eine zusammengesetzte Einheit, die eine Liste von Zeiträumen beschreibt, in denen die Bestellung des Nutzers aufgegeben oder ausgeführt werden kann.
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
time_windows | object(TimeOfDayRange) | Erforderlich | Der Zeitraum, in dem die Bestellung aufgegeben/ausgeführt werden kann. Erforderlich. |
day_of_week | Array von Enum(DayOfWeek) | Die Liste der Wochentage, an denen die Zeitfenster angewendet werden. Wenn nichts festgelegt ist, gilt die Regel für alle Wochentage. Optional. |
TimeOfDayRange
Ein Zeitraum mit Start und Ende.
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
open_time | object(TimeOfDay) | Eine Zeit, die den Beginn des Tages im Zeitraum angibt (einschließlich). Wenn nicht festgelegt, ist der Wert 00:00:00. Optional. | |
close_time | object(TimeOfDay) | Eine Zeit, die das Ende des Tages im Bereich angibt (exklusiv). Wenn nicht festgelegt, wird 23:59:59 verwendet. Optional. |
TimeOfDay
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
hours | Zahl | Stunden eines Tages im 24-Stunden-Format. Muss größer oder gleich 0 und in der Regel kleiner oder gleich 23 sein. Für bestimmte Fälle, z. B. den Geschäftsschluss, kann in einer API auch der Wert „24:00:00“ zulässig sein. | |
minutes | Zahl | Minuten einer Stunde. Muss größer oder gleich 0 und kleiner oder gleich 59 sein. | |
seconds | Zahl | Sekunden einer Minute. Muss größer oder gleich 0 und in der Regel kleiner oder gleich 59 sein. Eine API kann den Wert 60 zulassen, wenn sie Schaltsekunden zulässt. | |
nanos | Zahl | Sekundenbruchteile in Nanosekunden. Muss größer oder gleich 0 und kleiner oder gleich 999.999.999 sein. |
ValidTimeException
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
exceptional_period | object(ValidityRange) | Start- und Endzeitstempel, für die das Angebot nicht gültig ist. Diese Zeiten müssen unterschiedliche Tage darstellen. Das heißt, die Startzeit muss 00:00 Uhr (Tagesbeginn) und die Endzeit 00:00 Uhr (exklusiv) am Tag des Endes des Ausnahmezeitraums sein. |
OfferSource
Name | Beschreibung |
---|---|
OFFER_SOURCE_UNSPECIFIED | |
OFFER_SOURCE_AGGREGATOR |
ActionType
Name | Beschreibung |
---|---|
ACTION_TYPE_UNSPECIFIED | |
ACTION_TYPE_DINING |
OfferMode
Name | Beschreibung |
---|---|
OFFER_MODE_OTHER | |
OFFER_MODE_WALK_IN | |
OFFER_MODE_FREE_RESERVATION | |
OFFER_MODE_PAID_RESERVATION | |
OFFER_MODE_ONLINE_ORDER |
OfferCategory
Kategorie des Angebots. Ein Basisangebot ist ein Standardangebot, das allen Kunden zur Verfügung steht, z. B. 10% Rabatt auf Ausgaben über 100 $. Bei einem Basisangebot, das durch einen Gutschein oder ein Zahlungsmittel eingeschränkt ist, sind die entsprechenden Felder festgelegt. Außerdem haben wir Add-on-Angebote wie ADD_ON_PAYMENT_OFFER. Solche Angebote können zu anderen Angeboten hinzugefügt werden, um zusätzliche Rabatte zu erhalten.
Name | Beschreibung |
---|---|
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
Name | Beschreibung |
---|---|
FEE_UNIT_UNSPECIFIED | |
FEE_UNIT_PER_GUEST | |
FEE_UNIT_PER_TRANSACTION |
FeeType
Name | Beschreibung |
---|---|
FEE_TYPE_UNSPECIFIED | |
FEE_TYPE_FIXED | |
FEE_TYPE_VARIABLE |
MealType
Name | Beschreibung |
---|---|
MEAL_TYPE_UNSPECIFIED | |
MEAL_TYPE_BREAKFAST | |
MEAL_TYPE_LUNCH | |
MEAL_TYPE_DINNER |
PaymentInstrumentType
Name | Beschreibung |
---|---|
PAYMENT_INSTRUMENT_TYPE_UNSPECIFIED | |
PAYMENT_INSTRUMENT_CREDIT_CARD | |
PAYMENT_INSTRUMENT_DEBIT_CARD | |
PAYMENT_INSTRUMENT_BANK_ACCOUNT | |
PAYMENT_INSTRUMENT_UPI | |
PAYMENT_INSTRUMENT_ONLINE_WALLET |
DayOfWeek
Steht für einen Wochentag.
Name | Beschreibung |
---|---|
DAY_OF_WEEK_UNSPECIFIED | Der Wochentag ist nicht angegeben. |
MONDAY | Montag |
TUESDAY | Dienstag |
WEDNESDAY | Mittwoch |
THURSDAY | Donnerstag |
FRIDAY | Freitag |
SATURDAY | Samstag |
SUNDAY | Sonntag |
offer_specification
Der Rabatt kann ein Prozentsatz oder ein fester Wert sein, der vom Gesamtwert abgezogen wird. Beispiel: 1. 10% Rabatt auf die Endabrechnung. 2. 15 $ Rabatt auf eine Bestellung. Händler können auch benutzerdefinierte Rabatte wie „Zwei zum Preis von einem“ über die entsprechenden Spezifikationsfelder anbieten. Erforderlich.
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
discount_percent | Zahl | Schließt sich mit | Prozentsatz der Rechnung, auf den ein Rabatt gewährt wird. [0, 100] Bei 1+1- oder 50 %-Rabattangeboten, die für das gesamte Menü gelten (z.B. 1+1-Buffet, 1+1 auf die gesamte Rechnung, 1+1 auf das Menü), kann dieser Wert auf 50 festgelegt werden. |
discount_value | object(Money) | Schließt sich mit | Fester Wert des Rabatts. |
other_offer_detail_text | String | Schließt sich mit | Freitext zur Beschreibung des Rabatts. Bei bestimmten 1+1-Angeboten (z.B. 1+1 Getränke, +1 Hauptgericht, 1+1 ausgewählte Menüpunkte) sollten diese Details hier beschrieben werden. |
Kosten
Feldname | Typ | Anforderung | Beschreibung |
---|---|---|---|
amount | object(Money) | Schließt sich mit | |
amount_range | object(MoneyRange) | Schließt sich mit |
Feedupload
Der Angebotsfeed muss auf den SFTP-Server für Feeds Generic
hochgeladen werden. Folge der Anleitung zur Verwendung des allgemeinen SFTP-Servers für Feeds. Das Feld name
muss in der Deskriptordatei auf google.offer
gesetzt sein.
Upload-Häufigkeit
Im Allgemeinen erwartet Google einen Feedupload pro Tag. Die Häufigkeit kann je nach Häufigkeit der Angebotsaktualisierungen auf Ihrer Seite erhöht oder verringert werden, um eine gleichbleibend hohe Genauigkeit zu gewährleisten. Wenden Sie sich an Ihren Google-Ansprechpartner.
Es dauert einige Stunden, bis die Daten auf Google angezeigt werden.
Angebotskategorisierung
OFFER_CATEGORY_BASE_OFFER
: Angebote, die unabhängig voneinander in Anspruch genommen werden können, ohne mit anderen Angeboten kombiniert zu werden. Dazu zählen:- Pauschalrabatte auf die gesamte Rechnung (z.B. 20% Rabatt)
- Aboangebote (z.B. Kostenloses Dessert für Mitglieder)
- Zahlungsangebote in Fällen, in denen es keine anderen Basisangebote für das Restaurant gibt
- Add-on-Angebote: Angebote, für die ein Basisangebot eingelöst werden muss. Dazu gehören:
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
(z. B. Zusätzliche 10% Rabatt mit einer bestimmten Kreditkarte)OFFER_CATEGORY_ADD_ON_COUPON_OFFER
(z. B. Kostenloses Getränk mit einem bestimmten Gutscheincode)OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER
(z. B. Zusätzlicher Rabatt von 10% für Abonnenten)
Weitere Hinweise:
- Wenn für ein Restaurant kein Basisangebot festgelegt ist, werden keine Add-on-Angebote angezeigt.
Wenn es kein Basisangebot gibt, muss jedes Zahlungs-, Abo- oder Couponangebot, das ohne Hinzufügen zu einem anderen Angebot in Anspruch genommen werden kann, mit
OFFER_CATEGORY_BASE_OFFER
gekennzeichnet werden.- Je nach Typ müssen die relevanten Daten für
PaymentInstrument
,Subscription
oderCoupon
festgelegt werden. - Partner müssen zwei Kopien jedes dieser Angebote bereitstellen, um Szenarien abzudecken, in denen sie sowohl als Basisangebote als auch als Add-on-Angebote fungieren. Der Add-on-Angebotstext kann dann für mehrere Restaurants entweder mit
entity_ids
oderadd_on_offer_applicable_to_all_entities
festgelegt werden.
- Je nach Typ müssen die relevanten Daten für
- Wenn ein Restaurant mehrere kombinierbare Basisangebote hat, sollten alle Basisangebote mit
OFFER_CATEGORY_BASE_OFFER
gekennzeichnet werden. Basisangebote, die Zahlungs-, Abo- oder Gutscheinangebote sind, sollten zusätzlich als der entsprechende Add-on-Angebotstyp gesendet werden. ValidityPeriod
sollte verwendet werden, um Add-on-Angebote als Base Offers zu aktivieren, wenn kein aktives Base Offer vorhanden ist.
Beispielszenarien:
Ein Restaurant bietet 5% Rabatt bei Zahlung mit einer bestimmten Kreditkarte und ein kostenloses Getränk mit einem bestimmten Gutscheincode.
- Das Angebot mit 5% Rabatt auf Kreditkarten sollte in zwei Kopien gesendet werden, eine mit dem Tag
OFFER_CATEGORY_BASE_OFFER
und eine mit dem TagOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
, jeweils mit den Details zuPaymentInstrument
. - Ein Angebot für ein kostenloses Getränk mit einem Gutscheincode sollte als
OFFER_CATEGORY_ADD_ON_COUPON_OFFER
mit denCoupon
-Details gesendet werden.
- Das Angebot mit 5% Rabatt auf Kreditkarten sollte in zwei Kopien gesendet werden, eine mit dem Tag
Ein Restaurant bietet 10% Rabatt für Laufkundschaft und 5% Rabatt bei Zahlung mit einer bestimmten Kreditkarte. Beide Rabatte können kombiniert werden.
- Das Angebot für Laufkundschaft mit 10% Rabatt sollte mit
OFFER_CATEGORY_BASE_OFFER
gekennzeichnet werden. - Das Kreditkartenangebot mit 5% Rabatt sollte in zwei Ausführungen vorliegen, wobei eine mit
OFFER_CATEGORY_BASE_OFFER
und die andere mitOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
gekennzeichnet ist.
- Das Angebot für Laufkundschaft mit 10% Rabatt sollte mit
Ein Restaurant bietet nur an Wochentagen 10% Rabatt auf das Mittagessen und jederzeit 5% Rabatt bei Zahlung mit einer bestimmten Kreditkarte.
- Das Angebot mit 10% Rabatt sollte
ValidityPeriod
enthalten, um anzugeben, dass es nur während der Mittagszeit des Restaurants an Wochentagen gilt. - Das Kreditkartenangebot mit 5% Rabatt sollte in zweifacher Ausführung gesendet werden.
- Eine Kopie sollte mit
OFFER_CATEGORY_BASE_OFFER
getaggt werden und die Details zuPaymentInstrument
enthalten.ValidityPeriod
sollte so festgelegt werden, dass die Mittagszeit an Wochentagen ausgeschlossen wird, wenn das Mittagsangebot mit 10% Rabatt aktiv ist. - Eine Kopie sollte mit
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
getaggt werden und diePaymentInstrument
-Details enthalten.
- Eine Kopie sollte mit
- Alle anderen Zahlungsangebote für dieses Restaurant sollten mit
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER
gekennzeichnet werden.
- Das Angebot mit 10% Rabatt sollte
Entwicklung und Einführung
Während der Integration findest du im Partner-Portal Informationen und Feedback zu deiner Entwicklung. Der Entwicklungsprozess läuft so ab:
- Die Integration wird zuerst in der Sandbox-Umgebung entwickelt. Du solltest dort einen Produktionsexport verwenden oder Produktionsdaten sogar direkt nutzen. So wird sichergestellt, dass deine Entwicklung alle Grenzfälle abdeckt und Google die Datenqualität auswerten und dich je nach deinem Datenmodell besser unterstützen kann.
- Sobald du täglich vollständige Händler-, Dienstleistungs- und Angebotsfeeds in der Sandbox-Umgebung hochlädst, wertet das Google-Team deine Feeds aus. Wenn du die Genehmigung des Google-Teams erhältst, kannst du deinen Code in die Produktion übertragen und Produktionsdaten an die Google-Produktionsumgebung senden.
- Nachdem du die Produktionsintegration vollständig getestet hast, beginnt das Google-Team mit seinen Tests. Sobald alle Tests abgeschlossen sind, wird die Integration gestartet.
Monitoring
Um eine gute Nutzererfahrung zu gewährleisten, prüft Google vor und nach der Einführung, ob die Angebote gültig und korrekt sind und unseren Richtlinienkriterien entsprechen. Dazu setzt Google eine Kombination aus manueller und automatisierter Überprüfung ein. Das Ergebnis dieser Überprüfungen ist im Angebots-Dashboard des Action Centers verfügbar (nur Produktion). Die Ergebnisse dieser Überwachung können sich auf das Ranking der Angebote auswirken.
Automatisierte Prüfungen (Crawler)
Crawler werden vom Google-Qualitätsteam implementiert. Crawler sind Skripts, die einen Webbrowser automatisieren, um einige Klicks auszuführen und Angebotsinformationen zu extrahieren. Dies dient ausschließlich zu Qualitätsprüfungszwecken.
Anzahl der Abfragen
Wenn wir uns beispielsweise dazu entschließen, 5.000 Prüfungen pro Tag zu senden, bedeutet das, dass unser Crawler 5.000 Mal pro Tag (gleichmäßig über den Tag verteilt, also etwa einmal alle 17 Sekunden) alle folgenden Aktionen ausführt, die ein normaler Nutzer ausführen würde:
- Klicken Sie in der Google Suche auf den Partnerlink.
- Suchen Sie nach den Angebotsinformationen.
- Wenn für das Angebot eine Buchung erforderlich ist, wird der Buchungsvorgang fortgesetzt, um zu bestätigen, dass das Angebot zum angegebenen Zeitpunkt verfügbar ist. Es wird keine Buchung vorgenommen.
Erkennung von Web-Scrapern
Damit der Web-Scraper nicht gesperrt wird (was dazu führen kann, dass die Angebote als nicht verfügbar eingestuft werden), muss Ihr System es unserem Web-Scraper ermöglichen, Ihre Seite jederzeit abzufragen. So erkennen Sie unseren Web-Scraper:
- Der User-Agent des Web-Scrapers enthält den String Google-Offers:
- Beispiel:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google-Offers) Chrome/104.0.5112.101 Safari/537.36
- Sie können auch prüfen, ob die Aufrufe von Google stammen, indem Sie einen umgekehrten DNS-Lookup durchführen, wie in Googlebot und andere Google-Crawler prüfen empfohlen.
In unserem speziellen Fall folgt die umgekehrte DNS-Auflösung diesem Muster:
google-proxy-***-***-***-***.google.com
.
Technisches Verhalten
Caching
Um die Last auf der Partnerwebsite zu verringern, sind unsere Crawler in der Regel so konfiguriert, dass sie alle Standard-HTTP-Caching-Header in der Antwort berücksichtigen. Das bedeutet, dass wir bei korrekt konfigurierten Websites nicht wiederholt Inhalte abrufen, die sich selten ändern (z.B. JavaScript-Bibliotheken). Weitere Informationen zur Implementierung von Caching finden Sie in der HTTP-Caching-Dokumentation.