Акции

Промоакции дают вам и Google возможность стимулировать клиентов попробовать вашу службу заказа еды со скидкой. Google поддерживает интеграцию ваших комплексных действий по оформлению заказов с вашей системой управления рекламными акциями.

Поддерживаются следующие виды скидок:

  • Промокоды, спонсируемые Google: Промокоды, которые автоматически заполняются Google или вводятся пользователями.
  • Промокоды, спонсируемые сторонними организациями: Промокоды, которые могут ввести пользователи, предоставляемые вашей службой заказа еды.
  • Автоматические скидки, спонсируемые сторонними организациями: скидки, которые ваша служба заказа еды автоматически применяет без промокода.

Независимо от типа скидки, Google вызывает кассу при выполнении вашего заказа на еду, чтобы проверить и применить скидку.

Как разработчик службы заказа еды, вам необходимо внести некоторые изменения в свою реализацию, чтобы вычислять скидки для действительных промокодов или отправлять ошибки для недействительных промокодов, управлять ограничениями на использование промокодов и отслеживать учетные данные для возмещения.

Как обрабатывать рекламные акции

Чтобы реализовать выполнение, поддерживающее рекламные акции, выполните следующие действия:

  1. Настройте интеграцию промоакций . (Пропустите этот шаг, если вы не используете промокоды, спонсируемые Google.)
  2. Реализуйте оформление заказа с помощью промоакций .
  3. Осуществить отправку заказа с рекламными акциями .

Настроить интеграцию промоакций

В этом разделе описывается, как настроить интеграцию рекламных акций, если вы планируете использовать промокоды, спонсируемые Google. Если вы хотите поддерживать только промокоды или скидки, спонсируемые третьей стороной, вы можете указать свои собственные настройки и пропустить этот раздел.

Google указывает тип рекламной акции, которую следует спонсировать, и связывается с вами для настройки интеграции. Мы предоставляем следующие детали:

  • Сумма скидки.
  • Минимальная стоимость корзины.
  • Дата начала и окончания использования промокодов.
  • Максимальная сумма в долларах, заложенная в бюджет рекламной кампании.
  • Сколько раз можно использовать промокоды.

Примеры промокодов:

  • FopaNewUser : 10% (фиксированный процент) со скидкой максимум 50 долларов.
  • FopaMoreThan50 : 10 долларов США (скидка фиксированной суммы).

Если Google решит прекратить применение кода, с вами свяжутся.

Настройка выплат

Обратитесь к своему консультанту Google EAP, чтобы настроить процесс выплаты. Google возмещает транзакции, связанные с промокодами, спонсируемыми Google, только в том случае, если окончательный статус заказа является одним из следующих:

  • CONFIRMED
  • IN_TRANSIT
  • READY_FOR_PICKUP
  • IN_PREPARATION
  • FULFILLED

Внедрить оформление заказа с помощью промоакций

В этом разделе описывается реализация обработки оформления заказа при поддержке промокодов (спонсируемых Google или сторонних производителей). Для автоматических скидок, спонсируемых сторонними организациями, вам нужно только вернуть строку скидки в сообщении CheckoutResponseMessage (проверка промокода не требуется).

Во время выполнения заказа на еду Google отправляет вам один промокод в сообщении CheckoutRequestMessage . Пользователи могут изменить свою корзину или промо-код при повторных запросах на оформление заказа.

Чтобы проверить, впервые ли пользователь применил промокод, выполните следующие действия:

  • Промокоды, спонсируемые Google . Google проверяет, пытается ли вернувшийся пользователь снова использовать тот же промокод; вам не нужно ничего делать.
  • Промокоды или автоматические скидки, спонсируемые сторонними организациями . Если вы не реализовали привязку учетных записей и согласие пользователя, вы не сможете проверить данные пользователя во время обработки запроса на оформление заказа. Вместо этого проверьте это во время обработки SubmitOrderRequestMessage , используя Contact данные (например, адрес электронной почты пользователя) из объекта FoodCartExtension .

