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

SKAN и AdAttributionKit: как оценивать рекламу на iPhone без IDFA

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

В сентябре Meta принесла приложению доставки продуктов 4 000 установок, из них 1 500 на iPhone, и на iPhone ушло 750 000 ₸ (приложение то же, что в уроке про MMP на практике, цифры условные). 7 октября маркетолог открывает AppsFlyer, чтобы посчитать первые заказы из Meta на iPhone, и видит три числа установок: 300, 1 400 и 1 500. В одном отчёте заказов почти нет, в другом у пятой части записей пусто там, где должно стоять значение. Сломанного здесь ничего нет. Если человек отказал в отслеживании, MMP, скорее всего, не сопоставит его установку с кликом, и о таких установках рекламная сеть узнаёт от самой Apple: позже, сводно и с теми подробностями, какие Apple решит отдать.

SKAdNetwork или AdAttributionKit

Атрибуцию без отслеживания у Apple делают два фреймворка. SKAdNetwork (SKAN) работает с App Store. AdAttributionKit появился в iOS 17.4 и работает ещё и с альтернативными магазинами приложений, а на странице SKAdNetwork Apple прямо советует брать для рекламы приложений AdAttributionKit (SKAdNetwork, AdAttributionKit). Разрешение ATT не нужно ни тому, ни другому.

Окна конверсии, уровни детализации и сами значения у них одинаковые, и работают они вместе (совместимость двух фреймворков):

  • из показов обоих фреймворков система выбирает одного победителя: клик важнее показа, среди кликов побеждает последний, и всего рассматривается не больше шести показов;
  • когда приложение обновляет значение через SKAN, система повторяет вызов в AdAttributionKit;
  • идентификатор рекламной сети подходит к обоим фреймворкам.

Окна атрибуции у обоих по умолчанию тоже одни: 30 дней от клика до установки и 24 часа от показа (атрибуция рекламы у Apple). В примере из урока про MMP у Meta в AppsFlyer окно на клик 7 дней, поэтому установка через десять дней после клика у Apple вполне может достаться Meta, а в обычной атрибуции MMP уйдёт в органику.

Каким фреймворком подписана реклама, решает сеть, поэтому этот вопрос задают сетям и MMP. У AdAttributionKit два отличия, которые касаются маркетолога:

  • Настройка окон. С iOS 26 приложение может поменять окна в Info.plist: клик от 1 до 30 дней, показ от 1 до 7, для всех сетей сразу или для каждой отдельно. Там же задаётся пауза (cooldown) после установки или повторного открытия, в течение которой новые конверсии приложению не засчитываются (правила атрибуции, заметки к iOS 26).
  • Повторные открытия. С iOS 18 AdAttributionKit засчитывает рекламе открытие уже установленного приложения после клика: система открывает приложение по универсальной ссылке (Universal Link) и добавляет к ней параметр AdAttributionKitReengagementOpen (атрибуция и постбэки). Маршрутизатор из урока про диплинки должен этот параметр пропускать, а не считать ссылку неизвестной. Просмотр рекламы без клика повторного открытия не даёт, а число таких атрибуций Apple ограничивает в месяц на приложение и в год на устройство.

Что приходит в постбэке

Postback (постбэк) - подписанное Apple сообщение о том, что реклама сети привела к установке. В нём нет ни IDFA, ни ID пользователя. Остальное зависит от уровня данных (postback data tier). Apple определяет его по тому, сколько похожих установок набралось у этого приложения-площадки, у рекламируемого приложения, в этой стране и у этого идентификатора источника (постбэки в нескольких окнах):

  • на уровне 0 в первом постбэке только двузначный идентификатор источника, а второго и третьего не будет;
  • на уровне 1 добавляется грубое значение (coarse);
  • на уровне 2 точное значение (fine) и идентификатор источника до четырёх цифр;
  • на уровне 3 ещё и приложение, в котором показали рекламу, и страна.

Точное значение - число от 0 до 63, и что оно значит, решает приложение или сеть (значение конверсии). Грубое - low, medium или high, и смысл им тоже задаёте вы (грубые значения). В идентификаторе источника сеть передаёт сведения о кампании, и в двух цифрах их помещается меньше, чем в четырёх.

Отсюда практический совет. Чем больше установок приходится на одну рекламу, тем больше подробностей в постбэках, так что бюджет на iPhone не дробят на десятки групп объявлений: каждой достанется мало установок, и постбэки уйдут на нижние уровни. Страна тоже входит в расчёт уровня, поэтому на небольшом рынке вроде Казахстана подробности теряются быстрее, чем там, где у той же рекламы тысячи установок в день.

