コンテンツにスキップ

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から共有できるデータの例は次のとおりです。

  • パスの作成: 顧客がパスリンクをクリックし、初めてパスが表示されたとき。
  • パスのインストール: 顧客がパスをウォレットアプリに追加して保存したとき。
  • パスの更新: パスが更新されたとき。
  • パスの削除: 顧客がウォレットアプリからパスを削除したとき。

データがBrazeに渡されると、オーディエンスを構築し、Liquidを使用してコンテンツをパーソナライズし、これらのアクションが実行された後にキャンペーンやキャンバスをトリガーできます。

PassKitをBrazeに接続する

PassKitからデータを渡すには、Brazeのexternal IDをPassKitのexternalIdとして設定していることを確認してください。

  1. 設定の中で、PassKitのパスプロジェクトまたはプログラムの統合にあるBrazeタブの下の接続をクリックします。
    PassKitプラットフォームのBraze統合タイル。

  2. Braze APIキー、エンドポイントURL を入力し、コネクターの名前を指定します。

  3. 統合を有効化を切り替え、Brazeでメッセージのトリガーやパーソナライズに使用したいイベントを選択します。
    PassKit Braze統合タイルが展開され、APIキー、エンドポイントURL、統合名、有効化設定、メンバーシップ設定、パス設定を入力できる状態。

