Партнеры, участвующие в интеграции предложений, должны завершить настройку учётной записи для этапа интеграции на уровне продавца или организации (пилотный проект) до начала работы. Реализация, тестирование и запуск интеграции предложений подробно описаны в этом руководстве. Перед началом интеграции ознакомьтесь с этим обзором и правилами в отношении предложений .
Предложения
Интеграция предложений позволяет передавать структурированную информацию о промоакциях и скидках продавцов, действующих на определённые услуги в определённое время. Предложения включают в себя само предложение (процентная скидка, скидка в долларах США и т. д.), периоды действия (определённое время, дни недели и т. д.) и условия использования (предложение можно использовать только на определённые услуги), а также сложные комбинации ограничений.
Примеры предложений:
- Скидки на закуски по средам и четвергам в декабре с 12:00 до 17:00.
- Купите один десерт и получите второй бесплатно на ужин в честь Дня матери с 18:00 до 22:00
- Скидка 5 долларов на основное блюдо для бранча каждое воскресенье с 10:00 до 14:00
- Скидка 10% при личном обращении, которую можно комбинировать со скидкой 5% для премиум-подписчиков и скидкой 5%, если пользователь платит через ваше приложение.
Чтобы предложение было включено в интеграцию, оно должно соответствовать технической модели данных и нашим требованиям. Обязательно ознакомьтесь с нашей политикой в отношении предложений , чтобы убедиться в соблюдении правил интеграции и получить инструкции о том, что делать с предложениями, не соответствующими техническим требованиям.
Реализация предложений
Интеграция предложений состоит из двух каналов, которые будут загружаться ежедневно или с частотой, обеспечивающей высокую точность (что означает снижение вероятности устаревания):
OfferFeed
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| data | массив объектов (Offer) | 
Предложение
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| offer_id | нить | Необходимый | Уникальный идентификатор предложения. Обязательно. | 
| entity_ids | массив строк | Список продавцов, участвующих в данном предложении. | |
| add_on_offer_applicable_to_all_entities | булев | Если это правда, это предложение распространяется на все организации, входящие в агрегатор. Применимо только к дополнительным предложениям. | |
| offer_source | перечисление (OfferSource) | Необходимый | Предложение может быть предоставлено агрегатором, отдельным продавцом или даже третьей стороной в качестве дополнения. Обязательно. | 
| action_type | перечисление (ActionType) | Необходимый | Сервис, предоставляющий предложение. Значение offer_id может принадлежать только одному типу действия. Если предложение может быть общим для нескольких типов сервисов, то для каждого типа сервиса будут созданы дубликаты предложений с уникальными идентификаторами. Обязательно. | 
| offer_modes | массив перечисления (OfferMode) | Необходимый | Способы, которыми можно воспользоваться предложением: личное присутствие, бронирование, онлайн и т. д. Обязательно. | 
| offer_category | перечисление (OfferCategory) | Необходимый | Категория предложения. Обязательно. | 
| source_assigned_priority | число | Неотрицательное целое число ([1-100], где 1 соответствует наивысшему приоритету), указывающее уровень приоритета предложения, назначенный источником. Наличие нескольких предложений от одного продавца служит сигналом для ранжирования предложений. 0 означает, что приоритет не установлен. | |
| offer_details | объект (OfferDetails) | Необходимый | Подробная информация о предложении, например, скидка, стоимость бронирования и т. д. Обязательно. | 
| offer_restrictions | объект (OfferRestrictions) | Необходимый | Описывает, как ограничено предложение, т. е. требуется ли подписка/платежное средство, можно ли комбинировать это предложение с другими предложениями (и с какими типами) и т. д. Обязательно. | 
| coupon | объект (Coupon) | Подробная информация о купоне. Обязательно для offer_category: OFFER_CATEGORY_ADD_ON_COUPON_OFFER. | |
| payment_instrument | объект (PaymentInstrument) | Информация о платежном инструменте. Обязательно для offer_category: OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER. | |
| subscription | объект (Subscription) | Подробная информация о подписке. Обязательно для offer_category: OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER. | |
| terms | объект (Terms) | Необходимый | Условия предложения. Обязательно. | 
| validity_periods | массив объектов (ValidityPeriod) | Необходимый | Срок действия предложения. Описывает период действия предложения, включая время начала и окончания, дни недели и т. д. Обязательно. | 
| offer_url | нить | URL-адрес страницы предложения продавца. Обязательно для offer_category: OFFER_CATEGORY_BASE_OFFER. | |
| image_url | нить | URL-адрес изображения предложения продавца. | 
Подробности предложения
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| offer_display_text | нить | Необходимый | Текст предложения, который поставщик предложения хочет отображать клиентам на странице результатов поиска. Обязательно. | 
|  | один из (offer_specification) | Необходимый | Только одно из полей в этом oneOf может быть задано. | 
| max_discount_value | объект (Money) | Максимальная скидка, на которую можно рассчитывать. Например, скидка 10% при покупке на сумму до 100 долларов США. | |
| min_spend_value | объект (Money) | Минимальная сумма покупки для получения скидки. Например, скидка 10% при общей стоимости товара 100 долларов США или выше. | |
| booking_cost | объект (Money) | Стоимость бронирования по этому предложению. Например, скидка 100 долларов на итоговый счёт при бронировании столика стоимостью 15 долларов. | |
| booking_cost_unit | перечисление (FeeUnit) | Единица измерения стоимости бронирования. Например, на человека, на транзакцию. | |
| convenience_fee | объект (Fee) | ||
| booking_cost_adjustable | булев | Можно ли изменить стоимость бронирования, т.е. вычесть её из итогового счёта? Например: скидка 30% на ужин при бронировании. Стоимость бронирования составляет 15 долларов США, и эта сумма будет учтена в итоговом счёте. Итоговый счёт: Общая сумма расходов - 30% - 15 долларов США. | |
| additional_fees | массив объектов (AdditionalFee) | Дополнительные сборы, взимаемые с пользователя. Примеры: удобство, обслуживание и т. д. | 
Деньги
Представляет собой сумму денег с указанным типом валюты.
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| currency_code | нить | Трехбуквенный код валюты, определенный в ISO 4217. | |
| units | нить | Целые единицы суммы. Например, если currencyCode—"USD", то 1 единица равна одному доллару США. | |
| nanos | число | Количество единиц нано (10^-9) от суммы. Значение должно быть в диапазоне от -999 999 999 до +999 999 999 включительно. Если unitsположительная,nanosдолжно быть положительным или нулевым. Еслиunitsравна нулю,nanosможет быть положительным, нулевым или отрицательным. Еслиunitsотрицательная,nanosдолжно быть отрицательным или нулевым. Например, $-1,75 представляется какunits= -1, аnanos= -750 000 000. | 
Платеж
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| unit | перечисление (FeeUnit) | ||
| type | перечисление (FeeType) | ||
|  | один из (cost) | Только одно из полей в этом oneOf может быть задано. | 
MoneyRange
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| min_amount | объект (Money) | ||
| max_amount | объект (Money) | 
Дополнительный сбор
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| name | нить | Необходимый | Название дополнительной платы. Примеры: плата за обслуживание, плата за обработку и т. д. Обязательно. | 
| fee | объект (Fee) | 
Ограничения предложения
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| combinable_with_other_offers | булев | Можно ли комбинировать это предложение с другими предложениями? Если установлено значение true, партнёры могут указать, с какими предложениями можно комбинировать это предложение. Если заданы оба параметра: combinable_offer_categories и combinable_offer_ids, то любое предложение, соответствующее одному из вышеперечисленных условий, будет комбинируемым. | |
| combinable_offer_categories | массив перечисления (OfferCategory) | Список типов предложений, с которыми можно комбинировать это предложение. Например, это предложение может комбинироваться с другими купонами. Если параметр combinable_with_other_offers имеет значение true и это поле не задано, все типы будут комбинируемыми. | |
| combinable_offer_ids | массив строк | Список offer_id, с которыми можно комбинировать это предложение. Некоторые предложения можно комбинировать только с определёнными другими offer_id (они могут считаться родительскими предложениями). Если параметр combinable_with_other_offers имеет значение true и это поле не задано, все предложения можно комбинировать. | |
| inclusions | массив объектов (OfferCondition) | Перечень условий, которые должны быть соблюдены для того, чтобы предложение было действительным (например, безалкогольные напитки, еда). | |
| exclusions | массив объектов (OfferCondition) | Список условий, которые сделают предложение недействительным (например, шведский стол, комбинированные предложения и коктейли). | |
| min_guest | число | Минимальное количество человек, необходимое для использования предложения. | |
| food_offer_restrictions | объект (FoodOfferRestrictions) | Ограничения, касающиеся предложений еды. | 
ПредложениеУсловие
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| description | нить | 
FoodOfferRestrictions
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| meal_types | массив перечисления (MealType) | Типы питания, к которым может применяться предложение, например, обед или ужин. Если не указано иное, предложение может применяться ко всем типам питания. | |
| restricted_to_certain_courses | булев | Может ли предложение распространяться только на определенные курсы. | 
Купон
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| text | нить | Текст купона, который поставщик предложения хочет показать пользователям. | |
| code | нить | Необходимый | Для использования предложения требуется код купона. Обязательно. | 
Платежный инструмент
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| items | массив объектов (PaymentInstrumentItem) | Необходимый | Список платежных инструментов, которые можно использовать для участия в акции. Обязательно. | 
| provider_name | нить | Необходимый | Название поставщика платёжного инструмента. Это может быть название банка-партнёра, название банка и т. д. Например: American Express, HDFC, ICICI. Обязательно. | 
PaymentInstrumentItem
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| type | перечисление (PaymentInstrumentType) | Необходимый | Тип платежного инструмента. Обязательно. | 
| name | нить | Необходимый | Название платёжного инструмента, например, название кредитной карты. Например: HDFC Infinia, American Express Platinum. Обязательно. | 
Подписка
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| name | нить | Необходимый | Название подписки. Обязательно. | 
| subscription_auto_added | булев | Добавляется ли подписка автоматически, когда пользователь использует это предложение | |
| cost | объект (Money) | Необходимый | Стоимость подписки. Обязательно. | 
| subscription_duration | объект (Duration) | Необходимый | Срок действия подписки по указанной стоимости. Обязательно. | 
| terms_and_conditions_url | нить | Ссылка на условия партнера, относящиеся к данной подписке. | 
Продолжительность
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| seconds | нить | Секунды со знаком, относящиеся к промежутку времени. Должны быть в диапазоне от -315 576 000 000 до +315 576 000 000 включительно. Примечание: эти границы вычисляются следующим образом: 60 сек/мин * 60 мин/ч * 24 ч/сутки * 365,25 дней/год * 10 000 лет. | |
| nanos | число | Доли секунды со знаком с разрешением в наносекундах. Длительности менее одной секунды представлены полем «0 secondsи положительным или отрицательным полемnanos. Для длительностей в одну секунду и более ненулевое значение поляnanosдолжно иметь тот же знак, что и полеseconds. Диапазон значений: от -999 999 999 до +999 999 999 включительно. | 
Условия
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| url | нить | Ссылка на условия и положения партнера. | |
| restricted_to_certain_users | булев | Ограничено ли предложение определенными пользователями. | |
| terms_and_conditions | нить | Основной текст положений и условий предоставлен партнером. | |
| additional_terms_and_conditions | массив строк | Условия и положения в дополнение к основным положениям и положениям от партнера. | 
Срок действия
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| valid_period | объект (ValidityRange) | Время начала и окончания действия предложения. Эти значения должны соответствовать разным дням, то есть время начала должно быть 00:00 (начало дня), а время окончания — 00:00 (не включая день) в день окончания срока действия. | |
| time_of_day | массив объектов (TimeOfDayWindow) | Указывает допустимый временной интервал в заданный день и дни, в которые доступно предложение. Например: Понедельник: с 10:00 до 17:00 Вторник: с 10:00 до 14:00 Вторник: с 17:00 до 19:00 Ср, Чт, Пт, Сб, Вс: с 15:00 до 19:00 Если не указано, это означает, что предложение действительно в течение всего времени в течение valid_period. | |
| time_exceptions | массив объектов (ValidTimeException) | Указывает исключения из указанных выше valid_period и valid_time_of_week. | 
ДиапазонДостоверности
Диапазон временных меток «закрыто-открыто».
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| valid_from_time | объект (Timestamp) | Необходимый | Начальное время диапазона (включительно). Обязательно. | 
| valid_through_time | объект (Timestamp) | Конечное время диапазона (исключая указанное). Если не указано, это означает, что этот период бесконечен. Необязательно. | 
Метка времени
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| seconds | нить | Представляет секунды по времени UTC с эпохи Unix 1970-01-01T00:00:00Z. Должно быть в диапазоне от 0001-01-01T00:00:00Z до 9999-12-31T23:59:59Z включительно. | |
| nanos | число | Неотрицательные доли секунды с разрешением до наносекунд. Отрицательные значения секунд с дробями должны иметь неотрицательные значения в наносекундах, которые отсчитываются вперёд во времени. Должны быть в диапазоне от 0 до 999 999 999 включительно. | 
TimeOfDayWindow
Объект TimeWindow — это составная сущность, описывающая список окон, в которых заказ пользователя может быть размещен или выполнен.
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| time_windows | объект (TimeOfDayRange) | Необходимый | Временной интервал, в течение которого заказ может быть размещен/выполнен. Обязательно. | 
| day_of_week | массив перечисления (DayOfWeek) | Список дней недели, к которым применяется окно. Если ничего не указано, это означает, что оно применяется ко всем дням недели. Необязательно. | 
TimeOfDayRange
Диапазон времени «закрыто-открыто».
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| open_time | объект (TimeOfDay) | Время, указывающее время начала суток в диапазоне (включительно). Если не указано, означает 00:00:00. Необязательно. | |
| close_time | объект (TimeOfDay) | Время, указывающее конечное время суток в диапазоне (исключая указанное). Если не указано, означает 23:59:59. Необязательно. | 
Время дня
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| hours | число | Часы суток в 24-часовом формате. Должно быть больше или равно 0 и, как правило, меньше или равно 23. API может разрешить значение «24:00:00» для таких случаев, как время закрытия предприятия. | |
| minutes | число | Минуты часа. Должны быть больше или равны 0 и меньше или равны 59. | |
| seconds | число | Секунда минуты. Должна быть больше или равна 0 и, как правило, меньше или равна 59. API может допускать значение 60, если допускает дополнительные секунды. | |
| nanos | число | Доли секунды в наносекундах. Должны быть больше или равны 0 и меньше или равны 999 999 999. | 
ValidTimeException
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| exceptional_period | объект (ValidityRange) | Начальное и конечное время, на которое предложение недействительно. Эти значения должны соответствовать разным дням, то есть начальное время должно быть 00:00 (начало дня), а конечное время — 00:00 (не включая день) в день окончания периода исключения. | 
OfferSource
| Имя | Описание | 
|---|---|
| OFFER_SOURCE_UNSPECIFIED | |
| OFFER_SOURCE_AGGREGATOR | 
Тип действия
| Имя | Описание | 
|---|---|
| ACTION_TYPE_UNSPECIFIED | |
| ACTION_TYPE_DINING | 
OfferMode
| Имя | Описание | 
|---|---|
| OFFER_MODE_OTHER | |
| OFFER_MODE_WALK_IN | |
| OFFER_MODE_FREE_RESERVATION | |
| OFFER_MODE_PAID_RESERVATION | |
| OFFER_MODE_ONLINE_ORDER | 
ПредложениеКатегория
Категория предложения. Базовое предложение — это стандартное предложение, доступное всем клиентам, например, скидка 10% при покупке свыше 100 долларов США. Для базового предложения, ограниченного купоном или платежным инструментом, будут установлены соответствующие поля. Также доступны дополнительные предложения, например, ADD_ON_PAYMENT_OFFER. Такие предложения можно добавлять к другим предложениям для получения дополнительных скидок.
| Имя | Описание | 
|---|---|
| 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
| Имя | Описание | 
|---|---|
| FEE_UNIT_UNSPECIFIED | |
| FEE_UNIT_PER_GUEST | |
| FEE_UNIT_PER_TRANSACTION | 
FeeType
| Имя | Описание | 
|---|---|
| FEE_TYPE_UNSPECIFIED | |
| FEE_TYPE_FIXED | |
| FEE_TYPE_VARIABLE | 
ТипПитания
| Имя | Описание | 
|---|---|
| MEAL_TYPE_UNSPECIFIED | |
| MEAL_TYPE_BREAKFAST | |
| MEAL_TYPE_LUNCH | |
| MEAL_TYPE_DINNER | 
Тип платежного инструмента
| Имя | Описание | 
|---|---|
| PAYMENT_INSTRUMENT_TYPE_UNSPECIFIED | |
| PAYMENT_INSTRUMENT_CREDIT_CARD | |
| PAYMENT_INSTRUMENT_DEBIT_CARD | |
| PAYMENT_INSTRUMENT_BANK_ACCOUNT | |
| PAYMENT_INSTRUMENT_UPI | |
| PAYMENT_INSTRUMENT_ONLINE_WALLET | 
ДеньНедели
Обозначает день недели.
| Имя | Описание | 
|---|---|
| DAY_OF_WEEK_UNSPECIFIED | День недели не указан. | 
| MONDAY | Понедельник | 
| TUESDAY | Вторник | 
| WEDNESDAY | Среда | 
| THURSDAY | Четверг | 
| FRIDAY | Пятница | 
| SATURDAY | Суббота | 
| SUNDAY | Воскресенье | 
спецификация_предложения
Скидка может быть выражена в процентах или фиксированной суммой, вычитаемой из общей стоимости. Например: 1. Скидка 10% на итоговый счёт. 2. Скидка 15 долларов на заказ. Продавцы также могут предлагать индивидуальные скидки, например, «купи один — получи второй бесплатно», указав соответствующие поля. Обязательно.
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| discount_percent | число |  Взаимоисключающее с  | Процент от счета, на который предоставляется скидка. [0, 100] Для предложений со скидкой 1+1 или 50%, которые применяются ко всему обеду (например, 1+1 шведский стол, 1+1 на весь счет, 1+1 на комплексное меню), это значение можно установить равным 50. | 
| discount_value | объект (Money) |  Взаимоисключающее предложение с  | Фиксированная величина скидки. | 
| other_offer_detail_text | нить |  Взаимоисключающее с  | Текст в свободной форме с описанием скидки. Для специальных предложений «1+1» (например, напитки +1, основное блюдо +1, отдельные блюда +1) необходимо указать эти детали здесь. | 
расходы
| Имя поля | Тип | Требование | Описание | 
|---|---|---|---|
| amount | объект (Money) |  Взаимоисключающее с  | |
| amount_range | объект (MoneyRange) |  Взаимоисключающее с  | 
Загрузка ленты
 Фид предложений должен быть загружен на SFTP-сервер Generic Feed. Следуйте инструкциям в руководстве «Как использовать SFTP-сервер Generic Feed» и используйте name google.offer в файле дескриптора.
