Referral Tracking for Indie Hackers: Skip the $300/mo Tools

I needed referral tracking for my SaaS. The options were depressing.

When I checked (early 2026): ReferralCandy started at $59/mo, designed for e-commerce. Rewardful at $29/mo, but that's just the starting tier. FirstPromoter and PartnerStack were priced for larger teams.

I'm a solo founder. My MRR is in the hundreds, not thousands. Every dollar saved is another month of runway.

Here's the thing: I don't need a referral platform. I need to know which users came from which invite link. That's it.


What I Actually Needed

Let me break down the "enterprise referral solution" into what matters:

  1. Unique links per referrer - So I know who sent them
  2. Click tracking - How many people clicked
  3. Attribution - Connect the click to a signup

The first two are literally what URL shorteners do. The third is a query parameter and some code.

The Setup

I created invite links using jo4.io:

https://jo4.io/invite-sarah → myapp.com/signup?ref=sarah
https://jo4.io/invite-mike  → myapp.com/signup?ref=mike
https://jo4.io/invite-alex  → myapp.com/signup?ref=alex

Each referrer gets a memorable short link. Jo4 tracks clicks automatically. My signup form reads the ref parameter and stores it.

Total cost: $0 (free tier covers this easily).

The Analytics I Get

For each invite link, jo4 shows me:

  • Total clicks - How many people hit the link
  • Unique visitors - Deduplicated by IP
  • Geographic breakdown - Where clicks came from
  • Device/browser - Mobile vs desktop
  • Referrer - Where the link was shared (Twitter, email, etc.)
  • Timeline - When clicks happened

This is more data than I had with the $59/mo tool I tried last year.

Handling Attribution

On my signup page:

// Grab the ref parameter
const params = new URLSearchParams(window.location.search);
const referrer = params.get('ref');

if (referrer) {
  // Store it for the signup request
  localStorage.setItem('referrer', referrer);
}

On signup submission:

const referrer = localStorage.getItem('referrer');

await fetch('/api/signup', {
  method: 'POST',
  body: JSON.stringify({
    email,
    password,
    referredBy: referrer || null
  })
});

That's it. Now I have a referred_by column in my users table.

What About Rewards?

"But what about paying out referral bonuses?"

I run a report once a month:

SELECT referred_by, COUNT(*) as signups
FROM users
WHERE referred_by IS NOT NULL
AND created_at > NOW() - INTERVAL '30 days'
GROUP BY referred_by
ORDER BY signups DESC;

Then I send PayPal/Wise payments manually. At my scale (< 50 referrals/month), this takes 10 minutes.

When I'm at 500 referrals/month, I'll automate it. Or I'll pay for a tool. But I'll also have the revenue to justify it.

Advanced: UTM Tracking

For power referrers who share on multiple platforms, I give them UTM-tagged variants:

https://jo4.io/sarah-twitter → myapp.com/signup?ref=sarah&utm_source=twitter
https://jo4.io/sarah-youtube → myapp.com/signup?ref=sarah&utm_source=youtube
https://jo4.io/sarah-newsletter → myapp.com/signup?ref=sarah&utm_source=newsletter

Now I know not just WHO referred them, but WHERE. Jo4's analytics show me which links perform best.

The Numbers

After 3 months with this setup:

  • 47 referral signups tracked
  • $0 spent on referral tools
  • $2,820 saved vs. the "affordable" option
  • 10 minutes/month on manual payouts

The enterprise tools have dashboards and automation. I have a SQL query and a spreadsheet. At my scale, that's the right tradeoff.

When to Upgrade

I'll pay for a real referral platform when:

  1. Referral volume exceeds 100/month (manual payouts become painful)
  2. I need tiered rewards (different rates for different referrers)
  3. Compliance requires audit trails I can't build myself

Until then, a URL shortener with analytics does 80% of the job at 0% of the cost.


Running a referral program on a budget? Share your setup in the comments.

Building jo4.io - URL shortener with analytics that indie hackers actually use for invite links, affiliate tracking, and campaign attribution.