Meta: события приложения для рекламы в Facebook и Instagram
Шпаргалка: что и зачем настраивать в Expo-приложении, чтобы реклама в Meta Ads Manager видела установки, регистрации и покупки. Значения в примерах взяты из AiAstrology, в новом приложении подставь свои (таблица в самом конце). Google Analytics и Google Ads описаны отдельно в google-services.html.
Как всё связано
SDK отправляет события с App ID приложения. В Events Manager приложение называется набором данных (dataset). Чтобы реклама видела события, приложение и рекламный аккаунт должны лежать в одном бизнес-портфеле.
Бизнес-портфель
├── Приложение (App ID) ── события из SDK
├── Рекламный аккаунт ── реклама и оплата
└── Events Manager ── показывает события и передаёт их рекламе
Кто есть кто
Чек-лист для нового приложения
Шаги по порядку. Галочки сохраняются только в этом браузере.
- Заполнить основные настройкиполитика конфиденциальности, категория
- Выпустить версию в сторыдо этого реальных пользователей в отчётах не будет
1Создать приложение
- developers.facebook.com → My Apps → Create App.
- Use cases: выбрать Create & manage app ads with Meta Ads Manager. Остальные не нужны: Marketing API — программное управление рекламой, Facebook Login — вход через Facebook.
- Business: если бизнес-портфеля нет, выбрать «I don't want to connect a business portfolio yet». Портфель понадобится в шаге 7, его можно подключить позже.
- Requirements → Overview → Create app. Откроется дашборд приложения.
2Основные настройки
Слева App settings → Basic:
- Privacy Policy URL: именно политика конфиденциальности, не пользовательское соглашение. В AiAstrology:
https://webbro.org/aiastrology/privacy-policy.html(неterms-of-use.html). - Category: например Lifestyle.
- Data Protection Officer contact information — можно оставить пустым. Нужен только компаниям, которые по GDPR обязаны назначить ответственного за данные. Если заполнять, данные будут публично видны на Facebook.
3Платформы Android и iOS
Внизу страницы Basic → + Add platform, выбрать Android, потом так же iOS.
Android
| Поле | Что указать |
|---|---|
| Package Names | com.kapernikrs.aiastrology (как expo.android.package) |
| Class name | com.kapernikrs.aiastrology.MainActivity |
| Key hashes | Пусто: нужны только для входа через Facebook |
| Log In-App Purchases Automatically | выключить |
| Log In-App Subscriptions Automatically | выключено |
| Install Referrer Decryption Key, testing instructions | Пусто |
iOS
| Поле | Что указать |
|---|---|
| Bundle ID | com.kapernikrs.aiastrology (как expo.ios.bundleIdentifier) |
| iPhone Store ID | 6756072533 — число из ссылки на приложение в App Store |
| iPad Store ID | Тот же 6756072533, если приложение поддерживает iPad |
| Log in-app events automatically | выключить |
| URL Scheme Suffix, Shared secret, testing instructions | Пусто |
После изменений — Save Changes внизу страницы.
4App ID и Client token
app.json, SDK без них не стартует.- App ID — вверху страницы App settings → Basic.
- Client token — App settings → Advanced → Security → Client token. Остальные поля этого блока не трогать.
5Meta SDK и плагин
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: false | SDK не стартует сам: запускаем его в коде после ответа на ATT |
advertiserIDCollectionEnabled: false | До ответа на ATT рекламный идентификатор не собирается |
autoLogAppEventsEnabled: true | SDK сам пишет установку и запуски (Activate app) |
iosUserTrackingPermission: false | Плагин не трогает текст запроса ATT, остаётся наш |
scheme | fb + App ID, нужен SDK для ссылок |
Потом пересобрать: npx expo prebuild и обычная сборка. В Expo Go SDK не работает.
6Запуск после ATT и отправка конверсий
Запуск после ответа на 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.
CLAUDE.md и ANALYTICS.md).7Бизнес-портфель и рекламный аккаунт
- business.facebook.com → Create a business portfolio: название, имя, рабочий email. Если портфель уже есть, пропустить.
- В портфеле: Settings → Accounts → Apps → Add → Connect an app ID, вставить App ID.
- Там же Accounts → Ad accounts: добавить рекламный аккаунт, с которого будет реклама.
- Events Manager: приложение появится в Datasets. Открыть его → Settings → привязать рекламный аккаунт.
8Проверить события
Overview обновляется с задержкой от 20 минут до нескольких часов, поэтому сначала там «Inactive / Never received event». Это нормально.
Test events показывает события в реальном времени. Открыть вкладку, затем запустить приложение (или закрыть и открыть снова).
Как должно выглядеть: «Receiving activity» с вашим устройством, событие Activate app при открытии и fb_mobile_deactivate_app при сворачивании. Если пройти онбординг до конца, появится Complete registration.
В AiAstrology события дошли с Android-эмулятора и iOS-симулятора. Покупку на эмуляторе не проверить, это делается тестовой покупкой на реальном телефоне.
Если пусто: закрыть приложение полностью и открыть снова, держа Test events открытым. В логах iOS (xcrun simctl spawn booted log show) должны быть запросы на ep1.facebook.com/v26.0/<App ID>/activities.
9iOS: Aggregated Event Measurement
Events Manager → приложение → Settings (или раздел про iOS / Aggregated Event Measurement) → задать приоритет событий: покупка → пробный период → регистрация. Настраивать после того, как события начнут приходить.
10Приватность в сторах и политике
| Где | Что проверить |
|---|---|
| App Store Connect → App Privacy | Purchases → 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 safety | Device 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 ID | 1903324957707462 | App settings → Basic |
| Client token | в app.json | App settings → Advanced → Security |
| Bundle ID / package | com.kapernikrs.aiastrology | app.json |
| Android Class name | com.kapernikrs.aiastrology.MainActivity | android/app/src/main/java/…/MainActivity.kt |
| App Store ID | 6756072533 | ссылка на приложение в App Store |
| Privacy Policy URL | https://webbro.org/aiastrology/privacy-policy.html | PRIVACY_URL в src/constants/links.ts |
| Коммит | 761fb00 | Meta 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 не поможет |