Частота загрузки
Как правило, Google ожидает одну загрузку фида в день. Частота может быть увеличена или уменьшена в зависимости от частоты обновления предложений с вашей стороны для обеспечения стабильно высокой точности. Проконсультируйтесь с вашим контактным лицом Google.
Данные появятся в Google через несколько часов.
Категоризация предложений
-  OFFER_CATEGORY_BASE_OFFER: Предложения, которые можно использовать отдельно, не объединяя с другими предложениями. Сюда входят:- Фиксированные скидки на весь счет (например, скидка 20%)
- Предложения по подписке (например, бесплатный десерт при подписке)
- Предложения по оплате в случаях, когда нет других базовых предложений для ресторана
 
-  Дополнительные предложения: предложения, для которых требуется базовое предложение. К ним относятся:-  OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER(например, дополнительная скидка 10% при использовании определенной кредитной карты)
-  OFFER_CATEGORY_ADD_ON_COUPON_OFFER(например, бесплатный напиток с определенным кодом купона)
-  OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER(например, дополнительная скидка 10% для подписчиков)
 
-  
Другие соображения:
-  Если у ресторана нет базового предложения, дополнительные предложения отображаться не будут. Если базового предложения нет, любое предложение по оплате, подписке или купону, которое можно использовать без добавления к другому предложению, должно быть помечено как OFFER_CATEGORY_BASE_OFFER.-  В зависимости от типа необходимо установить соответствующие данные для PaymentInstrument,SubscriptionилиCoupon.
-  Партнеры должны предоставить две копии каждого из этих предложений, чтобы охватить сценарии, в которых они действуют как базовые предложения, так и предложения-дополнения. Копию предложения-дополнения можно затем настроить для нескольких ресторанов, используя entity_idsилиadd_on_offer_applicable_to_all_entities.
 
