You launched on Product Hunt last week and collected 200 signups. You sent a tweet, posted in two Indie Hackers threads, and a friend shared your link on LinkedIn. Now you want to know which channel drove real signups vs. which one just added noise. Without referral source tracking, your answer is a guess.

OperatorStack captures referral sources automatically from the same script tag you use for your waitlist and forms. Here is how it works and how to read the data.

OperatorStack reads ?utm_source= and ?ref= parameters on every pageview. No extra setup. The Analytics tab shows a breakdown of visits and signups by source. For custom tagging, use OperatorStack.trackEvent("event_name", { source: "channel" }) from the SDK.

How Referral Source Tracking Works

Two mechanisms run automatically when your script tag loads.

UTM parameter capture. When a visitor lands on yoursite.com?utm_source=twitter&utm_campaign=launch, OperatorStack reads those parameters and stores them with the pageview. Standard UTM fields captured: utm_source, utm_medium, utm_campaign, utm_content, and utm_term.

Referral code detection. When someone clicks a sharing link from your waitlist (for example, yoursite.com?ref=abc123), OperatorStack reads the ?ref= value and ties it to the referrer's contact record. Any signup from that session gets attributed to the correct person.

Both run client-side on page load. You do not write any tracking calls for these to work.

Step 1: Add the Script Tag

If you do not have the OperatorStack script on your page yet, add it:

<script src="https://operatorstack.dev/os.js" data-project="pk_your_key"></script>

That is the only change needed for automatic UTM and referral source tracking. Referral sources start appearing in your dashboard within minutes of your first tagged visit.

Place the script tag in <head> rather than just before </body> so referral data is captured even if the visitor bounces before the page fully loads.

For any link you share externally, append UTM parameters. Standard format:

https://yoursite.com?utm_source=twitter&utm_medium=social&utm_campaign=launch

Practical examples by channel:

ChannelExample URL
Twitter/X?utm_source=twitter&utm_medium=social
Product Hunt?utm_source=producthunt&utm_medium=referral
Indie Hackers?utm_source=indiehackers&utm_medium=community
Email newsletter?utm_source=newsletter&utm_medium=email
Direct share link?utm_source=share&utm_medium=referral

You do not need all five UTM fields. utm_source alone is enough to distinguish channels in your dashboard.

Do not tag your own internal links (navigation, footer links, internal CTAs) with UTM parameters. Internal UTM tags overwrite the original source attribution and inflate one channel's numbers at the expense of others.

Step 3: View Referral Source Data in the Dashboard

Open your project in OperatorStack and go to the Analytics tab. The Traffic Sources panel shows every utm_source value captured, ranked by visit count, with a conversion rate column (signups divided by unique visitors from that source).

You will also see a separate Referrals panel for ?ref= traffic, which maps to your waitlist leaderboard. Each referral code shows the number of visits and conversions it drove.

If a visitor arrives without any UTM or ?ref= parameter, OperatorStack records them as direct traffic.

Advanced: SDK Event Tracking With Source Attribution

For custom events beyond pageviews and signups, use trackEvent() directly:

// Tag a custom event with the source channel
await OperatorStack.ready;

OperatorStack.trackEvent("demo_requested", {
  source: "product_hunt",
  campaign: "may_launch",
});

This is useful when you are running a specific campaign and want to track a deeper conversion (demo request, trial start, upgrade click) beyond the initial signup. The source field appears in the Events section of your Analytics tab.

You can also read the current page's referral source and pass it programmatically:

await OperatorStack.ready;

// OperatorStack exposes the detected source on the analytics object
const detectedSource = OperatorStack.analytics?.source ?? "direct";

OperatorStack.trackEvent("waitlist_joined", {
  source: detectedSource,
});

What to Do With Referral Source Data

Three actions that move the needle within a week of launch:

Cut the channels that do not convert. A channel with 500 visits and 2 signups is not worth your time. Referral source data tells you this within days, not months.

Double down on the channel with the highest conversion rate. Often it is a niche community (an Indie Hackers thread, a specific subreddit, a Discord server) that sends fewer visitors but converts at 8-12% vs. 1-2% for broad social.

Activate your top referrers. The Referrals panel shows which ?ref= links drive the most signups. The people behind those links are your most engaged early users. Reach out before you launch.

Frequently Asked Questions

Does OperatorStack automatically capture UTM parameters?

Yes. Every pageview captured by OperatorStack records utm_source, utm_medium, and utm_campaign when they are present in the URL. No extra configuration.

What is the ?ref= parameter used for?

The ?ref= parameter carries a referral code from your waitlist sharing links. OperatorStack reads it on load and attributes the resulting signup to the correct referrer.

Can I track referral sources without changing my landing page code?

Yes. Add the OperatorStack script tag once. Referral source tracking is on by default -- no extra function calls needed for UTM and ref detection.

How do I see which source drives the most signups?

The Analytics tab in your project dashboard shows a traffic source breakdown. Each source lists pageviews and signup conversion rate so you can compare channels directly.

Can I add custom source data to an event?

Yes. Use OperatorStack.trackEvent('event_name', { source: 'your_source' }) to attach any source label to a custom event.