← Все инструкции

Meta: события приложения для рекламы в Facebook и Instagram

Шпаргалка: что и зачем настраивать в Expo-приложении, чтобы реклама в Meta Ads Manager видела установки, регистрации и покупки. Значения в примерах взяты из AiAstrology, в новом приложении подставь свои (таблица в самом конце). Google Analytics и Google Ads описаны отдельно в google-services.html.

Как всё связано

Приложение
→
Meta SDK
→
Приложение в Meta for Developers
→
Events Manager
→
Рекламный аккаунт

SDK отправляет события с App ID приложения. В Events Manager приложение называется набором данных (dataset). Чтобы реклама видела события, приложение и рекламный аккаунт должны лежать в одном бизнес-портфеле.

Бизнес-портфель
├── Приложение (App ID) ── события из SDK
├── Рекламный аккаунт ── реклама и оплата
└── Events Manager ── показывает события и передаёт их рекламе

Кто есть кто

Meta for Developersdevelopers.facebook.com: здесь создаётся приложение и берутся App ID и Client token.
App IDНомер приложения в Meta. По нему SDK понимает, чьи это события.
Client tokenКлюч, с которым SDK отправляет события. Зашит в приложение, секретом не считается.
Бизнес-портфельРаньше Business Manager. «Папка» бизнеса, где лежат приложение и рекламный аккаунт.
Events ManagerЭкран событий: какие пришли, тестовые события, настройки для iOS.
Ads ManagerГде создаётся и оплачивается реклама.
ATTЗапрос Apple «Разрешить отслеживание». Без согласия рекламный идентификатор (IDFA) на iOS не передаётся.
SKAdNetwork и AEMСпособы Apple и Meta считать установки и конверсии на iOS без IDFA.

Чек-лист для нового приложения

Шаги по порядку. Галочки сохраняются только в этом браузере.

Часть 1. Кабинет Meta
Зачем вообще. Реклама на установку приложения в Facebook и Instagram учится на событиях: кто установил после клика, кто прошёл онбординг, кто купил. Без SDK Meta не видит ничего, кроме кликов, и не может ни посчитать цену установки, ни показывать рекламу похожим людям.

1Создать приложение

Зачем: приложение в Meta даёт App ID и Client token, с которыми SDK отправляет события.
  1. developers.facebook.com → My Apps → Create App.
  2. Use cases: выбрать Create & manage app ads with Meta Ads Manager. Остальные не нужны: Marketing API — программное управление рекламой, Facebook Login — вход через Facebook.
Выбор use case: Create & manage app ads with Meta Ads Manager
  1. Business: если бизнес-портфеля нет, выбрать «I don't want to connect a business portfolio yet». Портфель понадобится в шаге 7, его можно подключить позже.
Шаг Business: портфель можно подключить позже
  1. Requirements → Overview → Create app. Откроется дашборд приложения.
Дашборд созданного приложения

2Основные настройки

Зачем: без ссылки на политику конфиденциальности приложение не опубликовать, а без платформ (шаг 3) Meta не свяжет события с приложением в сторах.

Слева App settings → Basic:

Блок Data Protection Officer: необязательный

3Платформы Android и iOS

Зачем: Meta сопоставляет события с приложением в сторе по package name и bundle ID. Store ID нужен, чтобы реклама вела в нужное приложение.

Внизу страницы Basic → + Add platform, выбрать Android, потом так же iOS.

Select platform: Android и iOS

Android

ПолеЧто указать
Package Namescom.kapernikrs.aiastrology (как expo.android.package)
Class namecom.kapernikrs.aiastrology.MainActivity
Key hashesПусто: нужны только для входа через Facebook
Log In-App Purchases Automaticallyвыключить
Log In-App Subscriptions Automaticallyвыключено
Install Referrer Decryption Key, testing instructionsПусто
Настройки платформы Android Переключатель Log In-App Purchases Automatically: должен быть выключен

iOS

ПолеЧто указать
Bundle IDcom.kapernikrs.aiastrology (как expo.ios.bundleIdentifier)
iPhone Store ID6756072533 — число из ссылки на приложение в App Store
iPad Store IDТот же 6756072533, если приложение поддерживает iPad
Log in-app events automaticallyвыключить
URL Scheme Suffix, Shared secret, testing instructionsПусто
Настройки платформы iOS
Почему автологирование покупок выключаем. Покупки отправляем сами, с ценой плана (шаг 6). Если оставить переключатели, Meta запишет каждую покупку ещё раз из App Store / Google Play, и в отчётах они задвоятся. Meta сама пишет об этом под переключателями.

После изменений — Save Changes внизу страницы.

4App ID и Client token

Зачем: оба значения вписываются в app.json, SDK без них не стартует.
App settings → Advanced → Security: Client token
Часть 2. Код приложения

5Meta SDK и плагин

