PassKit
PassKitは、Apple ウォレットとGoogle Payのパスをカスタマーエクスペリエンスに統合することで、モバイルリーチの拡大を支援します。デジタルクーポン、ロイヤルティカード、会員カード、チケットなどの作成、管理、配布、パフォーマンス分析を簡単に行うことができ、顧客は他のアプリを必要としません。
この統合はPassKitによって管理されています。
統合について
BrazeとPassKitの統合により、Apple ウォレットとGoogle Payのカスタムパスを即時に配信して、オンラインキャンペーンのエンゲージメントを高め、測定できます。その後、利用状況を分析し、リアルタイムに調整することで、位置情報に基づくメッセージやパーソナライズされたダイナミックな更新を顧客のモバイルウォレットに送信し、店舗内のトラフィックを増加させることができます。
前提条件
| 必要条件 | 説明 |
|---|---|
| PassKitアカウント | PassKitアカウントとPassKitアカウントマネージャーが必要です。 |
userDefinedID |
PassKitとBrazeの間でユーザーへのカスタムイベントやカスタム属性を適切に更新するには、Brazeのexternal IDをuserDefinedIDとして設定する必要があります。このuserDefinedIDは、PassKitのエンドポイントにAPIコールを行う際に使用されます。 |
| Braze REST APIキー | users.track権限を持つBraze REST APIキー。これは、Brazeダッシュボードの「設定」>「APIキー」から作成できます。 |
| Braze RESTエンドポイント | RESTエンドポイントのURL。エンドポイントはインスタンスのBraze URLに応じて異なります。 |
統合
顧客のモバイルウォレットエクスペリエンスをさらに充実させるために、PassKitダッシュボードから、Brazeの/users/trackエンドポイントを通じてBrazeにデータを渡すことができます。
PassKitから共有するデータの例を以下に示します。
- Pass created: 顧客がパスリンクをクリックして、パスが最初に表示される時点。
- Pass installs: 顧客がパスを追加し、自分のウォレットアプリに保存する時点。
- Pass updates: パスが更新される時点。
- Pass delete: 顧客がウォレットアプリからパスを削除する時点。
データがBrazeに渡されると、オーディエンスを構築し、Liquidでコンテンツをパーソナライズし、これらのアクションが実行された後にCampaignsやCanvasesをトリガーすることができます。
PassKitをBrazeに接続する
PassKitからデータを渡すには、Brazeのexternal IDをPassKitのexternalIdとして設定していることを確認します。
- PassKitパスプロジェクトまたはプログラムのSettingsのIntegrationsで、BrazeタブのConnectをクリックします。

- Braze APIキーとエンドポイントURLを入力し、コネクターの名前を入力します。
- Enable Integrationをトグルし、Brazeでメッセージをトリガーまたはパーソナライズしたいイベントを選択します。

