Most referral programs have a participation problem. A small percentage of users share their referral link, an even smaller percentage share it more than once, and almost nobody shares it consistently. The reward alone isn't enough to sustain behavior over time.
Leaderboards fix this by adding a second layer of motivation: social comparison. When users can see how they rank against other referrers, the program shifts from a one-time transaction ("share and get $10") to an ongoing competition. The result is higher participation rates and more referrals per active referrer.
This guide covers how to design, build, and optimize referral leaderboards. For the general referral program framework, see building referral programs that actually work. For reward structure, see the referral reward strategies guide.
The referrals list table with referrer details, status badges, and milestone progress.
Why Leaderboards Work
Leaderboards tap into three psychological drivers:
Social comparison. Festinger's social comparison theory shows that people evaluate their own abilities by comparing themselves to others. A leaderboard makes that comparison explicit and easy.
Loss aversion. Once a user has a rank, they're motivated to maintain it. Dropping from #5 to #8 feels like a loss, even though their actual rewards haven't changed. Kahneman and Tversky's prospect theory explains why losses feel roughly twice as painful as equivalent gains feel good.
Variable reinforcement. Each new referral changes the user's rank, but the magnitude of the change is unpredictable. This variability creates the same engagement loop that makes slot machines and social media feeds compelling.
Duolingo's leaderboard system is one of the most studied examples. After adding leagues and leaderboards, they reported a 17% increase in overall learning time and a significant boost in daily active users. The same principles apply to referral programs.
Leaderboard Design
Time Windows
Running a single all-time leaderboard creates a problem: early adopters dominate, and new users have no chance of ranking. This kills motivation for anyone who didn't start on day one.
Use time-windowed leaderboards instead:
- Weekly leaderboard: Resets every Monday. Everyone starts at zero. Best for keeping engagement high across your entire user base.
- Monthly leaderboard: Resets on the 1st. Gives users more time to climb but still prevents permanent domination.
- All-time leaderboard: Never resets. Good as a secondary view for your most dedicated referrers, but shouldn't be the primary board.
The weekly window is the sweet spot for most programs. It's short enough that new users feel they have a real shot, but long enough to build momentum within a cycle.
Scoring Models
Not all referrals are equal. A user who refers someone who makes a purchase is more valuable than one who refers someone who just creates an account. Your scoring model should reflect this.
Simple count: 1 point per successful referral. Easy to understand, easy to game.
Weighted actions: Different points for different outcomes.
| Action | Points |
|---|---|
| Friend creates account | 1 |
| Friend completes onboarding | 3 |
| Friend makes first purchase | 10 |
| Friend becomes a paying customer | 25 |
Revenue-based: Points proportional to the revenue generated by referred users. Aligns the leaderboard with business outcomes but is harder for users to understand.
The weighted model is the best default. It rewards quality referrals without requiring users to understand revenue metrics.
Display Design
A leaderboard needs to show three things at a glance:
- The user's own rank and score. Always visible, even if they're ranked #847. This is the most important element.
- The top performers. Show the top 5-10. These are aspirational targets.
- Nearby competitors. Show 2-3 users above and below the current user. These are the realistic targets that drive behavior.
Your Rank: #12 (47 points)
━━━━━━━━━━━━━━━━━━━━━━━━━
🥇 Sarah M. — 142 points
🥈 Alex K. — 128 points
🥉 Jordan L. — 115 points
4. Taylor R. — 98 points
5. Morgan S. — 91 points
...
10. Chris P. — 56 points
11. Sam W. — 51 points
▶ 12. You — 47 points
13. Riley D. — 44 points
14. Jamie T. — 41 points
Privacy
Show first names and last initials (or usernames) instead of full names. Some users don't want their referral activity visible to others. Offer an opt-out that replaces their name with "Anonymous" while keeping their rank visible to themselves.
Tiered Rewards
Leaderboards work best when combined with tiered rewards that unlock at specific ranks or thresholds.
Rank-Based Tiers
| Tier | Requirement | Reward |
|---|---|---|
| Bronze | Any referral | Standard referral bonus |
| Silver | Top 50 weekly | 1.5x referral bonus |
| Gold | Top 10 weekly | 2x referral bonus + badge |
| Platinum | #1 weekly | 3x referral bonus + exclusive badge |
Milestone-Based Tiers
Instead of (or in addition to) rank tiers, reward users for hitting absolute milestones:
- 5 referrals: Unlock a profile badge
- 10 referrals: Bonus reward (extra credit, free month, etc.)
- 25 referrals: "Super Referrer" status with permanent bonus rate
- 50 referrals: Personal thank-you from the team + top-tier badge
Milestones work well alongside leaderboards because they give users concrete goals when they're nowhere near the top of the rankings.
Badges
Badges serve as persistent, visible markers of achievement. Good badge categories for referral programs:
- Streak badges: "Referred someone 3 weeks in a row"
- Speed badges: "Referred 3 people in one day"
- Quality badges: "5 referred users became paying customers"
- Milestone badges: "10 total referrals", "25 total referrals"
Display badges on the user's profile so other users can see them. This creates social proof and aspiration.
Technical Implementation
Data Model
-- Referral events (source of truth)
CREATE TABLE referral_events (
id SERIAL PRIMARY KEY,
referrer_id INTEGER NOT NULL,
referred_id INTEGER NOT NULL,
action VARCHAR(50) NOT NULL, -- 'signup', 'onboarding', 'purchase'
points INTEGER NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- Leaderboard cache (rebuilt periodically)
CREATE TABLE leaderboard_cache (
period VARCHAR(20) NOT NULL, -- 'weekly-2026-W21', 'monthly-2026-05'
user_id INTEGER NOT NULL,
total_points INTEGER NOT NULL,
referral_count INTEGER NOT NULL,
rank INTEGER NOT NULL,
updated_at TIMESTAMP DEFAULT NOW(),
PRIMARY KEY (period, user_id)
);
-- Badges
CREATE TABLE user_badges (
user_id INTEGER NOT NULL,
badge_id VARCHAR(50) NOT NULL,
earned_at TIMESTAMP DEFAULT NOW(),
PRIMARY KEY (user_id, badge_id)
);
CREATE INDEX idx_leaderboard_rank ON leaderboard_cache (period, rank);
CREATE INDEX idx_referral_events_referrer ON referral_events (referrer_id, created_at);
Updating the Leaderboard
Rebuild the leaderboard cache on a schedule (every 5-15 minutes) rather than on every referral event. Real-time updates aren't necessary and create unnecessary database load.
async function rebuildWeeklyLeaderboard(db: Pool) {
const weekId = getISOWeek(); // e.g., '2026-W21'
await db.query(`
INSERT INTO leaderboard_cache (period, user_id, total_points, referral_count, rank, updated_at)
SELECT
$1 AS period,
referrer_id AS user_id,
SUM(points) AS total_points,
COUNT(*) AS referral_count,
RANK() OVER (ORDER BY SUM(points) DESC) AS rank,
NOW() AS updated_at
FROM referral_events
WHERE created_at >= date_trunc('week', NOW())
ON CONFLICT (period, user_id)
DO UPDATE SET
total_points = EXCLUDED.total_points,
referral_count = EXCLUDED.referral_count,
rank = EXCLUDED.rank,
updated_at = NOW()
`, [weekId]);
}
API Endpoints
// Get the leaderboard (top N + user's neighborhood)
app.get('/api/referrals/leaderboard', async (req, res) => {
const userId = req.user.id;
const period = req.query.period || getCurrentWeekId();
// Top 10
const top = await db.query(
`SELECT user_id, total_points, referral_count, rank
FROM leaderboard_cache
WHERE period = $1
ORDER BY rank ASC
LIMIT 10`,
[period]
);
// User's rank + neighbors
const userRank = await db.query(
`SELECT rank FROM leaderboard_cache WHERE period = $1 AND user_id = $2`,
[period, userId]
);
let neighbors = [];
if (userRank.rows.length > 0) {
const rank = userRank.rows[0].rank;
neighbors = await db.query(
`SELECT user_id, total_points, referral_count, rank
FROM leaderboard_cache
WHERE period = $1 AND rank BETWEEN $2 AND $3
ORDER BY rank ASC`,
[period, Math.max(1, rank - 2), rank + 2]
);
}
res.json({
period,
top: top.rows,
user: userRank.rows[0] || null,
neighbors: neighbors.rows || [],
});
});
Tracking Referrals with Deep Links
Each user's referral link should include their unique referral token. When the referred user installs the app, deferred deep linking preserves the referral attribution through the app store install.
// iOS: Retrieve referral data and record the event
Tolinku.shared.getDeepLinkData { result in
if let referrerToken = result.data["referral_code"] as? String {
ReferralManager.shared.recordReferral(referrerToken: referrerToken)
}
}
Use Tolinku webhooks to track referral completions server-side. When a referral.completed event fires, update the referrer's points and trigger a leaderboard rebuild. See the referral links documentation for setup details.
Avoiding Common Pitfalls
Gaming
Leaderboards create incentives to game the system. Common tactics:
- Self-referral: Creating fake accounts to refer yourself. Mitigate with device fingerprinting and KYC requirements.
- Referral rings: Small groups referring each other. Detect with network analysis (look for circular referral chains).
- Bot signups: Automated account creation. Mitigate with CAPTCHA and email/phone verification.
Set clear rules in your terms of service, and enforce them. Remove cheaters from the leaderboard publicly (replace their entry with "[removed]") to signal that gaming isn't tolerated.
Demotivation
A leaderboard that's dominated by a few power users can demotivate everyone else. Prevent this by:
- Using weekly resets so no one dominates permanently.
- Showing the user's neighborhood, not just the top 10. A user ranked #45 is motivated by being close to #42, not by seeing that #1 has 10x their score.
- Offering milestone rewards alongside rank rewards. Even if a user never cracks the top 10, they can still earn badges and bonuses.
Privacy Complaints
Some users don't want to appear on a leaderboard. Always offer an opt-out. Users who opt out should still be able to see their own rank privately but shouldn't appear on the public board.
Measuring Leaderboard Impact
Track these metrics before and after launching the leaderboard:
- Referral rate: % of users who share at least one referral link per week. The leaderboard should increase this.
- Referrals per referrer: Average referrals per active referrer. The leaderboard should increase this as users push for higher ranks.
- Repeat referrers: % of referrers who share in consecutive weeks. The leaderboard should improve retention.
- Top referrer concentration: % of total referrals from the top 10 users. If this is too high, your leaderboard may be demotivating the middle tier.
Use Tolinku analytics to track referral link performance across your leaderboard tiers.
A well-designed leaderboard can increase referral program participation by 30-50%, according to gamification research from Yu-kai Chou. The key is making it feel achievable for users at every level, not just the top performers.
For the full referral program framework, see building referral programs that actually work. For launch planning, see the referral program launch checklist.
Get deep linking tips in your inbox
One email per week. No spam.