-  В зависимости от типа необходимо установить соответствующие данные для 
-  Если в ресторане имеется несколько базовых предложений, которые можно суммировать, все базовые предложения следует пометить как OFFER_CATEGORY_BASE_OFFER, а базовые предложения, которые являются предложениями по оплате, подписке или купонам, следует отправлять дополнительно как соответствующий тип дополнительного предложения.
-  ValidityPeriodследует использовать для активации дополнительных предложений в качестве базовых предложений только в случае отсутствия активного базового предложения.
Примеры сценариев:
- Ресторан предлагает скидку 5% при оплате определенной кредитной картой и бесплатный напиток по определенному промокоду. -  Предложение о скидке 5% по кредитной карте должно быть отправлено в двух экземплярах, один с тегом OFFER_CATEGORY_BASE_OFFERи один с тегомOFFER_CATEGORY_ADD_ON_PAYMENT_OFFERс указанием данныхPaymentInstrument.
-  Предложение о бесплатном напитке с купоном следует отправлять как OFFER_CATEGORY_ADD_ON_COUPON_OFFERс указанием данныхCoupon.
 
-  Предложение о скидке 5% по кредитной карте должно быть отправлено в двух экземплярах, один с тегом 
- Ресторан предлагает скидку 10% при личном посещении и скидку 5% при оплате определенной кредитной картой, причем обе скидки можно комбинировать. -  Предложение со скидкой 10% при личном посещении должно быть помечено как OFFER_CATEGORY_BASE_OFFER.
-  Предложение о скидке 5% по кредитной карте должно иметь 2 копии, одна из которых должна быть помечена как OFFER_CATEGORY_BASE_OFFER, а другая — какOFFER_CATEGORY_ADD_ON_PAYMENT_OFFER.
 