Выявляйте ошибки или рассчитайте скидки при выполнении заказов на основе последнего запроса на оформление заказа. При этом убедитесь, что ваша система не хранит устаревшую информацию о состоянии.

Проверьте действительность промокода

При выполнении необходимо проверить действительность или соответствие данного промокода оговоренным условиям, таким как срок действия, максимальное использование и максимальная скидка. Затем ответьте соответствующим образом в сообщении CheckoutResponseMessage , указав вычисленную скидку или указав foodOrderErrors если промокод невозможно применить. Если вы обнаружите ошибки с промо-кодом, выполните процедуру, описанную в разделе «Обработка ошибок с промо-кодом» .

В следующем фрагменте кода показан пример foodOrderErrors для промо-кода. Убедитесь, что correctedProposedOrder не включает узел рекламных акций.

"foodOrderErrors": [
  {
    "error": "PROMO_NOT_APPLICABLE",
    // Copy promotions.coupon string from CheckoutRequest as the ID
    "id": "GoogleNewUser",
    "description": "Promotion could not be applied"
  }
],
"correctedProposedOrder": {// required ...},
"paymentOptions": {// required ...}

Рассчитать скидки

Если промо-код действителен, ваше выполнение должно вычислить сумму скидки в долларах и отправить обратно сообщение CheckoutResponseMessage с вычисленным значением скидки в otherItems . Общая стоимость заказа не должна быть отрицательной. Если сумма скидки превышает сумму корзины, отправьте обратно максимальную сумму в долларах, чтобы общая стоимость заказа стала равной 0 долларам США.

В следующем фрагменте показан пример раздела CheckoutResponseMessage для рекламной скидки:

"proposedOrder": {
   "otherItems": [
      . . .
      {
        "name": "Discount",
        // copy promotions.coupon field from CheckoutRequest as the id
        "id": "GoogleNewUser",
        "price": {
          "type": "ESTIMATE",
          "amount": {
          "currencyCode": "USD",
          "units": "-3",
          "nanos": -500000000
        }
      },
      "type": "DISCOUNT",
    }
  ]
}

Отпустить неиспользуемые промоакции

Не каждый запрос на оформление заказа приводит к запросу на отправку заказа. Если ваше выполнение приостанавливает продвижение по акции во время звонка по оформлению заказа, убедитесь, что у вас есть механизм, позволяющий отменить удержание, если акция не будет запрошена через отправку заказа по истечении определенного периода времени. Это гарантирует, что ваша служба заказа еды будет поддерживать правильную квоту кампании.

Обработка ошибок при использовании промоакций

Если при выполнении выяснится, что промокод из CheckoutRequestMessage недействителен (например, срок его действия истек, он недействителен или не распознан), отправьте сообщение CheckoutResponseMessage с foodOrderError , которое содержит применимый код ошибки и текст причины, а также correctedProposedOrder и paymentOptions . объекты.

Если при выполнении вы обнаружите несколько ошибок промокода в одном и том же запросе, отправьте обратно неисправимые ошибки, прежде чем отправлять обратно исправимые ошибки. Расставьте приоритеты своих проверок следующим образом (от высокого к низкому):

  • PROMO_NOT_RECOGNIZED
  • PROMO_EXPIRED
  • PROMO_USER_INELIGIBLE
  • PROMO_ORDER_INELIGIBLE
  • PROMO_NOT_APPLICABLE

Примеры

Вот пример запроса на оформление заказа с промокодом:

{
    "accessToken": "test_access_token",
    "lastSeen": "2018-06-22T19:25:39Z"
  },
  "conversation": {
    "conversationId": "XYZ"
  },
  "inputs": [
    {
      "intent": "actions.foodordering.intent.CHECKOUT",
      "arguments": [
        {
          "extension": {
            "@type": "type.googleapis.com/google.actions.v2.orders.Cart",
            "merchant": {
              "id": "https://www.exampleprovider.com/merchant/id1",
              "name": "Falafel Bite"
            },
            "lineItems": [
              {
                "name": "Falafel Tray",
                "type": "REGULAR",
                "id": "sample_item_offer_id_1",
                "quantity": 1,
                "price": {
                  "type": "ESTIMATE",
                  "amount": {
                    "currencyCode": "USD",
                    "units": "9",
                    "nanos": 950000000
                  }
                },
                "offerId": "https://www.exampleprovider.com/menu/item/offer/id1",
                "extension": {
                  "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                }
              }
            ],
            "promotions": [
              {
                "coupon": "FOPAACTIVECODE"
              }
            ],
            "extension": {
              "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
              "fulfillmentPreference": {
                "fulfillmentInfo": {
                  "pickup": {
                    "pickupTimeIso8601": "P0M"
                  }
                }
              }
            }
          }
        }
      ]
    }
  ],
  "directActionOnly": true,
  "isInSandbox": true
}

Вот соответствующий ответ при оформлении заказа, если промокод действителен:

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "checkoutResponse": {
              "proposedOrder": {
                "otherItems": [
                  {
                    "name": "Delivery Fees",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "3",
                        "nanos": 500000000
                      }
                    },
                    "type": "DELIVERY"
                  },
                  {
                    "name": "Tax",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "1",
                        "nanos": 370000000
                      }
                    },
                    "type": "TAX"
                  },
                  {
                    "name": "Promotion",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "-5",
                        "nanos": 0
                      }
                    },
                    "id": "FOPAACTIVECODE",
                    "type": "DISCOUNT"
                  }
                ],
                "cart": {
                  "merchant": {
                    "id": "https://www.exampleprovider.com/merchant/id1",
                    "name": "Falafel Bite"
                  },
                  "lineItems": [
                    {
                      "name": "Falafel Tray",
                      "type": "REGULAR",
                      "id": "2529103",
                      "quantity": 1,
                      "price": {
                        "type": "ESTIMATE",
                        "amount": {
                          "currencyCode": "USD",
                          "units": "9",
                          "nanos": 950000000
                        }
                      },
                      "offerId": "https://www.exampleprovider.com/menu/item/offer/id1",
                      "extension": {
                        "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                      }
                    }
                  ],
                  "promotions": [
                    {
                      "coupon": "FOPAACTIVECODE"
                    }
                  ],
                  "extension": {
                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
                    "fulfillmentPreference": {
                      "fulfillmentInfo": {
                        "pickup": {
                          "pickupTimeIso8601": "P0M"
                        }
                      }
                    }
                  }
                },
                "totalPrice": {
                  "type": "ESTIMATE",
                  "amount": {
                    "currencyCode": "USD",
                    "units": "9",
                    "nanos": 820000000
                  }
                },
                "extension": {
                  "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
                  "availableFulfillmentOptions": [
                    {
                      "fulfillmentInfo": {
                        "pickup": {
                          "pickupTimeIso8601": "P0M"
                        }
                      },
                      "expiresAt": "2018-06-22T19:30:52.596Z"
                    }
                  ]
                }
              },
              "orderOptions": {},
              "paymentOptions": {
                "googleProvidedOptions": {
                  "tokenizationParameters": {
                    "tokenizationType": "PAYMENT_GATEWAY",
                    "parameters": {
                      "gateway": "stripe",
                      "stripe:publishableKey": "example_stripe_client_key",
                      "stripe:version": "2017-04-06"
                    }
                  },
                  "supportedCardNetworks": [
                    "AMEX",
                    "DISCOVER",
                    "MASTERCARD",
                    "VISA",
                    "JCB"
                  ],
                  "prepaidCardDisallowed": true
                }
              }
            }
          }
        }
      ],
      "suggestions": []
    }
  }
}

