# Paddle

> Connect Paddle to atrby with a notification destination, so completed transactions are matched to the visit that brought them via custom data.

Canonical: https://atrby.site/docs/integrations/paddle
Last updated: 2026-10-21

Attribute every Paddle payment to the visit that brought it.

## Connect

1. In Paddle, open Developer tools → Notifications → New destination. After saving, copy the destination's **secret key**.
2. In atrby, open Revenue → Payment processors → Connect, choose Paddle and paste the secret.
3. atrby shows your webhook URL. It looks like `https://app.atrby.site/api/webhooks/paddle/…`. Add it in Paddle and send this event: `transaction.completed`.

The connection shows as active once the first webhook arrives. Webhooks with a wrong signature are rejected.

## Pass the visit ids

Where they go: Transaction `custom_data`, set with `customData` when you open the checkout. Read them in the browser with `atrby.ids()` and pass them when the checkout opens.

*Browser · Paddle.js*

```js
const ids = window.atrby?.ids(); // { atrby_sid, atrby_site }

Paddle.Checkout.open({
  items: [{ priceId: "pri_growth_monthly", quantity: 1 }],
  customData: { ...ids, atrby_uid: user.id },
});
```

`atrby_uid` is your user id, from [identify](https://atrby.site/docs/identify). It's optional, but it credits payments made long after the first visit.

## What gets recorded

- Each payment once, however often Paddle retries the notification.
- The amount is the transaction's grand total, tax included.
- Refunds aren't read from Paddle yet, so revenue is gross of refunds.

## Related
- [Stripe](https://atrby.site/docs/integrations/stripe)
- [Polar](https://atrby.site/docs/integrations/polar)
- [Payment API](https://atrby.site/docs/payment-api)
