Skip to content
99ersstudio
All work
Mobile Apps/Shipping

Calculator Batch

33 niche calculator apps from one shared Flutter codebase. 250 tests, two-round audited, AdMob + $2.99 Pro IAP wired across the entire fleet.

33
apps
250
tests
$2.99
Pro IAP

The problem

Niche calculator apps are an old, profitable corner of the Play Store: a Tip calculator, a Concrete-yardage calculator, a BAC calculator. Each one is a one-screen app with one piece of math, but each one needs its own icon, store listing, ASO keywords, ad units, IAP product, and signing keystore. Building 33 of them as 33 separate Flutter projects would mean maintaining 33 ad SDK upgrades, 33 Material 3 theme refreshes, and 33 IAP integrations every time anything in the platform shifts. We wanted one shell where every calculator is a config file plus a calculation function.

How we built it

  1. 01Built a shared shell that owns Material 3 theming (seed-colour based, light / dark, `ThemeMode.system`), settings, history, export, AdMob initialisation, and `in_app_purchase` plumbing. Each calculator drops in a config file (name, units, fields, validation) and a pure-Dart calculation function with unit tests.
  2. 02Wrote 33 calculators across personal-finance (Mortgage, Loan, Compound Interest, Salary, Car Loan), construction (Concrete, Paint, Tile, Carpet, Fence, Mulch, Drywall, Gravel), health (BMI, Calorie, Macro, Body Fat, Water Intake, Pregnancy, BAC, Pace), and everyday (Tip, Discount, Fuel Cost, Cooking Converter, GPA, Grade, Percentage, Age, Dog Age, Electricity Cost, Date Diff, Unit Converter). 250 of 250 unit tests passing, two full deep-audit rounds with zero bugs remaining.
  3. 03Wired the full ad stack — banner, interstitial, rewarded video, and native — plus a single $2.99 Pro IAP that removes ads, unlocks history, and unlocks export. Every ad widget and gate is reactive to purchase state via `ValueListenableBuilder`, so `setPro(true)` instantly hides every ad surface across the running app without a restart.
  4. 04Automated the per-app build: 33 configs, 33 store-listing folders, build scripts that swap icon, name, applicationId, ad unit IDs (via `dart-define`), and IAP product IDs at compile time. Ad mediation adapters (AppLovin MAX, Unity) are wired but commented out until the AdMob console is configured per app.
  5. 05Kept the shell honest with an explicit non-negotiable: a new calculator variant must ship in two to three days, every app must have a unique icon + name + store listing, no unnecessary permissions, ads never go full-screen on every tap, and every calculator must be unit-tested for accuracy.

Outcome

All 33 apps code-complete, 250 / 250 tests green, two rounds of deep audit cleared, monetisation fully wired across the fleet. Build automation produces a signed APK / app-bundle per app via the same script. The remaining work is exclusively human-only: Play Console accounts, AdMob ad-unit IDs per app, RevenueCat product setup, Firebase projects per app, and signing keystores. None of that requires touching the codebase again.

Stack

FlutterDartmath_expressionsgoogle_mobile_adsin_app_purchase

Flutter 3.x · Dart · `math_expressions` for evaluator · `google_mobile_ads` for the full ad stack · `in_app_purchase` for the Pro IAP · Material 3 with `ThemeMode.system` · Firebase Analytics + Crashlytics across all apps · per-app `dart-define` for ad unit IDs and IAP product IDs.

Next up

Submit QR Code Gen first (already store-doc complete) so the Play Console account warms up, then roll Calculator Batch through the same submission pipeline. Once the first three apps are live, flip ad mediation on and measure the eCPM uplift from AppLovin MAX + Unity bidders.

More case studies