GEMINI LABJP
CHAT — From August 26, Google Chat becomes a Gemini hub for searching, drafting, catching up on threads, and managing tasks and events with full Workspace context. Three days outANDROID — Gemini replaces Google Assistant on Android from September 4, twelve days from now. Worth checking any voice shortcuts you built on Assistant before the switchSCALE — The Gemini app crossed one billion monthly users on August 11ROBOTICS — gemini-robotics-er-1.6-preview shuts down on August 31, eight days out. The ER 2 preview models succeed it, adding spatial reasoning, multi-step tool orchestration, and multi-robot coordinationFLASH — Gemini 3.7 Flash went GA on August 13 and now powers Gemini Spark for AI Pro and Ultra subscribers in 160-plus countries. Introductory pricing runs through December 31CLASSROOM — Gemini in Classroom opened to students of all ages on August 10, with flashcards, practice quizzes, study guides, and guided promptsCHAT — From August 26, Google Chat becomes a Gemini hub for searching, drafting, catching up on threads, and managing tasks and events with full Workspace context. Three days outANDROID — Gemini replaces Google Assistant on Android from September 4, twelve days from now. Worth checking any voice shortcuts you built on Assistant before the switchSCALE — The Gemini app crossed one billion monthly users on August 11ROBOTICS — gemini-robotics-er-1.6-preview shuts down on August 31, eight days out. The ER 2 preview models succeed it, adding spatial reasoning, multi-step tool orchestration, and multi-robot coordinationFLASH — Gemini 3.7 Flash went GA on August 13 and now powers Gemini Spark for AI Pro and Ultra subscribers in 160-plus countries. Introductory pricing runs through December 31CLASSROOM — Gemini in Classroom opened to students of all ages on August 10, with flashcards, practice quizzes, study guides, and guided prompts
Articles/API / SDK
API / SDK/2026-08-23Intermediate

Moving app AI work from runtime calls to a pre-ship batch pass

Where you put a Gemini call decides whether your request count scales with users or with assets. Here is the decision rule I used to move classification into a pre-ship batch pass, plus a resumable implementation.

gemini107gemini-api283app-development2cost-designindie-dev47

Premium Article

Adding artwork to the ukiyo-e wallpaper app starts the same way every time: opening the preview folder and going through the images one by one, deciding which of the 30 categories each belongs to.

Once Gemini took over that sorting, I assumed without really thinking about it that the call would live inside the app. Tap the category tab, classify on the spot. On a whiteboard it looked perfectly reasonable.

I only ran the estimate right before implementation. Same processing, same model — but moving where the call lived changed the monthly request count by three orders of magnitude.

Here is the conclusion up front: if the input does not depend on the user and the set of inputs can be enumerated ahead of time, finishing the calls before you ship is the better trade for an indie developer. I kept exactly one feature at runtime, and only because its input cannot be enumerated.

What actually drives your request count

I had quietly treated "adding AI to the app" and "calling the API at runtime" as the same sentence. That is where the trap was.

The same classification behaves very differently depending on where it sits:

  • At runtime, the count scales with users × sessions. It grows as the app grows
  • Before shipping, the count scales with asset count. It does not move when users double

Wallpaper categories look the same to everyone who opens the app. I was recomputing one shared answer once per person. Once that registered, my question stopped being "which is faster" and became "what is this proportional to."

Putting both options into the same formula

The estimate takes about twenty lines. Writing it before you implement is what keeps the bill from surprising you later.

# Compare monthly call counts for the same feature at runtime vs. pre-ship.
# Swap in your own numbers before running.
 
def runtime_calls(mau, sessions_per_user, calls_per_session):
    """Runtime placement. Grows in proportion to your user base."""
    return mau * sessions_per_user * calls_per_session
 
def preship_calls(new_assets, passes_per_asset, prompt_revisions):
    """Pre-ship placement. Proportional to assets.
    prompt_revisions counts full re-runs after you edit the prompt."""
    return new_assets * passes_per_asset * (1 + prompt_revisions)
 
rows = []
for mau in (500, 5_000, 50_000):
    rt = runtime_calls(mau, sessions_per_user=6, calls_per_session=1)
    ps = preship_calls(new_assets=120, passes_per_asset=1, prompt_revisions=2)
    rows.append((mau, rt, ps, rt / ps))
 
print(f"{'MAU':>8} {'runtime/mo':>12} {'preship/mo':>12} {'ratio':>8}")
for mau, rt, ps, ratio in rows:
    print(f"{mau:>8,} {rt:>12,} {ps:>12,} {ratio:>7.1f}x")
 
print(f"\nbreak-even MAU = {360 / (6 * 1):.0f}")

Running it locally:

     MAU   runtime/mo   preship/mo    ratio
     500        3,000          360     8.3x
   5,000       30,000          360    83.3x
  50,000      300,000          360   833.3x
 
break-even MAU = 60

Sixty users. Past the point where you are handing builds to friends, runtime placement stops paying for itself on volume alone. Add 120 assets a month, rewrite the prompt twice and re-run everything, and you are still pinned at 360 calls.

As a ratio: 8.3x at 500 MAU, 83.3x at 5,000, 833.3x at 50,000. Only one side changes order of magnitude.

None of that surfaces until you are in production reading an invoice, and unwinding the design at that point costs you an app review cycle on top. The cheap way to avoid it is running those twenty lines before you write the feature.

The absolute numbers matter less than the shape: only one of these two is proportional to your user count. Per-call prices fall over time; the proportional side keeps climbing with growth regardless. If you want to record what each call actually costs you, I wrote up that side in recording production cost with the Gemini API usageMetadata field.

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
You will be able to tell, with a short formula, whether each AI feature in your app scales with your user count or with your asset count
You will avoid the class of design mistake that only shows up as an unexpected bill months after launch, by spending a few minutes on the estimate first
You will be able to lift a resumable batch pass straight into your own project, one that converges to the same result even if it dies halfway
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

Gemini 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 $15 for lifetime access
View Membership →

Related Articles

API / SDK2026-08-22
Once You Pass Twenty Mediation Groups, How Do You Find the Setting That Went Missing?
As ad mediation groups multiply, missing sources and type drift accumulate quietly. Here is the split I settled on: normalize the settings into one matrix, let code confirm the gaps, and send Gemini only the cells that need judgment.
API / SDK2026-06-26
Reliable Text-in-Image with Gemini 3.1 Flash Image — an OCR-Verified Pipeline
After the preview shutdown, the GA gemini-3.1-flash-image still occasionally garbles text baked into images. Here is a generate -> read-back-verify -> regenerate/composite pipeline, with working code and an unattended retry budget.
API / SDK2026-05-18
Building Automatic Wallpaper Category Classification with Gemini Vision
An indie developer shares how they implemented automatic wallpaper image classification with the Gemini Vision API — including accuracy results, real pitfalls, structured-output tips, and a cost comparison with GPT-4o Vision.
📚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 →