Ноль и пустое поле, как на схеме, - разные вещи. В схеме доставки 0 значит, что приложение записало первый запуск и больше ничего из схемы не случилось. Пустое поле значит, что Apple не отдала значение на этом уровне, а что человек делал в приложении, неизвестно.

Ноль и отсутствие значения

Схема приложения доставки из урока

  • Получен код 0

    Записан первый запуск

    Других действий из схемы не случилось

  • Поле пустое

    Apple не отдала значение на этом уровне

    Действия человека неизвестны

Код читают по схеме, пропуск не заменяют нулём.

Когда ждать данных

Значения обновляются в трёх окнах, считая от первого запуска. Когда окно закрылось, устройство отправляет постбэк со случайной задержкой: 24-48 часов для первого и 24-144 часа для второго и третьего (окна конверсии в AdAttributionKit). AppsFlyer обрабатывает постбэки раз в сутки: всё, что пришло за день, попадает в дашборд к 08:00 UTC следующего дня, то есть через 8-32 часа (руководство по SKAN в AppsFlyer).

ОкноДни после первого запускаЧто может быть в постбэкеЗадержка Apple после конца окнаВ AppsFlyer после первого запуска
Первое0-2Точное или грубое значение24-48 часовЧерез 80-128 часов
Второе3-7Только грубое24-144 часаЧерез 200-344 часа
Третье8-35Только грубое24-144 часаЧерез 872-1 016 часов

Окно можно закрыть раньше (lock window): тогда постбэк готовится сразу и уходит после той же задержки, а обновления до конца окна игнорируются. Второй и третий постбэк приходят, только если реклама подписана SKAN 4 или AdAttributionKit и приложение обновляло значение в этом окне. Они относятся к той же установке, и установками их не считают.

Для сентябрьской когорты это значит, что по людям, поставившим приложение 30 сентября, первое окно будет в AppsFlyer к 5 октября, а второе к 14-му. Отчёт, открытый 7 октября, первое окно по сентябрю уже показывает целиком, а второе ещё нет: кто из конца месяца заказал на третий-седьмой день, станет видно позже.

Схема значений для приложения доставки

Значения на телефоне ставит SDK AppsFlyer по схеме из SKAN Conversion Studio: Settings → SKAN Conversion Studio, режим SKAN 4 (Conversion Studio). Окна в AppsFlyer не пересекаются: второе измеряет только дни 3-7, а не 0-7. Поэтому для каждого окна сначала решают, на какой вопрос оно отвечает. У доставки так: сделал ли человек первый заказ и на какую сумму, заказывал ли что-то на 3-7-й день и заказывает ли дальше.

Окноlowmediumhigh
Первое, дни 0-2Открыл приложениеsign_upfirst_purchase
Второе, дни 3-7Открыл приложениеsign_upВыручка в окне больше нуля
Третье, дни 8-35Открыл приложениеОдин purchaseДва purchase и больше

Во втором окне high задан выручкой, а не двумя событиями: если в грубом значении несколько условий, AppsFlyer кодирует его, только когда случились все. Выручка больше нуля ловит и первый заказ, и повторный.

Точное значение первого окна отдают под выручку первого заказа и sign_up. Заказы, оплаченные курьеру, приходят в AppsFlyer с сервера, как в уроке про интеграцию SDK, и Conversion Studio учитывает и такие события. Но значение на телефоне обновится, только когда человек снова откроет приложение до конца окна. Заказ, который курьер закрыл, а человек приложение больше не открывал, в SKAN не попадёт. Дальше несколько правил AppsFlyer:

  • low - сессия. В первом окне это обязательно, во втором и третьем AppsFlyer это советует: без обновления значения в окне постбэка не будет.
  • Выручка в долларах. Диапазоны выручки AppsFlyer задаёт в USD, поэтому средний заказ 9 000 ₸ переводят по курсу и строят шкалу так, чтобы он попал в середину, а не в крайний диапазон. Если реклама идёт в Meta, диапазонов нужно не меньше четырёх.
  • Досрочное закрытие окна. Его можно включить по времени или по достижению high. Первый заказ тогда приходит в отчёт раньше, но второй заказ в те же дни значение уже не изменит, а время установки AppsFlyer оценит менее точно.
  • События в постбэках сети. События схемы должны быть сопоставлены в постбэках сети, а для Meta без этого SKAN-атрибуции на iOS 14.5 и новее не будет (FAQ AppsFlyer по Meta).

