Promoções

As promoções são uma forma de você e o Google incentivarem os clientes a experimente seu serviço de pedido de comida com preços com desconto. Compatíveis com o Google Integrar suas ações de pedidos de ponta a ponta ao gerenciamento de promoções sistema.

Os seguintes tipos de descontos são aceitos:

  • Códigos promocionais patrocinados pelo Google:códigos promocionais que são enviados automaticamente pré-preenchidos pelo Google ou inseridos pelos usuários.
  • Códigos promocionais patrocinados por terceiros:são códigos promocionais que os usuários podem inserir. fornecido pelo seu serviço de pedidos de comida.
  • Descontos automáticos patrocinados por terceiros:descontos dos seus alimentos serviço de pedidos é aplicado automaticamente sem um código promocional.

Seja qual for o tipo de desconto, o Google faz uma chamada para finalizar a compra da sua comida o atendimento do pedido para verificar e aplicar o desconto.

Como desenvolvedor de um serviço de pedidos de comida, você precisa fazer algumas alterações à sua implementação para calcular descontos para códigos promocionais válidos ou enviar erros de códigos promocionais inválidos, gerenciar o resgate de códigos promocionais limitações e acompanhar dados contábeis para reembolso.

Como processar promoções

Para implementar um fulfillment compatível com promoções, faça o seguinte:

  1. Configurar a integração de promoções. (Ignorar esta etapa se você não estiver usando códigos promocionais patrocinados pelo Google.)
  2. Implementar a finalização da compra com promoções.
  3. Implementar o envio de pedido com promoções.

Configurar a integração de promoções

Nesta seção, descrevemos como configurar a integração de promoções se você planeja usar Códigos promocionais patrocinados pelo Google. Se você quiser oferecer suporte apenas a códigos promocionais ou que um terceiro patrocina, é possível especificar sua própria configuração e pular nesta seção.

O Google especifica o tipo de promoção a ser patrocinada e entra em contato com você a integração. Fornecemos os seguintes detalhes:

  • O valor do desconto.
  • O valor mínimo do carrinho.
  • As datas de início e término da utilização dos códigos promocionais.
  • O valor máximo em reais orçado para a campanha de promoção.
  • É o número de vezes que os códigos promocionais podem ser usados.

Exemplos de códigos promocionais:

  • FopaNewUser: 10% (porcentagem fixa) com valor máximo de US $50 de desconto.
  • FopaMoreThan50: US$ 10 (valor fixo de desconto).

Caso o Google decida interromper a aplicação do código, você será contatado.

Configurar pagamentos

Entre em contato com seu consultor do EAP do Google para configurar o processo de pagamento. O Google reembolsa apenas transações que envolvem promoção patrocinada pelo Google. códigos se o status do pedido final for um dos seguintes:

  • CONFIRMED
  • IN_TRANSIT
  • READY_FOR_PICKUP
  • IN_PREPARATION
  • FULFILLED

Implementar a finalização da compra com promoções

Esta seção descreve a implementação do processamento de finalização de compra ao oferecer suporte códigos promocionais (patrocinados pelo Google ou por terceiros). Para os descontos automáticos patrocinados por terceiros, basta retornar o desconto no item de linha CheckoutResponseMessage (nenhuma verificação de código promocional está necessário).

Durante o atendimento do pedido de comida, o Google envia um único código promocional no campo CheckoutRequestMessage até o fulfillment. Os usuários podem alterar o carrinho ou o código promocional para solicitações repetidas de finalização de compra.

Para verificar se essa é a primeira vez que o usuário aplica um código promocional, faça o seguinte:

  • Códigos promocionais patrocinados pelo Google: o Google verifica se um usuário recorrente está tentando usar o mesmo código promocional novamente. não precisa fazer nada.
  • Códigos promocionais patrocinados por terceiros ou descontos automáticos: se você tem não tiver implementado a vinculação de conta e a ativação do usuário, não será possível verificar os detalhes do usuário durante o processamento da solicitação de finalização da compra. Em vez disso, verifique durante o processamento de SubmitOrderRequestMessage, usando a Contact detalhes (como o endereço de e-mail do usuário) do FoodCartExtension objeto.

