How we built a referral system without touching a single line of client code
How we created a platform-agnostic referral tracking system that increased organizer acquisition by 40%
A ticketing startup came to us with a growth challenge: they wanted to launch a referral program to acquire new event organizers, but their engineering team was already stretched thin. They couldn’t afford to build referral infrastructure into their core platform.
Most referral solutions—Rewardful, FirstPromoter, PartnerStack—require deep integration with your billing and user systems. That wasn’t an option here.
So we built something different.

The Challenge
The client needed a complete referral system: tracking links, attribution, analytics, and a polished landing page experience. But they had strict constraints.
First, zero modifications to their existing codebase. Their engineering team had a product roadmap to deliver, and embedding third-party tracking code wasn’t on it. Second, they wanted accurate attribution without relying on cookies or requiring users to take extra steps. Third, they needed the system live quickly—weeks, not months.
Traditional referral platforms couldn’t work. They all assume you can integrate with the target platform’s signup flow. We needed to track referrals to a destination we didn’t control.
Why Existing SaaS Solutions Failed
We evaluated every major player in the referral space:
| Solution | Monthly Cost | Problem |
|---|---|---|
| PartnerStack | $500+ | Requires billing integration |
| Rewardful | $49-99 | Needs Stripe/Paddle connection |
| FirstPromoter | $49-99 | Caps affiliates, needs integration |
| Post Affiliate Pro | $129+ | Heavy setup, enterprise-focused |
| Refgrow, LeadDyno | $29-49 | Limited attribution, basic features |
Every single one required access to the client’s signup and payment systems. Without that integration, they simply don’t work.
Our Solution: Independent Tracking Layer
We built a tracking system that sits between the referrer and the destination, capturing attribution data without touching the client’s codebase.
Architecture Overview
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Organizer │ │ HuSig Tracker │ │ Client Signup │
│ Dashboard │────▶│ Page │────▶│ Page │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Generate unique │ │ Capture: │ │ User signs up │
│ referral link │ │ • Fingerprint │ │ with UTM params │
│ │ │ • IP + Timestamp │ │ │
│ │ │ • Device data │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌──────────────────┐
│ Attribution │
│ Engine matches │
│ conversion back │
│ to original click│
└──────────────────┘
The key innovation: we never need to touch the client’s code. The tracking happens entirely in our layer.
Multi-Method Attribution
We implemented three attribution methods to maximize accuracy, each with different tradeoffs:
Method 1: UTM Parameters (90%+ accuracy)
When a user clicks a referral link like refer.tixfix.ai/r/ABC123, our tracker redirects them to the signup page with UTM parameters appended:
https://app.tixfix.ai/signup?utm_source=husig&utm_campaign=ABC123&husig_click_id=click_789
If the client’s system passes these parameters back via webhook when a conversion happens, we get near-perfect attribution.
Method 2: Browser Fingerprinting (70% accuracy)
For cases where UTM data isn’t available, we fall back to device fingerprinting. On every click, we capture:
- IP address (with geo-location)
- User agent string
- Screen resolution
- Timezone offset
- Browser language
- Canvas fingerprint hash
We combine these into a fingerprint hash and store it with a timestamp. When a conversion comes in, we search for matching fingerprints within a configurable time window (default: 7 days).
def generate_fingerprint(request_data):
components = [
request_data['ip'],
request_data['user_agent'],
request_data['screen_resolution'],
request_data['timezone'],
request_data['language']
]
return hashlib.sha256('|'.join(components).encode()).hexdigest()[:16]
Method 3: Email Bridge (95% accuracy)
For high-value referrals, we optionally capture the user’s email before redirecting. This creates a direct match when they sign up with the same email—no fingerprinting required.
The Matching Algorithm
When a conversion event arrives (via webhook or manual import), the attribution engine runs through the methods in priority order:
def attribute_conversion(conversion_data):
# Method 1: Direct UTM match
if conversion_data.get('husig_click_id'):
click = db.clicks.find_one({'click_id': conversion_data['husig_click_id']})
if click:
return {'method': 'utm', 'confidence': 0.95, 'click': click}
# Method 2: Email match
if conversion_data.get('email'):
click = db.clicks.find_one({
'captured_email': conversion_data['email'],
'timestamp': {'$gte': conversion_data['timestamp'] - timedelta(days=30)}
})
if click:
return {'method': 'email', 'confidence': 0.95, 'click': click}
# Method 3: Fingerprint match
fingerprint = generate_fingerprint(conversion_data)
clicks = db.clicks.find({
'fingerprint': fingerprint,
'timestamp': {'$gte': conversion_data['timestamp'] - timedelta(days=7)}
}).sort('timestamp', -1)
if clicks:
# Score by recency
best_match = score_matches(clicks, conversion_data['timestamp'])
return {'method': 'fingerprint', 'confidence': 0.70, 'click': best_match}
return {'method': 'none', 'confidence': 0, 'click': None}
The Landing Page Experience
A referral program is only as good as its conversion rate. We designed a landing page at refer.tixfix.ai that clearly communicated the value proposition.
Design Principles
Clear reward structure: Users see exactly what they’ll earn. We made the math visible, 25 dollars for the first referral, scaling up to 100 dollars per referral at higher tiers.
Single call-to-action: The page does one thing: get users to submit their referral. No distractions, no competing links.
Mobile-first: 60%+ of referral link clicks come from mobile (shared via text, social). The page had to work perfectly on phones.
Technical Implementation
We separated concerns for maintainability:
- External CSS instead of inline styles—easier to update branding
- Responsive breakpoints tested on actual devices, not just browser resize
- Fixed navbar with clear branding that doesn’t scroll away
- Smooth scroll to the form section when CTA is clicked
<!-- Hero CTA that scrolls to form -->
<a href="#referral-form" class="cta-button">
Refer an Organizer →
</a>
<style>
html {
scroll-behavior: smooth;
}
.cta-button {
background: linear-gradient(135deg, #4F46E5, #7C3AED);
padding: 16px 32px;
border-radius: 8px;
font-weight: 600;
}
</style>
The Email Confirmation System
When someone submits a referral, they get an immediate confirmation email. Email design has its own constraints—we couldn’t rely on web techniques.
What we avoided:
- Images for branding (often blocked by email clients)
- Complex layouts that break in Outlook
- Dark-only designs that fail in light mode clients
What we built:
- Text-based TixFix branding
- Dark header/footer matching the website aesthetic
- Mobile-friendly single-column layout
- Clear next steps and reward information
<!-- Email-safe header -->
<table width="100%" bgcolor="#1a1a2e">
<tr>
<td style="padding: 24px; text-align: center;">
<span style="color: #ffffff; font-size: 24px; font-weight: bold;">
📧 TixFix Referral Rewards
</span>
</td>
</tr>
</table>
Backend Infrastructure
Tech Stack
- FastAPI — Lightweight, fast, async-native Python framework
- MongoDB — Flexible schema for click/conversion data
- Redis — Rate limiting and caching
- AWS EC2 — Hosting with CloudFront CDN for the tracking page
Data Models
# Click tracking document
{
"_id": ObjectId("..."),
"click_id": "click_abc123",
"referrer_code": "ORG_456",
"referrer_id": "organizer_789",
"fingerprint": "a1b2c3d4e5f6g7h8",
"ip_address": "192.168.1.1",
"user_agent": "Mozilla/5.0...",
"screen_resolution": "1920x1080",
"timezone": "America/Los_Angeles",
"utm_params": {
"source": "husig",
"campaign": "ORG_456",
"medium": "referral"
},
"captured_email": null,
"timestamp": ISODate("2025-01-15T10:30:00Z"),
"converted": false,
"conversion_id": null
}
# Conversion document
{
"_id": ObjectId("..."),
"conversion_id": "conv_xyz789",
"attributed_click_id": "click_abc123",
"attribution_method": "utm",
"attribution_confidence": 0.95,
"referrer_code": "ORG_456",
"converted_user_email": "[email protected]",
"reward_status": "pending",
"reward_amount": 25.00,
"timestamp": ISODate("2025-01-15T11:45:00Z")
}
API Endpoints
@app.post("/api/clicks")
async def track_click(click_data: ClickData):
"""Record a referral link click"""
click_id = generate_click_id()
fingerprint = generate_fingerprint(click_data)
await db.clicks.insert_one({
"click_id": click_id,
"referrer_code": click_data.referrer_code,
"fingerprint": fingerprint,
"ip_address": click_data.ip,
"user_agent": click_data.user_agent,
"timestamp": datetime.utcnow()
})
return {"click_id": click_id, "redirect_url": build_redirect_url(click_data)}
@app.post("/api/conversions")
async def record_conversion(conversion_data: ConversionData):
"""Record and attribute a conversion"""
attribution = await attribute_conversion(conversion_data)
if attribution['click']:
await db.clicks.update_one(
{"click_id": attribution['click']['click_id']},
{"$set": {"converted": True, "conversion_id": conversion_data.id}}
)
await db.conversions.insert_one({
"conversion_id": conversion_data.id,
"attributed_click_id": attribution['click']['click_id'],
"attribution_method": attribution['method'],
"attribution_confidence": attribution['confidence'],
"timestamp": datetime.utcnow()
})
return attribution
@app.get("/api/referrers/{referrer_id}/stats")
async def get_referrer_stats(referrer_id: str):
"""Get performance stats for a referrer"""
pipeline = [
{"$match": {"referrer_id": referrer_id}},
{"$group": {
"_id": None,
"total_clicks": {"$sum": 1},
"total_conversions": {"$sum": {"$cond": ["$converted", 1, 0]}},
"conversion_rate": {"$avg": {"$cond": ["$converted", 1, 0]}}
}}
]
return await db.clicks.aggregate(pipeline).to_list(1)
Fraud Protection
Referral systems attract abuse. We implemented several protections:
Rate limiting: Max 100 clicks per IP per hour, max 10 conversions per referrer per day
Fingerprint velocity: Flag referrers with suspiciously similar fingerprints across clicks
Conversion timing: Flag conversions that happen within seconds of clicks (bot behavior)
Email domain analysis: Flag conversions from disposable email domains
async def check_fraud_signals(click_data, conversion_data):
signals = []
# Check click-to-conversion time
time_delta = conversion_data.timestamp - click_data.timestamp
if time_delta < timedelta(seconds=30):
signals.append("suspicious_timing")
# Check for disposable email
if is_disposable_email(conversion_data.email):
signals.append("disposable_email")
# Check fingerprint velocity
similar_clicks = await db.clicks.count_documents({
"fingerprint": click_data.fingerprint,
"timestamp": {"$gte": datetime.utcnow() - timedelta(hours=1)}
})
if similar_clicks > 5:
signals.append("fingerprint_velocity")
return signals
Analytics Dashboard
Referrers need to see their performance. We built a real-time dashboard showing:
- Total clicks with daily/weekly/monthly breakdowns
- Conversion rate compared to platform average
- Pending vs. paid rewards
- Top performing referral channels (where clicks originate)
The dashboard updates in real-time via WebSocket connections, so referrers see conversions the moment they happen.
The Results
The system went live at refer.tixfix.ai within three weeks of starting development.
Acquisition Impact
- 40% of new organizer signups came through referrals in the first two months
- 2.3 average referrals per active referrer — the reward tiers motivated continued sharing
- Customer acquisition cost dropped 60% compared to paid advertising channels
- Referral users had 25% higher retention at 90 days vs. organic signups
Operational Efficiency
- 70% faster setup compared to integrated solutions — no engineering coordination required
- 85% attribution accuracy across all methods combined
- Zero client engineering time — their team stayed focused on product
- 3-week delivery from kickoff to production launch
Technical Performance
- < 100ms redirect latency — users don’t notice the tracking hop
- 99.9% uptime since launch
- 50,000+ clicks tracked without performance degradation
Key Takeaways
Platform-Agnostic Tracking is Underserved
The referral SaaS market assumes you can integrate with your target platform. When you can’t—or don’t want to—the options disappear. There’s a real gap here for businesses working with partners, affiliates, or any scenario where you’re driving traffic to systems you don’t control.
Browser Fingerprinting Works Better Than Expected
Combined with timing windows and IP data, device fingerprints provide surprisingly accurate attribution without requiring cookies or consent flows. It’s not perfect, but 70% accuracy on a fallback method is valuable.
Simple Landing Pages Convert
We resisted the urge to over-design. Clear value proposition, visible reward math, prominent call-to-action, mobile-first layout. The page does one thing and does it well. Conversion rate on the landing page exceeded 30%.
Fraud Protection is Non-Negotiable
Every referral system attracts gaming attempts. Building fraud detection from day one saved significant manual review time later. The velocity checks alone caught 90%+ of suspicious activity automatically.
What’s Next
The independent tracking approach we built has applications beyond this single client:
- B2B partnerships where code integration isn’t feasible
- Cross-platform referrals spanning multiple destinations
- Agency management of referrals across multiple clients
- Affiliate networks without heavy technical requirements
We’re exploring productizing this as a standalone SaaS—a platform-agnostic referral tracker for teams who can’t or won’t integrate traditional solutions.
Looking to build growth infrastructure without heavy engineering lift? Get in touch to discuss how we can help.