-  Предложение со скидкой 10% при личном посещении должно быть помечено как 
- Ресторан предлагает скидку 10% только на обед по будням и скидку 5% в любое время при оплате определенной кредитной картой. -  Для предложения скидки 10% необходимо установить период действия ValidityPeriodтак, чтобы он действовал только в обеденное время в ресторане по будням.
-  Предложение о скидке 5% по кредитной карте должно быть отправлено в 2 экземплярах.-  Один экземпляр должен быть помечен тегом OFFER_CATEGORY_BASE_OFFERс указаниемPaymentInstrument.ValidityPeriodследует установить так, чтобы исключить обеденные часы по будням, когда действует скидка 10% на обед.
-  Один экземпляр должен быть помечен как OFFER_CATEGORY_ADD_ON_PAYMENT_OFFERс указанием данныхPaymentInstrument.
 
-  Один экземпляр должен быть помечен тегом 
-  Все остальные предложения по оплате для этого ресторана должны быть помечены как OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER.
 
-  Для предложения скидки 10% необходимо установить период действия 
Процесс разработки и запуска
На протяжении всей интеграции партнёрский портал будет предоставлять вам информацию и отзывы о вашей разработке. Процесс разработки будет проходить следующим образом:
- Интеграция будет сначала разработана в среде Sandbox. Вам следует использовать экспорт производственной среды (или даже непосредственно производственных данных) в среду Google Sandbox. Это гарантирует, что ваша разработка учитывает все пограничные случаи, а Google сможет оценить качество данных и более эффективно помогать вам на основе вашей модели данных.
- После того, как вы начнете регулярно и ежедневно загружать полный фид «Торговцы, Услуги и Сделки» в среду Google Sandbox, команда Google оценит ваши фиды. После одобрения команды Google вы сможете запустить свой код в эксплуатацию и начать отправлять данные в рабочую среду Google.
- После полного тестирования интеграции с продакшеном команда Google также проведёт тестирование. После завершения тестирования ваша интеграция будет запущена.
Мониторинг
Чтобы обеспечить пользователям комфортный опыт, Google будет проверять предлагаемые предложения на предмет их действительности, корректности и соответствия нашим критериям до и после запуска. Для этого Google будет использовать сочетание ручной и автоматизированной проверки. Результаты этих проверок будут доступны на панели инструментов предложений в Центре действий (только в рабочей версии). Результаты этого мониторинга могут быть использованы для влияния на рейтинг предложений.
 Убедитесь, что загрузка страницы со всеми предложениями занимает не более 5 секунд , в противном случае это будет считаться ошибкой и будет помечено как Bad link .
