TrackRev
Blog
6 min read
Polar revenue attribution

How to Track Which Acquisition Channel Pays Your Polar MRR

Polar products convert at 3.8% from click to payment, but a total rate hides which channel pays your MRR. How to tie every Polar sale to its source channel.

Muzahid Maruf — Founder of TrackRev.io

Muzahid Maruf, Founder

LinkedIn

On this page
  1. 01Why This Matters for Your Revenue
  2. 02Why Polar attribution matters for indie founders
  3. 03The three-step setup
  4. 04Passing metadata into Polar Checkout
  5. 05Reading metadata from the Polar webhook
  6. 06Polar vs Stripe vs Lemon Squeezy: attribution complexity compared
  7. 07Channel performance for Polar products
  8. 08The Polar audience difference
  9. 09TrackRev and Polar attribution

Explore with AI

Opens this article inside the chosen assistant with a ready-made prompt.

To know which acquisition channel actually pays your Polar MRR, you have to tie each sale back to the click that earned it — Polar-native products convert at 3.8% from first link click to first payment, but without channel-level revenue attribution founders see only that total, not which community post, newsletter, or Twitter thread drove each sale.

Polar attribution works the same way as Lemon Squeezy or Paddle: pass a session ID into the Polar Checkout via metadata, read it back from the checkout.updated or order.created webhook, match it to the originating click.

Polar's API is the cleanest of the three — proper REST with typed responses — so the integration is the shortest. This guide covers the setup for indie founders using Polar for subscriptions, digital products, or one-time sales.

Key Takeaways

  • Polar embeds checkout on your own domain — unlike Lemon Squeezy or Paddle — so the visitor cookie is already in scope at checkout creation time with no cross-domain gymnastics required.
  • Pass the visitor ID as metadata.vid in the server-side checkouts.create call; reading the cookie server-side eliminates the race condition that client-side reads create.
  • Always attribute on order.created, not the success_url redirect — buyers who close the tab after paying still fire the webhook but lose the redirect.
  • The metadata object persists on the subscription for its lifetime, so every renewal auto-attributes to the original channel and keeps LTV per channel updated automatically.
  • For Polar/indie products, once you can see which channel pays your MRR, newsletter, direct/word-of-mouth, and affiliate channels consistently dominate revenue — paid social rarely works at indie-product ACVs.

Why This Matters for Your Revenue

3.8% conversion rate is invisible by channel without attribution — and a single headline number flattens five very different channels into one indistinguishable average.

A Hacker News post that converts at 9% looks identical to a Twitter thread that converts at 0.4%, because both vanish into the same total.

The result is the smallest possible marketing surface — one solo founder, maybe a few hours a week — being spent on the loudest channel rather than the one quietly compounding.

For a Polar product doing $5K/month, redirecting two hours a week toward the channel that actually converts is the difference between a side project and a sustainable income.

Once each Polar order carries its originating channel through the metadata bridge, that 3.8% splits cleanly into per-channel conversion rates and revenue-per-click numbers you can actually compare.

A Discord that quietly produces 30% of revenue at 8% conversion becomes obvious instead of invisible, and a Twitter strategy that has produced zero paid customers in six months becomes hard to defend.

The same Stripe-style attribution mechanics — see Stripe revenue attribution — apply here with even less plumbing, because Polar embeds on your own domain.

Why Polar attribution matters for indie founders

Polar is built for solo founders, indie hackers, and small dev teams selling subscriptions, digital products, and one-time purchases.

Its core audience runs lean — usually one or two people splitting product, marketing, and support — which means every promotional hour has to compete with feature work, not against another marketer's calendar.

Attribution is the difference between knowing where to spend the next week and guessing.

Knowing whether your Product Hunt post or your Twitter thread drove more paying customers determines where you spend the next week of promotional effort.

Without that data, a founder might double down on the loudest channel rather than the highest-converting one — and "loudest" and "highest-converting" almost never agree at indie scale.

If you're driving traffic from a newsletter, a YouTube channel, X, an affiliate, and a Product Hunt launch, you want to know which one is actually paying. Polar's default dashboard shows revenue by product and customer — never by acquisition source.

The data exists; it just isn't joined to the click that earned it.

Why every promotional hour competes with feature work

At indie scale, marketing and product are the same person — usually the founder.

An hour spent writing a Twitter thread is an hour not spent shipping a feature, and an hour spent on a YouTube video is an hour not spent fixing a customer support ticket.

That makes the cost of misallocating promotional time genuinely high, because there is no marketer to absorb the wasted effort.

Knowing which channel actually drives paying customers is the difference between writing the next thread because it works and writing it because it's a habit. Attribution converts a high-stakes guess into a one-line dashboard query.

Why "loudest" and "highest-converting" rarely match

