パスキット
PassKitは、Apple WalletやGoogle Payのパスを顧客体験に統合することで、モバイル・リーチを拡大することを可能にする。デジタルクーポン、ポイントカード、会員カード、チケットなどの作成、管理、配布、パフォーマンス分析が簡単にできる。
BrazeとPassKitの統合により、Apple WalletとGoogle Payのカスタムパスを即座に配信することで、オンラインキャンペーンのエンゲージメントを高め、測定することができる。その後、利用状況を分析し、顧客のモバイル・ウォレットに位置情報ベースのメッセージやパーソナライズされた動的な更新をトリガーすることで、店舗でのトラフィックを増やすためのリアルタイム調整を行うことができる。
前提条件
必要条件 | 説明 |
---|---|
PassKitアカウント | PassKitアカウントとPassKitアカウントマネージャーが必要である。 |
userDefinedID |
PassKitとBrazeの間でユーザーへのカスタムイベントやカスタム属性を適切に更新するには、Brazeの外部IDをuserDefinedID 。このuserDefinedID 、PassKitエンドポイントにAPIコールを行う際に使用される。 |
Braze REST API キー | users.track 権限を持つ Braze REST API キー。これは、Brazeダッシュボードの「設定」>「APIキー」から作成できる。 |
Braze RESTエンドポイント | RESTエンドポイントのURL。エンドポイントは、[インスタンスのBraze URL]6 に依存する。 |
統合
顧客のモバイルウォレット体験をさらに豊かにするために、PassKitダッシュボードから、Brazeの[/users/track
エンドポイント]7]を通じてBrazeにデータを渡すことができる。
PassKitから共有されるデータの例には以下が含まれる:
- パスの作成:顧客がパスのリンクをクリックし、最初にパスが表示されたとき。
- パスのインストール:顧客がウォレットアプリにパスを追加し、保存する。
- パスの更新:パスが更新されたとき。
- パスの削除:顧客がウォレットアプリからパスを削除した場合。
データがBrazeに渡されると、オーディエンスを構築し、Liquidでコンテンツをパーソナライズし、これらのアクションが実行された後にキャンペーンやCanvasesをトリガーすることができる。
パスキットとブレイズを接続する
PassKitからデータを渡すには、Brazeの外部IDをPassKitのexternalId
。
- 設定内のPassKit passプロジェクトまたはプログラムのIntegrationsで、BrazeタブのConnectをクリックする。
- Braze APIキー、エンドポイントURLを入力し、コネクタの名前を入力する。
- Enable Integration(統合を有効にする)をトグルし、Brazeでメッセージをトリガーまたはパーソナライズしたいイベントを選択する。
スマートパスリンクを使ってパスを作成する
Braze内では、スマートパスリンクを設定し、顧客がAndroidまたはiOSのいずれかにパスをインストールするための固有のURLを生成することができる。そのためには、Brazeコンテンツブロックから呼び出せる暗号化されたSmartPassデータペイロードを定義する必要がある。この[コンテンツ・ブロック]9 ]は、将来のパスやクーポンに再利用できる。以下は、統合の際に使用される:
- PassKitのURL:PassKitのURLは、PassKitプログラムに固有のURLである。
各プログラムには固有のURLがあり、PassKitプログラムまたはプロジェクトの「Distribution」タブで見つけることができる。(例えば、https://pub1.pskt.io/c/ww0jir ) - PassKitの秘密だ:URLと一緒に、このプログラムのPassKit Keyも手元に用意しておく必要がある。
これはPassKitのURLと同じページに記載されている。 - プログラム(またはプロジェクト)ID:スマートパスのURLを作成するには、PassKitプログラムIDが必要となる。
プロジェクトやプログラムの“Settings “タブにある。
暗号化されたスマートパス・リンクの作成に関する詳細は、こちらの[PassKitの記事]8 。
ステップ1:パスデータのペイロードを定義する
まず、クーポンやメンバーのペイロードを定義しなければならない。
ペイロードに含めることができるコンポーネントは多岐にわたるが、ここでは2つの重要なコンポーネントを紹介する:
コンポーネント | 必須 | タイプ | 説明 |
---|---|---|---|
person.externalId |
必須 | String | Brazeの外部IDとして設定され、PassKitからBrazeへのコールバックが機能するために重要であり、Brazeユーザーは1つのキャンペーンで複数のオファーのクーポンを持つことができる。ユニークなものとして施行されていない。 |
members.member.externalId |
オプション | String | Brazeの外部IDとして設定し、外部IDを使用して会員パスを更新することができる。このフィールドを設定することで、会員プログラム内でユーザーが一意であることが強制される。 |
利用可能なフィールドの完全なリストとそのタイプ、役に立つ説明については、[PassKit GitHub documentation]10 を見てほしい。
ペイロードの例
1
2
3
4
5
6
7
8
{
"members.member.externalId": "{{${user_id}}}",
"members.member.points": "100",
"members.tier.name": "current_customer",
"person.displayName": "{{${first_name}}} {{${last_name}}}",
"person.externalId": "{{${user_id}}}",
"universal.expiryDate": "{{ "now" | date: "%s" | plus: 31622400 | date: "%FT%TZ" }}"
}
ステップ2:未定義のペイロード変数を作成し、エンコードする
BrazeダッシュボードのTemplates>Content Blocksに移動して、新しいコンテンツブロックを作成し、名前を付ける。
旧式のナビゲーションを使用している場合は、「エンゲージメント」>「テンプレート&メディア」>「コンテンツ・ブロック・ライブラリ」と進む。
コンテンツ・ブロックの作成」を選択して開始する。
次に、コンテンツブロックのリキッドタグを定義しなければならない。このコンテンツブロックを保存した後、このリキッドタグはメッセージを作成するときに参照できる。この例では、リキッドタグを{{content_blocks.${passKit_SmartPass_url}}}
として割り当てている。
このコンテンツ・ブロック内では、ペイロードを直接含めず、{{passData}}
変数で参照する。コンテンツ・ブロックに追加しなければならない最初のコード・スニペットは、{{passData}}
変数の Base64 エンコードをキャプチャする。
1
{% capture base64JsonPayload %}{{passDatapassData|base64_encode}}{% endcapture %}
ステップ3:SHA1 HMACハッシュを使用して暗号化署名を作成する。
次に、プロジェクトのURLとペイロードの[SHA1 HMAC]16 ハッシュ]を使って暗号化署名を作成する。
コンテンツ・ブロックに追加しなければならない2つ目のコード・スニペットは、ハッシュに使用するURLをキャプチャするものだ。
1
{% capture url %}{{projectUrl}}?data={{base64JsonPayload}}{% endcapture %}
次に、このハッシュとProject Secret
を使って署名を生成する必要がある。これは、3つ目のコード・スニペットを含めることで可能になる:
1
{% capture sig %}{{url | hmac_sha1: "Project_Secret"}}{% endcapture %}
最後に、5番目のコード・スニペットを使って、完全なURLに署名を追加する:
1
{% capture longURL %}{{projectUrl}}?data={{base64JsonPayload}}&sig={{sig}}{% endcapture %}
ステップ4:URLを印刷する
最後に、最終的なURLを呼び出し、メッセージ内にスマートパスのURLが表示されるようにする。
1
{{longURL}}
この時点で、あなたは次のようなコンテンツ・ブロックを作成したことになる:
1
2
3
4
5
6
7
8
9
{% capture base64JsonPayload %}{{passData|base64_encode}}{% endcapture %}
{% capture url %}{{projectUrl}}?data={{base64JsonPayload}}{% endcapture %}
{% capture sig %}{{url | hmac_sha1: "Project_Secret"}}{% endcapture %}
{% capture longURL %}{{projectUrl}}?data={{base64JsonPayload}}&sig={{sig}}&utm_source=braze&utm_campaign={{campaign.${name}}}{% endcapture %}{% capture longURL %}{{longURL | url_encode}}{% endcapture %}
{{longURL}}
この例では、インストール元をBrazeとこのキャンペーンまで追跡するためにUTMパラメータが追加されている。
ページを離れる前に、コンテンツ・ブロックを保存することを忘れないこと。
ステップ 5: すべてをまとめる
このコンテンツ・ブロックは、一度作成されれば、今後も再利用することができる。
コンテンツ・ブロックの例では、2つの変数が未定義のままになっていることにお気づきだろうか。
{{passData}}
- ステップ1で定義したJSONパス・データのペイロード
{{projectUrl}}
- Passkitプロジェクトのディストリビューション・タブにある、プロジェクトまたはプログラムのURL。
この決定は意図的なものであり、コンテンツ・ブロックの再利用性をサポートするものである。これらの変数は参照されるだけで、コンテンツ・ブロック内で作成されるわけではないので、コンテンツ・ブロックを作り直すことなく、これらの変数を変更することができる。
例えば、ロイヤリティ・プログラムの初期ポイントを増やすために、紹介オファーを変更したいかもしれないし、二次的なメンバー・カードやクーポンを作りたいかもしれない。これらのシナリオでは、異なるPasskitprojectURLs
、または異なるパスペイロードが必要となり、Brazeでキャンペーンごとに定義することになる。
メッセージ本文を作成する
この2つの変数をメッセージ・ボディに取り込み、コンテンツ・ブロックを呼び出す。 ステップ1で最小化したJSONペイロードをキャプチャする:
プロジェクトのURLを割り当てる
1
{% assign projectUrl = "https://pub1.pskt.io/c/ww0jir" %}
JSONをキャプチャする
1
{% capture passData %}{"members.member.externalId": "{{${user_id}}}","members.member.points": "100","members.tier.name": "current_customer","person.displayName": "{{${first_name}}} {{${last_name}}}","person.externalId": "{{${user_id}}}","universal.expiryDate": "{{ "now" | date: "%s" | plus: 31622400 | date: "%FT%TZ" }}"}{% endcapture %}
先ほど作成したコンテンツ・ブロックを参照する
1
{{content_block.${passkit_SmartPass_url}}}
メッセージ本文は次のようなものだ:
サンプルの出力URLは以下の通りだ:
出力URLは長くなる。その理由は、パスデータがすべて含まれており、データの完全性とURL変更による改ざんを確実にするために、クラス最高のセキュリティが組み込まれているからだ。SMSを使ってこのURLを配布する場合は、[bit.ly]3.これは、bit.ly エンドポイントへのコネクテッド・コンテンツ・コールを通じて行うことができる。
PassKitウェブフックを使用してパスを更新する
Brazeでは、WebhookキャンペーンやCanvas内のWebhookを設定して、ユーザーの行動に基づいて既存のパスを更新することができる。便利なPassKitエンドポイントについては、以下のリンクをチェックしてほしい。
ペイロードパラメーター
始める前に、PassKitへのウェブフックの作成と更新に含めることができる一般的なJSONペイロードパラメータを以下に示す。
データ | タイプ | 説明 |
---|---|---|
externalId |
String | 一意の顧客識別子(会員番号など)を使用する既存のシステムとの互換性を提供するために、パスレコードに一意のIDを追加できるようにする。このエンドポイントを使えば、パスIDの代わりにuserDefinedId 、campaignName 。この値はキャンペーン内で一意でなければならず、設定後は変更できない。Brazeとの統合には、Brazeの外部IDを使用することをお勧めする: {{${user_id}}} |
campaignId (クーポン) programId (会員制) |
String | PassKitで作成したキャンペーンまたはプログラムテンプレートのID。これを見つけるには、PassKitパス・プロジェクトのSettingsタブに向かう。 |
expiryDate |
IO8601 datetime | パスの有効期限。有効期限を過ぎると、パスは自動的に無効となる(isVoided を参照)。この値はテンプレートとキャンペーン終了日の値を上書きする。 |
status |
String | REDEEMED やUNREDEEMED など、クーポンの現在のステータス。 |
ステップ1:BrazeのWebhookテンプレートを作成する
今後のキャンペーンやCanvasで使用するPassKitウェブフックテンプレートを作成するには、Brazeダッシュボードの「テンプレート&メディア」セクションに移動する。単発のPassKitウェブフックキャンペーンを作成する場合、または既存のテンプレートを使用する場合は、新しいキャンペーンを作成する際にBrazeでウェブフックを選択する。
PassKitウェブフック・テンプレートを選択すると、以下のように表示される:
- ウェブフックのURL:
https://api-pub1.passkit.io/coupon/singleUse/coupon
- リクエスト・ボディRaw Text
リクエストヘッダと方法
PassKitの認証には、Base64でエンコードされたPassKit APIキーを含むHTTP Header
。以下はすでにキーと値のペアとしてテンプレートに含まれているが、Settingsタブでは、<PASSKIT_LONG_LIVED_TOKEN>
をあなたのPassKitトークンに置き換える必要がある。トークンを取得するには、PassKitプロジェクト/プログラムに移動し、「設定」>「統合」>「Long Lived Token」の順に移動する。
- HTTPメソッド:プット
- ヘッダーをリクエストする:
- 認可する:ベアラー
<PASSKIT_LONG_LIVED_TOKEN>
- Content-Type: application/json
- 認可する:ベアラー
Request body
Webhookをセットアップするには、リクエストボディに新しいイベントの詳細を記入し、ユースケースに必要なペイロードパラメータを含める:
1
2
3
4
5
{
"externalId": "{{${user_id}}}",
"campaignId": " 2xa1lRy8dBz4eEElBfmIz8",
"expiryDate": "2020-05-10T00:00:00Z"
}
ステップ2:リクエストをプレビューする
入力したテキストがBrazeタグに該当する場合、自動的にハイライト表示される。
Previewパネルでリクエストをプレビューするか、Testタブに移動して、ランダムなユーザー、既存のユーザーを選択するか、ウェブフックをテストするために自分でカスタマイズする。
ページを離れる前にテンプレートを保存することを忘れないこと!
更新されたWebhookテンプレートは、新しいWebhookキャンペーンを作成するときに、保存されたWebhookテンプレートリストで見つけることができる。
コネクテッド・コンテンツでパスの詳細を取得する
パスの作成と更新に加え、Brazeの[Connected Content]15 ] を介してユーザーのパスメタデータを取得し、メッセージングキャンペーンにパーソナライズされたパスの詳細を組み込むこともできる。
PassKitコネクテッド・コンテンツ・コール
1
2
3
{% connected_content https://api-pub1.passkit.io/coupon/singleUse/coupon/externalId/{{${user_id}}} :headers {"Authorization": "Bearer <PASSKIT_LONG_LIVED_TOKEN>","Content-Type": "application/json"} :save passes %}
{{passes.status}}
液体の回答例
1
2
3
4
5
6
7
8
9
10
11
{
"redemptionDate": null,
"redemptionCode": "",
"lat": 0,
"lon": 0,
"alt": 0,
"redemptionSource": "",
"redemptionReference": "",
"transactionReference": "",
"transactionAmount": 0
}
1
UNREDEEMED