Если значения в отчётах не сходятся со схемой, AppsFlyer называет обычную причину: в приложении есть другой SDK, который тоже обновляет значения конверсии (ATT и SKAN в AppsFlyer). Если ради отложенных диплинков из Meta в приложение добавили SDK Meta, выясните у разработчика, не обновляет ли и он эти значения.

Дату каждого изменения схемы записывайте рядом с отчётом. Постбэки по установкам, закодированным старой схемой, приходят ещё несколько дней, и AppsFlyer предупреждает, что данные SSOT примерно 96 часов после изменения будут неточными. Схему не меняют посреди теста.

Три режима в AppsFlyer

В My Dashboards у метрик есть переключатель метода атрибуции: Classic, SKAN и SSOT (My Dashboards). Те самые три числа из начала урока:

РежимУстановки Meta на iPhoneКого считает
Classic300Установки, которые AppsFlyer связал с Meta по обычным правилам, без SKAN
SKAN1 400Все установки, где Apple отдала победу Meta, включая уже посчитанных в Classic
SSOT1 500Classic и SKAN без повторов

Складывать 300 и 1 400 нельзя: часть людей есть в обоих отчётах. Single Source of Truth убирает эти повторы так (руководство по SSOT). Если AppsFlyer сам атрибутировал установку, SDK ставит бит внутри точного значения, и в данных SKAN он виден как af_attribution_flag = true. Поэтому флаг есть только в постбэках с точным значением: из 600 таких он true у 150 и false у 450. Остальные 800 постбэков, с одним грубым значением или вовсе пустые, флага не несут, и SSOT распределяет их моделью. В сентябре модель отнесла к повторам ещё 50 из них. Итого 300 + 450 + 750 = 1 500 установок и 200 повторов, из которых 50 оценены моделью.

SSOT включают в Conversion Studio, и данные появляются через 3-5 дней. Если выбрать в отчёте SSOT, не включив его в Conversion Studio, цифры будут неверными. Деньги в режиме SKAN AppsFlyer показывает в долларах, даже если валюта приложения - тенге. Apple Ads на iPhone AppsFlyer атрибутирует в обычном режиме и без IDFA, поэтому строку Apple Ads из урока про MMP читают как обычно.

Как читать первые заказы, когда часть значений пустая

Первые постбэки по 1 400 установкам Meta на iPhone выглядят так:

Что в первом постбэкеПостбэковИз них с первым заказом
Точное значение60048
Только грубое50035 с high
Ничего300Неизвестно
Всего1 400Не меньше 83

Наблюдаемых первых заказов за первые два дня 83. Отсюда расход на первый заказ из Meta на iPhone: 750 000 ₸ / 83 = 9 036 ₸, и это верхняя граница. Заказов может оказаться больше, но меньше быть не может.

Коллега предлагает взять долю из первой строки, 48 / 600 = 8%, применить её ко всем 1 400 и записать в отчёт 112 первых заказов. Так делать нельзя. Уровень данных зависит от того, сколько установок набралось у источника, поэтому постбэки без значения идут от более мелких площадок и кампаний, и случайной выборкой из всех установок они не будут. Похожи ли эти 300 человек на остальных, по таблице не сказать. Модель SSOT для них можно показать, но отдельной строкой с пометкой «оценка».

Сравнивать 9 036 ₸ с расходом на первый заказ к D7 из урока про MMP тоже рано: здесь только первые два дня. Строка в отчёт может звучать так: «Meta, iPhone, сентябрь: по SKAN не меньше 83 первых заказов за первые два дня, расход на первый заказ не больше 9 036 ₸; оценка SSOT для 300 постбэков без значения приведена отдельно».

Перед тем как менять бюджет на iPhone

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

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

Упражнение: схема для своего приложения

Возьмите приложение клиента или сервис доставки из урока и подготовьте одну страницу.

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

Первым делом смотрят на колонку high. Если в первом окне high - это регистрация или добавление в корзину, отчёт SKAN будет считать именно их, и расход на первый заказ из него не получить. Потом посмотрите на low: если там не сессия, часть людей вообще не даст постбэк во втором и третьем окне.

Последняя проверка - строка отчёта. Если в ней одно число заказов без слов «не меньше» или «оценка», значит, в него смешались наблюдаемые постбэки и модель, и клиент примет оценку за факт. Как в примере с доставкой: 83 заказа видно в данных, 112 получились из предположения, что пустые постбэки ведут себя как заполненные.

Видео: основы SKAdNetwork

SKAdNetwork: Getting Started With The Basics

Вводный ролик AppsFlyer на английском, чтобы привыкнуть к терминам.

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