Sign in

Blog / Attribution accuracy

Why attribution is never 100%

Published August 2026 · 6 min read

PORTLS is built to give you the most accurate picture possible of which links and content drive sales. But no attribution system can claim perfection. This page explains how we attribute, what can break the chain, and why an honest "Direct" is better than a guessed source.

How PORTLS attributes a sale

  1. A visitor clicks one of your PORTLS short links. We store a unique tracking id in the URL as fw_tid.
  2. The snippet on your storefront reads that id and stores it in a first-party cookie, along with any UTM parameters.
  3. When the shopper checks out, the store echoes the tracking id back to us in the order webhook.
  4. PORTLS matches the order to the click and credits the right link.

Server-side tracking, explained simply

Server-side tracking means the browser is just a sensor. The PORTLS snippet only collects a lightweight, first-party event and sends it to our servers. The real work — matching the click to the order, deduplicating bots, stitching sessions back together, and deciding which link gets credit — all happens on the backend.

That matters because ad blockers, privacy browsers, and iOS restrictions can block or limit third-party pixels. Because PORTLS receives order data directly from the store through signed webhooks, we can still attribute sales even when the browser pixel is missing or stripped.

What PORTLS is not. We do not use third-party cookies, fingerprinting, or invasive cross-site tracking. The snippet is a first-party sensor; the backend is the brain.

The honest trade-off. Server-side tracking is more resilient, but it is not magic. If a shopper clicks a link on their phone and buys later on their laptop, or if the order webhook arrives before the click is processed, attribution may still show as Direct. We will try to recover the session using buyer signals, but we will not fabricate a source.

What can break the chain

  • Ad blockers and privacy browsers. They can stop the snippet from loading, which means no tracking id is stored.
  • Storage limits. Safari and Firefox aggressively expire first-party cookies and local storage, especially for sites the user visits infrequently. A click today might not be remembered next week.
  • Cross-device journeys. Someone clicks your link on Instagram on their phone, then buys from their laptop later. The two devices do not share a cookie.
  • Apps that strip query params. Some in-app browsers remove fw_tid when the shopper lands on your store.
  • Hosted checkouts outside your theme. If the checkout page is rendered by the platform and does not include your footer snippet, we may not see the final steps before purchase.
  • Delayed purchases. A shopper clicks today, thinks it over, and returns directly tomorrow. The original tracking id is gone.

What PORTLS does anyway

When the simple chain breaks, we use several recovery layers before giving up and marking an order as Direct:

  • Buyer-signal matching. If the shopper enters an email, starts a cart, or begins checkout, we can match those signals to the order even without the original tracking id.
  • UTM fallback. Campaign and content parameters in the order can sometimes point back to the original link.
  • Stable visitor id. A first-party visitor id lets us link sessions that happen without a tracking id, as long as they occur on the same device and browser.
  • Session stitching. We look back from the order time and attach it to the nearest matching storefront session, even when the sale stays Direct.
  • Bundle expansion. Carts and orders sometimes disagree on product slugs when a bundle is involved. We expand bundle components so the session can still match.

Why we don't guess

It would be easy to assign every Direct order to the nearest click. But that would mislead you. We have seen cases where three different visitors browsed the same product in the same hour, and only one of them bought. Picking the nearest click would give the other two credit they did not earn.

Our stance is simple: an honest Direct is more useful than a false source. If you know the real source of an unattributed order, you can always manually attribute it in Settings.

How to get the best match rate

  • Install the snippet on your whole storefront, not just the landing page. The footer is usually the best place because it loads on every page, including checkout.
  • Use All traffic mode instead of Link only if you want PORTLS to build sessions for organic visitors too. That powers the recovery paths described above.
  • Keep links canonical. Don't shorten a PORTLS link twice through another shortener, because intermediate services can strip query parameters.
  • Make sure your checkout is on the same domain or uses the platform's theme snippet so the tracking id is passed through.
  • Categorize the PORTLS snippet as "necessary" or "analytics-first-party" in consent banners so it loads before the shopper leaves.

What a healthy number looks like

Match rates vary by audience. A store with most traffic coming from YouTube links and a well-installed snippet usually sees 85–95% of orders matched to a link. Stores with heavy mobile-app traffic, long purchase cycles, or a lot of direct/organic visitors will see more Direct orders. That is normal, not a bug.