Angebote
Mit der Angebotsintegration können Sie strukturierte Informationen zu Händlerangeboten und Rabatten, die zu bestimmten Zeiten auf bestimmte Dienste angewendet werden, weiterleiten. Angebote bestehen aus dem eigentlichen Angebot (Prozentrabatt, Rabatt in Dollar usw.), Gültigkeitszeiträumen (bestimmte Zeiten, Wochentage usw.) und anwendbaren Verwendungen (das Angebot kann nur für bestimmte Dienste verwendet werden) 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 beim Muttertagsessen 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 ein Angebot in die Integration aufgenommen werden kann, muss es in das technische Datenmodell passen und unsere Teilnahmevoraussetzungen erfüllen. Lies dir unsere Angebotsrichtlinien durch, um sicherzustellen, dass deine Integration den Anforderungen entspricht. Dort findest du auch Informationen dazu, was du mit Angeboten tun kannst, die die technischen Anforderungen nicht erfüllen.
Implementierung von Angeboten
Die Integration von Angeboten besteht aus zwei Feeds, die täglich oder in einer Häufigkeit hochgeladen werden, die eine hohe Genauigkeit gewährleistet (d. h. die Veraltung reduziert):
- Entweder:
- Händlerfeed
(mit
Merchant-Konfiguration) - Oder
Entitätsfeed
(mit der Konfiguration
Generic)
- Händlerfeed
(mit
- Und
Angebotsfeed
(mit der Konfiguration
Generic)
OfferFeed
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
data | Array von Objekten(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 Entitäten des Aggregators. Gilt nur für Zusatzangebote. | |
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 in Anspruch genommen werden kann – vor Ort, 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 die Prioritätsstufe des von der Quelle zugewiesenen Angebots angibt. Wenn für denselben Händler mehrere Angebote verfügbar sind, ist dies ein Signal für das Ranking von Angeboten. Der Wert 0 bedeutet, 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 das 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 zu einem Abo. Erforderlich für offer_category: OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER. | |
terms | object(Terms) | Erforderlich | Nutzungsbedingungen des Angebots. Erforderlich. |
validity_periods | Array von Objekten(ValidityPeriod) | Erforderlich | Der Gültigkeitszeitraum des Angebots. Beschreibt, für welchen Zeitraum das Angebot gültig ist, 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. | |
tags | Array von enum(OfferTag) | Spezielle Tags, die mit dem Angebot verknüpft sind. Damit werden Sonderangebote wie „Festlich“, „Am besten bewertet“ oder „Am häufigsten gebucht“ gekennzeichnet. | |
brand_id | String | Gibt die Marke an, die mit dem Angebot verknüpft ist. Wenn nichts festgelegt ist, wird die Standardmarke verwendet. | |
availability_level | enum(AvailabilityLevel) | Die Verfügbarkeit des Angebots. |
OfferDetails
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
offer_display_text | String | Erforderlich | Der Angebotstext, den der Angebotsanbieter Kunden auf der Suchergebnisseite präsentieren möchte. Beachte, dass dies möglicherweise nicht genau dem entspricht, was den Nutzern angezeigt wird, und dass wir andere Metadaten verwenden können, um den Text umzuschreiben oder umzuformulieren. Erforderlich. |
| oneOf(offer_specification) | Erforderlich | Es kann nur eines der Felder in diesem „oneOf“ festgelegt werden. |
max_discount_value | Objekt(Money) | Der maximale Rabatt, der in Anspruch genommen werden kann. Beispiel: 10% Rabatt auf bis zu 100 $. | |
min_spend_value | object(Money) | Der Mindestausgabenwert, um den Rabatt in Anspruch nehmen zu können. Beispiel: 10% Rabatt ab einem Gesamtpreis von 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 oder pro Transaktion. | |
convenience_fee | object(Fee) | ||
booking_cost_adjustable | boolean | Gibt an, ob die Buchungskosten anpassbar sind, 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 lautet also: Gesamtausgaben – 30 % – 15 $. | |
additional_fees | Array von Objekten(AdditionalFee) | Zusätzliche Gebühren, die dem Nutzer in Rechnung gestellt werden. Beispiele: Gebühren für Komfort, Bearbeitung, Lieferung, Verpackung, Servicegebühr usw. | |
offer_discount_type | enum(OfferDiscountType) | Die Art des Rabatts. | |
gift_card_info | object(GiftCardInfo) | Details speziell zu Geschenkkartenangeboten. |
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 | Zahl | Die ganzen Einheiten des Betrags.
Wenn currencyCode beispielsweise "USD" ist, entspricht 1 Einheit 1 $. | |
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.
Beispiel: -1,75 $ wird 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) |
GiftCardInfo
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
| oneOf(denomination_type) | Nur eines der Felder in diesem „oneOf“ kann festgelegt werden. |
FixedDenominations
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
amounts | Array von Objekten(Money) | Eine Liste aller verfügbaren diskreten Stückelungen (z.B. [100, 500, 1000]). |
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, kann jedes Angebot, das eine der oben genannten Bedingungen erfüllt, kombiniert werden. | |
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, können alle Typen kombiniert werden. | |
combinable_offer_ids | String-Array | Liste der Angebots-IDs, mit denen dieses Angebot kombiniert werden kann. Einige Angebote können nur mit bestimmten anderen Angebots-IDs kombiniert werden (können als übergeordnete Angebote betrachtet werden). 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 Objekten(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 Objekten(OfferCondition) | Liste der Bedingungen, die das Angebot ungültig machen würden (z.B. Buffet, Kombiangebote und Cocktails). | |
min_guest | Zahl | Die Mindestanzahl an Personen, die erforderlich ist, um das Angebot in Anspruch zu nehmen. Hinweis: Dieses Feld gilt nur für Tischreservierungen und sollte nicht für andere Branchen verwendet werden. | |
food_offer_restrictions | object(FoodOfferRestrictions) | Einschränkungen speziell für Lebensmittelangebote. | |
max_redemption_count | Zahl | Einschränkungen hinsichtlich der Häufigkeit, mit der dieses Angebot genutzt werden kann. Der Wert 0 bedeutet, dass es keine Limits gibt. Ein Wert von 3 bedeutet beispielsweise, dass der Nutzer dieses Angebot dreimal nutzen kann. | |
max_total_discount_value | object(Money) | Der maximale Rabatt, der für mehrere Transaktionen dieses Angebots gewährt werden kann. | |
special_conditions | String-Array | Besondere Bedingungen für dieses Angebot, die dem Nutzer angezeigt werden müssen. Beispiele: „Nur gültig für Zahlungen in [Gebiet]“, „Onlinezahlungen ausgeschlossen“, „Geschenkgutschein KANN während des Ausverkaufs verwendet werden.“ |
OfferCondition
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
description | String |
FoodOfferRestrictions
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
meal_types | Array von enum(MealType) | Die Mahlzeiten, für die das Angebot gilt, z. B. Mittag- oder Abendessen. Wenn keine Angabe erfolgt, kann das Angebot auf alle Mahlzeitentypen angewendet werden. | |
restricted_to_certain_courses | boolean | Gibt an, ob das Angebot nur für bestimmte Kurse gilt. |
Gutschein
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
text | String | Der Gutscheintext, den der Anbieter des Angebots den Nutzern anzeigen möchte. | |
code | String | Erforderlich | Gutscheincode erforderlich, um das Angebot einzulösen. Erforderlich. |
PaymentInstrument
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
items | Array von Objekten(PaymentInstrumentItem) | Erforderlich | Liste der Zahlungsmittel, die zum Einlösen des Angebots verwendet werden können. Erforderlich. |
provider_name | String | Name des Anbieters des Zahlungsmittels. Dies kann ein Bankpartner, der Name einer Bank usw. sein. Beispiel: American Express, HDFC, ICICI. |
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. Beispiel: 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 | Gibt an, wie lange das Abo zum angegebenen Abopreis [subscription_cost] gültig ist. Erforderlich. |
terms_and_conditions_url | String | URL zu den Nutzungsbedingungen des Partners, die für dieses Abo relevant sind. |
Dauer
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
seconds | Zahl | Vorzeichenbehaftete 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 | Vorzeichenbehaftete Sekundenbruchteile mit Nanosekundenauflösung des Zeitraums. Dauern von weniger als einer Sekunde werden mit einem seconds-Feld mit dem Wert 0 und einem positiven oder negativen nanos-Feld dargestellt. Bei einer Dauer 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 | Vom Partner bereitgestellter Text der primären Nutzungsbedingungen. | |
additional_terms_and_conditions | String-Array | Nutzungsbedingungen zusätzlich zu den primären 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, d.h. die Startzeit muss 00:00 Uhr (Beginn des Tages) und die Endzeit 00:00 Uhr (exklusiv) am Tag des Endes der Gültigkeitsdauer sein. | |
time_of_day | Array von Objekten(TimeOfDayWindow) | Gibt das gültige Zeitintervall an einem bestimmten Tag und die Tage an, an denen das Angebot verfügbar ist. Bei Zeiträumen, die Mitternacht überschreiten (z.B. 22:00 Uhr bis 2:00 Uhr), verwenden Sie separate Zeiträume für jeden Tag: einen, der um 23:59:59 Uhr endet, und einen, der am nächsten Tag um 00:00 Uhr beginnt.
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 keine Angabe gemacht wird, ist das Angebot innerhalb von valid_period jederzeit verfügbar. | |
time_exceptions | Array von Objekten(ValidTimeException) | Gibt Ausnahmen für die oben genannten Parameter „valid_period“ und „valid_time_of_week“ an. | |
date_exceptions | Array von Objekten(Date) | Gibt Ausnahmen in Tagen für den oben genannten gültigen Zeitraum und die Tageszeit an. | |
validity_scope | enum(ValidityScope) | Gibt den Geltungsbereich des Gültigkeitszeitraums an. | |
validity_duration_in_days | Zahl | Die Gültigkeitsdauer (in Tagen) des Gutscheins/Coupons nach dem Kauf. |
ValidityRange
Ein geschlossener/offener Zeitstempelbereich.
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
valid_from_time | object(Timestamp) | Erforderlich | Der Beginn des Zeitraums (einschließlich). Erforderlich. |
valid_through_time | object(Timestamp) | Die Endzeit des Bereichs (exklusiv). Wenn kein Wert festgelegt ist, bedeutet das, dass dieser Zeitraum nie endet. Optional. |
Zeitstempel
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
seconds | Zahl | Stellt Sekunden der UTC-Zeit seit Unix-Epoche 1970-01-01T00:00:00Z dar. Muss zwischen -62135596800 und 253402300799 liegen (einschließlich), was 0001-01-01T00:00:00Z bis 9999-12-31T23:59:59Z entspricht. | |
nanos | Zahl | Nicht negative Sekundenbruchteile Nanosekunden-Auflösung. Dieses Feld ist der Nanosekundenanteil der Dauer, keine Alternative zu Sekunden. Negative Sekundenwerte mit Brüchen müssen weiterhin nicht negative Nanosekundenwerte haben, die vorwärts in der Zeit gezählt werden. Muss zwischen 0 und 999.999.999 (einschließlich) liegen. |
TimeOfDayWindow
Das TimeWindow-Objekt ist eine zusammengesetzte Entität, die eine Liste von Zeitfenstern beschreibt, in denen die Bestellung des Nutzers entweder aufgegeben oder ausgeführt werden kann.
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
time_windows | object(TimeOfDayRange) | Erforderlich | Das Zeitfenster, in dem die Bestellung aufgegeben/ausgeführt werden kann. Erforderlich. |
day_of_week | Array von enum(DayOfWeek) | Die Liste der Wochentage, an denen die Fenster angewendet werden. Wenn keine festgelegt sind, gilt die Regel für alle Wochentage. Optional. | |
day_of_month | Array von Objekten(DayOfMonthRange) | Die Tage in einem Monat, an denen die Fenster angewendet werden. Wenn nichts festgelegt ist, gilt die Regel für alle Tage des Monats. Optional. |
TimeOfDayRange
Ein geschlossener/offener Zeitraum.
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
open_time | object(TimeOfDay) | Eine Zeit, die den Beginn des Tages im Bereich angibt (einschließlich). Wenn nicht festgelegt, bedeutet dies 00:00:00. Optional. | |
close_time | object(TimeOfDay) | Ein Uhrzeitwert, der das Ende des Tages des Bereichs angibt (exklusiv). Wenn nicht festgelegt, wird 23:59:59 verwendet. Optional. |
TimeOfDay
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
hours | Zahl | Stunden im 24-Stunden-Format. Muss größer oder gleich 0 und in der Regel kleiner oder gleich 23 sein. Eine API kann den Wert „24:00:00“ für Szenarien wie Geschäftsschlusszeit zulassen. | |
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. |
DayOfMonthRange
Ein Bereich von Tagen des Monats, der für alle Monate des Jahres gilt.
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
valid_from_day | Zahl | Erforderlich | Der erste Tag des Zeitraums (einschließlich). Erforderlich. |
valid_through_day | Zahl | Der letzte Tag des Bereichs (einschließlich). Wenn nicht festgelegt, steht dieser Bereich für einen einzelnen Tag (valid_from_day). Optional. |
ValidTimeException
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
exceptional_period | Objekt(ValidityRange) | Der Start- und Endzeitstempel, für den das Angebot nicht gültig ist. Diese Zeiten müssen unterschiedliche Tage darstellen, d.h. die Startzeit muss 00:00 Uhr (Beginn des Tages) und die Endzeit 00:00 Uhr (exklusiv) am Tag des Endes des Ausnahmezeitraums sein. |
Datum
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
year | Zahl | Jahr des Datums. Der Wert muss zwischen 1 und 9999 liegen oder kann 0 sein, wenn ein Datum ohne Jahreszahl angegeben wird. | |
month | Zahl | Monat eines Jahres. Der Wert muss zwischen 1 und 12 liegen. Er kann auch 0 sein, wenn ein Jahr ohne Monat und Tag angegeben wird. | |
day | Zahl | Tag eines Monats. Der Wert muss zwischen 1 und 31 liegen und für das Jahr und den Monat gültig sein. Er kann auch 0 sein, wenn das Jahr bzw. der Monat angegeben wird, der Tag selbst jedoch nicht relevant ist. |
OfferSource
| Name | Beschreibung |
|---|---|
OFFER_SOURCE_UNSPECIFIED | |
OFFER_SOURCE_AGGREGATOR |
ActionType
Stellt den Erfüllungsmodus des Angebots dar. Wenn ein Angebot für mehrere Erfüllungsmodi verwendet werden kann, müssen für jeden Erfüllungsmodus doppelte Angebote erstellt werden.
| Name | Beschreibung |
|---|---|
ACTION_TYPE_UNSPECIFIED | |
ACTION_TYPE_FOOD_DELIVERY | Das Angebot gilt für Lieferservices für Lebensmittel. |
ACTION_TYPE_FOOD_TAKEOUT | Das Angebot gilt für Bestellungen zum Mitnehmen oder Abholen. |
ACTION_TYPE_DINING | Das Angebot gilt für das Essen vor Ort in einem Restaurant. |
ACTION_TYPE_APPOINTMENT | Das Angebot gilt für Terminbuchungsdienste. |
ACTION_TYPE_SHOPPING_IN_STORE | Das Angebot gilt für Offlinekäufe im Geschäft. |
OfferMode
Gibt die Methode oder den Channel an, über die bzw. den der Nutzer das Angebot in Anspruch nehmen kann.
| Name | Beschreibung |
|---|---|
OFFER_MODE_OTHER | Für Erfüllungsmethoden, die nicht von anderen spezifischen Modi abgedeckt werden. |
OFFER_MODE_WALK_IN | Das Angebot ist für Besuche vor Ort ohne vorherige Reservierung verfügbar. |
OFFER_MODE_FREE_RESERVATION | Das Angebot gilt, wenn ein Nutzer eine Reservierung vornimmt, für die keine Vorauszahlung erforderlich ist. |
OFFER_MODE_PAID_RESERVATION | Das Angebot gilt, wenn ein Nutzer eine Reservierung vornimmt, für die eine Vorauszahlung erforderlich ist. |
OFFER_MODE_ONLINE_ORDER | Das Angebot gilt für Bestellungen, die über eine Website oder digitale Plattform aufgegeben werden. |
OFFER_MODE_GIFT_CARD_PURCHASE | Gibt an, dass der Kauf einer Geschenkkarte der wichtigste Schritt ist, um das Angebot zu erhalten. |
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 Basis-Abo, 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 mit anderen Angeboten kombiniert werden, um zusätzliche Rabatte zu erhalten.
| Name | Beschreibung |
|---|---|
OFFER_CATEGORY_UNSPECIFIED | Der UNSPECIFIED- oder Standard-Enum-Wert sollte in Feeds nicht verwendet werden. |
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
| Name | Beschreibung |
|---|---|
FEE_UNIT_UNSPECIFIED | Der UNSPECIFIED- oder Standard-Enum-Wert sollte in Feeds nicht verwendet werden. |
FEE_UNIT_PER_GUEST | |
FEE_UNIT_PER_TRANSACTION |
FeeType
| Name | Beschreibung |
|---|---|
FEE_TYPE_UNSPECIFIED | Der UNSPECIFIED- oder Standard-Enum-Wert sollte nicht in Feeds verwendet werden. |
FEE_TYPE_FIXED | |
FEE_TYPE_VARIABLE |
OfferDiscountType
| Name | Beschreibung |
|---|---|
OFFER_DISCOUNT_TYPE_UNSPECIFIED | |
OFFER_DISCOUNT_TYPE_INSTANT_DISCOUNT | |
OFFER_DISCOUNT_TYPE_CASHBACK | |
OFFER_DISCOUNT_TYPE_REWARD_POINT |
MealType
| Name | Beschreibung |
|---|---|
MEAL_TYPE_UNSPECIFIED | Der UNSPECIFIED- oder Standard-Enum-Wert sollte nicht in Feeds verwendet werden. |
MEAL_TYPE_BREAKFAST | |
MEAL_TYPE_LUNCH | |
MEAL_TYPE_DINNER |
PaymentInstrumentType
| Name | Beschreibung |
|---|---|
PAYMENT_INSTRUMENT_TYPE_UNSPECIFIED | Der UNSPECIFIED- oder Standard-Enum-Wert sollte in Feeds nicht verwendet werden. |
PAYMENT_INSTRUMENT_CREDIT_CARD | |
PAYMENT_INSTRUMENT_DEBIT_CARD | |
PAYMENT_INSTRUMENT_BANK_ACCOUNT | |
PAYMENT_INSTRUMENT_UPI | |
PAYMENT_INSTRUMENT_ONLINE_WALLET | |
PAYMENT_INSTRUMENT_NETBANKING |
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 |
ValidityScope
Der Umfang des Gültigkeitszeitraums, d. h. genau, für welche Aktionen dieser Gültigkeitszeitraum gilt.
| Name | Beschreibung |
|---|---|
VALIDITY_SCOPE_UNSPECIFIED | |
VALIDITY_SCOPE_CLAIM | |
VALIDITY_SCOPE_REDEEM |
OfferTag
| Name | Beschreibung |
|---|---|
OFFER_TAG_UNSPECIFIED | Der UNSPECIFIED- oder Standard-Enum-Wert sollte in Feeds nicht verwendet werden. |
OFFER_TAG_NEW_YEAR_SPECIAL | |
OFFER_TAG_VALENTINES_SPECIAL |
AvailabilityLevel
Gibt den Lager- oder Verfügbarkeitsstatus eines Angebots an.
| Name | Beschreibung |
|---|---|
AVAILABILITY_LEVEL_UNSPECIFIED | |
AVAILABILITY_LEVEL_LOW | Gibt an, dass das Angebot nur noch begrenzt verfügbar ist. Nutzer sollten sie einlösen, bevor sie nicht mehr verfügbar ist. Die Optionen „MEDIUM“ und „HIGH“ werden möglicherweise später hinzugefügt. |
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 | Prozentsatz der Rechnung, auf den ein Rabatt gewährt wird. [0, 100] Bei 1+1- oder 50 %-Rabatten, 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 gesetzt werden. |
discount_value | object(Money) | Schließt sich gegenseitig mit | Fester Wert des Rabatts. |
other_offer_detail_text | String | Schließt | Ohne Vorgaben formulierter Text, der den Rabatt beschreibt. Für bestimmte 1+1-Angebote (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 |
denomination_type
| Feldname | Typ | Anforderung | Beschreibung |
|---|---|---|---|
fixed_denominations | object(FixedDenominations) | Schließt sich mit | Wird verwendet, wenn die Geschenkkarte in bestimmten, festen Beträgen verfügbar ist. |
custom_range | object(MoneyRange) | Schließt sich mit | Wird verwendet, wenn die Marke es Nutzern erlaubt, einen benutzerdefinierten (flexiblen) Nennwert innerhalb eines definierten Bereichs auszuwählen. |
Feedupload
Der Angebotsfeed muss auf den SFTP-Server für den Generic-Feed hochgeladen werden. Folgen Sie der Anleitung unter SFTP-Server für generische Feeds verwenden und legen Sie in der Deskriptordatei name auf google.offer fest.
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 bei Mitgliedschaft)
- Zahlungsangebote, wenn es keine anderen Basisangebote für das Restaurant gibt
- Hinweis: Plattformweite Angebote zum Erlass oder zur Reduzierung von Gebühren sollten nicht als Basisangebote festgelegt werden.
- Zusatzangebote: Angebote, für die ein Basisangebot in Anspruch genommen 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ätzliche 10% Rabatt für Abonnenten)OFFER_CATEGORY_ADD_ON_FEE_REDUCTION_OFFER(z.B. kostenlose Lieferung oder reduzierte Gebühr)
Weitere Hinweise:
- Plattformweite Angebote zum Erlass oder zur Reduzierung von Gebühren sollten nicht als Basisangebote (
OFFER_CATEGORY_BASE_OFFER) festgelegt werden. Sie sollten nur alsOFFER_CATEGORY_ADD_ON_FEE_REDUCTION_OFFERfestgelegt werden, um ein anderes aktives Basisangebot zu ergänzen. - Wenn für ein Restaurant kein Basisangebot festgelegt ist, werden keine Zusatzangebote angezeigt.
Wenn es kein Basisangebot gibt, muss jedes Zahlungs-, Abo- oder Gutscheinangebot, das ohne ein anderes Angebot in Anspruch genommen werden kann, als
OFFER_CATEGORY_BASE_OFFERgekennzeichnet werden.- Je nach Typ müssen die relevanten Daten für
PaymentInstrument,SubscriptionoderCouponfestgelegt werden. - Partner müssen zwei Kopien jedes dieser Angebote bereitstellen, um Szenarien abzudecken, in denen sie sowohl als Basisangebote als auch als Zusatzangebote fungieren. Der Text des Zusatzangebots kann dann für mehrere Restaurants mit
entity_idsoderadd_on_offer_applicable_to_all_entitiesfestgelegt werden.
- Je nach Typ müssen die relevanten Daten für
- Wenn ein Restaurant mehrere Basisangebote hat, die kombiniert werden können, sollten alle Basisangebote als
OFFER_CATEGORY_BASE_OFFERgetaggt werden. Basisangebote, die Zahlungs-, Abo- oder Gutscheinangebote sind, sollten zusätzlich als entsprechender Zusatzangebotstyp gesendet werden. ValidityPeriodsollte nur dann verwendet werden, um Zusatzangebote als Basisangebote zu aktivieren, wenn kein aktives Basisangebot vorhanden ist.- Zusammenfassung identischer Angebote nach Zahlungsmittel: Wenn mehrere Zahlungsmittel denselben Rabattwert haben (z. B. Kreditkarte, Debitkarte und Net Banking mit jeweils 5% Rabatt), fassen Sie sie in einem einzigen
Offer-Objekt zusammen, anstatt separate doppelte Angebote zu senden. Fülle dazu die Listepayment_instrument.itemsmit allen anwendbaren Zahlungsmitteln aus. Dadurch wird das Layout der Google-Oberfläche übersichtlicher und potenzielle Ranking-Einbußen aufgrund übermäßiger Duplikatbeschränkungen werden vermieden.
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 für Kreditkarten sollte in zwei Kopien gesendet werden, eine mit dem Tag
OFFER_CATEGORY_BASE_OFFERund 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_OFFERmit den DetailsCoupongesendet werden.
- Das Angebot mit 5% Rabatt für Kreditkarten sollte in zwei Kopien gesendet werden, eine mit dem Tag
Ein Restaurant bietet 10% Rabatt für Gäste ohne Reservierung und 5% Rabatt bei Zahlung mit einer bestimmten Kreditkarte. Beide Rabatte können kombiniert werden.
- Das Angebot „10% Rabatt für Laufkundschaft“ sollte mit
OFFER_CATEGORY_BASE_OFFERgetaggt werden. - Das Kreditkartenangebot mit 5% Rabatt sollte zweimal vorhanden sein, einmal mit dem Tag
OFFER_CATEGORY_BASE_OFFERund einmal mit dem TagOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER.
- Das Angebot „10% Rabatt für Laufkundschaft“ sollte mit
Ein Restaurant bietet 10% Rabatt nur für das Mittagessen an Wochentagen und 5% Rabatt zu jeder Zeit, wenn mit einer bestimmten Kreditkarte bezahlt wird.
- Für das Angebot mit 10% Rabatt sollte
ValidityPeriodso festgelegt werden, dass es nur während der Mittagszeit des Restaurants an Wochentagen gilt. - Das Angebot „5% Rabatt mit Kreditkarte“ sollte in zweifacher Ausführung gesendet werden.
- Eine Kopie sollte mit
OFFER_CATEGORY_BASE_OFFERgetaggt werden und die Details zuPaymentInstrumententhalten.ValidityPeriodsollte so eingestellt werden, dass die Mittagszeit an Wochentagen ausgeschlossen wird, wenn das Mittagsangebot mit 10% Rabatt aktiv ist. - Eine Kopie sollte als
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFERmit denPaymentInstrument-Details gekennzeichnet sein.
- Eine Kopie sollte mit
- Alle anderen Zahlungsangebote für dieses Restaurant sollten mit
OFFER_CATEGORY_ADD_ON_PAYMENT_OFFERgekennzeichnet werden.
- Für das Angebot mit 10% Rabatt sollte
Entwicklung und Einführung
Während der Integration bietet das Partner-Portal Informationen und Feedback zu Ihrer Entwicklung. Der Entwicklungsprozess folgt diesem Ablauf:
- Die Integration wird zuerst in der Sandbox-Umgebung entwickelt. Sie sollten einen Export der Produktion (oder sogar Produktionsdaten direkt) in der Google-Sandbox-Umgebung verwenden. So können Sie sicherstellen, dass bei der Entwicklung alle Grenzfälle berücksichtigt werden. Außerdem kann Google so die Datenqualität bewerten und Sie anhand Ihres Datenmodells besser unterstützen.
- Sobald du täglich vollständige Händler-, Dienstleistungs- und Angebotsfeeds in der Sandbox-Umgebung hochlädst, wertet das Google-Team deine Feeds aus. Sobald das Google-Team die Genehmigung erteilt hat, können Sie Ihren Code in die Produktion übertragen und mit dem Senden von Produktionsdaten an die Google-Produktionsumgebung beginnen.
- Nachdem Sie die Produktionsintegration vollständig getestet haben, wird sie auch vom Google-Team getestet. Nach Abschluss aller Tests 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 verwendet Google eine Kombination aus manueller und automatisierter Überprüfung. Das Ergebnis dieser Überprüfungen ist im Angebots-Dashboard des Action Centers (nur Produktion) verfügbar. Das Ergebnis dieser Überwachung kann sich auf das Ranking der Angebote auswirken.
Achte darauf, dass die Seite mit den Angeboten in weniger als 5 Sekunden vollständig geladen wird. Andernfalls wird dies als Fehler gewertet und als Bad link gekennzeichnet.
Automatisierte Prüfungen (Crawler)
Das Google-Qualitätsteam implementiert Crawler. 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 beispielsweise 5.000 Prüfungen pro Tag senden, bedeutet das, dass unser Crawler 5.000-mal pro Tag (gleichmäßig über den Tag verteilt, also etwa alle 17 Sekunden) alle folgenden Aktionen ausführt, die ein normaler Nutzer ausführen würde:
- Starten Sie in der Google Suche und klicken Sie 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 jedoch 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
- Du kannst auch prüfen, ob die Aufrufe von Google stammen. Verwende dazu einen umgekehrten DNS-Lookup, wie im Hilfeartikel 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 reduzieren, 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 vermeiden, Inhalte, die sich selten ändern (z.B. JavaScript-Bibliotheken), wiederholt abzurufen. Weitere Informationen zur Implementierung von Caching finden Sie in der Dokumentation zum HTTP-Caching.