← Back to blog

Inside ADWize: AdSense analytics in your pocket

ADWize is the AdSense revenue tracker we built because the official AdSense iOS app was retired and the web dashboard is painful on mobile. This is what went into making it, the API quirks we hit, and the architecture we settled on.

The problem

If you run AdSense on a website, the dashboard tells you yesterday's revenue and the last 30 days. To check it on the go, you open Chrome, log in, navigate the desktop-y UI on a 6.7" screen, and squint.

We wanted an iPhone-native app that opens, shows today's revenue, and lets us drill down. Charts that compress without lying. Multiple AdSense accounts (publishers often have several).

AdSense API quirks

AdSense Management API works. It's also slow, eventually consistent, and has a 90-day window for some endpoints. Real revenue numbers update with a 24-48 hour lag - we surface this clearly in the UI so users don't think the app is broken.

Authentication is OAuth 2.0 with the Google Sign-In SDK. We use the standard SDK for the auth dance, then make raw API calls with our own URLSession code (Google's official client SDK is heavier than we need).

Charts that compress without lying

AdSense earnings can vary 10x day-to-day. A naive chart with auto-scaled Y axis makes a normal Tuesday look catastrophic next to a viral Wednesday.

We use Apple's Charts framework with a 95th-percentile-clamped Y axis when revenue spikes. The user can tap to see the actual numbers; the visual stays readable.

Multi-account support

Most AdSense users have one account. Publishers and consultants have several. We support N accounts, each with its own token in the Keychain, switchable from a top-bar account picker.

Storage detail: tokens are not in iCloud Keychain, even though that would be more convenient. AdSense terms forbid sharing tokens across devices - and conceptually, a refresh token is a permanent credential.

Privacy by design

ADWize is local-first. Your AdSense data is fetched on your device, cached locally, never sent to any mk0.net server. We don't run analytics SDKs that would leak which AdSense accounts our users have.

The privacy nutrition label fits on one screen. See our privacy nutrition label post for the full setup.

What we'd build differently

We'd start with a Live Activity for revenue tracking - a daily 'so far today' surface that updates a few times a day. Right now we do this only with widgets, and the Live Activity surface is genuinely better for daily-tracked metrics.

We'd also expose the AdSense data via App Intents, so users could ask Siri 'what's my AdSense revenue today.' Currently we don't, and that's a real miss for an indie creator audience.