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.
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
| Newsletter | 4,212 | $8,420 |
| 3,108 | $5,140 | |
| YouTube | 1,927 | $3,860 |
| Direct | 1,512 | $1,910 |
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
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
| Newsletter | 4,212 | $8,420 |
| 3,108 | $5,140 | |
| YouTube | 1,927 | $3,860 |
| Direct | 1,512 | $1,910 |
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.
Drop the first-party pixel
Sets a first-party cookie, exposeswindow.trackrev.visitorId()for your checkout JS to read.
<script async
src="https://trackrev.io/p.js"
data-workspace="ws_..."
data-cookie-domain=".yoursite.com"></script>Pass the visitor id into Paddle checkout
Paddle Billing usescustomData; Paddle Classic usespassthrough(stringified). Pick the one your account is on.
// 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 — 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,
}),
});Point a Paddle webhook at TrackRev
Signed with your Paddle public key, idempotent onevent_id. Replays don't double-attribute.
# 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 + chargebacksThe 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.
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
| Newsletter | 4,212 | $8,420 |
| 3,108 | $5,140 | |
| YouTube | 1,927 | $3,860 |
| Direct | 1,512 | $1,910 |
Paddle integration FAQ
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.