Перейти к содержимому
Назад в Академию

MMP на практике: как настроить AppsFlyer и Adjust и прочитать первый отчёт

11.04Мобильная аналитика и атрибуция
Содержание статьи

Приложение доставки продуктов в Алматы и Астане получает около 10 000 установок в месяц из Meta, TikTok, Google и Apple Ads, и каждый десятый установивший делает первый заказ в первую неделю (цифры в уроке условные). В конце сентября маркетолог складывает отчёты четырёх кабинетов и получает 1 270 первых заказов, а AppsFlyer приписывает этим же сетям 1 000. Ошибки здесь нет: каждый кабинет считает по своим правилам, и один заказ легко попадает сразу в два.

Что делает MMP и как выглядит настройка AppsFlyer

MMP (mobile measurement partner) решает, какой рекламе засчитать установку приложения и всё, что человек сделал после неё. AppsFlyer и Adjust устроены похоже:

  • SDK внутри приложения сообщает MMP о первом запуске и о событиях вроде первого заказа. Установкой AppsFlyer считает именно первый запуск, а не скачивание из магазина (модель атрибуции AppsFlyer).
  • Рекламные сети сообщают о кликах и показах. Meta, Google Ads, TikTok и Apple Ads (до 2025 года Apple Search Ads) - самоатрибутирующиеся сети (SRN): MMP сообщает им о новой установке, и сеть сама заявляет её своей, если человек видел или нажимал её рекламу (как AppsFlyer работает с SRN).
  • Если установку заявили несколько сетей, MMP отдаёт её одной по общим правилам: клик важнее показа, установку получает последний клик в пределах окна атрибуции, а если кликов не было, последний показ. Остальные сети попадают в отчёт как помощники (assisted installs).
  • Дальнейшие события человека привязываются к тому же источнику и уходят в сети постбэками, чтобы алгоритмы учились на заказах, а не на установках.

В кабинетах общих правил нет: Meta засчитывает себе установки, не глядя на другие источники (расхождения AppsFlyer и Meta), остальные сети считают по своим окнам. Покупательница во вторник кликнула рекламу в Instagram, в четверг - в TikTok, установила приложение и вечером заказала продукты на 9 000 ₸. Заказ может оказаться в обоих кабинетах, а AppsFlyer отдаст его TikTok и покажет Meta помощником. Только общие правила позволяют сравнить сети между собой и связать каждую установку с выручкой, которую она потом принесла.

Настройка AppsFlyer на практике укладывается в шесть шагов, и каждый разобран ниже:

  1. Взять ключ разработчика (dev key) и встроить SDK в iOS- и Android-версии.
  2. Описать события first_purchase и purchase с суммой в тенге.
  3. Подключить рекламные сети и решить, какие события им отправлять.
  4. Выставить окна атрибуции и часовой пояс.
  5. Пройти одну тестовую покупку от телефона до кабинета сети.
  6. Открыть отчёт по сетям и посчитать расход на первый заказ.

Как MMP устроен изнутри и когда хватает одного Firebase, объясняет статья про AppsFlyer, Adjust и Firebase. Здесь только практика.

SDK и ключ разработчика

AppsFlyer узнаёт ваш аккаунт по dev key. Он лежит в Settings → App Settings → Dev Key Management, и его вместе с ID приложения отправляют разработчику (базовая интеграция SDK).

С iOS есть ловушка. Если приложение показывает запрос ATT, разработчик должен включить в SDK ожидание ответа (waitForATTUserAuthorization). Без него первый запуск уйдёт в AppsFlyer без IDFA, даже если человек нажмёт «Разрешить», и сети не смогут сопоставить установку с кликом по идентификатору.

Попросите разработчика передавать в SDK номер клиента, когда человек входит в аккаунт. В AppsFlyer это Customer User ID: он попадёт в сырые данные рядом с AppsFlyer ID, и по нему человека из MMP находят в базе клиентов.

В Adjust вместо dev key - токен приложения (app token) и окружение: sandbox для тестов, production для сборки, которая уходит в магазин (SDK Adjust для Android).

Первый заказ и выручка

Событий с выручкой два: first_purchase на первый заказ и purchase на каждый следующий. Отправляют их не по нажатию кнопки «Оформить», а когда сервер подтвердил оплату заказа. При оплате картой событие отправляет приложение. Заказ с оплатой курьеру засчитывается, когда курьер его закрыл, и тогда событие отправляет сервер, как в интеграции SDK. Первый это заказ или нет, приложению сообщает сервер: только он видит всю историю заказов. В том же релизе в AppsFlyer уходят регистрация sign_up и address_out_of_zone: по ним видно, где люди теряются до заказа. Весь план событий собран в in-app событиях.

Выручкой AppsFlyer считает только параметр af_revenue, и в отчётах, и в сырых данных. Валюту передают в af_currency трёхбуквенным кодом ISO 4217. Если валюту не передать, SDK примет сумму за доллары (события в Android SDK), и заказ на 9 000 ₸ превратится в отчёте в 9 000 долларов.

