Skip to content
referral-system logo

Referral System Generator

referral-system

Generates referral/invite infrastructure with unique codes, deep link sharing, reward tracking, and fraud prevention. Use when user wants referral codes, invite friends flow, or viral growth mechanics.

SKILL.md

Full skill instructions

Referral System Generator

Generate a production referral/​invite system with unique code generation, deep link sharing, reward tracking, fraud prevention, and SwiftUI views for inviting friends and monitoring referral performance.

When This Skill Activates

Use this skill when the user:

  • Asks to "add a referral system" or "referral codes"
  • Wants to "invite friends" or "refer a friend" flow
  • Mentions "viral growth" or "invitation system"
  • Asks about "referral rewards" or "referral tracking"
  • Wants "invite codes" or "shareable invite links"

Pre-Generation Checks

1. Project Context Detection

  • Check Swift version (requires Swift 5.9+)
  • Check deployment target (iOS 17+ / macOS 14+ for @Observable and SwiftData)
  • Identify source file locations
  • Check for existing entitlements (Associated Domains for deep links)

2. Conflict Detection

Search for existing referral/​invite code:

Glob: **/​*Referral*.swift, **/​*Invite*.swift, **/​*InviteCode*.swift
Grep: "referralCode" or "inviteCode" or "ReferralManager"

If existing referral system found:

  • Ask if user wants to replace or extend it
  • If extending, identify integration points

3. Deep Link Setup Detection

Search for existing deep link handling:

Glob: **/​*DeepLink*.swift, **/​*UniversalLink*.swift
Grep: "onOpenURL" or "userActivity" or "NSUserActivity"

If deep link handling exists, integrate with it rather than generating a standalone handler.

Configuration Questions

Ask user via AskUserQuestion:

  1. Reward type?

    • Both-get (referrer and invitee both earn a reward) -- recommended
    • Referrer-only (only the person who shares gets rewarded)
    • Points-based (both parties earn points toward rewards)
  2. Code format?

    • Short alphanumeric (e.g., A7K2M9) -- recommended
    • Custom prefix (e.g., MYAPP-A7K2M9)
    • Username-based (e.g., john-A7K2)
  3. Sharing method?

    • Deep link (universal link with embedded code) -- recommended
    • Clipboard copy (copy code to pasteboard)
    • Share sheet (system share with link and message)
    • All of the above
  4. Storage?

    • SwiftData (local persistence, recommended for most apps)
    • UserDefaults (lightweight, for simple single-code scenarios)
    • CloudKit (sync across devices)

Generation Process

Step 1: Read Templates

Read templates.md for production Swift code.

Step 2: Create Core Files

Generate these files:

  1. ReferralCode.swift -- Model with unique code generation, expiration, usage tracking
  2. ReferralManager.swift -- @Observable manager for code lifecycle and redemption
  3. ReferralReward.swift -- Reward configuration, conditions, and fulfillment tracking

Step 3: Create UI Files

  1. InviteView.swift -- SwiftUI invite screen with code display and sharing
  2. ReferralDashboardView.swift -- Stats view for referral performance

Step 4: Create Integration Files

  1. ReferralDeepLinkHandler.swift -- Deep link parsing and redemption triggering

Step 5: Determine File Location

Check project structure:

  • If Sources/ exists -> Sources/​Referral/
  • If App/ exists -> App/​Referral/
  • Otherwise -> Referral/

Output Format

After generation, provide:

Files Created

Referral/
├── ReferralCode.swift            # Code model with generation and validation
├── ReferralManager.swift         # @Observable manager for code lifecycle
├── ReferralReward.swift          # Reward config and fulfillment tracking
├── InviteView.swift              # Invite screen with share actions
├── ReferralDashboardView.swift   # Referral stats dashboard
└── ReferralDeepLinkHandler.swift # Deep link parsing and redemption

Integration Steps

Add deep link handling in your App struct:

@main
struct MyApp: App {
    @State private var referralManager = ReferralManager()
    private let deepLinkHandler = ReferralDeepLinkHandler()

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(referralManager)
                .onOpenURL { url in
                    if let code = deepLinkHandler.extractCode(from: url) {
                        Task {
                            await referralManager.redeemCode(code)
                        }
                    }
                }
        }
    }
}

Present the invite screen:

struct ProfileView: View {
    @State private var showInvite = false

    var body: some View {
        Button("Invite Friends") { showInvite = true }
            .sheet(isPresented: $showInvite) {
                InviteView()
            }
    }
}

Show referral dashboard:

NavigationLink("My Referrals") {
    ReferralDashboardView()
}

Testing

@Test
func generatedCodeIsUnique() async throws {
    let manager = ReferralManager(store: InMemoryReferralStore())

    let code1 = await manager.generateCode(for: "user-1")
    let code2 = await manager.generateCode(for: "user-2")

    #expect(code1.value != code2.value)
}

@Test
func redemptionGrantsReward() async throws {
    let manager = ReferralManager(store: InMemoryReferralStore())
    let code = await manager.generateCode(for: "referrer-1")

    let result = await manager.redeemCode(code.value, redeemedBy: "invitee-1")

    #expect(result == .success)
    #expect(manager.rewards(for: "referrer-1").count == 1)
    #expect(manager.rewards(for: "invitee-1").count == 1)
}

@Test
func selfReferralIsRejected() async throws {
    let manager = ReferralManager(store: InMemoryReferralStore())
    let code = await manager.generateCode(for: "user-1")

    let result = await manager.redeemCode(code.value, redeemedBy: "user-1")

    #expect(result == .fraudDetected(.selfReferral))
}

@Test
func expiredCodeIsRejected() async throws {
    let manager = ReferralManager(store: InMemoryReferralStore())
    let code = ReferralCode(
        value: "EXPIRED1",
        ownerID: "user-1",
        expiresAt: Date.distantPast
    )

    let result = await manager.redeemCode(code.value, redeemedBy: "user-2")

    #expect(result == .expired)
}

Common Patterns

Generate and Share a Referral Code

// Generate code for current user
let code = await referralManager.generateCode(for: currentUserID)

// Share via system share sheet
let shareURL = deepLinkHandler.buildShareURL(for: code)
let message = "Join me on MyApp! Use my code \(code.value) for a bonus."
let activityItems: [Any] = [message, shareURL]

Redeem a Referral Code

// On app launch or deep link open
let result = await referralManager.redeemCode(codeString, redeemedBy: currentUserID)

switch result {
case .success:
    showRewardAnimation()
case .alreadyRedeemed:
    showAlert("You've already used a referral code.")
case .expired:
    showAlert("This referral code has expired.")
case .fraudDetected(let reason):
    logger.warning("Fraud detected: \(reason)")
case .invalid:
    showAlert("Invalid referral code.")
}

Track Rewards

// Check pending rewards
let pending = referralManager.pendingRewards(for: currentUserID)
for reward in pending {
    await fulfillReward(reward)
    await referralManager.markFulfilled(reward)
}

Gotchas

Fraud Prevention

  • Self-referral: Always verify referrer ID != redeemer ID. Users will try creating alt accounts.
  • Device fingerprinting: Consider storing device identifiers to detect multi-account abuse.
  • Rate limiting: Cap the number of referrals per user per time period (e.g., 50 per month).
  • Code reuse: Each invitee should only be able to redeem one referral code ever.

App Store Guidelines

  • Guideline 3.1.1: Do not offer real-money rewards or gift cards for referrals without proper IAP integration.
  • Guideline 3.2.2(vii): Referral systems must not manipulate App Store ratings or reviews.
  • Incentivized installs: Apple may reject apps that reward users purely for downloading. Tie rewards to meaningful in-app actions (e.g., completing a first task, making a purchase).

