Як налаштувати кампанії з ROAS bidding (Alpha school)
Реальна конфігурація з 4076 кампаній Client Alpha. Без теорії — копіюємо налаштування 1-в-1.
TL;DR
Bid strategy: LOWEST_COST_WITH_MIN_ROAS (Min ROAS Goal в UI)
Optimization goal: VALUE (Maximize value of conversions)
Conversion event: Purchase (з value переданим)
Critical prerequisite: pixel ОБОВ’ЯЗКОВО передає value параметр у кожному PURCHASE event
Якщо value не передається — ROAS bidding не запрацює, Meta поверне error або відмовиться оптимізувати.
Дві бідингові школи у vendor
| Параметр | Alpha (ROAS school) | Beta (Bid Cap school) |
|---|---|---|
| % campaigns | 74% з MIN_ROAS | 75% з BID_CAP |
| Bid strategy | LOWEST_COST_WITH_MIN_ROAS | LOWEST_COST_WITH_BID_CAP |
| Optimization goal | VALUE (98%) | OFFSITE_CONVERSIONS (100%) |
| Pixel передає value? | Так — обов’язково | Ні (тільки event count) |
| Що ти контролюєш | Min ROAS (наприклад 1.2 = 120%) | Max CPC ($0.10) |
| Що Meta робить | Шукає юзерів які куплять багато | Шукає кліки в межах CPC |
| Коли вмикати | Високий маржинальний vertical (loans, finance) | Volume-driven vertical (jobs, services) |
| Мінімум spend для learning | $50/day на adset, 50+ purchases/тиждень | $10/day на adset, 5+ purchases/тиждень |
Правило: ROAS bidding працює коли є чіткий signal на purchase value. Search arb типово має фіксований RPC per click → можна fake’ати value = RPC × 1, або реальний value через postback.
Setup ROAS bidding — крок за кроком
Крок 1: Pixel має передавати value
В JavaScript коді на landing:
// На КОЖЕН purchase event:
fbq('track', 'Purchase', {
value: 0.45, // RPC value (фактичний або estimated)
currency: 'USD' // ОБОВ'ЯЗКОВО
});Source value:
- Реальний: пост-постбек з search feed wrapper (Visymo/SearchLabz передає реальний RPC за клік)
- Estimated: фіксована середня RPC по nicheу (наприклад $0.30 для jobs verticals в US)
Без value Meta не може оптимізувати під ROAS — кампанія застрягне у learning.
Крок 2: Створення кампанії
В Ads Manager UI або API:
| Field | Value |
|---|---|
| Objective | Sales (OUTCOME_SALES) |
| Buying type | Auction |
| Special ad categories | None (або Credit якщо loans US) |
| Campaign budget optimization | OFF (ABO, як у vendor) |
| Bid strategy | LOWEST_COST_WITH_MIN_ROAS |
| Min ROAS goal | Залежно від маржі (див. таблицю нижче) |
Крок 3: Adset налаштування
| Field | Value |
|---|---|
| Conversion location | Website |
| Pixel | З нашого pool, ротуй |
| Conversion event | Purchase |
| Optimization goal | VALUE (98% Alpha adsets — саме це) |
| Daily budget | $50-100/day мінімум для ROAS learning ($10/day тут НЕ працює) |
| Schedule | 24/7 |
Крок 4: Targeting (як для bid caps — манул)
| Field | Value |
|---|---|
| Audience | Manual targeting only |
| Advantage Audience | OFF |
| Locations | Конкретний GEO |
| Age | 18-65 |
| Gender | All |
| Languages | За GEO |
| Detailed targeting | Empty |
| Custom Audiences | Empty |
Крок 5: Placements
Те ж саме що для Beta — FB+IG+Messenger+Threads, NO Audience Network, RELAXED brand safety, всі positions ON.
Min ROAS goal — як вибрати число
| Vertical | Margin зразковий | Min ROAS |
|---|---|---|
| Loans (high RPC, low conv rate) | 50-70% | 1.5-2.0 |
| Cosmetic procedures | 30-50% | 1.3-1.6 |
| Jobs (low RPC, high CTR) | 10-20% | 1.0-1.2 |
| Medical/Dental | 25-40% | 1.2-1.5 |
| Legal aid | 20-35% | 1.1-1.4 |
Правило: Min ROAS = (RPC / CPC) × 0.95 (95% від breakeven для запасу)
Приклад: якщо ваш target CPC $0.10 і RPC $0.20 → ROAS goal = (0.20 / 0.10) × 0.95 = 1.9
На старт ставимо нижче, в процесі підвищуємо. Якщо ROAS goal занадто високий — Meta отримає 0 impressions (нікого не знайде).
Real приклади з Client Alpha
Кампанія KAVS04451OA1WWCP03
- bid_strategy:
LOWEST_COST_WITH_MIN_ROAS - daily_budget: $10 (1000 cents)
- objective: OUTCOME_SALES
- Adset optimization: VALUE
- Pixel передає purchase value через postback з Visymo
Cost cap subgroup (1.6% adsets — 365 з 25,293)
Невелика частина adsets використовує COST_CAP strategy з конкретними bid amounts:
- $0.14, $0.35, $0.45, $0.59, $0.69, $0.75
- Optimization: OFFSITE_CONVERSIONS (не VALUE)
- Це гібрид: target CPA замість Min ROAS
Коли COST_CAP замість MIN_ROAS:
- Якщо value passback ще не налаштований
- Якщо vertical волатильний (Meta не може стабільно прогнозувати ROAS)
- Як safety net на нових account-ах перед переходом на ROAS
Що НЕ робити з ROAS bidding
❌ Бюджет $10/day на adset — недостатньо для learning. ROAS bidding потребує $50-100/day на adset мінімум, інакше Meta не зможе зібрати достатньо conversion data.
❌ Min ROAS > 3.0 на старт — Meta не знайде аудиторію, ad’и не пошлють impressions, кампанія “учиться” вічно. Стартуй з 1.0-1.5, нарощуй пізніше.
❌ Запуск без value у pixel — error “Pixel does not pass value parameter” або кампанія застрягне у learning.
❌ Зміна Min ROAS goal частіше ніж раз на 7 днів — Meta resets learning при кожній зміні bid strategy params.
❌ Mix VALUE + OFFSITE_CONVERSIONS optimization в одній кампанії — 98% adsets Alpha на VALUE, виняток рідкий. Дотримуйся одного.
Тестова стратегія — як вирішити чи ROAS school підходить нашій вертикалі
Тиждень 1-2: запусти 10 кампаній з BID CAP (Beta school) — bid cap $0.10, optimize OFFSITE_CONVERSIONS, $10/day budget кожна.
Тиждень 3-4: коли будуть 50+ purchases/тиждень на топ 3 акаунтах — copy-clone тих кампаній на ROAS bidding:
- bid strategy → MIN_ROAS, goal = 1.2
- optimization → VALUE
- budget → $50/day
- pixel value passback ON
Порівняй за 2 тижні:
- Cost per purchase
- Total purchases per $1000 spent
- Margin (RPC × purchases - spend)
Якщо ROAS виграє > 15% — перевести всі на ROAS school. Якщо ні — залишитись на BID CAP (як Beta).
Технічні вимоги до інфри (для розробника)
1. Postback endpoint на нашому tracker
Search feed (Visymo/SearchLabz) має зробити S2S постбек на наш endpoint після кожного клику на ad:
POST https://<наш-tracker>.com/postback
{
"click_id": "abc123", // з оригінального click
"value": 0.42, // RPC за цей клік (USD)
"currency": "USD",
"ad_id": "120209876543", // Meta ad_id
"fbclid": "fbclid_value"
}
2. Conversion API (CAPI) до Meta
Tracker має негайно forward’нути postback як PURCHASE event з value в Meta CAPI:
POST https://graph.facebook.com/v21.0/<pixel_id>/events
{
"data": [{
"event_name": "Purchase",
"event_time": <unix>,
"action_source": "website",
"user_data": {
"fbc": "fb.1.<unix>.<fbclid>",
"client_ip_address": "<ip>",
"client_user_agent": "<ua>"
},
"custom_data": {
"value": 0.42,
"currency": "USD"
},
"event_id": "<dedupe_id>" // = client-side fbq event_id для dedupe
}],
"access_token": "<system_user_token>"
}
3. Client-side fbq event як backup (deduplication)
На landing JavaScript fires те саме event:
const eventId = generateEventId(); // unique per click
fbq('track', 'Purchase', {
value: 0.42,
currency: 'USD'
}, { eventID: eventId });CAPI server-side event і client-side fbq event мають однаковий event_id → Meta дедупить, рахує як 1 event.
4. Pixel pool ротація
5+ pixels на старт. Кожна кампанія використовує конкретний pixel з pool. Postback handler знає який pixel прив’язаний до якого ad_id (з нашої БД).
Reporting — як читати ROAS у Meta
| Метрика | Що означає |
|---|---|
| ROAS | Покупки value / spend. Target ≥ Min ROAS goal. |
| Purchase ROAS | Те саме, тільки для purchase events |
| Cost per Purchase | spend / purchases. |
| Conversion value | Сума всіх values переданих у postback |
Якщо ROAS у звіті < Min ROAS goal:
- Перевір чи value передається (DevTools на landing → fbq events)
- Перевір чи CAPI postbacks приходять (CAPI Events Manager → Activity)
- Перевір deduplication (events не повинні дублюватись 2x)
- Якщо все ОК — Meta потребує ще learning часу (7-14 днів)
Коротко на пам’ять
Beta school: bid cap $X, OFFSITE_CONVERSIONS, ти контролюєш CPC. Volume-driven.
Alpha school: MIN_ROAS goal, VALUE optimization, Meta контролює quality. Margin-driven.
Наш план MVP: стартуємо з Beta (простіше). Через 4-6 тижнів коли postback працює і є purchase value data — переключаємо частину на Alpha school для high-margin verticals.
На основі: 4076 ROAS-bidding campaigns + 24,880 VALUE-optimized adsets з Client Alpha (account: Alpha), $191K spend за останні 6 місяців.