The Problem
Mobile game studios with multiple titles face a persistent challenge: how do you cross-promote between games without spending on ads? Traditional cross-promotion requires building separate ad networks, negotiating revenue shares with other publishers, and managing complex attribution across different platforms. Smaller studios often skip it entirely, leaving organic cross-sell opportunities on the table -- and missing out on the single most cost-effective user acquisition channel available.
CCFish solved this by building a cross-promotion engine that runs entirely on Cloudflare Workers, automatically surfacing complementary games to players based on their behavioral profile. The result is an organic sales channel that drives 22% of all new installs without a single dollar of ad spend. The engine pays for itself in infrastructure costs -- approximately $60 per month at scale.
The Solution
The cross-promotion engine operates as a smart recommendation layer between CCFish's game portfolio. When a player finishes a session, completes a milestone, or hits a revenue trigger (first IAP, day-7 retention, churn signal), the engine selects the best next game to promote. The selection is based on a real-time ML scoring model that runs serverlessly on Cloudflare Workers, using player behavior data stored in D1. No GPU, no expensive inference infrastructure -- just a few Workers invocations per recommendation.
Architecture Overview
The cross-promotion pipeline has five stages, each handled by a dedicated Worker:
1. **Behavioral Profile Builder** -- A cron-triggered Worker runs every 4 hours, aggregating player data from D1: session frequency, total spend, game preferences, completion rates, and churn risk indicators. Each player gets a behavioral fingerprint -- a 50-dimensional vector stored as compressed JSON. Players with fewer than 3 sessions are excluded from cross-promotion until they establish a baseline.
2. **Recommendation Engine** -- When a player triggers a cross-promotion event (session end, level complete, IAP, app open), a Worker fetches their behavioral fingerprint and scores each game in CCFish's portfolio against it using cosine similarity. The scoring considers: genre affinity (did they play similar games?), spending patterns (whale profiles get premium game recommendations), and engagement risk (at-risk players get re-engagement focused promos instead of new game pitches).
3. **Creative Selector** -- Each game has 3-5 promotional creatives (screenshots, video thumbnails, taglines). The engine selects the creative variant with the highest historical conversion rate for this behavioral segment, stored in D1 as a conversion matrix updated every 24 hours by a nightly Worker.
4. **Attribution Tracker** -- Every cross-promotion impression is logged in D1 with the player ID, source game, target game, timestamp, and creative variant. If the player installs the promoted game within 7 days, the attribution is recorded via a deferred install detection Worker that checks app store receipts.
5. **Conversion Analytics Dashboard** -- A Workers-based dashboard served as static HTML with D1 queries shows real-time cross-promotion performance: install attribution by source game, revenue lift per channel, optimal timing windows, and creative performance by segment.
Implementation
Key implementation details that made the difference:
- **Event triggers**: 8 cross-promotion trigger points across the game lifecycle: session end, level complete, first IAP, day-3 retention, day-7 retention, churn signal, app open (cold start), and tournament registration. Each trigger has a different recommended game and creative set tailored to the player's current mindset.
- **A/B testing built-in**: Every recommendation is A/B tested 50/50 split between the ML-selected game and a control rotation. The control ensures the ML model doesn't drift into recommending only one game. A nightly Worker compares conversion rates and updates the conversion matrix in D1.
- **Frequency capping**: No more than 2 cross-promotion impressions per player per 24-hour period, enforced by a KV-based dedup counter with automatic reset at midnight UTC. This prevents fatigue and keeps promotional UX positive.
- **Cost tracking**: Each cross-promotion impression costs $0.00004 (one Workers invocation plus one D1 read). At 50,000 impressions per day, total monthly cost is $60 -- compared to $5,000+ for equivalent paid UA through AdMob or Facebook.
Results
Six months of cross-promotion data shows:
- **22% of all new installs** come from the cross-promotion engine (up from 0% before launch)
- **3.4x higher conversion** for ML-selected recommendations versus random rotation control
- **14% revenue lift** across the entire game portfolio from cross-promoted installs within 30 days
- **$0 marginal ad spend** -- all cross-promotion is organic, costing only Workers infrastructure
- **47% reduction in 30-day churn** for players who engage with a cross-promoted game after install
Key Takeaways
- A cross-promotion engine turns your existing player base into a free distribution channel for new games
- Cloudflare Workers makes this economically feasible: $60 per month for 50K impressions per day versus $5,000+ for equivalent paid UA
- Behavioral segmentation is the key differentiator -- generic randomized cross-promotion has 3-5 times lower conversion than segment-aware recommendations
- The attribution loop closes the feedback cycle, letting the system automatically improve its recommendations over time without manual tuning or ML retraining