Watch And Earn docs
v4.0.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 yesterdayThe AdMob API connection (below). Without it: "Ad revenue: not measured".ads_reporting_admob_{YYYY-MM-DD}
Unity Ads and ironSource LevelPlay revenue are not pulled

Only AdMob reporting is 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 as the mediator, its report covers what it mediated, as far as AdMob reports it.

03Connect 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 all four AdMob values are set.

04Metrics 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.

05Status 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".