IDFA의 시대는 저물고 SKAdNetwork의 시대가 왔다
기존의 MMP(Mobile Measurement Platform)은 IDFA라는 Device ID를 통해 유저를 특정할 수 있었습니다. 그리고 유저를 특정하는 것은 곧 매체의 기여를 측정할 수 있는 중요한 방법 중 하나로 자리매김합니다.
기여를 측정한다는 것은 "유저가 매체의 광고를 통해 앱을 설치하였다"는 것을 정당하게 입증할 수 있는 것입니다.
IDFA는 iOS 기기 당 부여되는 고유값이므로 (1) 광고 클릭 및 조회를 통해 수집된 IDFA와 (2) 설치 후 실행 시 SDK를 통해 전송되는 IDFA를 대조하여 동일한 경우 광고를 통해 앱을 설치한 유저로 간주하는 것이지요.
하지만 2021년 4월 iOS 14 버전부터 시장에는 큰 시련이 닥칩니다. Apple이 ATT prompt를 통해 유저의 동의를 받을 경우에만 IDFA 수집을 허가하도록 제도를 바꾸었기 때문입니다. 매체들의 입장에선 "우리의 광고를 통해 00%나 앱을 다운받았다"라는 수치를 더이상 공표할 수 없게 되었습니다. 광고를 진행하였지만 IDFA가 수집되지 않을 경우 매체 광고를 통해 앱을 설치했는지 여부를 판가름할 수 없게 됩니다.
그래서 Apple이 내놓은 대안책이 SKAdNetwork입니다. 한 개인의 디바이스를 특정할 수 없어 익명성이 보장되지만 최대한의 기여 성과를 알려주기 위해 만들어진 방식이 SKAN의 탄생입니다. (사실 SKAN 1은 iOS 11.3부터 제공되었지만 실질적으로 SKAN이 광범위하게 활용된 것은 SKAN 2부터 입니다).
SKAdNetwork 설정 방법
- 매체는 Apple에 등록 후 ad network ID와 API 사용 허가를 부여받습니다.
- 앱 개발자는 매체 등록을 통해 광고 정보 제공을 허가하며 winning postback의 사본을 전달받습니다.
(advertised app) 광고주 앱 등록하기
Ad attribution을 등록하기 위해서는 앱이 처음 실행될 때 전환값을 업데이트하는 메소드 중 하나를 호출해야 합니다.
- updatePostbackConversionValue( :coarseValue:lockWindow:completionHandler:)
class func updatePostbackConversionValue(
_ fineValue: Int,
coarseValue: SKAdNetwork.CoarseConversionValue,
lockWindow: Bool,
completionHandler completion: (((any Error)?) -> Void)? = nil
)
class func updatePostbackConversionValue(
_ fineValue: Int,
coarseValue: SKAdNetwork.CoarseConversionValue,
lockWindow: Bool
) async throws
- updatePostbackConversionValue( :coarseValue:completionHandler:)
- updatePostbackConversionValue( :completionHandler:)
Copies of winning install-validation postback 전달받기
Winning install postback 사본을 전달받기 위해서는 NSAdvertisingAttributionReportEndpoint key 값을 광고 앱 내 Info.plist 파일 에 추가하고 포스트백을 전달받을 자체 서버를 등록합니다.
- Xcode 내 Project navigator에서 Info.plist 파일을 선택합니다.
- key name에 NSAdvertisingAttributionReportEndpoint로 등록합니다.
- 해당 key 값으로 포스트백을 전달받을 서버 endpoint URL을 입력합니다.
시스템에서는 포스트백을 전달하기 위해 well-known이라는 path를 생성하여 해당 path에 포스트백 데이터를 전송합니다. 포스트백을 전달받기 위해서, 보유한 서버의 도메인은 SSL certificate이 필요합니다.아래 path를 통해 HTTPS POST 메시지를 반환할 수 있도록 해당 도메인의 서버 설정을 미리 진행하여야 합니다.
https://example.com/.well-known/skadnetwork/report-attribution
SKAdNetwork 동작 방식 (SKAN 4 기준)
- 유저는 매체/퍼블리셔 측 앱 내 지면 or Safari와 같은 브라우저에서 제공하는 앱 광고를 접합니다.
- 이후 광고의 대상이 되는 앱 (advertised app) 을 다운로드 받습니다.
- 이 과정에서 Apple이 "앱 다운로드"에 대한 포스트백 데이터 티어를 부여합니다. 이후 window 기간 내 기기에서 발생하는 인앱이벤트에 따라 포스트백 데이터 티어가 갱신됩니다.
- 기본적으로 시스템에서는 최종 전환 값(포스트백 데이터 티어)을 측정하기 위해 첫번째 전환 윈도우 기간까지 갱신되는 값을 수집할 수 있습니다. 이후 첫번째 포스트백 전송은 첫번째 전환 윈도우 기간 이후 24-48 시간 내에 무작위로 어떤 시점에 포스트백 데이터를 전송합니다.
- 이후 두번째 포스트백과 세번째 포스트백 전송은 coarse value(high / medium / low)로 포스트백 데이터를 전달합니다.
- lockWindow 매개변수를 설정한 class의 경우, 최종 전환 값을 전환 윈도우 기간이 끝나기 전에 임의로 설정할 수 있습니다.
- 위 도표에서는 두번째 전환 윈도우 기간 (3-7일)이 끝나기 전에 전환 값을 확정할 수 있도록 locked을 걸었음을 의미합니다.
- 전환 값이 확정된 이후에는 시스템에서 즉시 포스트백을 전송하며 동일한 전환 윈도우 기간 안에서 갱신되는 이후 모둔 모든 전환 값을 무시합니다.
SKAdNetwork 포스트백 쪼개보기
그렇다면 전송되는 SKAdNetwork 포스트백은 어떤 정보를 포함하고 있을까요? SKAdNetwork 포스트백은 아래 예시와 같이 json 형식으로 전송됩니다.
{
"version": "4.0",
"ad-network-id": "com.example.adnetwork",
"campaign-id": 42,
"transaction-id": "12345678-1234-1234-1234-1234567890ab",
"app-id": 1234567890,
"attribution-signature": "abcdef123456...",
"redownload": false,
"source-app-id": 987654321,
"conversion-value": 12,
"coarse-conversion-value": "high",
"fidelity-type": 1,
"did-win": true,
"postback-sequence-index": 0,
"source-identifier": 5678
}
- version: SKAdNetwork의 버전 (2024년 12월 기준, 4.0까지 제공)
- ad-network-id: 광고 네트워크(매체)의 식별자
- campaign-id: 광고 네트워크가 설정한 캠페인 식별자
- transaction-id: 해당 전환 건에 대한 고유 식별자
- app-id: 설치된 앱의 App store ID
- attribution-signature: Apple 측에서 생성한 성명으로 포스트백의 무결성(integrity)를 검증하는데 사용됨
- redownload: 사용자가 이전에 앱을 설치한 이력이 있는지 확인함
- source-app-id: 광고를 표시한 퍼블리셔 앱의 App store ID
- conversion-value: fine conversion 값. 세분화된 전환 값으로 6 bit (0~63) 사이의 값을 가짐.
- coarse-conversion-value: coarse conversion 값. high / medium / low 값 중 하나를 가짐.
- fidelity-type: 광고 유형을 나타냄 (0은 view-through type, 1은 storekit-rendered ads)
- did-win: 이 광고 네트워크가 설치에 기여했는지 여부를 나타냄
- postback-sequence-index: 해당 포스트백의 순서를 나타내며, 0은 첫 번째 포스트백을 의미함.
- source-identifier: 소스 식별자. 최대 4자리 숫자(4 digit)를 가짐.
json 내 위와 같은 필드들의 값을 통해 어트리뷰션 정보를 수집할 수 있습니다.
간단한 예시를 보여드리겠습니다.
앱 1234567890 의 광고주는 conversion-value=10을 '앱 내 상품 구매(purchase)'으로 사전 정의하였다고 가정할 때,
{
"version": "4.0",
"ad-network-id": "com.genie.adnetwork",
"campaign-id": 1234,
"transaction-id": "abcd1234-5678-90ef-ghij-klmnopqrstuv",
"app-id": 1234567890,
"attribution-signature": "signature_value",
"redownload": false,
"source-app-id": 172638190,
"conversion-value": 10,
"coarse-conversion-value": "high",
"fidelity-type": 1,
"did-win": true,
"postback-sequence-index": 2,
"source-identifier": 1234
}
- 이 유저는 com.genie.adnetwork라는 매체의 광고를 통해 앱을 최초로 설치하였고,
- 조회가 아닌 클릭 방식의 광고(캠페인 1234)를 통해 앱을 설치하였으며,
- 설치 이후 여러 건의 인앱이벤트가 발생하였지만 conversion value 값이 가장 높은 앱 내 구매 이벤트가 전환 값으로 인정받아 포스트백 데이터가 전송되었습니다.
위와 같이 유저를 특정할 수 없어 익명성이 보장되지만 매체 측의 기여 성과도를 측정할 수 있는 SKAdNetwork를 통해 CPI, CPA와 같은 앱 광고를 지속할 수 있습니다.
SKAdNetwork는 광고주 측 개발자가 이를 충분히 이해하고 사용할 수 있다면 자체적으로 관리하여도 무방합니다. 하지만 대부분 MMP(Mobile Measurement Platform)에서 제공하는 SKAN 관련 product를 통해 관리하는 것이 매체 광고를 집행하는데 있어 SKAdNetwork을 십분 활용할 수 있는 방법입니다.
Reference
- https://developer.apple.com/documentation/storekit/configuring-an-advertised-app
- https://developer.apple.com/documentation/storekit/receiving-postbacks-in-multiple-conversion-windows
- https://developer.apple.com/documentation/storekit/skadnetwork-4-release-notes