The channels that produce the most visible engagement — likes, retweets, comments — almost never produce the most paying customers.

A Twitter thread that goes viral routinely drives 50,000 impressions, 200 link clicks, and zero subscriptions; a quiet Hacker News post that no one shares can drive 80 clicks and 8 paying customers in the same week.

Without attribution the founder sees only the viral thread's surface metrics and concludes Twitter is the channel that works. The dashboard tells the opposite story once revenue per click is the comparison metric — and that reversal usually persists across months.

The three-step setup

Step 1 — Tracking link per channel. Newsletter, X profile bio, YouTube description, each partner. Why this matters: without a unique tracking link per channel, the cookie has no source value to record.

Skipping this step means every conversion gets tagged (direct) regardless of where the click actually came from — and the entire attribution chain becomes useless.

Step 2 — Pass metadata into Polar Checkout. Polar Checkout accepts a metadata field in the create-checkout API. Stuff the visitor ID into it at the moment you create the checkout, on the server, after reading the cookie from the request.

Why this matters: Polar's checkout runs on your domain (Polar embeds rather than redirects), but the metadata bridge is still the cleanest way to carry the visitor ID through to the webhook payload without depending on cookie state at checkout completion time.

Step 3 — Listen for order.created and read the metadata. Match it back to the click. Why this matters: the webhook is the only signal that fires reliably on every successful payment, including renewals and webhook retries after a transient failure.

Skipping the webhook (and trying to attribute on the success_url redirect instead) loses any conversion where the user closes the tab before redirect, plus every recurring payment after the first.

For a subscription-focused walkthrough, see our Polar.sh revenue tracking setup for attributing every subscription to a channel.

The instinct at indie scale is to share one Polar buy-link across the newsletter, the Twitter bio, the YouTube description, and every Discord — fewer links to manage, less surface area for typos.

That collapses every channel into one undifferentiated bucket on the dashboard, and attribution is impossible no matter how clean the rest of the integration is.

A unique tracking link per channel writes a distinct UTM source into the first-party cookie at landing time, which is the value you ultimately credit the sale to.

Without distinct links the metadata still flows through, but every channel points to the same anonymous source.

Why metadata is set server-side, not client-side

Polar's create-checkout call accepts metadata from any source, but setting it server-side from the cookie on the inbound request is the only failure-proof option.

Client-side reads can race with a not-yet-set cookie on first-page-load conversions, and a value that depends on a JavaScript bundle that has not fully hydrated will be empty more often than teams expect.

Reading the cookie inside your /api/checkout route, where you have full request context and a deterministic execution order, eliminates the race condition entirely.

The server-side read also lets you cross-reference the visitor ID against your own database before passing it through.

Why order.created beats the success_url redirect

The success_url redirect runs in the buyer's browser and depends on them not closing the tab after payment — and a meaningful percentage of buyers close the tab the moment they see the confirmation page render, before any JavaScript fires.

Attribution that depends on the redirect therefore loses every one of those conversions. order.created fires from Polar's infrastructure regardless of what the buyer does next, and re-fires on every renewal afterward, which is what lets LTV per channel update automatically.

Use the redirect for the user-facing thank-you experience and the webhook for the actual attribution write.

Access-token scopes you need

The server-side polar.checkouts.create call needs an access token with at least checkouts:write, and the webhook needs the matching webhooks:read scope so you can pull event history if a delivery is missed.

Generate a server-only token in the Polar dashboard, never a client-side one — a leaked client token lets anyone create paid checkouts against your products.

Passing metadata into Polar Checkout

Server: create Polar checkout with metadata
// Using polar-sh SDKconst checkout = await polar.checkouts.create({  product_id: "prod_01h...",  customer_email: user.email,  metadata: {    vid: user.visitorId ?? "",  },  success_url: `${process.env.SITE_URL}/welcome`,}); // Redirect the visitor to checkout.url

Webhook event types worth subscribing to

Polar exposes a granular event stream: order.created for one-time and first-cycle subscription payments, subscription.created for the subscription record itself, subscription.updated for plan changes, and subscription.canceled for churn. Attribute revenue on order.created only — the others are state transitions, not money movements.

Subscribing to all of them is fine, but route only one to your attribution writer.

Reading metadata from the Polar webhook

Webhook handler: read metadata on order.created
// POST /api/polar/webhookconst event = JSON.parse(rawBody); if (event.type === "order.created") {  const vid = event.data?.metadata?.vid;  const email = event.data?.customer?.email;  const revenue = (event.data?.amount ?? 0) / 100;   attributeOrder({ vid, email, revenue });}

Webhook signature verification with standard-webhooks

Polar follows the standard-webhooks spec: every delivery includes webhook-id, webhook-timestamp, and webhook-signature headers. Verify against the secret you set when registering the endpoint, and reject anything older than five minutes to block replay attacks.