Deep Link Expiration

  • Universal links require an apple-app-site-association file on your server.
  • Referral deep links should have a TTL (default 30 days) to prevent stale code accumulation.
  • Handle the case where a user taps a referral link but the app is not installed (redirect to App Store, then capture code on first launch).

Data Privacy

  • Referral codes should not expose user PII (no emails or phone numbers in codes).
  • Provide opt-out: let users disable their referral code at any time.
  • Comply with GDPR/​CCPA if tracking referral relationships across users.

References

  • templates.md -- All production Swift templates
  • Related: generators/​deep-linking -- Universal link and deep link infrastructure
  • Related: generators/​share-card -- Visual share cards for social sharing
  • Related: generators/​analytics-setup -- Track referral funnel events

More skills from rshankras

apple-intelligence logo
rshankras/claude-code-apple-skills

apple-intelligence

Apple Intelligence skills for on-device AI features including Foundation Models, Visual Intelligence, App Intents, and intelligent assistants. Use when implementing AI-powered features.

778 241
View
release-review logo
rshankras/claude-code-apple-skills

release-review

Senior developer-level release review for macOS/iOS apps. Identifies security, privacy, UX, and distribution issues with actionable fixes. Use when preparing an app for release, want a critical review, or before App Store submission.

778 234
View
security logo
rshankras/claude-code-apple-skills

security

Security review and guidance for iOS, macOS, and watchOS apps. Covers secure storage, biometric authentication, network security, and platform-specific patterns. Use when implementing security features or reviewing code for vulnerabilities.

778 230
View
generators logo
rshankras/claude-code-apple-skills

generators

Code generator skills that produce production-ready Swift code for common app components. Use when user wants to add logging, analytics, onboarding, review prompts, networking, authentication, paywalls, settings, persistence, error monitoring, CI/CD pipelines, localization, push notifications, de...

778 221
View
shared logo
rshankras/claude-code-apple-skills

shared

Platform-agnostic skills including skill creation templates and best practices. Use when creating new skills or improving existing ones.

778 197
View
testing logo
rshankras/claude-code-apple-skills

testing

TDD and testing skills for iOS/macOS apps. Covers characterization tests, TDD workflows, test contracts, snapshot tests, and test infrastructure. Use for test-driven development, adding tests to existing code, or building test infrastructure.

778 194
View
monetization logo
rshankras/claude-code-apple-skills

monetization

Monetization strategy for iOS/macOS apps. Covers readiness assessment, pricing model selection, tier structuring, free trial strategy, and implementation guidance. Use when deciding what to charge, how to price, or planning monetization end-to-end.

778 185
View
legal logo
rshankras/claude-code-apple-skills

legal

Legal document generation and compliance guidance for indie Apple developers. Covers privacy policies, terms of service, EULAs, GDPR/CCPA/DPDP compliance, and Apple App Store legal requirements. Use when user needs legal documents or compliance guidance.

778 176
View
growth logo
rshankras/claude-code-apple-skills

growth

Growth skills for indie Apple developers — user acquisition, analytics interpretation, press/media outreach, community building, and indie business operations. Use when user asks about growing their app, understanding metrics, getting press coverage, or running an indie dev business.

778 170
View
core-ml logo
rshankras/claude-code-apple-skills

core-ml

Core ML, Create ML, Vision framework, Natural Language framework, on-device ML integration. Use when user wants image classification, text analysis, object detection, sound classification, model optimization, or custom model integration. Covers Core ML vs Foundation Models decision.

778 166
View
idea-generator logo
rshankras/claude-code-apple-skills

idea-generator

Brainstorm and rank iOS/macOS app ideas tailored to developer skills. Use when user says "what should I build", "give me app ideas", "I don't know what to build", "brainstorm app ideas", or "help me find an app idea".

778 0
View
memory logo
rshankras/claude-code-apple-skills

memory

Swift 6.2 InlineArray and Span types for zero-overhead memory access, fixed-size collections, and safe pointer alternatives. Use when optimizing performance-critical code paths.

778 0
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View