Skip to content

Refer & Earn

The refer-and-earn module provides a referral program where users generate unique codes to invite others. Both referrer and referee earn rewards, with payouts via Stripe Connect.

Module path: src/lib/modules/refer-and-earn/ Route: /refer-and-earn

interface ReferralCode {
code: string; // e.g., "JOHN123"
userId: string; // Code owner
isActive: boolean;
usageCount: number;
maxUsage: number | null; // null = unlimited
expiresAt?: Timestamp;
customUrl?: string; // Vanity URL
}
  • generateReferralCodeFromName(name) - Name-based code
  • generateReferralCodeFromEmail(email) - Email-based code
  • generateUniqueReferralCode() - Random unique code
interface Referral {
referrerId: string;
refereeId: string;
status: 'pending' | 'completed' | 'expired' | 'cancelled';
source: ReferralSource;
conversionEvent: ConversionEvent;
rewards: { referrer: Reward; referee: Reward };
metadata: { utmParams; ipAddress; userAgent };
}
type ReferralSource = 'email' | 'social' | 'direct' | 'sms' | 'affiliate' | 'qr_code';
type ConversionEvent = 'signup' | 'email_verification' | 'first_purchase' | 'subscription' | 'minimum_spend' | 'custom';
interface Reward {
type: 'credit' | 'discount' | 'points' | 'product' | 'subscription';
status: 'pending' | 'issued' | 'redeemed' | 'expired' | 'cancelled';
amount: number;
discountCode?: string;
minimumSpend?: number;
isPercentage?: boolean;
expiresAt?: Timestamp;
}

User Tiers: Bronze, Silver, Gold, Platinum

interface ReferralConnectAccount {
userId: string;
stripeAccountId: string;
accountStatus: 'pending' | 'verified' | 'restricted';
chargesEnabled: boolean;
payoutsEnabled: boolean;
requirements: {
currentlyDue: string[];
eventuallyDue: string[];
pastDue: string[];
};
}
referralStore.referrals; // All user's referrals
referralStore.referralCodes; // All codes owned by user
referralStore.totalReferrals;
referralStore.totalReferralCodes;
referralConnectManager.connectAccount; // Stripe Connect details
referralConnectManager.accountStatus; // Status flags
referralService.createReferralCodeForUser();
referralService.createAdditionalReferralCodeForUser();
referralService.checkReferralCodeExists(code);
referralService.deactivateReferralCode(code);
referralService.reactivateReferralCode(code);
referralService.trackReferralSignup(code, userId);

Persists referral code in cookies across sessions:

  • Save/retrieve referral code
  • Manage UTM parameters
  • Track referral data
ComponentPurpose
refer-header.sveltePage header with generate code CTA
general-stats.svelteReferral performance stats
stats-card.svelteIndividual stat display
referral-codes.svelteAll codes with usage data
referrals-table.svelteReferral list
recent-activity.svelteRecent referral activity
generate-referral-code-dialog.svelteInitial code creation
generate-additional-code-dialog.svelteAdditional codes
invite-friend-button.svelteShare referral link
payout-dialog.svelteStripe Connect payout

The /waiting-for-approve page integrates with referrals:

  • Users can enter a referral code to get approved during private beta
  • Valid referral code + available registry slots = automatic approval
  • Updates user document with referral relationship