Polar's official SDK exposes a validateEvent helper that does both checks in one call.

Polar vs Stripe vs Lemon Squeezy: attribution complexity compared

Polar's attribution setup is actually simpler than Lemon Squeezy's because checkout happens on your own domain — the cookie does not have to survive a cross-domain redirect.

Polar is also the lowest-cost Merchant of Record of the group: its published pricing starts at 5% + 50¢ and drops toward roughly 3.8% + 40¢ on paid tiers, versus a flat ~5% + 50¢ for both Lemon Squeezy and Paddle.

Here is how the three platforms compare on the variables that affect how you wire up tracking.

AspectStripePolarLemon Squeezy
Checkout domainYour domain or stripe.comYour domain (Polar embeds)lemonsqueezy.com
Cookie trackingWorks nativelyWorks natively (same domain)Requires URL parameter passthrough
Custom metadata fieldmetadata: {} objectmetadata: {} objectcheckout[custom][key] URL parameter
Webhook event for paymentcheckout.session.completedorder.createdorder_created
Session ID passthrough methodStripe Checkout metadataPolar Checkout metadataCustom URL parameter
Setup complexityLowLowMedium
Merchant of Record / fee✗ PSP — 2.9% + 30¢✓ MoR — from ~3.8% + 40¢✓ MoR — ~5% + 50¢
TrackRev native support

Why Polar's same-domain embed simplifies the integration

Because Polar embeds checkout in an iframe on your own domain rather than redirecting to a separate one, the visitor ID is in scope at checkout creation time without any cross-domain gymnastics.

There is no URL-encoding step, no truncation risk, no JSON-string-inside-a-query-param dance — you read the cookie server-side, pass it as a typed metadata field, and the webhook returns it parsed.

The integration code is shorter than the equivalent Lemon Squeezy or Paddle setup by roughly a third, and the silent-failure surface is correspondingly smaller.

This is the structural reason Polar's setup complexity sits at "Low" in the comparison table while Lemon Squeezy sits at "Medium".

Why a typed metadata field beats a stringified payload

Polar's metadata field accepts a proper JSON object end-to-end — your create-checkout call sends an object and your webhook handler receives the same object, with no JSON.parse step in between.

That eliminates an entire class of bugs that plague Paddle Classic and Lemon Squeezy integrations, where a JSON string passed through a URL parameter can truncate, escape incorrectly, or fail to parse on the webhook side.

The typed schema also makes IDE autocomplete useful — you discover the available fields by typing rather than by reading the docs, which is the kind of API quality that prevents bugs from being written in the first place.

Channel performance for Polar products

Based on attribution data across TrackRev workspaces using Polar, indie products see very different channel mixes than B2B SaaS. Owned audience and launch-day traffic dominate; paid social barely registers.

Newsletter and direct traffic together typically account for 50–65% of attributed revenue on Polar-connected workspaces — a number that would look broken on a B2B SaaS dashboard but is normal for indie distribution.

Direct traffic is unusually high for indie products and represents the strongest growth signal in the data. Most of it is dark social — DMs, Slack pastes, Telegram forwards, screenshot shares — and word of mouth from existing customers.

It is the channel you cannot buy and the channel that ranks first on every Polar workspace we have analysed.

ChannelAvg. click-to-paid rateAvg. revenue per click
Newsletter6.2%$4.80
X / Twitter2.1%$1.90
Product Hunt (launch day)4.8%$3.40
Affiliate / friends5.4%$5.20
Direct8.1%$6.10

Source: Aggregate TrackRev workspace data, 2026. Polar-connected workspaces.

Why niche communities outperform larger networks

For Polar and indie products, traffic from Hacker News, IndieHackers, Reddit niches, and small Discord servers consistently outperforms larger paid channels on revenue per click.

The clicks are lower in absolute volume but the audience is pre-qualified — they self-selected into the niche your product serves, so the conversion gap closes by 3-5x compared to paid social.

"Affiliate / friends" in the table includes informal recommendations from other indie makers, which is why its revenue per click sits at the top.

The pattern is consistent across every Polar workspace in the dataset: small, targeted communities convert at rates that make paid social look structurally broken at indie ACVs.

Why direct traffic dominates indie product dashboards

On every Polar workspace we have analysed, the direct channel ranks first by revenue per click — usually by a wide margin. The reason is that almost none of it is truly direct.

It is dark social: links pasted into private DMs, Slack threads, Telegram groups, and screenshots shared in WhatsApp; word of mouth from existing customers vouching for the product to a friend; and brand search where the visitor already knew your name from somewhere a tracking link cannot reach.

These visitors arrive pre-qualified, which is why their click-to-paid rate sits at 8.1% versus 2.1% for cold Twitter traffic. The implication: invest in being recommendable, not just in being seen.

