Игрок только что проиграл на 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 дней. Стоимость рассчитывается индивидуально.
Закажите аудит вашей текущей интеграции — бесплатно оценим проект. Свяжитесь с нами для консультации.







