Гравець щойно програв на 10-му рівні — витратив 15 хвилин, злість і бажання кинути. Правильно розміщена Rewarded Ads перетворює цю фрустрацію на дохід без втрати лояльності. Але неправильна інтеграція руйнує баланс економіки та зменшує retention. Ми займаємося rewarded-інтеграцією 5+ років, реалізували 30+ проєктів для iOS та Android — від гіперказуальних до RPG. Один із кейсів: після налаштування continue-after-fail retention зріс на 12%, а eCPM збільшився на 25%. Середній ріст eCPM після нашого налаштування — 25-40% (наприклад, з $6 до $9 для одного з проєктів). Розберемо технічні нюанси та підводні камені.
Як вибрати placement для Rewarded Ads?
Placement — це точка в ігровому циклі, де в гравця виникає потреба, яку він готовий «оплатити» переглядом реклами. Найефективніші:
-
Continue after fail — конверсія 30–50% за умови, що гравець не бачив рекламу на цьому екрані раніше. Показуємо після
onGameOver, до екрану результатів. Ліміт: 1–2 рази за спробу. - Daily bonus multiplier — «дивись рекламу — отримай x3 до щоденної нагороди». Не порушує баланс, конверсія стабільно висока.
- Extra currency / chest unlock — конкретна пропозиція: «+50 gems» замість «бонус». Працює в головному меню або після рівня.
| Placement | Конверсія | Вплив на Retention | Рекомендований ліміт |
|---|---|---|---|
| Continue after fail | 30–50% | Нейтральний (при ліміті) | 1–2 за спробу |
| Daily bonus multiplier | 20–35% | Позитивний | 1 раз на день |
| Extra currency | 15–25% | Нейтральний | 3–5 разів на день |
Як технічно інтегрувати rewarded на Unity?
Використовуємо SDK AdMob (Google Mobile Ads) або IronSource (LevelPlay). Для AdMob ініціалізація:
private RewardedAd rewardedAd;
public void LoadRewardedAd()
{
var adUnitId = Application.platform == RuntimePlatform.Android ? "ca-app-pub-xxx/yyy" : "ca-app-pub-xxx/zzz";
RewardedAd.Load(adUnitId, new AdRequest(), (ad, error) =>
{
if (error != null)
{
Debug.LogWarning($"Rewarded load failed: {error}");
return;
}
rewardedAd = ad;
RegisterRewardedAdEvents(rewardedAd);
});
}
private void RegisterRewardedAdEvents(RewardedAd ad)
{
ad.OnAdFullScreenContentClosed += () =>
{
LoadRewardedAd();
};
}
public void ShowRewardedAd(System.Action<int> onRewarded)
{
if (rewardedAd == null || !rewardedAd.CanShowAd())
{
Debug.Log("Rewarded not ready");
return;
}
rewardedAd.Show(reward =>
{
onRewarded?.Invoke(reward.Amount);
});
}IronSource (LevelPlay) вимагає виклику IronSource.Agent.loadRewardedVideo() заздалегідь, а кнопку показувати тільки при IronSource.Agent.isRewardedVideoAvailable() == true.
void Start()
{
IronSource.Agent.loadRewardedVideo();
}
public void OnShowRewardedClicked()
{
if (IronSource.Agent.isRewardedVideoAvailable())
{
IronSource.Agent.showRewardedVideo();
}
}
private void OnRewardedVideoAdRewarded(IronSourcePlacement placement)
{
int rewardAmount = placement.getRewardAmount();
// нарахувати нагороду
} | SDK | SSV-підтримка | Простота інтеграції | eCPM (середнє) |
|---|---|---|---|
| AdMob | + (ECDSA) | Середня | $8-12 |
| Unity Ads | + | Проста | $6-10 |
| IronSource | + (LevelPlay) | Складна (потрібне налаштування waterfall) | $10-15 |
Чому серверна верифікація (SSV) обов'язкова?
Якщо rewarded дає тверду валюту (gems, crystals) — без SSV нагороди накручуються інструментами типу Frida за кілька хвилин. AdMob SSV обробляє callback швидше за IronSource, що знижує затримку нарахування на 200 мс. Схема:
- Клієнт передає
userIdта унікальнийnonceуcustomDataпри запиті реклами. - AdMob/IronSource включають їх у SSV-callback на ваш backend з ECDSA-підписом.
- Сервер перевіряє підпис, унікальність nonce (щоб один callback не пройшов двічі) та нараховує валюту.
Реалізація клієнта — 0.5 дня, серверна частина — 1 день з тестуванням.
Приклад обробки SSV-коллбеку на Python
from flask import Flask, request
from ecdsa import VerifyingKey
import json
app = Flask(__name__)
@app.route('/ssv_callback', methods=['POST'])
def ssv_callback():
data = request.json
signature = data['signature']
payload = data['payload']
vk = VerifyingKey.from_pem(open('public_key.pem').read())
if vk.verify(signature, payload.encode()):
# Перевірити nonce в Redis
return 'OK', 200
return 'Invalid signature', 400 Які ліміти показів ставити?
Ліміти мають бути на сервері, а не тільки на клієнті (PlayerPrefs скидаються). У проєкті з MMO-грою ми налаштували ліміти через Redis, щоб гарантувати унікальність nonce навіть при високому RPS. Типові: 5–10 rewarded/день для валюти, 1–2/день для continue. Жорсткий ліміт вбиває дохід, м'який — руйнує економіку. Рекомендуємо починати з 8 rewarded/день і A/B-тестувати крок у ±2. A/B-тестування дозволяє знайти баланс між доходом та економікою без ризику.
Як ми інтегруємо rewarded ads: покроковий процес
- Аудит поточної інтеграції (якщо є) та рекомендації щодо збільшення eCPM.
- Підбір placement під вашу ігрову економіку.
- Реалізація на Unity (AdMob, IronSource) або нативних SDK (iOS/Android).
- Налаштування SSV-бекенду (будь-який стек: Node.js, Python, Go).
- A/B-тестування placement та лімітів.
- Документація та 1 місяць підтримки.
Що ви отримуєте в результаті
Після завершення роботи ви отримуєте:
- Робочі rewarded placements з оптимізованим часом показу.
- Серверну верифікацію SSV із захистом від накруток.
- Документацію за ключовими скриптами та конфігами.
- Доступ до бекенд-коду для самостійного доопрацювання.
- 1 місяць технічної підтримки та консультацій.
Строки орієнтовно
Базова інтеграція з 2–3 placement та лімітами — від 2 днів. Із SSV та серверною логікою нагород — від 3 днів. Вартість розраховується індивідуально.
Замовте аудит вашої поточної інтеграції — оцінимо проєкт. Зв'яжіться з нами для консультації.







