# Refunds, fees and currencies

How ProductLense turns charges, refunds, processor fees and foreign currencies into one net revenue figure in USD, and where the figures are estimates.

Every payment keeps its original amount, fee and currency, plus USD amounts for reporting. Revenue is charges − refunds − chargebacks, before processor fees; Fees are the processor and merchant-of-record fees on those charges, minus fees returned on refunds; Net revenue is Revenue − Fees.

## Net revenue per payment

```text
charge:                 net = amount − fee
refund or chargeback:   net = −(amount + fee)
```

Refund and chargeback amounts are always positive in ProductLense; the sign comes from the kind. A full refund therefore removes the charge's amount and adds back nothing for the fee unless the provider returns it.

Some merchants of record return their cut on a refund (Paddle, Dodo Payments, and Lemon Squeezy for tax). Their refunds carry a negative fee, so a full refund nets to exactly minus the original charge's net and the payment disappears from net revenue as if it never happened.

Only payments with status `succeeded` count. Pending and failed payments are stored and left out.

## Where the fee comes from

| Provider | Fee recorded |
|---|---|
| Stripe | The balance transaction fee, converted from the settlement currency to the charge currency; the dispute fee on chargebacks |
| Paddle | Grand total minus earnings: Paddle's cut and tax, so net equals your payout |
| Lemon Squeezy | Tax only; the platform fee is not in the API, so an estimate applies (see below) |
| Polar | The platform fee when the order reports it, otherwise 0 |
| Dodo Payments | Total minus settlement amount when both are in the same currency, otherwise tax only |
| Razorpay | The payment's fee, which includes GST |
| Chargebee | 0: gateway fees are not stored in Chargebee |
| Shopify | 0: fees are in the Payouts API, not on orders |
| Gumroad | The Gumroad fee on the sale |
| Creem | 0: not itemised |
| Payment API | The `fee` you send |

## Estimated fees

When a charge arrives with a fee of 0, ProductLense can estimate it from a rate you set on the connection: a percentage of the amount plus a fixed amount in a currency of your choice.

```text
estimated fee = amount × fee_pct + fixed fee (converted to the payment currency)
```

- New Lemon Squeezy connections start with 5% + 0.50 USD and new Dodo Payments connections with 4% + 0.40 USD. Every other connection starts with no estimate.
- Change the rate under Processor fees on the connection in Settings → Billing connections. The percentage can be 0 to 50%.
- An estimate never exceeds the charge amount, is applied only to charges, and never replaces a fee the provider reported.
- When the currency of the fixed part has no exchange rate for the day, only the percentage is applied.

> [!NOTE]
> An estimated fee is only as close as the rate you enter. If your real blended rate is 4.4% and the estimate says 5%, fees are overstated by 0.6% of revenue, and profit understated by the same amount. The revenue and profit pages show the share of fees that are estimates, so you can see how much of a figure rests on them.

## Currencies

Amounts are stored in their original currency and converted to USD with the European Central Bank reference rate for the payment's date. ECB rates are stored as USD per unit and derived from the euro cross rates.

- A day without a rate (weekends, holidays) uses the nearest earlier day, up to 10 days back.
- A currency the ECB has not published a rate for yet is stored with its USD amount missing and filled in by a job that runs every hour once a rate exists.
- Conversion uses the unrounded rate; only the final USD amounts are rounded to cents.
- Reports are in USD. The original amount and currency stay on each payment.

## Related

- [How payments are attributed](/docs/revenue/attribution)
- [Profit per channel](/docs/profit/profit-per-channel)
- [How ProductLense counts](/docs/get-started/how-productlense-counts)