Braze内でSmartPassリンクを設定して、顧客がAndroidまたはiOSにパスをインストールするための一意のURLを生成できます。これを行うには、BrazeのContent Blockから呼び出し可能な暗号化されたSmartPassデータペイロードを定義する必要があります。このコンテンツブロックは、将来のパスやクーポンに再利用できます。以下は統合時に使用されます。

  • PassKit URL:PassKit URLは、PassKitプログラム固有のURLです。
    各プログラムには一意のURLがあり、PassKitプログラムまたはプロジェクトのDistributionタブで確認できます。(例:https://pub1.pskt.io/c/ww0jir)

  • PassKitシークレット:URLとともに、このプログラム用のPassKitキーが必要です。
    PassKit URLと同じページで確認できます。

  • プログラム(またはプロジェクト)ID:SmartPass URLを作成するには、PassKitプログラムIDが必要です。
    プロジェクトまたはプログラムのSettingsタブで確認できます。

暗号化されたSmartPassリンクの作成に関する詳細は、このPassKitの記事をご確認ください。

ステップ1:パスデータペイロードを定義する

まず、クーポンまたはメンバーペイロードを定義する必要があります。

ペイロードに含められるさまざまなコンポーネントがありますが、ここでは注目すべき2つの重要なコンポーネントを紹介します。

コンポーネント 必須 タイプ 説明
person.externalId 必須 String Brazeのexternal IDとして設定され、PassKitからBrazeへのコールバックが機能するために不可欠です。これにより、企業のユーザーが1つのキャンペーンで複数のオファーに対するクーポンを持つことができます。一意性は強制されません。
members.member.externalId 任意 String Brazeのexternal IDとして設定され、external IDを使用してメンバーシップパスを更新できます。このフィールドを設定すると、メンバーシッププログラム内でユーザーが一意として強制されます。

利用可能なフィールドの完全なリスト、タイプ、および説明については、PassKit GitHubドキュメントをご覧ください。

ペイロードの例

{
  "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 Block Liquidタグを定義する必要があります。このコンテンツブロックを保存した後、メッセージ作成時にこのLiquidタグを参照できます。この例では、Liquidタグを{{content_blocks.${passKit_SmartPass_url}}}として割り当てています。

このコンテンツブロック内では、ペイロードを直接含めず、{{passData}}変数で参照します。コンテンツブロックに追加する最初のコードスニペットは、{{passData}}変数のBase64エンコーディングをキャプチャします。

{% capture base64JsonPayload %}{{passDatapassData|base64_encode}}{% endcapture %}

ステップ3:SHA1 HMACハッシュを使用して暗号化署名を作成する

次に、プロジェクトURLとペイロードのSHA1 HMACハッシュを使用して暗号化署名を作成します。

コンテンツブロックに追加する2番目のコードスニペットは、ハッシュに使用されるURLをキャプチャします。

{% capture url %}{{projectUrl}}?data={{base64JsonPayload}}{% endcapture %}

次に、このハッシュとProject Secretを使用して署名を生成する必要があります。3番目のコードスニペットを含めることで実行できます。

{% capture sig %}{{url | hmac_sha1: "Project_Secret"}}{% endcapture %}

最後に、5番目のコードスニペットを使用して、完全なURLに署名を追加します。

{% capture longURL %}{{projectUrl}}?data={{base64JsonPayload}}&sig={{sig}}{% endcapture %}

ステップ4:URLを出力する

最後に、最終的なURLを呼び出して、メッセージ内にSmartPass URLを出力するようにします。

{{longURL}}

この時点で、次のようなコンテンツブロックが作成されています。

{% 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プロジェクトのDistributionタブで確認できるプロジェクトまたはプログラムのURL

これは意図的な設計であり、コンテンツブロックの再利用性をサポートしています。これらの変数はコンテンツブロック内で作成されるのではなく参照されるだけなので、コンテンツブロックを作り直すことなく変数を変更できます。

例えば、ロイヤルティプログラムの初回オファーを変更してより多くの初期ポイントを含めたい場合や、別のメンバーカードやクーポンを作成したい場合があります。これらのシナリオでは、異なるPassKitのprojectURLや異なるパスペイロードが必要になりますが、Brazeでキャンペーンごとに定義できます。

メッセージ本文の作成

メッセージ本文でこれらの両方の変数をキャプチャし、コンテンツブロックを呼び出す必要があります。 ステップ1の圧縮されたJSONペイロードをキャプチャします。

プロジェクトURLを割り当てる

{% assign projectUrl = "https://pub1.pskt.io/c/ww0jir" %}

JSONをキャプチャする

{% 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.${passkit_SmartPass_url}}}

メッセージ本文は次のようになります。 キャプチャしたJSONとコンテンツブロック参照が表示されたコンテンツブロックメッセージ作成画面の画像

サンプルの出力URLは次のとおりです。 ランダムに生成された長い英数字の文字列を含む出力URL

出力URLは長くなります。その理由は、すべてのパスデータが含まれており、URL変更によるデータ改ざんを防ぐ最高クラスのセキュリティが組み込まれているためです。SMSでこのURLを配信する場合は、bit.lyなどのリンク短縮プロセスを通すことをお勧めします。これは、bit.lyのエンドポイントへのConnected Content呼び出しで実行できます。

Webhookを使用したPassKitのパス更新

Braze内で、Webhookキャンペーンまたはキャンバス内のWebhookを設定して、ユーザーの行動に基づいて既存のパスを更新できます。PassKitの便利なエンドポイントについては、以下のリンクをご覧ください。

ペイロードパラメーター

始める前に、PassKitへの作成・更新Webhookに含めることができる一般的なJSONペイロードパラメーターを紹介します。

データ タイプ 説明
externalId String パスレコードに一意のIDを追加し、一意の顧客識別子(例:メンバーシップ番号)を使用する既存システムとの互換性を確保します。パスIDの代わりにuserDefinedIdとcampaignNameを使用して、このエンドポイント経由でパスデータを取得できます。この値はキャンペーン内で一意である必要があり、一度設定すると変更できません。

Brazeとの連携には、Brazeのexternal IDの使用をお勧めします:{{${user_id}}}
campaignId(クーポン)

programId(メンバーシップ)
String PassKitで作成したキャンペーンまたはプログラムテンプレートのIDです。これを確認するには、PassKitパスプロジェクトの設定タブに移動してください。
expiryDate IO8601 datetime パスの有効期限です。有効期限を過ぎると、パスは自動的に無効化されます(isVoidedを参照)。この値はテンプレートおよびキャンペーンの終了日の値を上書きします。
status String クーポンの現在のステータスです(例:REDEEMEDやUNREDEEMED)。

ステップ1:BrazeのWebhookテンプレートを作成する

今後のキャンペーンやキャンバスで使用するPassKitのWebhookテンプレートを作成するには、Brazeダッシュボードのテンプレートとメディアセクションに移動します。単発のPassKit Webhookキャンペーンを作成する場合や、既存のテンプレートを使用する場合は、新しいキャンペーンを作成する際にBrazeでWebhookを選択してください。

PassKitのWebhookテンプレートを選択すると、以下が表示されます:

  • Webhook URL:https://api-pub1.passkit.io/coupon/singleUse/coupon
  • リクエスト本文:Raw Text

リクエストヘッダーとメソッド

PassKitでは認証のためにHTTP Headerが必要で、base 64でエンコードされたPassKit APIキーを含めます。以下はテンプレート内にキーと値のペアとして既に含まれていますが、設定タブで<PASSKIT_LONG_LIVED_TOKEN>をPassKitトークンに置き換える必要があります。トークンを取得するには、PassKitプロジェクト/プログラムに移動し、Settings > Integrations > Long Lived Tokenに移動してください。

  • HTTPメソッド:PUT
  • リクエストヘッダー:
    • Authorization:Bearer <PASSKIT_LONG_LIVED_TOKEN>
    • Content-Type:application/json

リクエスト本文

Webhookを設定するには、リクエスト本文に新しいイベントの詳細を入力します。ユースケースに必要なペイロードパラメーターを含めてください:

{
  "externalId": "{{${user_id}}}",
  "campaignId": " 2xa1lRy8dBz4eEElBfmIz8",
  "expiryDate": "2020-05-10T00:00:00Z"
}

ステップ2:リクエストをプレビューする

適用可能なBrazeタグがある場合、Raw Textが自動的にハイライトされます。

プレビューパネルでリクエストをプレビューするか、テストタブに移動して、ランダムなユーザー、既存のユーザーを選択するか、独自にカスタマイズしてWebhookをテストできます。

Connected Contentを使用したパスの詳細の取得

パスの作成と更新に加えて、Braze Connected Contentを使用してユーザーのパスメタデータを取得し、パーソナライズされたパスの詳細をメッセージングキャンペーンに組み込むこともできます。

PassKit Connected Contentコール

{% 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レスポンスの例

{
    "redemptionDate": null,
    "redemptionCode": "",
    "lat": 0,
    "lon": 0,
    "alt": 0,
    "redemptionSource": "",
    "redemptionReference": "",
    "transactionReference": "",
    "transactionAmount": 0
}
UNREDEEMED
New Stuff!