Olo
Oloは、あらゆるタッチポイントでのホスピタリティを実現するレストラン向けの大手オープンSaaSプラットフォームです。
OloとBrazeを統合することで、以下のことが可能になります。
- BrazeのユーザープロファイルをOloのユーザープロファイルと一致するように更新する
- Oloのイベントに基づいて、Brazeから最適な次のメッセージを送信する
前提条件
| 要件 | 説明 |
|---|---|
| Oloアカウント | このパートナーシップを利用するには、webhookにアクセスできるOloアカウントが必要です。Oloダッシュボード内のセルフサービスwebhookツールを使用してwebhook購読を設定してください。 |
| Brazeデータ変換 | Oloからデータを受信するには、データ変換URLが必要です。 |
webhookは、Oloがユーザーとそのアクションに関するイベント駆動型の情報をBrazeに送信する方法です。送信されるイベントには、注文完了、ゲストのオプトイン、注文のピックアップなどが含まれます。Olo webhookは、アクションが実行されてから通常数秒以内にイベントをBrazeに配信します。
免責事項
Oloでは、承認された各ブランドの環境ごとにWebhookは1つに制限されており、すべて同じDestination URLに送信されます。異なるブランドには異なるURLを設定できますが、同じブランドのイベントは1つのURLを共有する必要があります。Brazeでは、これはOloとの連携に使用できるトランスフォーメーションが1つだけであることを意味します。
この単一のトランスフォーメーション内で複数のOloイベントを処理するには、各webhookの X-Olo-Event-Type ヘッダーを確認してください。このヘッダーにより、異なるOloイベントを条件付きで処理できます。
連携
ステップ1: Oloのテストイベントを受け入れるためのBrazeデータ変換を設定する
Brazeダッシュボードで、データ設定 > データ変換に移動します。
変換を作成を選択して変換に名前を付け、編集エクスペリエンスを選択します。

テンプレートを使用を選択すると、データ変換のユースケースを含むテンプレートライブラリーを参照できます。または、ゼロから作成を選択してデフォルトのコードテンプレートを読み込みます。
ゼロから作成する場合は、変換の送信先を選択します。テンプレートライブラリーからコードテンプレートを挿入することもできます。
送信先の詳細
- POST: Track users: ソースプラットフォームからのWebhookを、属性、イベント、購入などのユーザープロファイル更新に変換します。
- PUT: Update multiple catalog items: ソースプラットフォームからのWebhookをカタログアイテムの更新に変換します。
- DELETE: Delete multiple catalog items: ソースプラットフォームからのWebhookをカタログアイテムの削除に変換します。
- PATCH: Edit multiple catalog items: ソースプラットフォームからのWebhookをカタログアイテムの編集に変換します。
- POST: Send messages immediately via API Only: ソースプラットフォームからのWebhookを変換し、指定したユーザーに即座にメッセージを送信します。

変換を作成すると、変換の詳細ビューが表示されます。ここでは、Webhookの詳細の下にこの変換に対して受信した最新のWebhookが表示され、変換コードの下に変換コードを記述するスペースが表示されます。
次のステップで使用するWebhook URLをコピーします。
ステップ2: Olo webhookを設定する
Oloダッシュボード内のセルフサービスWebhookツールを使用して、データ変換に送信するwebhookを設定します。
- Brazeに送信するイベントを選択します
- 送信先URLを設定します。これはステップ1で作成したデータ変換URLです。

