CLAUDE LABJP
FORK — Claude Code 2.1.212 changes what /fork does: it copies your conversation into a new background session with its own row in claude agents, so you can keep working. The old in-session subagent is now /subtaskLIMITS — WebSearch calls are now capped at 200 per session by default, and subagent spawns get the same 200 ceiling, so a runaway search or delegation loop stops on its ownMCPBG — MCP tool calls running past two minutes now move to the background automatically, keeping the session usable. Tune the threshold with CLAUDE_CODE_MCP_AUTO_BACKGROUND_MSPLANFIX — Fixed plan mode auto-running file-modifying Bash commands such as touch and rm without a permission prompt or an SDK canUseTool callbackSONNET5 — Claude Sonnet 5 is running on introductory pricing of $2 per million input tokens and $10 per million output. After August 31 it moves to $3 and $15IPO — Bankers are reportedly lining up investor meetings for Anthropic ahead of a possible public listing as soon as OctoberFORK — Claude Code 2.1.212 changes what /fork does: it copies your conversation into a new background session with its own row in claude agents, so you can keep working. The old in-session subagent is now /subtaskLIMITS — WebSearch calls are now capped at 200 per session by default, and subagent spawns get the same 200 ceiling, so a runaway search or delegation loop stops on its ownMCPBG — MCP tool calls running past two minutes now move to the background automatically, keeping the session usable. Tune the threshold with CLAUDE_CODE_MCP_AUTO_BACKGROUND_MSPLANFIX — Fixed plan mode auto-running file-modifying Bash commands such as touch and rm without a permission prompt or an SDK canUseTool callbackSONNET5 — Claude Sonnet 5 is running on introductory pricing of $2 per million input tokens and $10 per million output. After August 31 it moves to $3 and $15IPO — Bankers are reportedly lining up investor meetings for Anthropic ahead of a possible public listing as soon as October
Articles/Claude Code
Claude Code/2026-05-23Advanced

A Daily Revenue Pipeline for 4 Wallpaper Apps: 8 Weeks Running App Store Connect API + AdMob With Claude Code

An 8-week record of running App Store Connect API and AdMob Reporting API through a Python pipeline for 4 iOS wallpaper apps, with Claude Code helping absorb JWT auth quirks, gzip TSV edge cases, timezone misalignment, and Slack alerting thresholds — written from an indie developer's perspective.

Claude Code197App Store Connect APIAdMob12Indie Development8Revenue AnalyticsiOS24

Premium Article

A Slack message arrives at 7:00 JST every morning with yesterday's revenue, AdMob earnings, and Day 7 subscription retention for all four of my wallpaper apps, on a single line. It took about eight weeks to reach that state.

I have been building iOS apps as an indie developer since 2014, and even after my apps crossed 50 million cumulative downloads, my morning routine was still to open App Store Connect, then AdMob, then Firebase one by one and copy numbers into a Google Sheet. It is the kind of work that is dull and easy to get wrong. Forgetting to do it on a weekend means stacking three days of work on Monday morning.

To hand off this routine for good, I asked Claude Code to build me a Python pipeline that runs at 7:00 JST every morning, calls App Store Connect API and AdMob Reporting API for all four apps, joins them on a JST date axis, and writes back to a dashboard. Writing the first draft took a day. Making it boring and reliable in production took eight weeks. Below are the specific traps I hit along the way and where Claude Code actually mattered.

Why "just look at the dashboards" did not work

App Store Connect, AdMob, and Firebase all offer fine dashboards. I still built my own pipeline for three reasons.

The first reason is timezone mismatch. App Store Connect's daily reports use US Pacific time (UTC-8). My AdMob account also runs in Pacific. Firebase Analytics is set to JST on some projects and Pacific on others. Comparing "revenue for May 22, 2026" across three dashboards requires constant mental correction across slightly different windows. Running four apps in parallel as an indie, doing that adjustment in your head all day is not sustainable.

The second reason is the lookback window. AdMob's UI gives you two years, but if you want the same weekly aggregate every Friday, accumulating it yourself is dramatically faster. After eight weeks of operation, I have 180 days of daily data sitting in a local SQLite database. When I run a new experiment I can ask "how does this compare to the same weekday over the past six months" on the spot.

The third reason is cross-app signal latency. When you look at four apps' revenue, eCPM, and retention separately, small signals like "wallpaper app A's AdMob CPM has been dropping since Friday" disappear into the noise. A single dashboard surfaces those. In the past eight weeks, my morning Slack digest caught a 38% Wednesday-to-Thursday eCPM drop on one rewarded ad unit, and I flipped the mediation order over the weekend instead of finding out the following Tuesday.

Overall structure: what to fetch, where to put it

The first decision I made with Claude Code was about storage and granularity. For a single indie developer with four apps, jumping straight to Cloud SQL or BigQuery felt like overkill.

[06:30 JST every morning]                       [07:00 JST every morning]
  asc_fetcher.py  ──┐                            ┌──> dashboard_sync.py
  admob_fetcher.py ─┤  ──> raw_*.csv (S3) ──>    │     (Google Sheets writeback)
  fbase_fetcher.py ─┘                            ├──> slack_digest.py
                                                 │     (day-over-day + anomalies)
                          merger.py               └──> revenue.db (SQLite)

                            └──>  daily_summary table

I put S3 in the middle on purpose so that API fetching and aggregation are fully decoupled. If an API call fails due to rate limits or an auth error, the raw CSV still exists, and the aggregation layer can be re-run as many times as needed. Telling Claude Code from the start "I want fetch, transform, and deliver split into three phases so I can isolate failures later" paid off later many times over.

SQLite was enough. Eight weeks of data sit in about 200 KB. Being able to drop into sqlite3 from the terminal whenever I want to reshape the schema is genuinely useful for an evolving setup.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
A working ES256 JWT auth flow for App Store Connect API that avoids the DER vs raw signature trap, plus retry strategy for empty Sales Reports (200 status with header-only TSV)
Concrete AdMob Reporting API v1beta report spec with currency JPY, language ja, and timeZone Asia/Tokyo, plus a SQLite schema that joins ASC and AdMob on a single JST date axis
Six battle-tested alerting rules from 8 weeks of operation, including a 14.3% AdMob eCPM recovery I caught only because the morning Slack digest surfaced a Wednesday-to-Thursday drop
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Claude Code2026-07-08
Auditing Your Own Code for Required Reason API Declarations with Claude Code
Required reason codes in PrivacyInfo.xcprivacy apply to your own code, not just third-party SDKs. After a wallpaper app of mine was rejected, here is the Claude Code workflow I use to scan Swift sources and match APIs to reason codes before submission.
Claude Code2026-05-26
Four Weeks With Claude Code: Driving Xcode Warnings to Zero in an Indie iOS Codebase
An indie iOS developer behind 50M+ downloads pairs with Claude Code for four weeks to clear hundreds of accumulated Xcode warnings. Notes on weekly scope, what to delegate, and the boundary where human judgment still wins.
Claude Code2026-06-30
Fixing Blurry Wallpapers on New iPhones with Claude Code: Safely Growing a Per-Device Resolution Map
Why wallpapers go blurry or letterboxed on brand-new iPhones, and how to collapse scattered device branches into a single source of truth you can extend in one line — walked through as a real Claude Code refactor with before/after code.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →