# AdMob ad revenue

URL: https://traqio.app/docs/integrations/admob
Last updated: 2026-10-14

Measure ROAS for ad-funded apps: forward AdMob's impression-level revenue to Traqio from the paid-event callback, and it joins the install that saw the ad.

For an ad-funded app, ad revenue *is* the revenue. AdMob reports the value of every impression to the app through its **paid-event callback**; forwarding it to Traqio joins that revenue to the install that saw the ad — and from there to the campaign that drove it — so a game or a utility gets a real ROAS per campaign, not just an app-wide total.

> **Which SDKs** trackAdRevenue is available in the React Native, Expo and Capacitor SDKs (the JavaScript engine). The native, Flutter, KMP, MAUI and Unity SDKs do not report ad revenue yet.

## Set up

### Turn on impression-level ad revenue

In AdMob: Settings → Account → Reporting → impression-level ad revenue.

### Forward each paid event to the SDK

```ts
// In AdMob's paid-event callback, once per impression:
Traqio.trackAdRevenue({
  valueMicros: 21500,         // the AdValue in micros — 0.0215 of the currency; never pre-round it
  currency: "USD",            // ISO 4217, as AdMob reports it
  precision: "estimated",     // AdMob's precisionType
  adUnitId: "ca-app-pub-0000000000000000/0000000000",
  adFormat: "rewarded",
  adSourceName: "AdMob Network", // the mediation source that filled it, when known
});
```

Pass the value in **micros** as AdMob gives it — never pre-rounded: a single banner impression is worth a fraction of a cent. Add the format and the mediation source when you have them; they are kept with each impression.

### Test with test ad units

```ts
Traqio.init({ /* … */ testAds: true }); // while on AdMob's test ad unit ids
```

Test impressions appear in the console as **TEST** — the pipe is proven — and are never counted as revenue.

### Go live

Switch to real ad unit ids and remove `testAds`. The AdMob card turns to **Receiving impressions** and the revenue reaches the revenue, ROAS and cohort reports.

## How Traqio handles it

| Aspect | Behaviour |
| --- | --- |
| Batching | impressions are queued on the device and sent in batches of up to 100 |
| Double counting | each batch has an id persisted with the queue — a retry after a crash is recognised, never counted twice |
| Attribution | matched to the install by the SDK's device id, else by your user id; unmatched revenue is still recorded, as unmatched |
| Storage | summed per currency and per UTC day of the impressions, so cent fractions are not rounded away |
| Ad networks | never forwarded to Meta or TikTok: thousands of tiny values would distort the purchase signal their bidding uses |
| iOS | ad revenue also moves the SKAdNetwork conversion value, like a purchase |

## Frequently asked questions

**Why doesn't Traqio use the AdMob Reporting API?**
Because it cannot be attributed. The Reporting API gives daily totals by app, country, ad unit and source, with nothing that identifies an install, so it could only produce an app-wide total — never revenue per campaign. The paid-event callback fires on the device, per impression, where the install is known.

**Will Traqio's ad revenue match the AdMob dashboard?**
Closely, not exactly. Most mediation sources report an estimated value per impression (precision: estimated), so totals drift a few percent from the final AdMob payout, in both directions.
