Dodo Payments affiliate tracking comes down to one metadata key and one webhook event. You attach a referral ID to the checkout as metadata, Dodo carries it through the payment, and a payment.succeeded webhook hands it back to your affiliate software with the money attached. Everything else (renewals, refunds, disputes, tax) is variations on that loop, and this article walks through each one with the real event names.
So you know who’s talking: Rekomi is what I build all day, and Dodo’s own affiliates documentation lists us as one of three integration partners, alongside Affonso and Dub Partners. I’ll keep the mechanics honest and name the exact fields, because on a merchant-of-record platform the details are where the money hides.
Sixty-second summary:
Attribution rides in metadata:
rekomi_refon API checkouts, or?metadata_rekomi_ref=appended to a static payment link.One event carries all the money:
payment.succeededfires for one-time sales, first subscription charges, and every renewal.Commissions are pre-tax: Dodo is the merchant of record, so affiliates earn on the sale amount, never on the VAT Dodo collects.
How Dodo Payments affiliate tracking works out of the box
Dodo doesn’t build its own tracking engine, but it’s unusually welcoming to the tools that do. There’s an Affiliates section right in the Dodo dashboard (powered by Affonso), and the docs describe the metadata pattern that any tracking tool rides on. Credit where due: Dodo made a deliberate platform decision here, and it’s a good one – metadata attached to a checkout, subscription, or payment persists through the object’s whole life, which is exactly the property attribution needs.
If you’re comparing the tools themselves, that’s a different article: best affiliate software for Dodo Payments covers the field. Here we’re staying under the hood.
Step one: the click stores a referral
An affiliate link is just your URL with a recognizable param: yoursite.com?via=maria. A script in your site’s head picks it up on page load, stores the slug in the visitor’s browser with a 90-day window, and logs the click server-side with its referrer and UTM tags. Rekomi’s script also accepts the params other platforms trained the internet on (?ref=, ?fpr=, 19 in total), which is a small thing that saves real migration pain: nobody has to reprint their links.
The click is now sitting in the browser as a stored referral. It hasn’t met Dodo yet. That handoff is step two, and it’s the only step with any real engineering in it.
Step two: the referral gets into the payment
Here’s the mechanism: Dodo accepts a metadata object on checkouts, subscriptions, and one-off payments, and it copies any metadata_* query param on a payment link into that same object. That gives you two routes, one for each kind of seller.
Static payment links (no code): append the flat underscore param and you’re done:
https://your-checkout-link?metadata_rekomi_ref=maria
API checkouts (server-side): grab the stored referral client-side with window.Rekomi.getReferral(), hand it to your server, and include it in the request body:
"metadata": { "rekomi_ref": "maria" }
I’ll flag a nice Dodo-specific detail here: because any metadata_* query param is copied straight into metadata, payment links need no special-cased field. On Polar, by contrast, checkout links only pass a single reference_id param, so tools have to run a fallback read. Dodo’s design is simpler, and simpler attribution plumbing is plumbing that doesn’t leak.
Once the metadata is on a subscription, it persists for the subscription’s entire life. Stamp it at signup and the renewal in month 20 still knows who sent the customer.
Step three: one webhook event, every dollar
This is my favorite part of Dodo’s event model, and the part most worth understanding before you trust any tool on it. payment.succeeded fires for every charge: a one-time purchase, the first subscription payment, every monthly renewal, an upgrade’s immediate charge, even the recovery charge after a subscription comes off hold. Listen to that one event and you’ve heard all the money.
The double-count trap: Dodo also emits subscription.renewed, and it fires alongside payment.succeeded on every renewal. A tool that credits both events pays the commission twice, and a tool that keys on subscription.renewed alone reads a pre-tax plan amount rather than what was actually charged. When you evaluate any tracking tool on Dodo, this is genuinely the question I’d ask first: which events do you credit, and how do you dedupe them? (Rekomi’s answer: payment.succeeded only, deduped by payment ID.)
The subscription lifecycle events (subscription.active, on_hold, failed, cancelled, expired) move no money. They exist so a dashboard can tell you a referred customer churned, which matters for the affiliate’s expectations more than for the ledger.