Зачем: без нативного SDK события в Meta не отправить. Плагин при npx expo prebuild вписывает настройки в Info.plist и AndroidManifest.xml и сам добавляет SKAdNetwork-идентификаторы Meta (v9wttpbfk9, n38lu8286q): без них Meta не видит установки с iOS.
yarn add react-native-fbsdk-next

В AiAstrology стоит версия 13.4.3. app.json:

"plugins": [
  ["react-native-fbsdk-next", {
    "appID": "1903324957707462",
    "clientToken": "…",
    "displayName": "AiAstrology",
    "scheme": "fb1903324957707462",
    "isAutoInitEnabled": false,
    "autoLogAppEventsEnabled": true,
    "advertiserIDCollectionEnabled": false,
    "iosUserTrackingPermission": false
  }]
]
ОпцияЗачем
isAutoInitEnabled: falseSDK не стартует сам: запускаем его в коде после ответа на ATT
advertiserIDCollectionEnabled: falseДо ответа на ATT рекламный идентификатор не собирается
autoLogAppEventsEnabled: trueSDK сам пишет установку и запуски (Activate app)
iosUserTrackingPermission: falseПлагин не трогает текст запроса ATT, остаётся наш
schemefb + App ID, нужен SDK для ссылок

Потом пересобрать: npx expo prebuild и обычная сборка. В Expo Go SDK не работает.

6Запуск после ATT и отправка конверсий

Зачем: Apple требует не передавать рекламный идентификатор без согласия. А реклама учится на конверсиях под стандартными именами Meta, поэтому отправляем не все события, а только их.

Запуск после ответа на ATT

App.tsx: ответ на запрос ATT передаётся в startAnalytics, на Android ответа нет, поэтому там всегда true.

void ensureTrackingTransparencyPermission()
  .catch(() => undefined)
  .then((status) => startAnalytics({ trackingAllowed: status === 'granted' || status === 'unavailable' }));

В startAnalytics вызывается initMeta(trackingAllowed), в track() — reportMetaEvent(name, attributes) рядом с AppMetrica и Firebase, а при уходе приложения в фон — flushMeta().

src/services/analytics/meta.ts

Можно копировать в новое приложение, поменяв только имена своих событий:

import { Platform } from "react-native";
import { AppEventsLogger, Settings } from "react-native-fbsdk-next";
import { AnalyticsEvent } from "./events";

let isInitialized = false;

/** Starts the SDK after the ATT answer: on iOS the advertiser id is used only when tracking was allowed. */
export const initMeta = (trackingAllowed: boolean) => {
  if (isInitialized) return;
  try {
    if (Platform.OS === "ios") void Settings.setAdvertiserTrackingEnabled(trackingAllowed).catch(() => undefined);
    // Off in the native config until now, so nothing is collected before the ATT answer.
    Settings.setAdvertiserIDCollectionEnabled(trackingAllowed);
    Settings.initializeSDK();
    isInitialized = true;
  } catch (e) {
    if (__DEV__) console.warn("Meta SDK init failed", e);
  }
};

export const reportMetaEvent = (name: string, params: Record<string, string | number | boolean>) => {
  if (!isInitialized) return;
  try {
    if (name === AnalyticsEvent.OnboardingCompleted && !params.reentry) {
      AppEventsLogger.logEvent(AppEventsLogger.AppEvents.CompletedRegistration);
    } else if (name === AnalyticsEvent.PurchaseResult && params.result === "purchased") {
      const plan = String(params.plan);
      const currency = String(params.currency);
      if (Number(params.trial_days) > 0) {
        AppEventsLogger.logEvent(AppEventsLogger.AppEvents.StartTrial, {
          [AppEventsLogger.AppEventParams.ContentID]: plan,
          [AppEventsLogger.AppEventParams.Currency]: currency,
        });
      } else if (typeof params.price === "number") {
        AppEventsLogger.logPurchase(params.price, currency, { [AppEventsLogger.AppEventParams.ContentID]: plan });
      }
    }
  } catch (e) {
    if (__DEV__) console.warn("Meta logEvent failed", name, e);
  }
};

/** Sends buffered events now (e.g. when the app goes to the background and may be killed). */
export const flushMeta = () => {
  if (!isInitialized) return;
  try {
    AppEventsLogger.flush();
  } catch {
    // ignore
  }
};

Что уходит в Meta

Наше событиеВ MetaПочему
установка, запуск, сворачиваниеSDK шлёт самActivate app — это и есть установка для рекламы
onboarding_completed (не повторный)fb_mobile_complete_registrationСтандартное событие «регистрация»
покупка плана с пробным периодомStartTrialДенег ещё не заплатили, цену не передаём
покупка без пробногоfb_mobile_purchase с ценой и валютойПозволяет оптимизировать рекламу на выручку
все остальныене отправляютсяРекламе они не нужны, лишние данные в Meta ни к чему

Для покупок событие purchase_result несёт цену, валюту и длину пробного периода плана (price, currency, trial_days), их передаёт PaywallScreen.tsx. В Meta уходит только result = purchased.