val eventValues = HashMap<String, Any>()
eventValues[AFInAppEventParameterName.REVENUE] = 9000
eventValues[AFInAppEventParameterName.CURRENCY] = "KZT"
AppsFlyerLib.getInstance().logEvent(applicationContext, "first_purchase", eventValues)

Свои имена событий не должны начинаться с af_, это префикс встроенных событий AppsFlyer (правила имён).

В Adjust порядок обратный. Событие сначала создают в интерфейсе (AppView → All apps → приложение → Events → Add event), и Adjust выдаёт ему токен (как добавить событие). В код уходит токен, а сумма задаётся через setRevenue(9000.0, "KZT") (события в SDK Adjust). Так что новое событие в Adjust не появится, пока кто-то с доступом к интерфейсу его не заведёт.

Рекламные сети и постбэки

В AppsFlyer сети подключают в Collaborate → Partner Integrations: находите сеть, нажимаете Integrate и включаете Activate partner (настройка партнёра). Переключатель не трогают всё время работы с сетью, а паузу ставят в кабинете: AppsFlyer предупреждает, что отключение интеграции может необратимо навредить идущим кампаниям.

Каждой сети нужен свой ключ. Для Meta это Facebook App ID (интеграция с Meta), для Google Ads - идентификатор связи, Link ID (интеграция с Google Ads). Его создаёт администратор в самом Google Ads: «Инструменты» → «Менеджер данных» → «+ Подключить продукт» → «Сторонняя аналитика приложений» → «Создать идентификатор связи» (Tools → Data manager → + Connect Product → Third-party app analytics → Create link ID, как создать идентификатор связи). Четырём сетям из примера трекинговая ссылка не нужна, они SRN, а для остальных её создают на вкладке Attribution link.

Дальше блок In-app event postbacks, где вы решаете, что сеть узнает о заказах:

  • first_purchase сопоставляют с событием покупки в сети, иначе сеть его не получит. Имена различаются по регистру: First_Purchase и first_purchase для AppsFlyer разные события, поэтому их копируют из таблицы событий.
  • В поле including выбирают Values & revenue. С другими вариантами сеть получит заказ без суммы и не сможет оптимизироваться на выручку.
  • В поле for users from выбирают, чьи события отправлять: только пользователей этой сети (This partner only) или всех, включая органику (All media sources including organic). Со вторым вариантом у алгоритма сети больше данных, но из-за него же сеть может засчитать себе заказ, который AppsFlyer отдал другой сети.

Интеграцию настраивают для каждого приложения: после сохранения переключитесь в Android-версию и повторите шаги.

В Adjust путь такой: Campaign Lab → Partners → New partner. Для Meta нужно ещё подключить Adjust как источник данных в Events Manager, без этого Meta не сможет заявить ни одной установки, которую видит Adjust. События, которые вы не сопоставили, Meta не получает (настройка Meta в Adjust).

Окна атрибуции и часовой пояс

Окно атрибуции - это сколько времени может пройти от клика или показа до первого запуска, чтобы установку засчитали сети. По умолчанию у AppsFlyer 7 дней на клик (можно от 1 до 30) и 1 день на показ (модель атрибуции AppsFlyer), у Adjust 7 дней и 24 часа (окна в Adjust).

Для SRN AppsFlyer советует ставить окна, как у самой сети (модель атрибуции AppsFlyer). У Meta это 7 дней на клик и 1 день на просмотр (расхождения AppsFlyer и Meta), для Google Ads AppsFlyer рекомендует 30 дней на клик (интеграция с Google Ads). Обратная сторона: с окном в 30 дней Google получает установки, случившиеся через 8-30 дней после клика, а TikTok с окном в 7 дней такие уже не получит. Запишите окна каждой сети в отчёт, чтобы сравнение читали с этой поправкой.

Часовой пояс приложения в AppsFlyer по умолчанию UTC+0, и его можно поменять в настройках приложения (расхождения AppsFlyer и Meta). А часовой пояс Google Ads после создания аккаунта не меняется (часовой пояс в Google Ads). Поэтому подстройте под кабинеты часовой пояс приложения в AppsFlyer, а сдвиг для остальных кабинетов запишите в отчёт, иначе ночные и утренние заказы в MMP и в кабинете окажутся в разных днях.

Одна тестовая покупка до договора

Прежде чем включать рекламу, проведите один тестовый заказ на 9 000 ₸ до конца: first_purchase с суммой и валютой KZT в AppsFlyer, та же строка в сырой выгрузке Export → Raw Data Export (страница выгрузки) и покупка в Events Manager Meta. Тестовое устройство регистрируют и SDK проверяют по интеграции SDK, а если вы ещё выбираете MMP, пройдите ту же проверку на пробном доступе до договора.

Проверка тестового заказа до рекламы

