사내 서비스에서 조만간 앱 가입 이벤트를 열기로 했다. 이벤트가 열리기 전에, 유저가 어떤 경로로 앱을 설치했는지 트래킹 해두는 기능이 있다면 이벤트 결과 지표에 도움이 될 수 있을 것 같았다.
그래서 Deferred Deep Link + 마케팅 트래킹
을 지원하는 링크 서비스들을 좀 찾아봤고, 그 중에 AppsFlyer
의 OneLink
서비스를 사용하기로 결정했다. 내 기준에 사용성이 괜찮았고, 무엇보다 Flutter SDK관련 지원이 잘 되어있는 것 같았다. 그래서 AppsFlyer를 사용해서 설치 유입 경로 트래킹 기능을 구축해봤고, 그 과정을 작성해보려고 한다.
OneLink
는 표준화된 기술 용어가 아니라, AppsFlyer만의 브랜드 네이밍이다.Deep Link + Deferred Deep Link + OS 분기 + 마케팅 트래킹 기능
을 하나로 패키징한 링크 서비스다.xxx.onelink.me
형태를 갖는다.앱이 설치되지 않은 상태에서 딥링크를 클릭한 사용자에게, 앱 설치 후에도 원래 딥링크의 목적지로 이동시키는 기술. 특정 링크를 통해 앱을 설치한 사용자들은 설치 후에도 유입된 링크의 목적에 따라 액션을 취해줄 수 있다.
다양한 딥링크 유입(Universal, App Link, URL Scheme, Deferred)을 SDK내부에서 하나의 콜백 규약으로 통합해서 앱에 전달하는 시스템
즉, 모든 링크들을 하나의 gateway에서 관리하는 규약(프로토콜) 및 방식을 칭한다.
사용자 OneLink 클릭
↓
디바이스에서 앱 설치 여부 확인
↓
(설치됨) → Universal/App Link → 앱 열림
(미설치) → 스토어 이동 → 설치 후 앱 열림
↓
앱 열림 → AppsFlyer SDK 트리거
↓
SDK가 딥링크 데이터 조회
↓
앱에 딥링크 데이터 전달 (onDeepLinking 콜백)
↓
앱에서 deep_link_value 파싱 → 이동 처리
"OneLink는 디바이스가 아니라 AppsFlyer 서버에 클릭 히스토리를 저장하고, SDK가 앱 실행 시 서버에 조회해서 데이터를 가져오는 구조이다."
대표적으로 4개의 링크 파라미터를 통해 관리한다.
pid
를 가질 수 있다.dev_kakao_invite
, prod_event_landing
등pid
) 안에 세부 캠페인을 구분하기 위해 사용landing_may
, event_0422
, abtest_group_b
af_subX
사용from_onelink
, signup_landing
등af_sub1=user_123
, af_sub2=campain_spring
https://graphic.onelink.me/abc123?
pid=prod_web_direct
&c=main_banner
&deep_link_value=ViewerPage
&af_sub1=1234(episodeId)
pid
(채널명): 웹에서 모바일로 직접 이동시키기 때문에 채널명을 <환경>_web_direct
로 명명campaign
: 그래픽 웹 내 어느 영역에서 클릭했는지 구분하기 위해 사용deep_link_value
: viewer 페이지로 이동시키기 위해 설정af_sub1
: episodeId 를 받아 파라미터로 활용하기 위해 설정AppsFlyer 대시보드 → Engage → OneLink Management → New Link
를 클릭해서 새로운 링크를 만들어준다. 카테고리를 선택한 뒤, 링크의 이벤트 이름(media source
) 을 넣어준다.
링크의 기본적인 값들을 세팅하는 단계이다. 위에서 설정한 media source
값을 다시 설정할 수 있고, campaign
값도 설정할 수 있다. (campaign 은 생략 가능) Retargeting
, Link branding
은 필요가 없어 따로 설정하진 않았다.
링크의 Preview가 필요한 경우 세팅. 별도로 필요가 없다면 스킵해도 된다.
실제 딥링크에 들어갈 변수값을 설정한다. 이 단계에선 deep_link_value
값과 deep_link_sub1
값을 설정하는데, 해당 변수들은 앱 내에서 분기 조건으로 사용되는 값이 된다.
앱 설치 여부에 따라 Redirect시킬 주소들을 넣는다.
iOS, Android에 설정한 OneLink의 주소로 Universal/App Link가 작동된다.
AppsFlyer는 등록한 앱의 Package Name(Android)과 App ID(iOS)에 해당하는 스토어 주소로 Redirect 시켜준다.
딥링크의 부가 파라미터 정보들을 담는 af_sub
값을 지정한다. Add parameter
를 클릭하면 드롭다운 옵션이 나온다.
void _setupDeepLinkingListener() {
_appsflyerSdk.onDeepLinking((DeepLinkResult result) {
Logger.log('AppsFlyerService onDeepLinking', type: LogType.deeplink);
if (_hasActiveListener) {
_deepLinkController.add(result);
} else {
_bufferedDeepLinks.add(result);
}
});
}
Deferred Deep Link
의 경우, 앱이 실행된 후 즉시 리스너가 동작할 수 있다. 만약 딥링크 콜백이 실행 된 순간에 아직 시스템이 온전하게 초기화 되지 않았을 경우, 딥링크 액션이 실행되지 않을 수 있다. Deferred
는 설치 후 딱 1회만 적용되기 때문에, 이런 누락 케이스가 발생 할 경우가 생기면 안된다.
따라서 정답은 아니지만, 딥링크가 누락 될 경우를 대비해 버퍼를 사용하여 들어오는 링크 정보들을 모두 저장한 후 시스템 초기화가 완전히 끝난 후 남아있는 딥링크 액션들을 처리해주는 방식을 사용하면 누락 위험을 줄여줄 수 있다.
Deferred Deep Link의 테스트가 어려운 이유는, 실제로 링크를 타고 스토어로 들어가 앱을 설치 후 실행시켜서 링크가 동작하는지 확인해봐야 하기 때문이다. 연동을 해보면서 개발 및 운영에서 간단하게 테스트 할 방법들을 찾았고, 아래에 방법들을 작성해봤다. (Test Documentation)
DeviceId
설치 후 로그인을 통해 IDFA
를 확인한다.테스터 디바이스로 등록되면, 앱을 지웠다 다시 깔아도 새로운 설치로 처리되기 때문에 Deferred Deep Link의 동작을 확인할 수 있다. 딥링크 이벤트를 수신 시, Sentry
혹은 GA
같은 이벤트 트래킹 툴을 사용하여 확인할 수 있다.
원래 개발 환경에서는 테스트를 할 수 없지만(스토어에 올라가있지 않기 때문에) 야매로 동작을 확인할 수 있는 방법이 있다. (Test Device가 등록되어있다는 가정 하에 진행)
onDeepLink
수신 확인IDFA(iOS), GAID(Android)
기준으로 같은 디바이스를 구분해서 "앱 설치 전 클릭"을 기억하고 있다가 Deferred로 연결한다.AppsFlyer OneLink
수신 시 Sentry에 Event를 적재시켰고, Sentry에서 확인 한 결과 Deferred와 일반 딥링크가 구분되어 로그가 적재되었다. 추후에 가입 이벤트가 생길 시 파라미터랑 캠패인을 잘 조합해서 유입 경로 및 마케팅 지표를 추적할 수 있게 되었다!