SmartPassリンクを使用してパスを作成する
Brazeでは、SmartPassリンクを設定して、顧客がAndroidまたはiOSにパスをインストールするための一意のURLを生成できます。そのためには、BrazeのContent Blockから呼び出せる暗号化されたSmartPassデータペイロードを定義する必要があります。このContent Blockは、今後のパスやクーポンに再利用できます。以下は統合の際に使用されます。
- PassKit URL: PassKit URLは、PassKitプログラムの一意のURLです。
各プログラムには固有のURLがあり、PassKitプログラムまたはプロジェクトのDistributionタブで確認できます。(例: https://pub1.pskt.io/c/ww0jir) - PassKitシークレット: URLとともに、このプログラムのPassKit Keyを手元に用意しておく必要があります。
これはPassKit URLと同じページで確認できます。 - プログラム(またはプロジェクト)ID: SmartPass URLを作成するには、PassKitプログラムIDが必要です。
プロジェクトやプログラムのSettingsタブで確認できます。
暗号化されたSmartPassリンクの作成に関する詳細は、こちらのPassKitの記事を参照してください。
ステップ1: パスデータペイロードを定義する
まず、クーポンまたはメンバーのペイロードを定義する必要があります。
ペイロードにはさまざまなコンポーネントを含めることができますが、ここでは2つの重要なコンポーネントを示します。
| コンポーネント | 必須 | タイプ | 説明 |
|---|---|---|---|
person.externalId |
必須 | String | Brazeのexternal IDとして設定され、PassKitからBrazeへのコールバックが機能するために重要です。これにより、会社ユーザーは1つのCampaignで複数のオファーのクーポンを持つことができます。一意であることは必須ではありません。 |
members.member.externalId |
オプション | String | Brazeのexternal IDとして設定します。external IDを使用してメンバーシップパスを更新できます。このフィールドを設定することで、メンバーシッププログラム内でユーザーが一意になります。 |
使用可能なすべてのフィールドとそのタイプ、役立つ説明については、PassKit GitHubのドキュメントを参照してください。
ペイロードの例
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ダッシュボード内のテンプレート > Content Blocksに移動して、新しいContent Blockを作成し、名前を付けます。
Create Content Blockを選択して開始します。
次に、Content BlockのLiquidタグを定義します。このContent Blockを保存したら、メッセージを作成するときにこのLiquidタグを参照できます。この例では、Liquidタグを{{content_blocks.${passKit_SmartPass_url}}}として割り当てています。
このContent Block内部では、ペイロードを直接含めず、{{passData}}変数で参照します。Content Blockに追加する最初のコードスニペットは、{{passData}}変数のBase64エンコードをキャプチャします。
1
{% capture base64JsonPayload %}{{passDatapassData|base64_encode}}{% endcapture %}
ステップ3: SHA1 HMACハッシュを使用して暗号化署名を作成する
次に、プロジェクトのURLとペイロードのSHA1 HMACハッシュを使って暗号化署名を作成します。
Content Blockに追加する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を呼び出して、メッセージ内にSmartPass URLが出力されるようにします。
1
{{longURL}}
この時点で、次のようなContent Blockが作成されています。
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とこのCampaignまで追跡するために、UTMパラメーターが追加されています。
ページを離れる前に、Content Blockを必ず保存してください。
ステップ5: すべてをまとめる
このContent Blockが作成されたら、今後再利用できます。
Content Blockの例では、2つの変数が未定義のままになっていることにお気づきでしょう。
{{passData}} - ステップ1で定義したJSONパスデータのペイロード
{{projectUrl}} - PassKitプロジェクトのDistributionタブにあるプロジェクトまたはプログラムのURL。
これは意図的な決定であり、Content Blockの再利用性をサポートします。これらの変数は参照されるだけで、Content Block内で作成されるわけではないので、Content Blockを作り直すことなく変更できます。
たとえば、紹介オファーを変更して、ロイヤルティプログラムに初回ポイントを追加したり、セカンダリメンバーカードやクーポンを作成したりすることがあります。これらのシナリオでは必要なPassKitのprojectURLsまたはパスペイロードが異なる可能性があります。これらはBrazeでCampaignごとに定義します。
メッセージ本文を作成する
この2つの変数をメッセージ本文にキャプチャしてから、Content Blockを呼び出します。 ステップ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 %}
先ほど作成したContent Blockを参照する
1
{{content_block.${passkit_SmartPass_url}}}
メッセージ本文は次のようになります。

サンプルの出力URLは以下の通りです。

