Integration · Paddle

Paddle revenue, attributed to the click that earned it.

Paddle's merchant-of-record model hides the customer behind their VAT engine. TrackRev fixes that by passing your first-party visitor id through `custom_data` (Billing) or `passthrough` (Classic) — so every transaction comes back with its channel attached.

Revenue · last 10 days
How it works

The visitor id rides shotgun through checkout.

Paddle's checkout takes a `custom_data` object (Billing) or `passthrough` string (Classic). We stash your TrackRev visitor id in there at checkout open. The webhook drops it back to us. Match made, sale attributed.

  • First-party pixel exposes window.trackrev.visitorId() for checkout config
  • Paddle stores custom_data on the transaction + the subscription
  • Webhook delivers transaction.completed events to TrackRev within seconds
Top channels · 30 days
Newsletter4,212$8,420
Facebook3,108$5,140
YouTube1,927$3,860
Direct1,512$1,910
Merchant of record, sorted

Tax-exclusive revenue. None of Paddle's VAT inflating your channels.

Paddle handles VAT, sales tax, and reverse charge invoicing for you — but those line items shouldn't show up as ad revenue. TrackRev reads the `tax_exclusive` total per transaction, so your per-channel numbers reflect what you actually earned, not what the buyer paid.

  • Net revenue = Paddle's tax-exclusive subtotal, fees backed out
  • Multi-currency: native currency stored, USD at daily ECB rate for totals
  • Refunds via adjustment.created reverse credit + commissions
Revenue · last 10 days
Subscription LTV

Renewals inherit the original visitor id.

Paddle stamps `custom_data` on the subscription itself, not just the first transaction. Every renewal `transaction.completed` carries the visitor id forward — so a Newsletter signup that turns into a $390 annual subscription keeps crediting Newsletter on year 2, 3, and 4.

  • Recurring multiplier configurable per program (one-time, N months, lifetime)
  • Subscription cancellations stop future credit; refunds reverse it
  • Plan changes update the attributed MRR without losing channel history
Top channels · 30 days
Newsletter4,212$8,420
Facebook3,108$5,140
YouTube1,927$3,860
Direct1,512$1,910
Setup

Paddle + TrackRev in 3 steps.

One script tag, one line in your checkout config, one webhook. Works for Billing and Classic — same flow, different field name.

1

Drop the first-party pixel

Sets a first-party cookie, exposeswindow.trackrev.visitorId()for your checkout JS to read.

Your site (once)
<script async
  src="https://trackrev.io/p.js"
  data-workspace="ws_..."
  data-cookie-domain=".yoursite.com"></script>
2

Pass the visitor id into Paddle checkout

Paddle Billing usescustomData; Paddle Classic usespassthrough(stringified). Pick the one your account is on.

Paddle Billing (custom_data)
// Paddle Billing — pass the TrackRev visitor id into custom_data.
Paddle.Checkout.open({
  items: [{ priceId: "pri_xxx", quantity: 1 }],
  customer: { email: user.email },
  customData: {
    trackrev_visitor_id: window.trackrev?.visitorId() ?? null,
  },
});
Paddle Classic (passthrough)
// Paddle Classic — same idea, but the field is called `passthrough`.
Paddle.Checkout.open({
  product: 123456,
  email: user.email,
  passthrough: JSON.stringify({
    trackrev_visitor_id: window.trackrev?.visitorId() ?? null,
  }),
});
3

Point a Paddle webhook at TrackRev

Signed with your Paddle public key, idempotent onevent_id. Replays don't double-attribute.

Paddle → Notifications
# Paddle Dashboard → Developers → Notifications → New endpoint:

https://api.trackrev.io/webhooks/paddle/ws_xxxx

# Events:
transaction.completed
transaction.payment_failed
subscription.canceled
adjustment.created    # refunds + chargebacks
What TrackRev tracks from Paddle

The Paddle data we listen for.

Completed transactions

Native currency, tax-exclusive subtotal, customer email, custom_data — joined to a click on every webhook.

Subscription renewals

Recurring transaction.completed events inherit the original subscription's custom_data + visitor id.

Billing + Classic

Both Paddle products supported behind the same TrackRev workspace — pick per integration.

Multi-currency

Native currency preserved per transaction; USD totals via daily ECB conversion for cross-currency views.

Refunds + adjustments

adjustment.created events reverse revenue and commission credit on the next sync tick.

Email fallback

When custom_data is missing (ad-blocker race), email-to-visitor binding catches the attribution anyway.

Paddle + affiliate program

Pay your affiliates from Paddle transactions, same engine.

Pro-tier workspaces pipe Paddle transactions through the same commission ledger as Stripe. A partner's tagged TrackRev link drops the visitor id into checkout; the webhook closes the loop; the commission row writes itself. Refunds via Paddle's adjustment.created reverse pending payouts.

  • Partner commissions accrue from real Paddle transactions, not raw clicks
  • Recurring commissions follow Paddle subscription renewals
  • Adjustments / refunds reverse pending commissions
  • Monthly payouts via Stripe invoice, PayPal Payouts, or manual CSV
Top channels · 30 days
Newsletter4,212$8,420
Facebook3,108$5,140
YouTube1,927$3,860
Direct1,512$1,910

Paddle integration FAQ

Both. Paddle Billing is the default — we read transactions via the v1 API and listen for the `transaction.completed` webhook. Paddle Classic uses the legacy `passthrough` field instead of `custom_data`, but the wiring is identical from your side. Set a key, set a webhook, done.

Connect Paddle. See your channels in tax-exclusive revenue.

Works with Paddle Billing and Paddle Classic. Free tier covers 1,000 events / month. No card to start.