Приватность: в Meta уходят только факты: событие, план, цена. Имена, даты рождения, места и тексты чатов не отправляются (правила в CLAUDE.md и ANALYTICS.md).
Часть 3. Связка с рекламой и проверка

7Бизнес-портфель и рекламный аккаунт

Зачем: пока приложение и рекламный аккаунт не в одном портфеле, события приходят, но реклама о них не знает и не может на них учиться.
  1. business.facebook.com → Create a business portfolio: название, имя, рабочий email. Если портфель уже есть, пропустить.
  2. В портфеле: Settings → Accounts → Apps → Add → Connect an app ID, вставить App ID.
  3. Там же Accounts → Ad accounts: добавить рекламный аккаунт, с которого будет реклама.
  4. Events Manager: приложение появится в Datasets. Открыть его → Settings → привязать рекламный аккаунт.

8Проверить события

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

Overview обновляется с задержкой от 20 минут до нескольких часов, поэтому сначала там «Inactive / Never received event». Это нормально.

Events Manager: Overview пока без событий

Test events показывает события в реальном времени. Открыть вкладку, затем запустить приложение (или закрыть и открыть снова).

Test events: ожидание событий

Как должно выглядеть: «Receiving activity» с вашим устройством, событие Activate app при открытии и fb_mobile_deactivate_app при сворачивании. Если пройти онбординг до конца, появится Complete registration.

Test events: события пришли

В AiAstrology события дошли с Android-эмулятора и iOS-симулятора. Покупку на эмуляторе не проверить, это делается тестовой покупкой на реальном телефоне.

Если пусто: закрыть приложение полностью и открыть снова, держа Test events открытым. В логах iOS (xcrun simctl spawn booted log show) должны быть запросы на ep1.facebook.com/v26.0/<App ID>/activities.

9iOS: Aggregated Event Measurement

Зачем: большинство пользователей iOS отказывают в отслеживании в запросе ATT. Для них Meta видит конверсии только через AEM и SKAdNetwork, и только по событиям, которым задан приоритет.

Events Manager → приложение → Settings (или раздел про iOS / Aggregated Event Measurement) → задать приоритет событий: покупка → пробный период → регистрация. Настраивать после того, как события начнут приходить.

10Приватность в сторах и политике

Зачем: ссылка на политику в сторах — это только одна часть. Отдельно есть анкеты о собираемых данных, и они должны совпадать с тем, что делают SDK, иначе Apple или Google могут не пропустить обновление.
ГдеЧто проверить
App Store Connect → App PrivacyPurchases → Purchase History (Analytics, Third-Party Advertising, используется для отслеживания); Identifiers → Device ID отмечен как используемый для отслеживания, цель Third-Party Advertising; у Usage Data / Advertising Data добавить цель Third-Party Advertising
Google Play Console → App content → Data safetyDevice or other IDs, App interactions, Purchase history — передаются третьим лицам для рекламы и аналитики
Политика конфиденциальностиНазвать Meta SDK и Google Firebase: они получают идентификатор устройства и события использования приложения для аналитики и измерения рекламы

App Privacy в App Store правится и публикуется без новой сборки. Лучше сделать до выхода версии с Meta SDK.

11Выпустить версию

Реальные установки и конверсии появятся в Meta только после выхода версии с SDK в App Store и Google Play. Рекламу запускать после этого. Для старта оптимизировать на установки или регистрацию, на покупки — когда их наберётся хотя бы несколько десятков в неделю.

Справочник

Значения AiAstrology

В новом приложении замени их на свои.

ЧтоЗначениеГде взять
Meta App ID1903324957707462App settings → Basic
Client tokenв app.jsonApp settings → Advanced → Security
Bundle ID / packagecom.kapernikrs.aiastrologyapp.json
Android Class namecom.kapernikrs.aiastrology.MainActivityandroid/app/src/main/java/…/MainActivity.kt
App Store ID6756072533ссылка на приложение в App Store
Privacy Policy URLhttps://webbro.org/aiastrology/privacy-policy.htmlPRIVACY_URL в src/constants/links.ts
Коммит761fb00Meta app events for Facebook / Instagram ads

Грабли, на которые уже наступали

СимптомРешение
В Privacy Policy URL указали terms-of-use.htmlНужна политика конфиденциальности: privacy-policy.html
Покупки в Meta задвоилисьВыключить автологирование покупок и подписок в настройках платформ (шаг 3)
В логе Android при старте «GraphRequest can't be used when Facebook SDK isn't fully initialized»Нормально: нативная часть обращается к SDK до того, как наш код запустил его после ATT. После запуска ошибок нет
Overview: «Inactive / Never received event»Overview обновляется с задержкой, смотреть Test events
Сборки падают с «no space left on device»Кончилось место на внутреннем диске: сборкам и эмулятору нужно 10–15 ГБ. Чистить ~/Library/Developer/Xcode/DerivedData и xcrun simctl delete unavailable
Поменял App ID или Client token, ничего не изменилосьНужны npx expo prebuild и пересборка нативного приложения, Metro reload не поможет