Watch And Earn docs
v3.1.0
Live demoConsole demo Get help
● Monetise · Measured numbers only

Revenue centre
what was measured, nothing estimated.

Console → Revenue and growth shows revenue that was actually recorded, with a reference for each event, plus DAU, ARPDAU, day-1 and day-7 retention and a sign-up funnel from real events. Anything not measured is labelled 'not measured' and never guessed.

revenueEventsARPDAUD1 / D7Funnel

01Measured, or "not measured"

Revenue comes only from revenueEvents, one document per realised event with a reference (docs/CONTRACT-3.1.md §6, admin/src/growth.ts). There is no estimate anywhere: no eCPM guess, no projected income. An event without an amount is not counted, and the page says how many there were and from which source. Currencies are listed separately and never converted.

The demo console has no revenue

The public read-only demo runs on sample data and shows "Revenue: not measured", not even sample revenue. Your own console shows what your backend recorded.

02Sources and what each needs

Source in the consoleWritten byNeedsReference
Store purchases (VIP, remove ads, boosters, packs)verifyPurchase, first verification of each orderThe store must report a price. App Store: the signed transaction's price and currency. Google Play: Order.total from the Orders API, which needs "View financial data" for the Functions service account (set up). Otherwise the event has no amount ("price not reported").iap_{platform}_{orderId}
Offerwalls, SurveysThe ow* postback functionsA provider that sends its payout in USD. Reversals are negative.{offerwall|survey}_{provider}_{txid}
Sponsor bookingsTrigger onSponsorWriteA booking amount on the sponsor (Sponsors).sponsor_{sponsorId}
Ad networks (reporting API)Scheduled pullAdReports, daily at 12:00 UTC, for yesterdayAn AppLovin MAX Report Key and/or the AdMob API connection (below). Without them: "Ad revenue: not measured".ads_reporting_{applovin|admob}_{YYYY-MM-DD}
Unity Ads and ironSource LevelPlay revenue are not pulled

Only AppLovin MAX and AdMob reporting are implemented (firebase/functions/src/adreports.ts). Revenue served through Unity Ads or LevelPlay stays in those dashboards and does not appear here. If you use AdMob or MAX as the mediator, their report covers what they mediated, as far as that network reports it.

03Connect AppLovin MAX reporting

  1. Copy the Report KeyAppLovin dashboard → Account → Keys → Report Key (not the SDK key or the Event Key).
  2. Paste itConsole → Revenue reporting → AppLovin MAX Revenue Reporting API key (owner only, write-only). Press the field's Test button: it requests one day from r.applovin.com/maxReport.
  3. Wait for the jobpullAdReports writes one event per day from the next run at 12:00 UTC.

API used: MAX Revenue Reporting API, columns=day,estimated_revenue. The network itself calls this figure an estimate. The console shows what the network reports.

04Connect AdMob reporting

The AdMob API uses OAuth. You need four values: the publisher id, an OAuth client id and secret, and a refresh token (firebase/README.md §4).

  1. Publisher idAdMob → Settings → Account information → Publisher ID (pub-…). Console → AdMob publisher id.
  2. Enable the AdMob APIIn the Google Cloud console of any project you own: APIs & Services → Library → AdMob API → Enable.
  3. OAuth consent screenAPIs & Services → OAuth consent screen. Add the scope https://www.googleapis.com/auth/admob.readonly. Publish the app (set it to "In production"): refresh tokens of apps left in "Testing" expire after 7 days.
  4. OAuth clientAPIs & Services → Credentials → Create credentials → OAuth client ID → type Desktop app. Copy the client id and client secret into the console.
  5. Refresh tokenRun Google's OAuth flow for installed apps with that client and the scope above, signed in as a user with access to your AdMob account, and copy the refresh token into the console. Google's guide: OAuth 2.0 for iOS & desktop apps. The package includes no helper for this step.
  6. TestPress Test on the refresh-token field. The console exchanges the token and lists your AdMob account, and checks it matches the publisher id.

API used: accounts.networkReport.generate, ESTIMATED_EARNINGS in USD. Days are in your AdMob account's time zone. Ad revenue counts as measured when the AppLovin key is set, or all four AdMob values are.

05Metrics and their definitions

Console → Revenue and growth, range 7, 30 or 90 days. These are the console's own definitions (admin/pages/app.js, admin/src/analytics.ts):

MetricDefinition
DAU (average per day)Users with activity on a UTC day, averaged over the range.
ARPDAUMeasured net revenue in the Currency for ARPDAU (Revenue reporting, default USD) ÷ the sum of daily active users in the range. Revenue in other currencies is not converted and not included. "—" when there is no measured revenue in that currency.
Day-1 / Day-7 retentionOf the users who signed up at least N days ago, the share that was active on day N after sign-up.
FunnelUsers who signed up in the range → of those, the share that watched a verified ad → the share that made a verified purchase.
Verified adsRewarded videos credited after the network's callback, in the range.
Offerwall and survey conversionsPostbacks recorded in the range.

Past days use the daily rollup analyticsDaily/{day} (job analyticsDaily, 00:30 UTC). Today and missing days are counted live. Retention and the funnel use the newest 1,000 sign-ups of the range, and the page says so when the cap applies.

The Overview shows the same numbers as tiles, plus users, active today, points issued today, verified ads today and open fraud flags and review items.

06Status checks about revenue

  • Ad revenue is measured (reporting API connected): information only. It says "not measured" until a reporting key is set.
  • Store purchases without a reported price: purchases whose store did not return a price. Usually the Play service account lacks "View financial data".