프로모션을 통해 판매자와 Google은 고객이 다음 액션을 취하도록 유도할 수 있습니다. 할인된 가격으로 음식 주문 서비스를 이용해 보세요. Google 지원 주문 엔드 투 엔드 작업을 프로모션 관리와 통합 있습니다.
다음과 같은 유형의 할인이 지원됩니다.
- Google 스폰서 프로모션 코드: 자동으로 생성되는 프로모션 코드입니다. 사전 입력되어 있거나 사용자가 입력한 값입니다.
- 서드 파티 스폰서 프로모션 코드: 사용자가 입력하는 프로모션 코드입니다. 피드할 수 있습니다.
- 서드 파티 후원 자동 할인: 음식에 적용되는 할인입니다. 프로모션 코드 없이 자동으로 적용됩니다.
할인 유형과 관계없이 Google에서 음식에 대해 결제 호출을 보냅니다. 주문 처리를 사용하여 할인을 확인하고 적용합니다.
음식 주문 서비스 개발자는 몇 가지 사항을 변경해야 합니다. 유효한 프로모션 코드에 대한 할인을 계산하거나 잘못된 프로모션 코드 관련 오류, 프로모션 코드 사용 관리 환급을 위한 회계 데이터를 추적할 수 있습니다.
프로모션 처리 방법
프로모션을 지원하는 처리를 구현하려면 다음 단계를 따르세요.
- 프로모션 통합 설정 (건너뛰기 단계를 따르세요.
- 프로모션으로 결제를 구현합니다.
- 프로모션으로 주문 제출을 구현합니다.
프로모션 통합 설정
이 섹션에서는 Google 스폰서 프로모션 코드 프로모션 코드만 지원하려는 경우 또는 직접 설정을 지정한 다음 건너뛸 수 있으며, 이 섹션을 참조하세요.
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
이 (가) 잘못되었습니다. 예를 들어 만료되었거나 유효하지 않습니다.
인식되지 않음) foodOrderError
와 함께 CheckoutResponseMessage
를 전송합니다.
오류 코드, 이유 텍스트, 오류 메시지,
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 }
다음은 fulfillment의 해당 제출 주문 응답의 예입니다. 프로모션 코드가 유효한 경우
{ "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." } ] } }