Налаштування SKAdNetwork для атрибуції встановлень iOS-додатку
Ми часто стикаємося з ситуацією, коли після інтеграції SKAdNetwork рекламні кампанії втрачають до 30% атрибуції — просто тому, що забули додати ID мережі в Info.plist або не налаштували conversion value. Наш досвід показує: правильна конфігурація з першого разу скорочує час запуску на 2–3 дні та економить до 40% бюджету на тестові кампанії. SKAdNetwork в 3 рази безпечніший для користувачів, ніж традиційна IDFA-атрибуція, але вимагає точного налаштування. Отримайте консультацію з налаштування SKAdNetwork вже сьогодні, щоб не втрачати встановлення.
Після iOS 14.5 Apple прибрала прямий доступ до IDFA без явної згоди користувача. Замість детермінованої атрибуції через рекламний ідентифікатор Apple ввела SKAdNetwork — агрегований механізм, де постбеки відправляються безпосередньо в рекламну мережу без передачі даних про пристрій. Налаштувати це не складно — але зрозуміти, що саме робити і в якому порядку, займає час. Ми гарантуємо, що з нашою допомогою ви уникнете типових помилок.
Як працює SKAdNetwork
Ланцюжок атрибуції виглядає так:
- Рекламна мережа підписує показ реклами своїм SKAdNetwork ID
- Користувач клікає та встановлює додаток
- iOS реєструє встановлення та запускає таймер
- Додаток викликає
updateConversionValue(_:) — передає 6-бітне значення (0–63), що кодує дію користувача
- Apple відправляє постбек рекламній мережі — без user_id, без IDFA, тільки aggregate-дані кампанії
Згідно з Apple SKAdNetwork documentation, затримка постбека — від 24 до 72 годин. Це не баг, це архітектурне рішення Apple для захисту приватності.
Що потрібно зробити в додатку?
Додати SKAdNetwork IDs в Info.plist
Кожна рекламна мережа має унікальний SKAdNetwork ID. Їх потрібно прописати в Info.plist вашого додатку — інакше Apple не зарахує атрибуцію від цієї мережі:
<key>SKAdNetworkItems</key>
<array>
<!-- Google UAC -->
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cstr6suwn9.skadnetwork</string>
</dict>
<!-- Meta (Facebook) -->
<dict>
<key>SKAdNetworkIdentifier</key>
<string>v9wttpbfk9.skadnetwork</string>
</dict>
<!-- TikTok -->
<dict>
<key>SKAdNetworkIdentifier</key>
<string>gta9lk7p23.skadnetwork</string>
</dict>
<!-- AppLovin -->
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ludvb6z3bs.skadnetwork</string>
</dict>
</array>
Актуальний список з 200+ ідентифікаторів підтримують MMP-провайдери (AppsFlyer, Adjust) — їх можна вивантажити готовим plist-фрагментом.
Виклик updateConversionValue
Це найтонша частина. У вас є 6 біт (значення 0–63) для кодування поведінки користувача. Apple скине таймер на 24 години кожного разу, коли ви викликаєте updateConversionValue зі зростаючим значенням. Після того як таймер завершиться — постбек йде, значення зафіксовано.
import StoreKit
// Приклад простої схеми конверсії:
// 0–7: реєстрація (біт 0 = завершив онбординг)
// 8–15: перша дія (біт 3 = додав в корзину)
// 16–31: покупка (біт 4 = здійснив покупку)
func trackRegistration() {
if #available(iOS 14.0, *) {
SKAdNetwork.updateConversionValue(1) // 000001
}
}
func trackFirstPurchase(revenueLevel: Int) {
// revenueLevel 1–3 кодуємо в біти 1-2
let value = 16 | revenueLevel // 010001, 010010, 010011
if #available(iOS 14.0, *) {
SKAdNetwork.updateConversionValue(value)
}
}
Правило: значення має бути строго зростаючим. Якщо викликати updateConversionValue(5) після updateConversionValue(10) — виклик ігнорується. Це обмеження SKAdNetwork 1.0–2.x.
Як упакувати максимум сенсу в 6 біт conversion value?
Стандартний підхід — розділити 6 біт на два поля:
| Біти |
Призначення |
Приклад значень |
| 5–4 (старші) |
Подія-тригер |
00=install, 01=registration, 10=first_purchase, 11=repeat_purchase |
| 3–0 (молодші) |
Revenue bucket |
0=$0, 1=$0–5, 2=$5–20, 3=$20–50, ..., 15=$500+ |
При такій схемі рекламна мережа отримує не просто «встановлення», а «користувач здійснив першу покупку в діапазоні $5–20». Google UAC може оптимізувати кампанію саме під таких користувачів. SKAdNetwork в цьому плані кращий, ніж чиста IDFA-атрибуція, за приватністю, але вимагає додаткового налаштування. За оцінками, невірна конфігурація conversion value коштує рекламодавцям в середньому $5 000–$15 000 щомісячних втрат.
Як правильно тестувати SKAdNetwork?
Apple надає SKAdNetwork TestKit для емуляції постбеків. Ми використовуємо його на кожному проєкті — це дозволяє відловити помилки схеми на етапі розробки, а не після запуску кампанії. Тестувати потрібно з різними значеннями conversion value і перевіряти, що постбек приходить з правильним кодом.
Повний список популярних SKAdNetwork ID
| Мережа |
SKAdNetwork ID |
| Google Ads |
cstr6suwn9.skadnetwork |
| Meta |
v9wttpbfk9.skadnetwork |
| TikTok |
gta9lk7p23.skadnetwork |
| AppLovin |
ludvb6z3bs.skadnetwork |
| Unity Ads |
4DZT52R2T5.skadnetwork |
| Snapchat |
8s468mfl3y.skadnetwork |
| Twitter |
9rd848q2bz.skadnetwork |
| Pinterest |
5lm9lj6jb7.skadnetwork |
Поширені помилки
Не додані всі SKAdNetwork IDs. Якщо ID мережі відсутній в Info.plist — Apple не відправить постбек цій мережі, і атрибуція з неї не працює. Рекламна мережа бачить встановлення як неатрибутовані.
Conversion value не оновлюється. Багато команд викликають SKAdNetwork.registerAppForAdNetworkAttribution() (застарілий метод з SKAdNetwork 1.0) і забувають про updateConversionValue. В результаті постбек йде з нульовим значенням — рекламна мережа знає про встановлення, але не про активність користувача.
Схема conversion value не узгоджена з рекламною командою. Технічна інтеграція зроблена, але маркетинг не знає, що означає значення 17 в постбеку. Декодування conversion value потрібно документувати і налаштовувати в MMP-дашборді.
Що входить в роботу
- Збір актуального списку SKAdNetwork IDs під використовувані рекламні мережі
- Проектування conversion value schema під продуктові події
- Інтеграція
updateConversionValue в ключових точках додатку
- Налаштування декодування в AppsFlyer / Adjust
- Тестування через SKAdNetwork TestKit
Строки
Орієнтовно від 3 до 5 днів з урахуванням проектування conversion value schema та тестування. Вартість розраховується індивідуально після аналізу рекламних каналів. Наша команда має 8+ років досвіду в iOS-розробці та більше 50 успішних інтеграцій SKAdNetwork — зв'яжіться з нами для консультації.
Аналітика мобільних застосунків: Firebase, Amplitude, AppsFlyer та атрибуція
Наша команда регулярно стикається з проектами, де аналітика вже «налаштована», але реальних інсайтів немає. Типовий приклад — стартап з 50k DAU: трекінг десятків подій без жодної відповіді на питання «чому користувачі не доходять до оплати». За два тижні ми побудували базову воронку і з'ясували, що 70% аудиторії відвалюється на екрані верифікації номера телефону. Після локалізації бага retention зріс на 12%. Висновок: аналітика повинна починатися з конкретних питань, а не з трекінгу всього підряд.
Чому таксономія подій — основа аналітики мобільних застосунків?
Firebase Analytics, Amplitude, Mixpanel — технічно схожі. Різниця в тому, що ви в них кладете. Типова помилка: події screen_view, button_tap_1, button_tap_2 без контексту. Через місяць ніхто не пам'ятає, що таке button_tap_2.
Правильна таксономія: об'єкт + дія + контекст. product_viewed, checkout_started, payment_completed з параметрами product_id, category, price, source. Це дозволяє будувати воронки, когортний аналіз та retention без додаткового трекінгу.
Ми фіксуємо naming convention у tracking plan — документі (Google Sheet або Amplitude Data Catalog), де описано кожну подію, її параметри та умови спрацьовування. Tracking plan синхронізується з командою аналітиків до початку розробки, а не після. Такий підхід гарантує, що через місяць дані залишаться інтерпретованими, а не перетворяться на звалище. Досвід впровадження на 50+ проектах підтверджує: при відсутності tracking plan вартість підтримки аналітики зростає у 2-3 рази за рахунок переробок.
Що обрати для аналітики мобільних застосунків: Firebase, Amplitude чи Mixpanel?
Таблиця нижче показує ключові відмінності трьох популярних платформ. Вибір залежить від бюджету, трафіку та завдань.
| Критерій |
Firebase Analytics |
Amplitude |
Mixpanel |
| Безкоштовний ліміт |
Безліміт (в рамках Spark-плану) |
До 10 млн events/міс |
До 1 тис. MTU/міс (Special) |
| Затримка даних |
До 24 годин (стандарт) |
Хвилини (real-time) |
Хвилини (real-time) |
| Воронки та когорти |
Базові воронки, обмежена кількість |
Глибокі воронки, Journeys, когорти |
Funnels, Retention, Insights |
| BigQuery-експорт |
Так (безкоштовно, сирі дані) |
Так (підписка) |
Так (Enterprise) |
| Session Replay |
Ні |
Є (iOS/Android SDK) |
Ні |
| Інтеграція з рекламою |
Google Ads (нативна) |
Через Universal Links |
Через партнерів |
Firebase Analytics — безкоштовно, глибока інтеграція з Google Ads, BigQuery-експорт для сирих даних. Обмеження: затримка даних до 24 годин, обмежені воронки. Для стартапів з Google Ads трафіком — перший вибір.
Amplitude — продуктова аналітика з акцентом на когорти та шляхи користувача. Journeys (колишній Pathfinder) показує реальні шляхи між подіями — не передбачувані воронки, а фактичні маршрути. Session Replay — запис сесій для UX-аналізу. Безкоштовний тир до 10 млн events/місяць достатній для більшості продуктів на старті.
Mixpanel — ближче до Amplitude, сильніший у сегментації в реальному часі. Insights, Funnels, Retention — базові інструменти, які закривають 90% аналітичних завдань продакта.
Більш формальні визначення цих платформ можна знайти у Wikipedia (Firebase) та Wikipedia (Amplitude).
Як вирішити проблему мультиканальної атрибуції з AppsFlyer?
Знати звідки прийшов користувач — окреме завдання. Firebase Attribution працює лише всередині Google-екосистеми. Для мультиканальної атрибуції (Facebook Ads, TikTok, Apple Search Ads, programmatic) потрібен MMP — Mobile Measurement Partner.
AppsFlyer — лідер ринку. OneLink — universal deep link, який працює на iOS та Android і коректно атрибутує встановлення з будь-якого каналу. Protect360 — вбудований захист від fraud (фейкові встановлення, click injection на Android). Adjust та Branch — конкуренти з подібним функціоналом. Branch сильний у deep linking; Adjust популярний у gaming.
Згідно з Apple, з iOS 14.5 застосунки повинні отримувати дозвіл користувача через ATT перед збором IDFA для відстеження. AppsFlyer використовує probabilistic matching (IP + user agent + timing) для цих користувачів — точність нижча, але краще ніж нічого. SKAdNetwork та Privacy Preserving Attribution надають агреговані дані від Apple із затримкою 24-72 години.
Як налаштувати crash-аналітику, щоб не пропускати баги?
Firebase Crashlytics — стандарт для crash reporting. Автоматично групує креші за стектрейсом, показує affected users %, velocity alerts при зростанні crash rate більш ніж на 10% за годину.
Важливо: символікація. На iOS .dSYM файли повинні автоматично завантажуватися при кожній збірці — через Fastlane upload_symbols_to_crashlytics або Xcode Cloud built-in. Без символів креш у Crashlytics виглядає як набір адрес пам'яті. Це трапляється частіше, ніж здається при переході на новий CI — в одному проекті з аудиторією 500k користувачів ми виявили, що 40% крешів залишалися несимволізованими через пропущений етап у CI/CD. Після автоматизації час реакції на баги скоротився з 3 годин до 15 хвилин.
Для React Native та Flutter — @sentry/react-native та sentry_flutter дають додатковий контекст: breadcrumbs, мережеві запити перед крешем, стан Redux/Provider.
Нижче — порівняння популярних інструментів crash-аналітики для вибору під свої завдання.
| Критерій |
Firebase Crashlytics |
Sentry |
Instabug |
| Безкоштовний ліміт |
Безліміт (в рамках Spark) |
5k events/міс |
250 MAU |
| Групування |
За стектрейсом + параметри |
За fingerprint |
За стектрейсом + метадані |
| Символікація |
Автоматична (через файл) |
Автоматична (через CLI) |
Автоматична |
| Velocity alerts |
Так (за % зміни) |
Так (за кількістю) |
Так (за порогом) |
| Дод. контекст |
Logs, Keys, Custom Keys |
Breadcrumbs, User, Tags |
User steps, мережеві запити |
| Ціна |
Безкоштовно (у Firebase) |
Від $26/міс (Team) |
Від $99/міс |
Налаштування оточення
Три оточення з окремими Firebase проектами: dev, staging, production. Змішувати аналітику з тестових сесій і production — поширена помилка, яка спотворює всі метрики. На iOS через GoogleService-Info.plist для кожної схеми, на Android через google-services.json у папці кожного flavor.
Терміни: базова аналітика з Firebase + Crashlytics — 3-5 днів. Повноцінний tracking plan + Amplitude/Mixpanel з воронками та когортами — 2-3 тижні. Атрибуція через AppsFlyer з deep linking та fraud protection — 1-2 тижні. Вартість розраховується індивідуально залежно від складності інтеграцій.
Що входить у нашу роботу
В рамках впровадження аналітики ми надаємо:
- Розробку та узгодження tracking plan з командами продукту та маркетингу.
- Інтеграцію SDK (Firebase, Amplitude, Mixpanel, AppsFlyer) з урахуванням вашого стеку (Swift/Kotlin/Flutter/React Native).
- Налаштування воронок, когорт, дашбордів та алертів.
- Автоматизацію символікації та завантаження .dSYM через Fastlane.
- Документацію щодо подій та параметрів.
- Навчання команди роботі з аналітичною платформою.
- Два тижні пост-релізної підтримки та коригування трекінгу.
Наш досвід — 7 років впровадження аналітики та понад 80 успішних проектів у сфері мобільної розробки. Ми гарантуємо коректність даних і прозорість кожного етапу.
Зв'яжіться з нами, щоб отримати консультацію з налаштування аналітики вашого застосунку. Замовте аудит поточної аналітики — і ми покажемо, які метрики ви втрачаєте.