Updated 2 October 2026
Polar revenue attribution
Polar handles the order and the subscription. trckable adds where it came from: the source, campaign and page behind each paying customer.
In short
- Connect with an organization access token. trckable creates the webhook endpoint, backfills 90 days and checks again every six hours.
- Checkout links carry the visit on their own: the tracker adds a reference to
polar.shlinks on click. Checkouts you create through the API take onemetadatafield. - Checkout metadata becomes order metadata and renewals inherit it, so a subscription keeps crediting the visit that won it.
From a Polar order to a reason#
Polar's dashboard shows your orders, customers and subscriptions. What it cannot show is why a customer showed up. Did the order come from your launch post, a search for a tool like yours, or a link in your README?
That is the question that decides where the next week goes. trckable ties each order to the visit that preceded it, so you read sources, pages and campaigns with revenue next to them.
How a Polar order finds its visit#
- Checkout links. When a visitor clicks a link to Polar, the tracker adds the visitor id as
reference_id. No configuration. - Checkouts created with the API. Pass the visitor id as metadata with the helper in the npm package:
const ids = getIds(request.headers.get('cookie'))
await polar.checkouts.create({ products: [productId], ...checkoutFields('polar', ids) })
- Renewals. Polar copies a checkout's metadata onto the order, and a subscription's renewals inherit the subscription's copy. So attribution survives renewals without anything else to configure.
An order with no visitor id still counts in your totals, shown as unattributed.
Connect Polar in three steps#
- Create an organization access token in the Polar dashboard with three scopes:
webhooks:write,orders:readandrefunds:read. - Paste it in Settings → Payments → Polar. If you use Polar's sandbox, choose the sandbox mode: it is a separate service with its own tokens, and its payments are kept apart from your real numbers. trckable creates the webhook endpoint with a pinned API version, stores the signing secret encrypted and backfills 90 days.
- Click a checkout link from a page you visited with the tracker on, and check that the order appears in the Payments page, as a test payment if you used the sandbox.
Prefer not to give a token? The manual setup shows the endpoint address and the events, and you paste the signing secret back. A self-hosted trckable needs a public HTTPS address for Polar to reach (TRCKABLE_BASE_URL).
What trckable listens for#
| Event | Used for |
|---|---|
order.paid | The payment: amount, tax, currency, customer, metadata |
order.updated, order.refunded | Refunded totals on an order |
refund.created, refund.updated | Refunds, recorded once each |
The order is the payment. Polar's webhooks follow the Standard Webhooks signing scheme, and trckable verifies each delivery before it believes it. It accepts both of the secret formats Polar has used, so a connection created before the change keeps working.
What you see#
Revenue, conversion and revenue per visitor appear in the key numbers; revenue plots under the visitors chart; every breakdown row has revenue and conversion columns; and Sources that pay ranks channels by revenue per visitor. In Full mode, Pages that sell and Latest buyers complete the picture.

What counts as revenue#
- The amount paid excluding tax, before fees, converted at the European Central Bank's rate on the day of the payment.
- Refunds are subtracted per refund. Sandbox orders are kept out of your real numbers.
- Attribution goes to the last non-direct visit within 90 days before the order, or to the first touch if you switch the model. The total never changes, only who gets the credit.
If a delivery fails#
trckable writes each webhook to disk before it answers, and every six hours it lists recent orders and refunds through Polar's API to fill any gap. A missed delivery is a delay and not a hole.
Questions#
- Where do I find an organization access token?
- In the Polar dashboard. Give it only the three scopes above: it needs to create one webhook endpoint and read orders and refunds.
- Does it work with Polar's sandbox?
- Yes. Choose sandbox when you connect: it is a separate environment, and trckable keeps its payments apart from your real numbers.
- Do subscription renewals keep their source?
- Yes. Metadata from the first checkout is on the subscription, and renewals inherit it, so a renewal is credited to the visit that started the subscription.
- I sell sponsorships and one-off products. Does that work too?
- Yes: the order is the payment, whatever it sells.
- Will my numbers match Polar's dashboard exactly?
- They are built the same way from the same orders, but trckable shows amounts excluding tax, before fees and converted at the ECB rate. We say "reconciled with Polar", not "identical".
Keep reading#
- Revenue attribution for every provider
- The full revenue docs
- Stripe, Paddle, Lemon Squeezy, Dodo Payments
- trckable is free and open source: self-host it, or let us run it