Вот пример ответа при оформлении заказа, если промокод недействителен:

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "error": {
              "foodOrderErrors": [
                {
                  "error": "PROMO_NOT_RECOGNIZED",
                  "id": "SOMEPROMO",
                  "description": "Coupon not found"
                }
              ],
              "correctedProposedOrder": {
                "cart": {
                  "merchant": {
                    "id": "https://www.exampleprovider.com/merchant/id1",
                    "name": "Falafel Bite"
                  },
                  "lineItems": [
                    {
                      "id": "sample_item_offer_id_4",
                      "name": "Prawns Biryani",
                      "type": "REGULAR",
                      "quantity": 1,
                      "price": {
                        "type": "ESTIMATE",
                        "amount": {
                          "currencyCode": "USD",
                          "units": "18",
                          "nanos": 750000000
                        }
                      },
                      "offerId": "https://www.exampleprovider.com/menu/item/offer/id4",
                      "extension": {
                        "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                      }
                    }
                  ],
                  "extension": {
                    "fulfillmentPreference": {
                      "fulfillmentInfo": {
                        "pickup": {
                          "pickupTimeIso8601": "P0M"
                        }
                      }
                    },
                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension"
                  },
                  "promotions": []
                },
                "otherItems": [
                  {
                    "name": "Tax",
                    "type": "TAX",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "1",
                        "nanos": 650000000
                      }
                    }
                  }
                ],
                "termsOfServiceUrl": "https://exampleprovider.com/terms",
                "totalPrice": {
                  "type": "ESTIMATE",
                  "amount": {
                    "currencyCode": "USD",
                    "units": "20",
                    "nanos": 400000000
                  }
                },
                "extension": {
                  "availableFulfillmentOptions": [
                    {
                      "fulfillmentInfo": {
                        "pickup": {
                          "pickupTimeIso8601": "PT0M"
                        }
                      }
                    }
                  ],
                  "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension"
                }
              },
              "paymentOptions": {
                "googleProvidedOptions": {
                  "prepaidCardDisallowed": false,
                  "billingAddressRequired": true,
                  "tokenizationParameters": {
                    "tokenizationType": "PAYMENT_GATEWAY",
                    "parameters": {
                      "gateway": "braintree",
                      "braintree:apiVersion": "v1",
                      "braintree:sdkVersion": "1.4.0",
                      "braintree:merchantId": "example_braintree_merchant_ID",
                      "braintree:clientKey": "example_braintree_client_key",
                      "braintree:authorizationFingerprint": "example_braintree_fingerprint"
                    }
                  }
                }
              },
              "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension"
            }
          }
        }
      ]
    }
  }
}

