Contents

Chapter 8. How-to Guides

Reward Existing Customers Automatically

A discount without a coupon code can apply by itself, to logged-in customers who already have the right products. There are two kinds, chosen in System Group Key once Use Coupon Code is off:

Relations: an upgrade discount

For customers moving from one thing to another. Choose a Scope and what the customer holds and buys: From Level and To Level, From Category and To Category, or From Product and To Product. With levels, Same Category (on by default) also requires the two products to be in the same category, or one inside the other: with Suite as the parent of Joomla and WordPress, a Single (Joomla) customer gets the discount on a Suite product, but not on a WordPress one. Eligible After Expiration lets customers whose access has already ended qualify too.

Bundles: a loyalty discount

For customers who already have at least Number of Products products of a level, category or product, buying another of the same.

The amount, recurrence, expiry, usage limit and Restrict To work as for a coupon. One discount applies per purchase.

When a logged-in customer who qualifies chooses a price, your site asks Paddle for a checkout with the discount already applied, and the checkout opens with it. The discount is never put in the page, so nobody can copy it into their own checkout. If Paddle won't apply it, for example because Restrict To leaves out that price, the checkout opens at the normal price. Product pages and {psprice} tags show the normal price; the discount appears in the checkout.

That Paddle.js opens a checkout for a transaction created through the API with a discount whose enabled_for_checkout is false has not been verified in the sandbox (AGENTS.md, "Needs the sandbox").

Warning

Give an automatic discount a Percentage if your customers can pay in more than one currency. Paddle applies a fixed Amount only to checkouts in the discount's own currency. When it shows the checkout in the customer's local currency instead, Paddle refuses the discounted checkout with an error. PaddleSubs then opens the checkout again at the normal price, with a note above it telling the customer that their discount couldn't be applied in their currency and was removed. The customer can still buy, but without the discount.

The discount's edit page warns you when this can happen; see Discount Type and its amount.

Report to Paddle: a transaction created through the API with a flat (or flat per seat) catalog discount in the price's currency opens in the overlay checkout, which then localizes it to the customer's currency and shows a checkout error, because flat discounts must be in the transaction's currency (transaction_invalid_discount_currency). Percentage discounts work. Ask Paddle to drop the discount, keep the transaction's currency, or convert the amount instead of failing. Seen in testing 2026-10; PaddleSubs sends the discount's currency_code as entered and creates the transaction without one. Until then PaddleSubs can't tell, when it creates the transaction, which currency the checkout will use, so checkout.js catches the checkout.error (code validation, the currency rule only in its detail) and reopens the normal checkout, leaving the refused transaction as a draft in Paddle.