The Polar audience difference

Polar's typical customer — indie founder, solo developer, two-person SaaS team — is not the same buyer as a mainstream B2B SaaS workspace. The channel mix follows the buyer, not the product.

Three structural differences shape which channels actually work for Polar products.

Communities over paid ads. Indie founders are usually targeting developers, designers, no-code builders, and other indie founders — audiences that congregate in niche communities (Hacker News, IndieHackers, niche subreddits, Twitter circles) rather than scrolling Instagram.

Paid Facebook/TikTok at indie ACVs ($5–$50/month products) almost never works because CAC sits above LTV on day one. Community presence — answering questions, shipping in public, posting build logs — pays compound returns at zero variable cost.

Word of mouth over partnerships. Formal affiliate programs at indie scale tend to fail the same way: 200 affiliates sign up, three send any clicks, one drives almost all the revenue.

What actually works for Polar products is informal recommendations — other indie makers who already use your product telling their followers about it, with or without a referral link. The "Affiliate / friends" line in the table above is mostly that.

Plan for it: make your product easy to recommend before you build a tiered commission structure.

Why content marketing is the indie founder's highest-leverage channel

Without a growth team, an indie founder's leverage is one detailed blog post, one good demo video, one open-source library that doubles as a lead magnet.

A single tutorial that ranks for a long-tail query keeps generating clicks for years; a Facebook campaign stops the minute the credit card stops.

The Polar channel mix reflects this — content and SEO are rarely the top channel by raw clicks but are consistently top three by LTV.

The compounding nature of search-indexed content means that the effort invested in month one is still producing attributed revenue in month twelve, which is a payoff curve no paid channel can match at indie scale.

Tip

Polar's metadata object accepts arbitrary nested JSON, but flat string keys are the safest — webhook handlers across SDK versions sometimes coerce nested objects to strings inconsistently. Store the visitor ID, UTM source, and campaign as top-level keys and you'll never debug a parse mismatch. The TrackRev Polar integration uses this flat schema by default.

TrackRev and Polar attribution

TrackRev integrates with Polar's checkout and subscription webhooks. Paste your Polar access token into TrackRev's integration settings, and the metadata handshake is wired up at checkout creation time.

Related reading: Lemon Squeezy revenue attribution for the parallel LS flow; Stripe revenue attribution for the simpler Stripe case; Paddle revenue attribution if you also sell through Paddle.

TrackRev's free tier covers 1,000 events — usually enough to see channel patterns clearly on a small Polar product.

External references: Polar checkouts API documentation; Polar webhooks documentation; Stripe docs for comparison.

For indie founders selling on Polar, the next infrastructure decision is usually whether to bolt on a separate affiliate tool — and the default stack here is brutal for small-team economics.

Bitly Growth at $35 a month for link tracking plus Rewardful Starter at $49 a month for affiliates is $84 a month, two systems pulling from the same Polar order.created webhook with two definitions of a sale and a monthly reconciliation that no solo founder actually has time for.

TrackRev covers both for $39 a month against one Polar connection with a single definition of a sale — 54% cheaper than the two-tool stack and built so affiliate-driven revenue rolls up alongside newsletter, community, and direct in the same dashboard.

If you are evaluating an attribution setup for Polar today, the lower-cost answer is the same one that handles your affiliate program tomorrow, on the metadata field you have already wired up.

Polar's clean metadata object is the same field that carries an affiliate ID through the same order.created webhook — there is no second integration to build and no second tool to pay for.

Most SaaS teams run Bitly Growth ($35/mo) for link tracking and Rewardful Starter ($49/mo) for affiliates — $84/mo for two tools with two different definitions of a conversion.

TrackRev is $39/mo for both, on the same Polar data, with no monthly reconciliation between systems.

For a solo founder running a Polar product, the $45/month saving is real budget and the eliminated reconciliation work is real time — both better spent on the product or on the channels the dashboard now shows you should fund.

Wire the metadata once and let the same handshake power channel attribution and affiliate commissions together.

Found this useful? Share it.

PostLinkedIn

Frequently asked questions

Muzahid Maruf — Founder of TrackRev.io

Written by

Muzahid Maruf, Founder, TrackRev.io & Contant.io

Muzahid Maruf is the founder of TrackRev.io and Contant.io. He writes about marketing attribution, link tracking, and revenue analytics for SaaS teams.

Writes about Marketing attribution · Link tracking · Revenue analytics · SaaS growth

Keep reading

Related articles from the TrackRev blog.

Stop guessing where your revenue comes from.

Set up TrackRev in 5 minutes. Free tier covers 1,000 events / month — no card needed.

How to Track Which Acquisition Channel Pays Your Polar MRR · TrackRev