OAuthおよびX-Olo-Signatureヘッダーの共有シークレットは、変換には必要ありません。
Oloでは、Olo webhookの設定プロセスを完了する前に、テストイベントwebhookからの成功レスポンスが必要です。
ステップ3: 選択したOloイベントを受け入れるための変換コードを記述する
このステップでは、ソースプラットフォームから送信されるwebhookペイロードをJavaScriptオブジェクトの戻り値に変換します。
- サポートするOloイベントのサンプルイベントペイロードを使用して、データ変換URLにリクエストを送信します。リクエストのフォーマットについては、リクエストボディのフォーマットを参照してください。
- データ変換を更新し、Webhookの詳細でサンプルイベントペイロードが表示されることを確認します。
- 選択したOloイベントをサポートするようにデータ変換コードを更新します。
- 検証をクリックして、コード出力のプレビューを返し、それが受け入れ可能な
/users/trackリクエストであるかどうかを確認します。 - データ変換を保存して有効化します。
リクエストボディのフォーマット
この戻り値は、Brazeの/users/trackリクエストボディのフォーマットに準拠している必要があります。
- 変換コードはJavaScriptプログラミング言語で記述します。if/elseロジックなど、標準的なJavaScriptの制御フローがサポートされています。
- 変換コードは
payload変数を介してWebhookリクエストボディにアクセスします。この変数は、リクエストボディのJSONを解析して生成されるオブジェクトです。 /users/trackエンドポイントでサポートされている機能はすべてサポートされています。以下が含まれます:- ユーザー属性オブジェクト、イベントオブジェクト、購入オブジェクト
- ネストされた属性およびネストされたカスタムイベントプロパティ
- 購読グループの更新
- 識別子としてのメールアドレス
Olo webhookのデータ変換テンプレートの例
このセクションでは、出発点として使用できるテンプレートの例を紹介します。ゼロから作成することも、必要に応じて特定のコンポーネントを削除することもできます。
各テンプレートでは、/users/trackリクエストを構築するための変数brazecallをコードで定義しています。
/users/trackリクエストをbrazecallに割り当てた後、明示的にbrazecallを返してアウトプットを作成します。
単一イベントの変換
単一のOloイベントのみをサポートする場合、X-Olo-Event-Typeヘッダーを使用して/users/trackリクエストペイロードを条件付きで作成する必要はありません。たとえば、Olo Order Placed webhookがBrazeに送信されたときに、購入イベントまたはカスタムイベントをユーザープロファイルに記録する場合です。
各製品を購入として記録する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// iterate through the items included within the order
const purchases = payload.items.map((item) => {
return {
external_id: payload.customer.customerId.toString(),
product_id: item.productId.toString(),
currency: 'USD',
price: item.sellingPrice,
time: new Date().toISOString(),
quantity: item.quantity,
properties: {
customValues: item.customValues
}
};
});
// log a purchase per item in the order
let brazecall = {
"purchases": purchases
};
return brazecall;
カスタムイベントを記録する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// log an event “Order Placed” to the profile that includes all items in the order as event properties.
let brazecall = {
"events": [
{
"external_id": payload.customer.customerId.toString(),
"_update_existing_only": false,
"name": "Order Placed",
"time": new Date().toISOString(),
"properties": {
"Delivery Method": payload.deliveryMethod,
"Items": payload.items,
"Total": payload.totals.total,
"Location": payload.location.name
}
}
]
};
return brazecall;
マルチイベントトランスフォーメーション
Oloは各webhookのX-Olo-Event-Typeヘッダー内にイベントタイプを送信します。単一のトランスフォーメーション内で複数のOlo webhookイベントをサポートするには、このヘッダータイプの値に基づいてwebhookペイロードを変換する条件ロジックを使用します。
以下のトランスフォーメーションの例では、JavaScriptがUserSignedUpとOrderPlacedのイベントに対して特定のペイロードを作成します。さらに、else条件は、X-Olo-Event-TypeヘッダーがUserSignedUpおよびOrderPlaced以外のOloイベントがBrazeに送信された場合のペイロードを処理します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// captures the value within the X-Olo-Event-Type header for use in the conditional logic
let event_type = headers["X-Olo-Event-Type"];
// defines a variable 'brazecall' that will hold the request payload for the /users/track request
let brazecall;
// if the X-Olo-Event-Type header is 'UserSignedUp', define a variable for the different subscription statuses that could be included within the Olo event payload
if (event_type == "UserSignedUp") {
let emailSubscribe;
let emailSubscriptionGroup;
let smsSubscriptionGroup;
// determine if the user has opted into marketing emails
if (payload.allowEmail) {
emailSubscribe = "opted_in";
emailSubscriptionGroup = "subscribed";
} else {
emailSubscribe = "unsubscribed";
emailSubscriptionGroup = "unsubscribed";
}
// determine if the user has opted into SMS
if (payload.allowMarketingSms) {
smsSubscriptionGroup = "subscribed";
} else {
smsSubscriptionGroup = "unsubscribed";
}
// build the /users/track request and pass in the appropriate subscription statuses
brazecall = {
"attributes": [{
"external_id": payload.id.toString(),
"_update_existing_only": false,
"email": payload.emailAddress,
"first_name": payload.firstName,
"last_name": payload.lastName,
"email_subscribe": emailSubscribe,
"phone": payload.contactNumber,
"subscription_groups": [{
"subscription_group_id": "57e5307f-9084-490d-9d6d-8244dc919a48",
"subscription_state": emailSubscriptionGroup
},
{
"subscription_group_id": "6440ba26-86ea-47db-a935-6647941dc78b",
"subscription_state": smsSubscriptionGroup
}
]
}]
}; // if the X-Olo-Event-Type header is 'OrderPlaced', build the /users/track request to log an event to the user profile
} else if (event_type == "OrderPlaced") {
brazecall = {
"events": [{
"external_id": payload.customer.customerId.toString(),
"_update_existing_only": false,
"name": "Order Placed",
"time": new Date().toISOString(),
"properties": {
"Delivery Method": payload.deliveryMethod,
"Items": payload.items,
"Total": payload.totals.total,
"Location": payload.location.name
}
}]
};
} else { // if the X-Olo-Event-Type header is anything else, build the /users/track request to log an event to the user profile
brazecall = {
"events": [{
"external_id": payload.customer.customerId.toString(),
"_update_existing_only": true,
"name": "Another Event",
"time": new Date().toISOString()
}]
};
}
// return `brazecall` to create an output.
return brazecall;
ステップ4:Olo webhookを公開する
Brazeでデータトランスフォーメーションを有効にしたら、Oloダッシュボード内のセルフサービスwebhookツールを使用してwebhookを公開します。webhookが公開されると、データトランスフォーメーションがOlo webhookイベントメッセージの受信を開始します。
知っておくべきこと
リトライ
OloはHTTPレスポンスステータスコード429 - Too Many Requestsまたは5xx範囲(ゲートウェイタイムアウトやサーバーエラーなど)のwebhook呼び出しを、リクエストを破棄するまでの24時間以内に最大50回リトライします。
最低1回の配信
webhook呼び出しがHTTPレスポンスステータスコード429 - Too Many Requestsまたは5xx範囲(ゲートウェイタイムアウトやサーバーエラーなど)になった場合、Oloはメッセージの送信を諦めるまでの24時間以内に最大50回リトライします。
そのため、サブスクライバーがwebhookを複数回受信する可能性があります。X-Olo-Message-Idヘッダーを確認して重複を無視するのは、サブスクライバー側の責任です。