Осуществить отправку заказа с рекламными акциями

При выполнении заказа на отправку проверьте, впервые ли пользователь применяет промокод. Во время обработки SubmitOrderRequestMessage вы можете проверить это, используя Contact данные (например, адрес электронной почты пользователя) из объекта FoodCartExtension .

Также следует еще раз проверить применимость промокода:

  • Если код применим: подтвердите заказ и отметьте купон как погашенный.
  • Если код больше не применим: Отклоните заказ с ошибкой PROMO_NOT_APPLICABLE . Вы можете указать конкретную причину отклонения, используя тот же механизм, что и для FoodOrderUpdateExtension .

Примеры

Вот пример запроса на отправку заказа с рекламными акциями:

{
  "conversation": {
    "conversationId": "example_conversation_ID"
  },
  "inputs": [
    {
      "intent": "actions.intent.TRANSACTION_DECISION",
      "arguments": [
        {
          "transactionDecisionValue": {
            "order": {
              "finalOrder": {
                "cart": {
                  "merchant": {
                    "id": "https://www.exampleprovider.com/merchant/id1",
                    "name": "Falafel Bite"
                  },
                  "lineItems": [
                    {
                      "name": "Falafel Tray",
                      "type": "REGULAR",
                      "id": "sample_item_offer_id_1",
                      "quantity": 1,
                      "price": {
                        "type": "ESTIMATE",
                        "amount": {
                          "currencyCode": "USD",
                          "units": "9",
                          "nanos": 950000000
                        }
                      },
                      "offerId": "https://www.exampleprovider.com/menu/item/addon/offer/id1",
                      "extension": {
                        "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                      }
                    }
                  ],
                  "promotions": [
                    {
                      "coupon": "FOPAACTIVECODE"
                    }
                  ],
                  "extension": {
                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
                    "fulfillmentPreference": {
                      "fulfillmentInfo": {
                        "pickup": {
                          "pickupTimeIso8601": "P0M"
                        }
                      }
                    },
                    "contact": {
                      "displayName": "Food Ordering",
                      "email": "example.provider@gmail.com",
                      "phoneNumber": "+19993334444",
                      "firstName": "Food",
                      "lastName": "Ordering"
                    }
                  }
                },
                "otherItems": [
                  {
                    "name": "Delivery Fees",
                    "type": "DELIVERY",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "3",
                        "nanos": 500000000
                      }
                    }
                  },
                  {
                    "name": "Tax",
                    "type": "TAX",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "1",
                        "nanos": 370000000
                      }
                    }
                  },
                  {
                    "name": "Promotion",
                    "type": "DISCOUNT",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "-5"
                      }
                    },
                    "id": "FOPAACTIVECODE"
                  },
                  {
                    "name": "Subtotal",
                    "type": "SUBTOTAL",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "9",
                        "nanos": 950000000
                      }
                    }
                  },
                  {
                    "name": "Tip",
                    "type": "GRATUITY",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD"
                      }
                    }
                  }
                ],
                "totalPrice": {
                  "type": "ESTIMATE",
                  "amount": {
                    "currencyCode": "USD",
                    "units": "9",
                    "nanos": 820000000
                  }
                },
                "extension": {
                  "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension"
                }
              },
              "googleOrderId": "example_google_order_ID",
              "orderDate": "2018-06-22T19:30:59.502Z",
              "paymentInfo": {
                "displayName": "example_display_name",
                "googleProvidedPaymentInstrument": {
                  "instrumentToken": "example_instrument_token"
                },
                "paymentType": "PAYMENT_CARD"
              },
              "locale": "en"
            }
          }
        }
      ]
    }
  ],
  "directActionOnly": true,
  "isInSandbox": true
}