出力URLは長くなります。その理由は、パスデータがすべて含まれており、データの完全性とURL変更による改ざんを防ぐために、クラス最高のセキュリティが組み込まれているからです。SMSを使用してこのURLを配布する場合は、bit.lyのようなリンク短縮プロセスで実行することをお勧めします。これは、bit.lyエンドポイントへのコネクテッドコンテンツ呼び出しを使用して行うことができます。
PassKit Webhookを使用してパスを更新する
Brazeでは、WebhookのCampaignやCanvas内のWebhookを設定して、ユーザーの行動に基づいて既存のパスを更新することができます。有用なPassKitエンドポイントについては、次のリンクを参照してください。
ペイロードパラメーター
始める前に、PassKitへのWebhookの作成と更新に含めることができる一般的なJSONペイロードパラメーターを以下に示します。
| データ | タイプ | 説明 |
|---|---|---|
externalId |
String | 一意の顧客識別子(メンバーシップ番号など)を使用する既存のシステムとの互換性を得るために、パスレコードに一意のIDを追加できます。このエンドポイントを使用して、パスIDではなくuserDefinedIdとcampaignNameでパスデータを取得できます。この値はCampaign内で一意でなければならず、設定後は変更できません。Braze統合では、Brazeのexternal ID {{${user_id}}}を使用することをお勧めします。 |
campaignId(クーポン)programId(メンバーシップ) |
String | PassKitで作成したCampaignまたはプログラムテンプレートのIDです。これを確認するには、PassKitパスプロジェクトのSettingsタブに移動します。 |
expiryDate |
ISO8601日時 | パスの有効期限です。有効期限を過ぎると、パスは自動的に無効になります(isVoidedを参照)。この値はテンプレートとCampaign終了日の値を上書きします。 |
status |
String | REDEEMEDやUNREDEEMEDなど、クーポンの現在のステータスです。 |
ステップ1: BrazeのWebhookテンプレートを作成する
今後のCampaignsやCanvasesで使用するPassKit Webhookテンプレートを作成するには、Brazeダッシュボードのテンプレートとメディアセクションに移動します。単発のPassKit WebhookのCampaignを作成する場合、または既存のテンプレートを使用する場合は、新しいCampaignを作成する際にBrazeでWebhookを選択します。
PassKit Webhookテンプレートを選択すると、以下のように表示されます。
- Webhook URL:
https://api-pub1.passkit.io/coupon/singleUse/coupon - リクエスト本文: Raw Text
リクエストヘッダーとメソッド
PassKitの認証には、Base64でエンコードされたPassKit APIキーを含むHTTP Headerが必要です。以下はすでにキーと値のペアとしてテンプレートに含まれていますが、Settingsタブでは、<PASSKIT_LONG_LIVED_TOKEN>をPassKitトークンに置き換える必要があります。トークンを取得するには、PassKitプロジェクト/プログラムに移動し、Settings > Integrations > Long Lived Tokenに移動します。
- HTTPメソッド: PUT
- リクエストヘッダー:
- Authorization: Bearer
<PASSKIT_LONG_LIVED_TOKEN> - Content-Type: application/json
- Authorization: Bearer
リクエスト本文
Webhookをセットアップするには、リクエスト本文に新しいイベントの詳細を記入し、ユースケースに必要なペイロードパラメーターを含めます。
1
2
3
4
5
{
"externalId": "{{${user_id}}}",
"campaignId": " 2xa1lRy8dBz4eEElBfmIz8",
"expiryDate": "2020-05-10T00:00:00Z"
}
ステップ2: リクエストをプレビューする
入力したテキストがBrazeタグに該当する場合、自動的にハイライト表示されます。
Previewパネルでリクエストをプレビューするか、Testタブに移動して、ランダムなユーザー、既存のユーザーを選択するか、Webhookをテストするために自分でカスタマイズします。
ページを離れる前にテンプレートを保存することを忘れないでください!
更新されたWebhookテンプレートは、新しいWebhookのCampaignを作成するときに、保存済みWebhookテンプレートリストで見つけることができます。
コネクテッドコンテンツからパスの詳細を取得する
パスの作成と更新に加え、ユーザーのパスメタデータをBrazeのコネクテッドコンテンツから取得し、パーソナライズされたパスの詳細をメッセージングCampaignsに組み込むこともできます。
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}}
Liquidの応答の例
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