Refunds and disputes: the clawback loop
A commission that survives its refund is a leak in your margin. Dodo closes that loop with two event families:
refund.succeededreverses commission per refund. Dodo allows refunds within 30 days of the transaction, each partial refund arrives as its own event with its own ID, and the clawbacks keep landing until the original commission is exhausted – never past it.dispute.openedclaws back immediately. Dodo holds the disputed funds the moment a chargeback opens, so the commission reverses at the same moment. That’s a very real advantage over platforms with no dispute signal at all (Polar, for one, has none).
One honest asymmetry: if you later win the dispute, the commission doesn’t automatically restore. Won disputes are rare enough that this is a reasonable trade, but it’s real, and the audit trail shows you exactly when it happens so you can re-credit the affiliate manually.

Who gets credited, and on what amount
When payment.succeeded arrives, resolution is a short ladder: the rekomi_ref metadata wins if it matches an approved affiliate; otherwise the customer’s history does (a prior attributed purchase by the same Dodo customer credits the same affiliate, which is what keeps renewals honest even when metadata goes missing); otherwise the sale records unattributed and waits in a review queue. Worth stating plainly: there’s no coupon-code fallback on Dodo. A “use my code” promotion with no click won’t attribute here, so links are the mechanism, full stop.
Now the amount. Dodo is a merchant of record: it collects sales tax and VAT on your behalf, and the charge the customer sees includes it. Commission math has to care. Say you sell a $49 product at a 20% commission, and a customer in Germany pays $58.31 with 19% VAT on top. The affiliate earns 20% of $49, which is $9.80 – not 20% of $58.31, which would quietly overpay by $1.86 on every single German sale. Pre-tax basis is 100% the correct behavior on any MoR platform, and it’s worth confirming whichever tool you pick does it.
That $1.86 sounds small until you scale it: at 500 international sales a month, tax-inclusive commissions would overpay affiliates by roughly $900/mo of margin you never intended to give away. The plumbing pays for itself fast!
What the affiliate experiences
From the affiliate’s chair, all of this collapses into something pleasantly boring: a link, a dashboard showing clicks and conversions, and commissions that appear when payments succeed and shrink when refunds happen. Recurring is where Dodo products shine for affiliates – a $25/mo subscription at 30% is $7.50 landing every month per retained customer, because every renewal’s payment.succeeded carries the same subscription metadata. When balances become payouts, Rekomi moves the money itself and handles the tax forms; the payout rail details live in the Dodo Payments setup guide.
Questions people actually ask
Does Dodo Payments support affiliate tracking natively?
Partly. Dodo has an in-dashboard Affiliates feature powered by Affonso, and its docs list Affonso, Dub Partners, and Rekomi as integration partners. The tracking mechanics (metadata plus webhooks) are the same underneath whichever you choose.
Do renewals pay recurring commissions on Dodo?
Yes. The metadata stamped at signup stays on the subscription permanently, and every renewal fires its own payment.succeeded, so each renewal credits the original affiliate automatically.
Is commission calculated before or after tax?
Before. Dodo is the merchant of record and the tax it collects belongs to tax authorities, so a correctly built tool commissions the pre-tax sale amount.
Can affiliates be credited by discount code on Dodo?
No. Attribution on Dodo runs on link clicks carried through metadata; there’s no reliable code-to-affiliate signal in the payment events.
What happens if a customer files a chargeback?
The commission reverses the moment dispute.opened arrives, matching Dodo’s own behavior of holding the funds immediately.
Prove it to yourself
Reading about attribution is fine; watching it catch a payment is better. The Dodo Payments integration connects with one API key (Rekomi creates the webhook and fetches the secret itself), so the hookup is literally one paste! From there the honest next step is a test-mode run: decorate a payment link with ?metadata_rekomi_ref= and your test affiliate’s slug, pay with a test card, and watch the conversion arrive pre-tax and correctly credited. If it does that on sale one, it’ll do it on sale ten thousand.


