RORK LABJP
RORKMAX — Rork Max generates pure Swift instead of React Native, enabling true native apps across iPhone, iPad, Watch, TV, Vision Pro, and iMessageAPPLE — Rork's 2026 direction has a clear theme of native empowerment across the Apple ecosystemEXPO — Standard builds run on React Native and Expo, so you're left with a real project structure and code you can keep working onFUNDING — Rork recently raised $15M and now sees over 743,000 monthly visits with 85% growthPRICING — Rork is free to start, with paid plans from $25/month and Rork Max at $200/monthCROSS — Rork builds iOS, Android, and web from a single prompt, finished off with a bit of follow-up tweakingRORKMAX — Rork Max generates pure Swift instead of React Native, enabling true native apps across iPhone, iPad, Watch, TV, Vision Pro, and iMessageAPPLE — Rork's 2026 direction has a clear theme of native empowerment across the Apple ecosystemEXPO — Standard builds run on React Native and Expo, so you're left with a real project structure and code you can keep working onFUNDING — Rork recently raised $15M and now sees over 743,000 monthly visits with 85% growthPRICING — Rork is free to start, with paid plans from $25/month and Rork Max at $200/monthCROSS — Rork builds iOS, Android, and web from a single prompt, finished off with a bit of follow-up tweaking
Articles/Business
Business/2026-04-28Intermediate

Choosing a Revenue Model for Your Rork App — Ads, Subscriptions, or One-Time Purchase, Backed by Real Operating Numbers

Drawing on the period when my wallpaper apps hit peak ad revenue, I rebuilt the comparison of ads, subscriptions, and one-time purchases under identical conditions — with genre-by-genre guidance and implementation notes for Rork.

rork58monetization47admob4subscription28revenue-modelapp-store15google-play5indie-dev11rork-max40revenuecat2

Premium Article

There was a stretch of time when I would open the AdMob dashboard late at night and line up eCPMs by country. The same wallpaper app earned two to four times more per impression in the US than in Japan. Bid prices rippled by hour of day, and toward month-end the numbers would float upward as advertisers burned through budgets. Even during the peak — when ad revenue crossed ¥1.5M in a month — I watched those figures sink to nearly half the next month. The lesson that a business should never depend on a single revenue model was burned into me in front of that dashboard.

Now that Rork lets you build apps this quickly, every project hits the same fork in the road at the planning stage: ads, subscription, or one-time purchase? What my own operating experience tells me is that the right answer shifts with genre and scale, while the clearly wrong patterns stay remarkably consistent. In this piece I rebuild the three-model comparison under identical conditions and walk through genre fit and the practical details of implementing each model in Rork.

The Character of Each Model — Where Revenue Comes From, and Where It Plateaus

Ad-based apps are free to use, monetized through impressions. Download volume is the revenue base, which pairs well with genres that pull strong store search traffic. The flip side: revenue per user is low, and placement design that respects the user experience is what keeps the model alive.

Subscriptions collect recurring payments directly from users. Margins are high, and once the base accumulates, month-over-month revenue becomes far more predictable. The cost is a standing obligation to keep shipping reasons to stay subscribed — and a long-running battle with churn.

One-time purchases ask users to pay once. Implementation is the simplest of the three and entitlement state is trivial to manage. But revenue depends entirely on new acquisition; when downloads flatten, so does income.

News apps and mini-game collections lean toward ads. Daily-use productivity tools lean toward subscriptions. Single-purpose utilities lean toward one-time purchases. That is the broad map — but as the projections below show, the optimal answer moves as your app grows.

The Reality of Ad Revenue (AdMob) — eCPM, Fill Rate, and Mediation

Two metrics govern ad revenue: eCPM (revenue per 1,000 impressions) and fill rate (the share of ad requests actually served).

Japanese eCPMs run roughly $0.50–$2.00 depending on genre — games higher, utilities lower. North America and Western Europe run $2.00–$8.00; Southeast Asia $0.20–$0.80. In my own portfolio, the regional mix of users moved revenue more than almost anything else. I prioritized English localization over new features at one point precisely because raising the price of the same impressions beat adding functionality on ROI.

Picking the Ad SDK — expo-ads-admob No Longer Works

Older tutorials still show expo-ads-admob, but that package has been removed from the Expo SDK and will not run today. For AdMob in an Expo project generated by Rork, the current standard is react-native-google-mobile-ads. It does not work in Expo Go, so a development build via EAS Build is a prerequisite.

npx expo install react-native-google-mobile-ads

Register your AdMob app IDs through the plugin config in app.json:

{
  "expo": {
    "plugins": [
      [
        "react-native-google-mobile-ads",
        {
          "androidAppId": "ca-app-pub-xxxxxxxx~xxxxxxxx",
          "iosAppId": "ca-app-pub-xxxxxxxx~xxxxxxxx"
        }
      ]
    ]
  }
}

Placing Rewarded Ads Well

Rewarded ads convert well because users opt in. For mini-games, the classic placement is a "watch an ad for +100 coins" button on the score screen. For productivity tools, the same mechanic becomes "use a premium feature once for free."

Here is the implementation against the current API. Two habits prevent most production incidents: wait for the load event before showing, and unsubscribe your listeners.