Автоматизированные проверки (сканеры)
Команда Google по качеству внедряет сканеры. Сканерами называют скрипты, которые автоматизируют веб-браузер для выполнения некоторых кликов и извлечения информации о предложениях исключительно для целей проверки качества .
Количество запросов
Например, если мы решили отправлять 5000 чеков в день, это означает, что 5000 раз в день ( равномерно распределенных в течение дня, то есть примерно один раз каждые 17 секунд ) наш сканер выполнит все следующие действия, которые выполнил бы обычный пользователь:
- Откройте поиск Google и нажмите на партнерскую ссылку.
- Ознакомьтесь с информацией о предложении.
- Если предложение требует бронирования, оно будет передано в процесс бронирования для подтверждения доступности предложения в указанное время (бронирование не будет выполнено).
Обнаружение веб-скрейперов
Чтобы избежать блокировки веб-скрейпера (что может привести к выводу о недоступности предложений), убедитесь, что ваша система разрешает нашему веб-скрейперу постоянно запрашивать информацию на вашей странице. Чтобы идентифицировать наш веб-скрейпер:
-  User-Agent веб-скрапера будет содержать строку « Google-Offers »:- Пример: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, как Gecko; Google-Offers ) Chrome/104.0.5112.101 Safari/537.36
 
-  Вы также можете проверить, исходят ли вызовы от Google, используя обратный DNS, как рекомендовано в разделе «Проверка робота Googlebot и других поисковых роботов Google» . В нашем конкретном случае обратное разрешение DNS происходит по следующему шаблону: google-proxy-***-***-***-***.google.com.
Техническое поведение
Кэширование
Для снижения нагрузки на сайт-партнёр наши роботы, как правило, настроены на обработку всех стандартных HTTP-заголовков кэширования, присутствующих в ответе. Это означает, что для правильно настроенных сайтов мы избегаем повторной загрузки редко изменяющегося контента (например, библиотек JavaScript). Подробнее о реализации кэширования см. в этой документации по HTTP-кэшированию .