Sign in →

Promotions

Create and manage customer-redeemable coupon codes — percentage, fixed-amount, and free-trial discounts with redemption caps and validity windows.

Updated 2026-07-29Suggest edits

Promotions

Promotions (Pricing Studio → Promotions) is Aforo's coupon engine. Coupons are standalone, customer-redeemable discount codes that apply at billing time — distinct from the per-subscription discount baked into an offering.

Coupon fields

FieldValues
CodeThe code customers enter (e.g. LAUNCH20)
Discount typePERCENTAGE, FIXED_AMOUNT, FREE_TRIAL_DAYS
Discount valueThe number (e.g. 20 for 20% or $20)
CurrencyRequired for FIXED_AMOUNT (USD / EUR / GBP / INR)
DurationONCE, REPEATING (with durationInMonths), FOREVER
Max redemptionsTotal cap (blank = unlimited)
Max per customerPer-customer cap
Valid from / untilActivation window
ℹ

Two behaviours worth knowing about the discount types:

  • FREE_TRIAL_DAYS records the redemption but does not automatically extend the subscription's trial window in v1 — an operator applies the extension with POST /api/v1/subscriptions/{id}/extend-trial.
  • FIXED_AMOUNT must match the invoice currency. If a coupon's currency differs from the invoice being discounted, the discount is skipped (logged, not applied) rather than converted — so set the currency to the one the customer is billed in.

Status

StatusMeaning
ACTIVELive and redeemable within its window
EXPIREDPast its validUntil date
DISABLEDManually turned off

The KPI strip shows Total Coupons, Active, Currently Redeemable, and Total Redemptions.

Eligibility

By default a coupon is available to everyone. Use the Eligibility section when you create a coupon to lock it down:

Restrict toEffect
CustomersOnly the listed customers can redeem the code. Anyone else who enters it is told it isn't available on their account — so a discount you negotiated for one account can't leak to others.
OfferingsThe code only applies to the listed plans. Entering it against any other plan is rejected.

Leave both empty for an open promotion. The check runs everywhere the code is used — inline validation, the storefront checkout, and redemption — and the customer scope is taken from the signed-in session, so a customer can't redeem on another's behalf. Once a coupon has been redeemed its eligibility locks along with the rest of its terms; create a new coupon to change who can use it.

⚠

Once a coupon has been redeemed, its commercial terms (code, discountType, discountValue, currency, duration) are locked and cannot be edited — this protects customers who already redeemed it. You can still disable it.

How customers apply a coupon

Customers enter the code at storefront checkout, in the Promotion code field on the subscribe screen. As they type, the storefront previews the result inline — a valid code shows the discount, the discounted total, and a customer-ready message ("Valid — 40% off"); an invalid one explains why (expired, redemption cap reached, not eligible for the plan). Nothing is redeemed until they subscribe.

When the customer confirms, the code is applied as part of creating the subscription — atomically. If the code turns out to be invalid at that moment (for example, it hit its cap a second earlier), the whole subscribe fails rather than creating a subscription without the promised discount. The discount then attaches to the subscription and reduces future invoices according to the coupon's discountType and duration.

The preview total is an estimate. The final invoice can differ once metered usage, proration, and tax are applied — checkout labels it as such.

Building your own checkout

If you run a headless storefront, the same flow is three endpoints under the Coupons family of the storefront API:

EndpointJob
GET /api/v1/portal/coupons/validateCheck a code as the customer types — returns the outcome and a message
GET /api/v1/portal/coupons/previewCompute the discounted total against the price the customer is about to pay
POST /api/v1/portal/coupons/redeemApply the code — or pass couponCode when you create the subscription to do it atomically

GET /api/v1/portal/coupons/active lists the discounts currently in effect for a signed-in customer, for an "active promos" panel.

Redemption tracking

Open a coupon's View redemptions to see each redemption: customer, subscription, total discount applied, remaining applications, and redeemed-at timestamp.