Ad revenue

Impression-level ad revenue from AdMob, AppLovin MAX, ironSource and others, stored as events and included in LTV / ROAS.

Updated 2026-09-02

SDK#

iOS — AdMob paid event
interstitial.paidEventHandler = { value in
    WhichClick.logAdRevenue(network: "admob", adUnit: "ca-app-pub-1/2", format: "interstitial", placement: "level_end",
                            revenue: Double(truncating: value.value) / 1_000_000, currency: value.currencyCode, precision: "\(value.precision.rawValue)")
}
Android — MAX
MaxAdRevenueListener { ad -> WhichClick.logAdRevenue(network = ad.networkName, adUnit = ad.adUnitId, format = ad.format.label, revenue = ad.revenue, currency = "USD", precision = ad.revenuePrecision) }

The SDK batches (5 s / 20 impressions) to POST /api/sdk/v1/ad-revenue. revenue is in currency units — divide AdMob micros by 1,000,000.

HTTP#

POST /api/sdk/v1/ad-revenue
{ "device_id": "<sha256>", "install_id": "ins_01…", "events": [ { "network": "admob", "ad_unit": "ca-app-pub-1/2", "format": "interstitial", "placement": "level_end", "revenue": 0.0125, "currency": "USD", "precision": "ESTIMATED", "ts": "2026-09-02T09:30:00Z" } ] }

Response {"accepted":1,"install_id":"ins_01…"}.

Reporting#

Ad revenue is stored as ad_revenue app events (value = revenue) and shown on the Ad revenue dashboard: ARPDAU, eCPM, revenue by network / format / placement, and per-campaign ROAS that includes ad revenue alongside purchases and subscriptions.