CCFish drives in-app purchase revenue not through one sales page but through a five-stage funnel that starts before the player downloads the app: playable ad to App Store product page to first-session onboarding to mid-game friction points to post-purchase retention loops. Each stage increases willingness-to-pay while decreasing purchase friction.
The Problem
Most free-to-play mobile games treat IAP as a single transaction moment — a shop screen with bundles, a price tag, and a "Buy" button. This ignores mobile game economics: purchase intent is built across multiple touchpoints, starting before the player even installs.
For CCFish (bundle `com.snngames.seafishshooter`, App Store ID 1135853532), the problem had three dimensions:
**Zero funnel visibility.** The game tracked final purchase events (buying Pearls, the premium currency) but nothing before that. Which players saw the shop? Which received an offer but didn't convert? Every pricing experiment was a black box.
**Playable ads that generated downloads but not revenue.** CCFish ran playable ad campaigns where users tried casting a line or previewing a boss encounter. These drove installs at a healthy CPI ($2.50-$3.20 on US iOS) but the install-to-purchase conversion was below 2%. The ads highlighted fun gameplay but never hinted at the premium economy.
**Flat pricing with no segmentation.** Every player saw the same Pearl bundle prices regardless of engagement level, session count, or purchase history. A player on day 30 who had caught 500 fish saw the same $0.99 starter pack as someone who opened the app once.
The Solution
CCFish implemented a five-stage sales funnel that treats IAP conversion as a continuous pipeline. Each stage feeds into the next, conditioning the player incrementally:
| Stage | Touchpoint | Goal |
|-------|-----------|------|
| 1. Awareness | Playable ad / UA creative | Preview premium content (legendary rods, boss loot)
| 2. Consideration | App Store product page | Show value via Custom Product Pages
| 3. Onboarding | First 3 game sessions | Introduce Pearl economy at low commitment
| 4. Conversion | Contextual friction points | Offer bundles tied to immediate player need
| 5. Retention | Post-purchase flow | Re-engage paying users with VIP perks
Architecture / Strategy Overview
The funnel is powered by a server-side decision engine on Cloudflare Workers that evaluates player state at each stage:
```javascript
async function selectOffer(playerId, funnelStage) {
const profile = await getPlayerProfile(playerId);
// Stage 4: Conversion — triggered by friction events
if (funnelStage === 'conversion') {
if (profile.rodBroken && profile.inTournament) {
return { offer: 'emergency_repair', pearls: 50, price: 0.99 };
}
if (profile.collectionProgress > 0.8) {
return { offer: 'collection_complete', pearls: 200, price: 1.99 };
}
}
// Stage 3: Onboarding — first 3 sessions
if (funnelStage === 'onboarding' && profile.sessionCount <= 3) {
return { offer: 'starter_pack', pearls: 300, price: 0.99 };
}
return { offer: 'default_shop', pearls: 100, price: 0.99 };
}
```
Key architectural decisions: server-side offer selection prevents reverse-engineering of pricing from the Cocos Creator client; session-level events feed player actions to Workers via REST; Custom Product Pages (up to 35 variants) match each UA creative so the post-download experience matches the pre-download promise; and staged pricing tiers increase exposure gradually ($0.99 to $19.99).
Implementation Details
Playable Ad to App Store Handoff
Each playable ad creative closes with a card showing a specific legendary rod or boss fish the player almost caught during the demo. The corresponding App Store Custom Product Page features that same item as its hero image. This visual continuity increases install-to-first-purchase conversion by an estimated 12-18% because the player arrives already wanting what they saw.
Onboarding: The Starter Pearl
CCFish gives every new player 50 free Pearls on session 1. This lets the player experience purchasing (a rod upgrade, a tournament entry) without spending real money, creating an endowment effect — after spending virtual currency, players are more willing to replenish it. The $0.99 starter pack (300 Pearls) appears only after the player has spent those free Pearls and faces a real choice: save for a legendary rod (500 Pearls) or buy tournament entries (50 each).
Conversion: Contextual Offer Engine
The most impactful change was replacing the static shop with offers triggered by real-time events:
| Trigger Event | Player State | Offer | Price |
|-------------|-------------|-------|-------|
| Rod broken in tournament | Frustrated, urgent | Emergency Repair (50 Pearls) | $0.99 |
| Collection gap of 3-5 fish | Near-completion | Collection Boost (200 Pearls) | $1.99 |
| Legendary rod in shop | Aspirational | Golden Rod Bundle (1000 Pearls) | $9.99 |
Each offer has a countdown timer (2 minutes for rod repair, 10 minutes for collection boost, 1 hour for legendary rod) creating urgency without aggressive pressure.
Post-Purchase Retention
After a first purchase, players enter a VIP track with daily bonus Pearls, early access to new locations, a pity timer on legendary fish spawns (guaranteed legendary after X dry catches), and priority support. This increases 30-day LTV for paying users by 34%.
Results / Metrics
Over a 90-day period after implementing the five-stage funnel:
| Metric | Before | After | Change |
|--------|--------|-------|--------|
| Install-to-1st-purchase CVR | 2.1% | 3.8% | +81% |
| ARPPU | $4.42 | $6.87 | +55% |
| Shop screen conversion | 0.8% | 2.4% | +200% |
| Tournament entry conversion | 1.5% | 4.2% | +180% |
| Starter pack purchase rate | 5.3% | 11.7% | +121% |
| 30-day retention (payers) | 38% | 51% | +34% |
| Revenue from contextual offers | 0% | 43% of total IAP | New |
All figures normalized for seasonality versus the same quarter last year. The contextual offer engine alone now drives 43% of all IAP revenue.
The biggest surprise: the install-to-purchase lift came primarily from the playable-ad-to-CPP handoff, not from in-game changes. Players arriving at a matched Custom Product Page converted at 4.9% versus 1.7% for generic — suggesting the highest-impact IAP optimization happens before the player even installs.
Key Takeaways
1. **The IAP funnel starts before the download.** Playable ads and Custom Product Pages are part of your sales channel, not just your acquisition channel. Matching creative across ad, store, and game increases conversion by making the purchase feel like a continuation.
2. **Context beats price.** A $0.99 emergency rod repair converts better than a $0.99 generic Pearl bundle because it's tied to an immediate, emotionally charged need. Framing matters more than the dollar amount.
3. **Onboarding is a purchase tutorial.** Free Pearls followed by the starter pack teaches players how to value virtual currency before asking them to spend real money. Move purchase education before the purchase ask.
4. **Server-side logic protects your pricing.** Computing offers on Workers instead of in the Cocos Creator client prevents datamining of pricing strategies and lets you iterate without app store review cycles.
5. **Measure the whole pipeline.** Without visibility from ad creative through CPP through onboarding to purchase event, you're optimizing in the dark. The five-stage funnel provides end-to-end attribution for every IAP dollar.