// Rewarded ads with react-native-google-mobile-ads
import { useEffect, useState } from 'react';
import { TouchableOpacity, Text } from 'react-native';
import {
  RewardedAd,
  RewardedAdEventType,
  TestIds,
} from 'react-native-google-mobile-ads';
 
// Replace with your own ad unit ID in production
const adUnitId = __DEV__ ? TestIds.REWARDED : 'YOUR_REWARDED_AD_UNIT_ID';
 
const rewarded = RewardedAd.createForAdRequest(adUnitId);
 
export const RewardAdButton = ({ onReward }: { onReward: (n: number) => void }) => {
  const [loaded, setLoaded] = useState(false);
 
  useEffect(() => {
    const unsubLoaded = rewarded.addAdEventListener(
      RewardedAdEventType.LOADED,
      () => setLoaded(true)
    );
    const unsubEarned = rewarded.addAdEventListener(
      RewardedAdEventType.EARNED_REWARD,
      (reward) => {
        onReward(reward.amount); // e.g. +100 coins
      }
    );
    rewarded.load();
    return () => {
      unsubLoaded();
      unsubEarned();
    };
  }, [onReward]);
 
  return (
    <TouchableOpacity
      disabled={!loaded}
      onPress={() => {
        rewarded.show();
        setLoaded(false);
        rewarded.load(); // preload the next one
      }}
    >
      <Text>{loaded ? 'Watch an ad for +100 coins' : 'Loading…'}</Text>
    </TouchableOpacity>
  );
};

Interstitial Frequency — What a Policy Warning Taught Me

Interstitials carry the highest eCPMs and tend to become the revenue backbone, but careless placement risks both churn and policy enforcement. I once overlooked an implementation path that could fire a full-screen ad on nearly every navigation, and AdMob sent me a policy violation warning. I scrambled to fix it the same day — once ad serving is limited, revenue heads to zero immediately. Frequency control belongs in code, enforced mechanically.

My rule of thumb: a minimum time gap since the last ad, and at least two user actions in between. One small class enforces both.

// Interstitial frequency management
class AdFrequencyManager {
  private lastAdTime = 0;
  private actionCount = 0;
  private readonly minIntervalMs = 60_000; // at least 60s
  private readonly minActionsBetweenAds = 2;
 
  canShowInterstitial(): boolean {
    return (
      Date.now() - this.lastAdTime > this.minIntervalMs &&
      this.actionCount >= this.minActionsBetweenAds
    );
  }
 
  recordAction(): void {
    this.actionCount += 1;
  }
 
  recordAdShown(): void {
    this.lastAdTime = Date.now();
    this.actionCount = 0;
  }
}
 
export const adManager = new AdFrequencyManager();

At my peak, interstitials produced most of the revenue and banners contributed roughly a tenth as a supplement. Even then I never set the interval below 60 seconds. The higher an ad format's eCPM, the faster overexposure destroys the asset that produces it.

Build Mediation in the Console — Don't Bid on the Client

Mediation — stacking multiple ad networks — is the single most reliable eCPM lever. My stack ran AdMob as the anchor with Facebook Audience Network, Unity Ads, AppLovin, and Pangle layered in; compared to AdMob alone, eCPM improved by 30–50% in practice.

One caution: do not try to implement network selection in app code. Like many developers, I was once tempted to fetch bids from each network client-side and compare them — a pseudo-waterfall. It is the wrong shape both for latency and for policy. Today's AdMob configures mediation groups in the console, and bidding happens server-side. Your only client-side task is adding each network's official adapter as a dependency; the ad request code is identical to the single-network case.

# Adding adapters (one official adapter per network)
npm install react-native-google-mobile-ads
npm install @react-native-admob/admob-mediation-unity
# Then register each network in your AdMob mediation group in the console

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 realistic monthly revenue model comparing ads, subscriptions, and one-time purchases at MAU 5,000 — plus the two classic estimation traps (daily vs. monthly mix-ups, confusing MAU with new installs) and how to correct them
Field-tested AdMob insights from running a four-network mediation stack, country-level eCPM swings, and the ad-placement safety rules I adopted after receiving a policy warning
How to choose between Rork (Expo) and Rork Max (Swift) for billing implementation, and how the Small Business Program cuts store fees from 30% to 15%
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

Rork 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

Business2026-05-23
From a Rork-Built App to Monthly Break-Even at 100 Yen Subscription: Indie Numbers from May 2026
A small Rork-built utility app reached month-over-month break-even on a 100 yen subscription combined with AdMob. May 2026 numbers, decisions, and what I deliberately left out.
Business2026-05-06
Google Play Subscription Offers: Reduce Churn and Maximize Revenue for Your Rork App
A practical guide to using Google Play subscription offers — free trials, introductory pricing, upgrade offers, and win-back offers — to maximize revenue from Android apps built with Rork.
Business2026-04-28
Monetizing SwiftUI Native Apps Built with Rork Max — From App Store Approval to Subscription Revenue
The complete playbook for taking Rork Max's SwiftUI native code from generation to App Store approval to subscription revenue, with actual code fixes and review strategies.
📚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 →