> ## Documentation Index
> Fetch the complete documentation index at: https://seenpaid.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# How attribution works

> How seenpaid follows one id from a post click to a payment, and why some rows say Direct or Unknown. Applies when revenue attribution is on.

This page explains what happens when [revenue attribution](/guides/turn-on-revenue-attribution) is on. The short version: **one identifier rides along from the click to the sale**, and matching that id at both ends is what ties a payment back to a post.

## The one-identifier idea

The post lives on one surface (X, LinkedIn, TikTok) and the sale happens on another (Stripe, Gumroad, Shopify). The two never talk, so the link between "this post" and "this payment" is normally lost. seenpaid makes one id survive the whole journey:

```
post → tracked link → click → your site → checkout → payment
              (cp_tid)                 (client_reference_id)
```

That id is **`cp_tid`**, the seenpaid tracking id.

## The chain, step by step

<Steps>
  <Step title="A tracked link is minted">
    When you publish, seenpaid replaces your URL with `go.seenpaid.com/r/<id>` (redirect mode) or appends `?cp_tid=<id>` to your own URL (own-URL mode). The id is unique to that post and platform. On Instagram and TikTok the tracked link goes on your [bio page](/guides/bio-page).
  </Step>

  <Step title="A click is recorded">
    In redirect mode the `/r/<id>` hop logs the click and forwards the visitor to your page with `cp_tid` in the URL. In own-URL mode the pixel on your page reports the click.
  </Step>

  <Step title="The id is kept on your site">
    The [pixel](/guides/track-your-sales) stores `cp_tid` first-party, in both a cookie and localStorage, so it survives a visitor who lands on your homepage, browses to pricing, and buys later. It then attaches the id to your Stripe checkout as **`client_reference_id`**. For a Payment Link opened straight from the tracked link, no pixel is needed.
  </Step>

  <Step title="A payment fires">
    Your payment provider sends seenpaid a webhook for the completed payment: Checkout Session, Payment Link, direct charge or subscription invoice on Stripe, or the equivalent sale event on Gumroad, Lemon Squeezy, Whop, Shopify, Paddle, Polar or Dodo Payments.
  </Step>

  <Step title="The sale is matched to the post">
    seenpaid reads the id, finds the click it belongs to, and finds the post behind it. The revenue now belongs to that post.
  </Step>
</Steps>

## The reporting window

Results summarises a rolling window of **7, 30 or 90 days** (30 by default). Totals count only matched payments and clicks inside the window; "vs previous period" compares against the equal-length window just before it.

## Why some rows say Direct or Unknown

* **Direct**: a click with no referrer (typed URL, in-app browser, stripped referrer). Still a real, attributed click.
* **Unknown**: seenpaid couldn't resolve that dimension (no geolocation, unrecognised device).
* **None**: the link carried no UTM tag for that field.

A large Direct share is normal for social traffic.

## What counts as revenue

Completed checkouts and payment links, direct charges, recurring subscription invoices. Refunds and chargebacks are subtracted back out, so a post's earnings reflect money you kept.

## Honest by design

seenpaid never invents a match. A payment with no tracking id, or one that doesn't resolve to a click, is recorded as revenue but left **unattributed**, not credited to a random post. There is no "probable" tier based on referrers, time windows or fingerprinting; a modelled number beside a real one would make the real one doubtful. The **Sales traced to a post** figure on Results shows exactly what share of your payments was traceable.

## Privacy

* **First-party only.** `cp_tid` is stored on your own domain; seenpaid uses no third-party cookies and no cross-site tracking network.
* **The pixel does nothing on a direct visit.** No tracked link, no id, nothing to store.
* **The matching field is an opaque id**, not personal data. seenpaid does not guess a buyer from their email.

<CardGroup cols={2}>
  <Card title="Track your sales" icon="code" href="/guides/track-your-sales">
    The one tag that carries cp\_tid into checkout.
  </Card>

  <Card title="Connect a revenue source" icon="plug" href="/guides/connect-stripe">
    Stripe and seven other payment tools.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.