CCFish proved that a mobile fishing game could acquire 340,000 users in 90 days with zero paid advertising — purely through a Telegram-native viral loop. By embedding share-to-invite mechanics directly into the Cocos Creator Mini App, the team turned every catch, every leaderboard entry, and every reward screen into a distribution channel that compounds with each new player.
The Problem — Mobile Game UA Costs Are Broken
In 2025, acquiring a single mobile game user through paid channels hit an all-time high. CPI for casual games across Meta, Google, and TikTok averaged $4.00–$7.00 in Tier 1 markets, with D30 retention barely reaching 12–18%. For a small studio with no venture capital runway, these numbers are prohibitive. CCFish faced an even harder constraint: Telegram Mini Apps cannot run Meta or Google SDKs, and webview-based mini apps don't support app store attribution. Paid acquisition is structurally impossible on Telegram.
**The insight:** This is not a bug — it is a design constraint that forces pure organic growth. CCFish turned that constraint into an advantage.
The Solution — An Embedded Viral Loop
Rather than fighting platform limitations, CCFish designed the entire game around a single growth mechanism: the Telegram share dialog combined with a referral reward system that creates a closed viral loop.
```
Player catches fish → share result → friend taps link
→ friend installs → friend catches fish → shares result
→ new friend sees it → loop continues
```
Every act of playing produces a shareable artifact (catch result, leaderboard rank, rare fish). Each artifact carries an invitation link. Every install from that link creates a new player who produces more artifacts.
The Growth Equation
The virality coefficient *K* = (shares per user) × (conversion rate per share) × (invitees who share again). When K > 1, growth compounds. CCFish achieved K = 1.32 in their first 90 days.
Architecture Overview — Share → Invite → Reward
The loop is implemented across three layers inside the Cocos Creator project.
Layer 1: Telegram Share Bridge
CCFish uses `Telegram.WebApp.switchInlineQuery()` to trigger the native share sheet — no third-party SDK needed.
```typescript
class TelegramShareService {
private tg = (window as any).Telegram.WebApp;
shareCatchResult(fishName: string, weight: number): void {
this.tg.switchInlineQuery(
`🎣 I just caught a ${fishName} (${weight}kg) in CCFish! Beat me?`,
['users']
);
}
shareLeaderboard(rank: number): void {
this.tg.switchInlineQuery(
`🏆 I'm ranked #${rank} on CCFish! Catch a bigger fish.`,
['users']
);
}
}
```
Layer 2: Deep Link Referral Tracking
Every shared message includes a unique referral code embedded in the Mini App `start_param`. When a friend taps the link, Telegram passes the parameter on launch.
```typescript
class ReferralTracker {
parseStartParam(): ReferralData | null {
const startParam = (window as any).Telegram.WebApp
.initDataUnsafe?.start_param;
if (!startParam) return null;
// Format: "ref_{userId}_{source}_{timestamp}"
const parts = startParam.split('_');
return {
referrerId: parts[1],
source: parts[2],
timestamp: parseInt(parts[3], 10)
};
}
}
```
Layer 3: Reward Distribution
When the referred friend completes their first catch, the backend awards both users immediately.
```json
{
"rewards": {
"referrer": {
"first_catch": { "coins": 200, "premium_bait": 1, "xp": 500 }
},
"referee": {
"welcome_bonus": { "coins": 300, "premium_rod_rental": "24h" }
}
}
}
```
Implementation — The Viral Loop Step by Step
Step 1: Gated Share Prompts
Not every catch triggers a share — only notable ones (personal bests, rare species, milestones). This prevents share fatigue.
```typescript
function shouldPromptShare(c: CatchResult): boolean {
return [
c.weight > c.personalBest,
c.baitRarity >= 'rare',
c.isMilestoneCatch
].filter(Boolean).length >= 2;
}
```
Step 2: Share Dialog + Reward Preview
The game shows a modal previewing the shared message and the referral bonus ("+200 coins per referral"). The user taps Share, and Telegram's native inline query opens.
Step 3: Friend Experience (Under 20 Seconds)
When the friend taps the link, CCFish streams the onboarding: (1) welcome banner identifying the inviter, (2) trophy fish animation, (3) first cast tutorial, (4) first catch with 300 bonus coins. The entire flow from tap to first catch takes under 20 seconds.
Step 4: Dual-Sided Reward Delivery
Both parties receive rewards immediately. The referrer gets a Telegram bot notification:
```json
{
"type": "referral_reward",
"referrer_id": 145892,
"referee_name": "Alex",
"reward": { "coins": 200, "premium_bait": 1 }
}
```
This notification triggers the referrer to reopen the game, see their balance, and share another catch — restarting the loop.
Step 5: Loop Closure
The new player, after catching a significant fish, is prompted to share. They become a referrer. The loop is fully closed.
```typescript
function onNewCatch(userId: string, c: CatchResult): void {
saveCatch(userId, c);
const referral = getReferralData(userId);
if (referral && !referral.firstCatchRewarded) {
awardUser(referral.referrerId, REWARDS.referrer.first_catch);
awardUser(userId, REWARDS.referee.welcome_bonus);
sendBotNotification(referral.referrerId, {
type: 'referral_reward', refereeId: userId
});
markFirstCatchRewarded(userId);
}
if (shouldPromptShare(c)) pushSharePrompt(userId, c);
}
```
Results — Organic Acquisition Metrics
Over the first 90 days post-launch, CCFish's viral loop produced these results:
| Metric | Value |
|---|---|
| Total organic installs | 340,000 |
| Virality coefficient (K) | 1.32 |
| Shares per user (avg) | 4.7 |
| Share-to-install conversion | 8.3% |
| User-to-referrer conversion | 22% |
| D30 retention (referred) | 34% |
| D30 retention (non-referred) | 18% |
| Effective CPI | $0.17 |
| Viral inflection point | Day 14 |
The effective CPI of **$0.17** stands in stark contrast to the $4.00–$6.00 range of paid channels — a 25–35x improvement. Referred users retained 89% better at D30 than non-referred users, confirming that social proof from a trusted contact is a stronger acquisition signal than any ad impression.
Viral Inflection Timeline
```
Day | New Installs | Cumulative | K
----|-------------|-----------|-----
1 | 120 | 120 | 0.41
7 | 1,890 | 6,200 | 0.87
14 | 8,400 | 42,000 | 1.08 ← inflection
30 | 24,000 | 130,000 | 1.32
60 | 38,000 | 248,000 | 1.28
90 | 22,000 | 340,000 | 1.15 ← plateau
```
Growth was linear for the first two weeks (community seeding). After Day 14, compounding took over until the Telegram Mini App discovery ceiling was hit around Day 75.
Key Takeaways
1. **Platform constraints are growth constraints — that's good.** Telegram's walled garden forced CCFish to build a true viral loop instead of buying traffic. The result was a K > 1 engine.
2. **Gate share prompts on achievement.** Only notable catches (personal bests, rarities, milestones) trigger sharing. This preserves share quality and prevents spam fatigue.
3. **Immediate dual-sided rewards are non-negotiable.** Both referrer and referee must receive visible, immediately usable rewards. CCFish's coin + bait + rod rental structure created a compelling value exchange.
4. **The loop must close before it compounds.** If the new user never shares, the loop dies. CCFish ensured 87% of new users hit their first share-eligible catch within the first session.
5. **Referred users are higher quality.** The 89% higher D30 retention validates that social proof from a trusted contact outperforms any paid impression.
6. **Fix the right levers.** K matters, but the leading indicators are share prompt rate, share-to-conversion, and user-to-referrer conversion. Fixing any one can push K above 1.
For any mobile game team considering Telegram as a platform, CCFish's playbook is clear: build the share mechanic into the core loop, reward both sides immediately, and let compounding do the work that paid ads used to do.