Гравець щойно програв на 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 днів. Вартість розраховується індивідуально.
Замовте аудит вашої поточної інтеграції — безкоштовно оцінимо проєкт. Зв'яжіться з нами для консультації.