Вот пример соответствующего ответа на заказ при выполнении, если промокод действителен:

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "example_action_order_ID",
              "orderState": {
                "state": "CREATED",
                "label": "Order is created with partner."
              },
              "updateTime": "2018-06-22T19:31:01.556Z",
              "orderManagementActions": [
                {
                  "type": "CALL_RESTAURANT",
                  "button": {
                    "title": "Call Us",
                    "openUrlAction": {
                      "url": "tel:+1-111-111-1111"
                    }
                  }
                },
                {
                  "type": "EMAIL",
                  "button": {
                    "title": "Email Us",
                    "openUrlAction": {
                      "url": "mailto:example.provider@gmail.com"
                    }
                  }
                },
                {
                  "type": "CUSTOMER_SERVICE",
                  "button": {
                    "title": "Customer Service",
                    "openUrlAction": {
                      "url": "http://www.google.com"
                    }
                  }
                }
              ]
            }
          }
        }
      ],
      "suggestions": []
    }
  }
}

Вот пример ответа на отправку заказа, если промокод недействителен:

"orderUpdate": {
  "actionOrderId": "sample_action_order_id",
  "orderState": {
    "state": "REJECTED",
    "label": "Order rejected."
  },
  "updateTime": "2017-05-10T02:30:00.000Z",
  "rejectionInfo": {
    "type": "PROMO_NOT_APPLICABLE",
    "reason": "Sorry, there's something wrong. Try another code?"
  },
  "orderManagementActions": [
    {
      "type": "CUSTOMER_SERVICE",
      "button": {
        "title": "Contact customer service",
        "openUrlAction": {
          "url": "mailto:support@example.com"
        }
      }
    },
    {
      "type": "EMAIL",
      "button": {
        "title": "Email restaurant",
        "openUrlAction": {
          "url": "mailto:example.provider@example.com"
        }
      }
    },
    {
      "type": "CALL_RESTAURANT",
      "button": {
        "title": "Call restaurant",
        "openUrlAction": {
          "url": "tel:+19993334444"
        }
      }
    }
  ],
  "infoExtension": {
    "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension",
    "foodOrderErrors": [
      {
        "error": "PROMO_USER_INELIGIBLE",
        "description": "Sorry, you can only use this promotion once."
      }
    ]
  }
}