Тестовый заказ: 9 000 ₸

  1. AppsFlyer

    first_purchase: сумма и KZT

  2. Сырая выгрузка

    Та же строка в Export > Raw Data Export

  3. Meta Events Manager

    Покупка дошла до сети

При выборе MMP пройдите ту же проверку на пробном доступе до договора.

Один тестовый заказ проверяют в MMP, сырой выгрузке и кабинете сети.

Какой отчёт открыть первым

Дашборд Overview, на который ссылаются старые инструкции, AppsFlyer закрыл 30 июня 2026 года, вместо него теперь My Dashboards (объявление AppsFlyer). Для Android откройте шаблон Performance Analysis, для iOS, если настроен Single Source of Truth, одноимённый шаблон (шаблоны My Dashboards). Сгруппируйте по источнику (media source), добавьте установки и уникальных пользователей first_purchase за период D7 с расчётом Cumulative. Расход возьмите из кабинетов.

СетьУстановки в AppsFlyerCPIРасходПервые заказы в кабинетеПервые заказы в AppsFlyer, D7Расход на первый заказ
Meta4 000500 ₸2 000 000 ₸5204005 000 ₸
TikTok3 000300 ₸900 000 ₸2101506 000 ₸
Google App campaigns2 000600 ₸1 200 000 ₸3603004 000 ₸
Apple Ads1 000900 ₸900 000 ₸1801506 000 ₸
Всего10 000500 ₸5 000 000 ₸1 2701 0005 000 ₸

Самые дешёвые установки у TikTok, но первый заказ оттуда стоит 6 000 ₸. У Google установка дороже, а первый заказ дешевле всех. Часть этого преимущества - окно 30 дней против 7 у TikTok. По одному месяцу не скажешь, хуже ли аудитория TikTok или его пользователи просто заказывают позже, поэтому перед тем как резать бюджет, дождитесь той же когорты на D30. Повторные заказы тоже смотрят в MMP: Meta показывает события в пределах 7 дней после клика, а AppsFlyer держит пользователя из Meta за источником до 180 дней (расхождения AppsFlyer и Meta).

Дальше две поправки:

  • Сверка с кабинетами. Период LTV и когорты D7 привязывают заказы к дате установки, а кабинет Meta считает по дате события. Для сверки с кабинетом переключите период на Actual (расхождения AppsFlyer и Meta).
  • iOS. Если согласия ATT нет хотя бы в одном из двух приложений, вашем или том, где человек увидел рекламу, сети не могут сопоставить установку с кликом по идентификатору, и в обычном дашборде такая установка, скорее всего, окажется в органике. Результат SRN на iOS AppsFlyer советует смотреть в дашборде SKAN или в Single Source of Truth (как AppsFlyer работает с SRN), подробнее в уроке про SKAdNetwork.

В Adjust те же цифры смотрят в Datascape, его отчётном разделе (Datascape).

AppsFlyer, Adjust или MyTracker

AppsFlyer публикует цены: на тарифе Growth первые 12 000 конверсий (атрибутированных установок и повторных вовлечений) в первый год бесплатны, дальше $0,07 за каждую, а сырые данные и Data Locker оплачиваются отдельно (тарифы AppsFlyer). При 10 000 установок из рекламы в месяц пакет закончится на второй месяц, дальше выходит около $700 в месяц. Условия Adjust и то, как каждый принимает серверные события, сравнивает статья про выбор MMP. Если в медиаплане есть VK Ads и Яндекс Директ, посмотрите и на MyTracker: в списке интеграций на сайте MyTracker есть обе площадки, а базовый тариф у него бесплатный.

Задание: техзадание на подключение MMP

Возьмите приложение, с которым работаете, или приложение доставки из урока и соберите на одной странице техзадание для разработчика и маркетолога:

Выполнено 0 из 5

И напишите абзац для владельца приложения, который увидел в кабинетах 1 270 первых заказов, в вашем отчёте 1 000, и спрашивает, куда делись 270 и какая сеть врёт.

Заказы никуда не делись, и никто не врёт. Каждая сеть заявляет установку по своим данным, в том числе по показу, и не смотрит, был ли клик в другой сети. Заказ человека, который видел рекламу в двух сетях, сидит в двух кабинетах. AppsFlyer отдаёт каждый заказ одной сети по общим правилам, поэтому складывать и сравнивать сети можно только по нему. Его итог сверяют с системой заказов: первых заказов у тех, кто установил приложение в сентябре, там должно быть не меньше 1 000, ведь туда попадают и органические установки, а если меньше, ищите дубли событий. И ещё одно: атрибуция говорит, какой сети засчитан заказ, но не говорит, случился бы он без рекламы. Это отдельный вопрос, о нём урок про модели атрибуции.

Видео: зачем брендам MMP

Why Brands Need a Mobile Measurement Partner (MMP)

Ролик от AppsFlyer на английском: зачем нужен посредник между приложением и рекламными сетями.

Нужна помощь с аналитикой вашего проекта?