PassKit
PassKit을 사용하면 Apple Wallet 및 Google Pay 패스를 고객 경험에 통합하여 모바일 도달 범위를 확장할 수 있습니다. 디지털 쿠폰, 로열티 카드, 멤버십 카드, 티켓 등을 쉽게 생성, 관리, 배포하고 성과를 분석할 수 있으며, 고객이 별도의 앱을 설치할 필요가 없습니다.
이 통합은 Passkit에서 유지 관리합니다.
통합 정보
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에 따라 달라집니다. |
통합
고객의 모바일 지갑 경험을 더욱 풍부하게 하기 위해 PassKit 대시보드 내에서 Braze /users/track 엔드포인트를 통해 Braze로 데이터를 전달하도록 선택할 수 있습니다.
PassKit에서 공유할 데이터의 예시는 다음과 같습니다:
- 패스 생성: 고객이 패스 링크를 클릭하고 처음으로 패스가 표시될 때.
- 패스 설치: 고객이 패스를 지갑 앱에 추가하고 저장할 때.
- 패스 업데이트: 패스가 업데이트될 때.
- 패스 삭제: 고객이 지갑 앱에서 패스를 삭제할 때.
데이터가 Braze로 전달되면 오디언스를 구축하고, Liquid를 통해 콘텐츠를 개인화하며, 이러한 동작이 수행된 후 Campaign 또는 Canvas를 트리거할 수 있습니다.
PassKit을 Braze에 연결
PassKit에서 데이터를 전달하려면 Braze 외부 ID를 PassKit의 externalId로 설정했는지 확인하세요.
- Settings 내 PassKit 패스 프로젝트 또는 프로그램의 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 키가 준비되어 있어야 합니다.
PassKit URL과 같은 페이지에서 찾을 수 있습니다. - 프로그램(또는 프로젝트) ID: SmartPass URL을 생성하려면 PassKit 프로그램 ID가 필요합니다.
프로젝트 또는 프로그램의 Settings 탭에서 찾을 수 있습니다.
암호화된 SmartPass 링크 생성에 대한 자세한 내용은 이 PassKit 문서를 참조하세요.
1단계: 패스 데이터 페이로드 정의
먼저 쿠폰 또는 멤버 페이로드를 정의해야 합니다.
페이로드에 포함할 수 있는 다양한 구성요소가 있지만, 여기서 주목해야 할 두 가지 중요한 항목이 있습니다:
| 구성요소 | 필수 | 유형 | 설명 |
|---|---|---|---|
person.externalId |
필수 | 문자열 | Braze 외부 ID로 설정되며, PassKit에서 Braze로의 콜백이 작동하는 데 중요합니다. 이를 통해 회사 사용자가 하나의 Campaign에서 여러 오퍼에 대한 쿠폰을 가질 수 있습니다. 고유성이 강제되지 않습니다. |
members.member.externalId |
선택 사항 | 문자열 | Braze 외부 ID로 설정되며, 외부 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 대시보드에서 Templates > Content Blocks로 이동하여 새 Content Block을 생성하고 이름을 지정합니다.
Create Content Block을 선택하여 시작합니다.
다음으로 Content Block Liquid Tag를 정의해야 합니다. 이 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에 추가해야 하는 두 번째 코드 스니펫은 해싱에 사용할 URL을 캡처합니다.
1
{% capture url %}{{projectUrl}}?data={{base64JsonPayload}}{% endcapture %}
다음으로 이 해시와 Project Secret을 사용하여 서명을 생성해야 합니다. 세 번째 코드 스니펫을 포함하여 이를 수행할 수 있습니다:
1
{% capture sig %}{{url | hmac_sha1: "Project_Secret"}}{% endcapture %}
마지막으로 다섯 번째 코드 스니펫을 사용하여 전체 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에 정의되지 않은 두 개의 변수가 남아 있는 것을 알 수 있습니다.
{{passData}} - 1단계에서 정의한 JSON 패스 데이터 페이로드
{{projectUrl}} - PassKit 프로젝트의 배포 탭에서 찾을 수 있는 프로젝트 또는 프로그램의 URL.
이 결정은 의도적이며 Content Block의 재사용성을 지원합니다. 이러한 변수는 Content Block 내에서 생성되는 것이 아니라 참조만 되기 때문에 Content Block을 다시 만들지 않고도 변수를 변경할 수 있습니다.
예를 들어, 로열티 프로그램에 더 많은 초기 포인트를 포함하도록 소개 오퍼를 변경하거나 보조 멤버 카드 또는 쿠폰을 만들고 싶을 수 있습니다. 이러한 시나리오에서는 서로 다른 PassKit projectURLs 또는 서로 다른 패스 페이로드가 필요하며, Braze에서 Campaign별로 정의합니다.
메시지 본문 작성
메시지 본문에서 이 두 변수를 모두 캡처한 다음 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 웹훅을 사용하여 패스 업데이트
Braze 내에서 웹훅 Campaign 또는 Canvas 내 웹훅을 설정하여 사용자의 동작에 따라 기존 패스를 업데이트할 수 있습니다. 유용한 PassKit 엔드포인트에 대한 정보는 다음 링크를 확인하세요.
페이로드 매개변수
시작하기 전에 PassKit에 대한 생성 및 업데이트 웹훅에 포함할 수 있는 일반적인 JSON 페이로드 매개변수는 다음과 같습니다.
| 데이터 | 유형 | 설명 |
|---|---|---|
externalId |
문자열 | 고유 고객 식별자(예: 멤버십 번호)를 사용하는 기존 시스템과의 호환성을 제공하기 위해 패스 레코드에 고유 ID를 추가할 수 있습니다. 패스 ID 대신 userDefinedId 및 campaignName을 통해 이 엔드포인트를 사용하여 패스 데이터를 검색할 수 있습니다. 이 값은 Campaign 내에서 고유해야 하며, 이 값이 설정된 후에는 변경할 수 없습니다.Braze 통합의 경우 Braze 외부 ID를 사용하는 것을 권장합니다: {{${user_id}}} |
campaignId (쿠폰) programId (멤버십) |
문자열 | PassKit에서 생성한 Campaign 또는 프로그램 템플릿의 ID입니다. 이를 찾으려면 PassKit 패스 프로젝트의 Settings 탭으로 이동하세요. |
expiryDate |
IO8601 datetime | 패스 만료 날짜입니다. 만료 날짜 이후 패스는 자동으로 무효화됩니다(isVoided 참조). 이 값은 템플릿 및 Campaign 종료 날짜 값을 재정의합니다. |
status |
문자열 | 쿠폰의 현재 상태(예: REDEEMED 또는 UNREDEEMED). |
1단계: Braze 웹훅 템플릿 생성
향후 Campaign이나 Canvas에서 사용할 PassKit 웹훅 템플릿을 만들려면 Braze 대시보드의 템플릿 및 미디어 섹션으로 이동하세요. 일회성 PassKit 웹훅 Campaign을 만들거나 기존 템플릿을 사용하려면 새 Campaign을 만들 때 Braze에서 Webhook을 선택하세요.
PassKit 웹훅 템플릿을 선택하면 다음이 표시됩니다:
- Webhook URL:
https://api-pub1.passkit.io/coupon/singleUse/coupon - Request Body: Raw Text
요청 헤더 및 메서드
PassKit은 base 64로 인코딩된 PassKit API 키를 포함하는 승인용 HTTP Header가 필요합니다. 다음은 이미 템플릿 내에 키-값 페어로 포함되어 있지만, Settings 탭에서 <PASSKIT_LONG_LIVED_TOKEN>을 PassKit 토큰으로 교체해야 합니다. 토큰을 검색하려면 PassKit 프로젝트/프로그램으로 이동한 다음 Settings > Integrations > Long Lived Token으로 이동하세요.
- HTTP Method: PUT
- Request Header:
- Authorization: Bearer
<PASSKIT_LONG_LIVED_TOKEN> - Content-Type: application/json
- Authorization: Bearer
요청 본문
웹훅을 설정하려면 사용 사례에 필요한 페이로드 매개변수를 포함하여 요청 본문에 새 이벤트 세부 정보를 입력합니다:
1
2
3
4
5
{
"externalId": "{{${user_id}}}",
"campaignId": " 2xa1lRy8dBz4eEElBfmIz8",
"expiryDate": "2020-05-10T00:00:00Z"
}
2단계: 요청 미리보기
원시 텍스트는 적용 가능한 Braze 태그인 경우 자동으로 강조 표시됩니다.
Preview 패널에서 요청을 미리 보거나 Test 탭으로 이동하여 무작위 사용자, 기존 사용자를 선택하거나 직접 커스터마이즈하여 웹훅을 테스트할 수 있습니다.

페이지를 떠나기 전에 템플릿을 저장하세요!
업데이트된 웹훅 템플릿은 새 웹훅 Campaign을 만들 때 저장된 웹훅 템플릿 목록에서 찾을 수 있습니다.
연결된 콘텐츠를 통해 패스 세부 정보 검색
패스를 생성하고 업데이트하는 것 외에도 Braze 연결된 콘텐츠를 통해 사용자의 패스 메타데이터를 검색하여 메시징 Campaign에 개인화된 패스 세부 정보를 포함할 수 있습니다.
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