Run a Paddle affiliate program on Paddle Billing

Run a Paddle affiliate program that books commissions from Paddle Billing webhooks. OpenPromoter reads the click id from custom data and credits the partner on each completed transaction. Approved refunds and chargebacks adjust the commission.

Paddle at a glance

Events handled7
Click idcustomData.op_click
Discount codesCredited
RefundsAdjusted
DisputesReversed
Test events taggedYes
Fee on payouts0%

Does Paddle have a built-in affiliate program?

We found no affiliate feature in Paddle's developer docs as of November 2026. Sellers run affiliate programs with a separate tool that reads Paddle webhooks. Paddle's custom data field makes that work because it carries a click id from checkout to every transaction.

Paddle is a merchant of record. It sells to your customer, handles sales tax and pays you out. Source: Paddle Billing (November 2026).

That shapes how commissions are counted. OpenPromoter pays commission on the subtotal minus discounts. Sales tax that Paddle collects never earns a commission.

How Paddle affiliate tracking works with custom data

Paddle.js accepts a customData object when it opens checkout. op.js gives you the visitor's click id and you pass it as op_click. Paddle stores it on the transaction and copies it to the subscription and every renewal transaction created from it.

Paddle describes that copying in its custom data guide. Keep op_click at the top level of the object.

Discount codes as partner codes

A discount code on the transaction counts as the partner's coupon code. A sale with that code is credited with or without a click. Give each partner a code in Paddle and enter the same code on their page.

HTML checkout buttons

Paddle's HTML checkout takes the same object in a data-custom-data attribute. Fill it from window.openpromoter.clickId before the customer clicks.

Customers stay linked

After the first credited payment, the Paddle customer id is linked to the partner. Later transactions for that customer are credited to the same partner.

If the click id is missing, customer.created can still match the email recorded with openpromoter.signup(). A partner discount code also credits the sale.

checkout.js
Paddle.Checkout.open({
  items: [{ priceId: "pri_123", quantity: 1 }],
  customData: { op_click: window.openpromoter.clickId },
});

Set up a Paddle affiliate program in four steps

A Paddle affiliate program needs one notification destination and one line in your checkout code. You add the destination in Paddle, choose seven events and paste its secret key into OpenPromoter. Then you pass the click id as custom data when checkout opens.

  • 1

    Add a destination

    In Paddle, open Notifications and add a destination for /api/webhooks/paddle/<workspaceId>.

  • 2

    Choose seven events

    Select every event in the table below and save the destination.

  • 3

    Paste the secret key

    Copy the destination's secret key into Settings > Integrations.

  • 4

    Pass the click id

    Send op_click from window.openpromoter.clickId in customData.

OpenPromoter checks the Paddle-Signature header on every request. It rebuilds the HMAC from the timestamp and the raw body and rejects anything older than five minutes. Paddle explains the format in its signature verification guide.

The billing providers docs list the URL and events with copy-ready values.

Paddle webhook events and what each one does

OpenPromoter reads seven Paddle Billing events. One links the customer, one books the commission, two handle refunds and chargebacks and three follow the subscription. Each event is verified against its signature and processed only once even when Paddle delivers it twice.

Paddle webhook events and what each one does
EventWhat OpenPromoter does
customer.createdLinks the customer to a partner from custom data or the lead email
transaction.completedBooks the commission on the subtotal minus discounts
adjustment.createdApplies an approved refund or a chargeback
adjustment.updatedApplies a refund once Paddle approves it
subscription.createdTracks the subscription and its status
subscription.updatedUpdates trialing, active and past due status
subscription.canceledStops recurring commissions

Paddle sends transaction.completed for the first payment and for every renewal. Each one books its own commission while it falls inside the commission duration.

How Paddle refunds and chargebacks change commissions

Paddle records refunds and chargebacks as adjustments. OpenPromoter applies a refund only after Paddle approves it and then reduces or reverses the commission. A chargeback adjustment reverses the commission and claws it back from the next payout if you already paid it.

Partial and full refunds

A partial refund before payout reduces the commission in proportion. A full refund reverses it. A refund after payout adds a negative line to the partner's next payout.

Set the hold period to at least your refund window. The default is 30 days.

Chargebacks

Paddle reports a chargeback as an adjustment with the chargeback action. OpenPromoter treats it as a lost dispute and reverses the commission. There is no open dispute stage to hold on Paddle.

Trials and cancellations

Subscription events track trialing, active and past due status. A trial earns nothing until a transaction completes. subscription.canceled stops recurring commissions for that customer.

Test with the Paddle sandbox

The Paddle sandbox is a separate account with its own API keys, notification destinations and test cards. Turn on Sandbox when you connect it under Settings > Integrations. OpenPromoter then tags its sales and commissions as Test and keeps them out of real payouts.

Sign up at sandbox-vendors.paddle.com and use the card 4242 4242 4242 4242 with any future expiry. Source: Paddle sandbox docs (November 2026).

When the test passes, click Delete test data. Then connect your live Paddle account with Sandbox off.

Common Paddle affiliate setup mistakes

Most Paddle setup problems come from a click id missing from checkout or a destination that misses events. A secret key from the sandbox in a live connection is the other common cause. Each mistake below comes with the fix.

  • Paddle Classic alerts

    The handler reads Paddle Billing only. Report Classic sales through the REST API.

  • Click id read too early

    Read window.openpromoter.clickId when checkout opens. op.js loads async and sets it after load.

  • A sandbox key in live

    Sandbox and live destinations have different secret keys. Paste the one for the account you connect.

  • Missing adjustment events

    Subscribe to both adjustment events. Without them refunds never reach OpenPromoter.

  • Nested custom data

    Keep op_click at the top level of customData. A nested value is not read.

  • A short hold period

    Set the hold period to at least your refund window. The default is 30 days.

Pay Paddle affiliates and handle tax

Paddle pays you and OpenPromoter pays your partners. Partners choose Stripe Connect, PayPal, Wise or manual payment in their portal and you approve each batch. Each rail charges its own fee and OpenPromoter takes 0% of payouts on every plan.

Stripe Connect needs a Stripe account of your own as the platform. PayPal and Wise payouts need no Stripe account. The payouts page compares the rails.

Partners paid by PayPal, Wise or by hand submit a W-9 or a W-8BEN in the portal. EU VAT ids are checked against the VIES service. Every payout gets a self-billed invoice with a sequential number.

US partners need a W-9 before their payouts for the year pass the 1099-NEC threshold. That threshold is $2,000 for payments made in 2026. The 1099 guide for affiliates covers the filing.

The payout rails a partner can choose and the tax papers collected before payout. Sample data.

Questions

Does it support Paddle Classic?
No. It supports Paddle Billing. Report Classic sales with POST /api/v1/conversions and refunds with POST /api/v1/refunds.
Does Paddle custom data carry over to renewals?
Yes. Paddle copies custom data from the first transaction to the subscription and from the subscription to each renewal. OpenPromoter also links the customer to the partner after the first payment.
Do Paddle discount codes count?
Yes. A discount code on the transaction counts as the partner's coupon code.
What amount is the commission based on?
The transaction subtotal minus discounts. Tax is excluded.
Can I run Paddle and Stripe at the same time?
Yes. Several billing providers can be connected to one workspace side by side. Commissions from both land in the same ledger.
Can I move partners from another affiliate tool?
Yes. Import a CSV from Rewardful, FirstPromoter, Tolt or PartnerStack and each partner keeps their code. See getting started.

[ openpromoter ]

Try it with your own Stripe account

Free on Cloud up to $1k a month in partner revenue or free forever on your own server.