קידומי מכירות

מבצעים מאפשרים לכם ול-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 ...}

הנחות ב-Compute

אם קוד השובר תקף, במילוי הבקשה צריך לחשב את ערך ההנחה ולשלוח בחזרה 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."
      }
    ]
  }
}