Watch And Earn docs
v3.1.0
Live demoConsole demo Get help
● Monetise · Ads 3.1

Mediation and placements
more fill, every ad capped.

Version 3.1 can use several ad networks at once, either as a waterfall the app runs itself or through one mediator SDK. It also adds app-open, interstitial, banner, native and rewarded-interstitial placements. Every placement is off by default and capped in the console.

Waterfall or mediatorOff by defaultCaps per user and day

01Waterfall or mediator

Console → Mediation → How ads are filled. The app reads the choice from config/public.ads, so you can switch without a new build.

ModeWhat the app doesWhen to use it
Waterfall in the app (default)For each ad format the app tries the networks in the order you list (ads.waterfall.<format>). When a network has no fill or returns an error, the app moves to the next one. A network without ids, or without that format, is skipped (app/lib/ads/ad_service.dart, tests in app/test/ad_policy_test.dart).You have accounts with several networks and want a simple fallback without setting up mediation in a dashboard.
A mediator SDKEvery format goes to one SDK only: AdMob, AppLovin MAX or ironSource LevelPlay (Mediator setting). That SDK runs its own mediation or bidding.You prefer bidding inside one network. Add the other networks in that mediator's own dashboard. That setup is done in the network's dashboard, not in this package.
3.0 installs keep their network

When a waterfall list is missing or empty, the app uses [ads.network], the single network you chose in 3.0 (AdMob unless you changed it). A fresh 3.1 console writes admob as every list's default.

Which network has which format

From NETWORK_FORMATS in admin/src/manifest.ts. The console only asks for the unit ids a network has. A waterfall line that names a network without that format is skipped and shown on the Status page.

FormatAdMobAppLovin MAXUnity AdsironSource LevelPlay
Rewarded videoyesyesyesyes
Interstitialyesyesyesyes
Banneryesyesyesyes
App openyesyesnono
Nativeyesyesnono (see note)
Rewarded interstitialyesnonono
Native ads in the app: AdMob and AppLovin MAX

The app renders native ads with AdMob (Dart template) and AppLovin MAX (docs/CONTRACT-3.1.md §11). LevelPlay's SDK has native ads, but the app does not render them, so the console asks for no LevelPlay native unit ids. Put admob or applovin in the native waterfall.

02Set up a waterfall

  1. Enter the ids of each networkConsole → AdMob units, AppLovin MAX units, Unity Ads units, ironSource LevelPlay units. 3.1 adds the app-open, native and rewarded-interstitial unit fields where the network has that format.
  2. Order the networks per formatConsole → Mediation. Each Waterfall: … field takes one network per line, first tried first, using the names admob, applovin, unity, ironsource. Example for rewarded videos:
    applovin
    admob
    unity
  3. Set up rewarded-ad callbacks for every network in the listPoints are credited by whichever network calls back, so every network you use for rewarded videos needs its callback URL and secret (Callback URLs).
  4. Check the Status pageSkipped lines (unknown name, repeat, network without the format) are listed there.

03Placements and their defaults

Console → Ad placements. Every placement is off until you switch it on. The defaults and limits come from admin/src/manifest.ts and match docs/CONTRACT-3.1.md §1. Days are UTC.

PlacementSettingDefaultAllowed
App openApp-open adoff
Seconds between two (minimum)24030 to 86400
Most per day40 to 50
InterstitialInterstitial between screensoff
Every n-th natural break31 to 50
Seconds between two (minimum)12030 to 3600
Most per day120 to 100
BannerBanneroff
On these screenshome, tasks, historyhome, tasks, history, leaderboard, store, profile
NativeNative ads in listsoffLists: history, tasks, store
After every n-th list item62 to 100
Most per list30 to 20
Rewarded interstitialRewarded interstitial after a game resultoffAdMob only
Points per view50 to 10000
Seconds between two (minimum)30030 to 86400
Most per day60 to 100

Global caps

SettingDefaultAllowedMeaning
All full-screen ads: most per hour60 to 60App open, interstitial and rewarded interstitial together. Rewarded videos the user chooses are not counted.
No full-screen ads in the first seconds of a user's first session1200 to 3600Counted from launch, on the first app session of the install only.
No non-rewarded ads for VIP usersonVIP users and users who bought remove-ads see no app-open, interstitial, banner, native or rewarded-interstitial ads. Rewarded videos stay available because the user starts them.

These counters live on the device (app/lib/ads/ad_policy.dart). The rewarded-interstitial limits are also checked on the server when the app asks for an ad session.

0 means none

A cap of 0 means none, everywhere: most per day = 0 means that placement shows nothing that day, all full-screen ads: most per hour = 0 means no app-open, interstitial or rewarded-interstitial ads at all, and native: most per list = 0 means no native ads. The app (ad_policy.dart), the server's rewarded-interstitial cap (requestAdSession) and the web demo apply the same rule. Rewarded videos the user starts are not affected by these caps. To stop a placement, you can also simply switch it off.

04When each placement shows

From docs/CONTRACT-3.1.md §11 and app/lib/ads/ad_policy.dart:

  • App open shows when the app comes back to the foreground. It never shows right after another full-screen ad, a store sheet or the in-app browser.
  • Interstitial shows at a natural break (a game result, leaving a quiz, closing the mystery box) once every n-th break breaks have passed and the caps allow it.
  • Banner shows at the bottom of the screens you pick.
  • Native ads appear inside the history, tasks and store lists.
  • Rewarded interstitial is offered after a game result, behind an intro screen (below).
The 3.0 settings still work

Console → Ads still has Interstitial every n-th screen change and Banner on the home screen. The app uses them only when the matching 3.1 placement is absent from config/public. A 3.1 console always writes the placements, so use Ad placements from now on.

05The rewarded-interstitial intro rule

AdMob's rewarded-ads policy requires an introductory screen before a rewarded interstitial: it must offer a visible "no" option and give the user enough time to opt out. Skipping must not get in the way of normal use. Read the policy: AdMob policies for ad units that offer rewards.

How the app does it (RewardedIntroScreen in app/lib/ui/widgets/ad_widgets.dart):

  1. Intro screenAfter a game result the app shows the reward (points per view), a 5-second countdown and a No thanks button.
  2. Skip"No thanks" closes the screen. The offer then waits seconds between two before it can appear again. A skip does not count as a show.
  3. WatchWhen the countdown ends, the ad plays. Points are credited only by the network's server-side callback, like a rewarded video. The server checks most per day and seconds between two (requestAdSession with placement rewardedInterstitial). Credits use ledger type rewardedInterstitial.
Keep the intro

Do not remove the intro screen or hide the "No thanks" button. Do not add text that pushes users to watch (for example "watch to support us"). The policy forbids it.

06Turning placements on

  • Turn on one placement at a time and watch your retention on Revenue and growth before you add the next.
  • Ad networks and stores penalise disruptive ads. Keep the global hourly cap and the first-session grace.
  • Every network in a waterfall must be allowed in your consent setup. Add it to the ad partners list of your AdMob GDPR message (Consent).