Identifique erros ou calcule descontos com seu fulfillment com base nos a solicitação de finalização da compra. Ao fazer isso, certifique-se de que seu sistema não fique desatualizado informações de estado.

Verificar a validade do código promocional

O atendimento do pedido precisa verificar a validade ou a qualificação de uma promoção de acordo com os termos estipulados, como a data de validade, o uso máximo e desconto máximo. Em seguida, responda de forma adequada no CheckoutResponseMessage com o desconto calculado ou com foodOrderErrors se o código promocional não podem ser aplicadas. Se você detectar erros no código promocional, siga as o processo descrito em Solucionar erros com promoções.

O snippet a seguir mostra um exemplo de foodOrderErrors para um código promocional. Verifique se correctedProposedOrder não inclui as promoções. nó.

"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 ...}

Descontos do Compute

Se o código promocional for válido, o processamento do pedido precisa calcular o desconto valor em dólar e devolver um CheckoutResponseMessage com o valor o valor de desconto na matriz otherItems. O preço total do pedido não pode ser negativa. Se o valor do desconto exceder o valor do carrinho, envie de volta o valor máximo em dólares para renderizar o preço total do pedido como US $0.

O snippet a seguir mostra um exemplo de seção CheckoutResponseMessage para o desconto promocional:

"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",
    }
  ]
}

Publicar promoções não usadas

Nem toda solicitação de finalização de compra leva a uma solicitação de envio de pedido. Se o atendimento do pedido colocar a promoção em espera no momento da chamada de finalização da compra, verifique se você tem para liberar a retenção caso a promoção não seja reivindicada por meio de enviar o pedido após um determinado período. Isso garante que seus alimentos serviço de pedidos mantém a cota de campanha correta.

Solucionar erros com promoções

Se o processamento do pedido determinar que o código promocional de um CheckoutRequestMessage não é válido (por exemplo, expirou, é inválido, ou não reconhecido), envie um CheckoutResponseMessage com um foodOrderError. que contenha o código do erro aplicável e o texto do motivo, além de Objetos correctedProposedOrder e paymentOptions.

Caso o fulfillment encontre vários erros de código promocional na mesma solicitação, enviar de volta os erros irrecuperáveis antes de devolver os erros recuperáveis. Priorize suas verificações da seguinte maneira (da prioridade mais alta para a mais baixa):

  • PROMO_NOT_RECOGNIZED
  • PROMO_EXPIRED
  • PROMO_USER_INELIGIBLE
  • PROMO_ORDER_INELIGIBLE
  • PROMO_NOT_APPLICABLE

Exemplos

Veja um exemplo de solicitação de finalização de compra com um código promocional:

{
    "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
}

Esta é a resposta de finalização da compra correspondente do fulfillment se a promoção é válido:

{
  "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": []
    }
  }
}

Veja um exemplo de resposta de finalização de compra se o código promocional for inválido:

{
  "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"
            }
          }
        }
      ]
    }
  }
}

Implementar o envio de pedido com promoções

Ao realizar o pedido de envio, verifique se essa é a primeira vez que o o usuário está aplicando um código promocional. Durante SubmitOrderRequestMessage processamento, verifique isso usando os detalhes da Contact (como o endereço de e-mail do usuário) do objeto FoodCartExtension.

Verifique também novamente a aplicabilidade do código promocional:

  • Se o código for aplicável:confirme o pedido e marque o cupom resgatado.
  • Se o código não for mais aplicável:recuse o pedido com o Erro PROMO_NOT_APPLICABLE. Você pode informar um motivo específico para a rejeição usando o mesmo mecanismo de FoodOrderUpdateExtension.

Exemplos

Confira um exemplo de solicitação de envio de pedido com promoções:

{
  "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
}

Veja um exemplo da resposta de envio de pedido correspondente de um atendimento de pedidos se o código promocional for válido:

{
  "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": []
    }
  }
}

Veja um exemplo de resposta do pedido de envio se o código promocional for inválido:

"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."
      }
    ]
  }
}