Skip to content

Create and sell an offer

An offer is one way to sell one product. The product says what the access is; the offer says how it is sold. One product usually has several offers, priced and pitched differently.

You need the catalog write permission (the Owner, Admin and Developer roles). Every change here edits the draft and reaches checkout after the next deploy. Audience is the exception: decisions read it as saved.

  1. Create the product first: see Set up a product.
  2. Open Revenue › Catalog › Offers and select New offer.
  3. Fill in the form:
    • Name: what staff and your page call it, up to 200 characters.
    • Code: your own offer code, kept exactly as typed. Letters, digits, dots, hyphens and underscores, up to 128 characters. The offer’s id is made from it: ofr_, then the code in lower case with each run of other characters replaced by _, and any _ left at its start or end dropped. pro-annual and pro-annual. both become ofr_pro_annual.
    • Access set: the product this offer sells.
    • Family and Audience: optional, your own words. Audience says who the offer is sold to. A user’s user.membership_type fact is the audience of the offer behind their membership grant.
  4. Select Create. The offer is created not for sale and opens for editing.

The offer’s screen has five sections: Merchandising, Access set, Discount, Prices and Upgrades.

In Merchandising:

Field What it changes
Purchasable Whether checkout sells it now. Off by default.
Status active or archived. An archived offer is not sold.
The offer is the trial Marks a free trial offer. Checkout applies your organization’s trial reuse rule to it.
Trial days The trial length your page shows. 1 to 365 whole days, or empty for none.
Renews Whether it bills again at the end of a term, for your page to show.
Name, Code, Family How staff and your page name it.
Audience Who it is sold to. Read as user.membership_type.
Eligibility Who may buy it, as free text. Empty means anyone. Checkout does not enforce it.
Import key A second identifier, if you carry one.
Upgrade template Which of your upgrade pages renders it.

The free-text fields are your own vocabulary. An outcome’s ref field can return all of them except Import key, together with the discount and the prices, so your page renders the offer from the decision.

Trial days and Renews are labels. What the buyer is charged, and when, is set by the price in your billing provider.

Checkout charges the offer’s active price in your billing provider. The Prices section lists the billing provider prices mapped to the offer: Billing provider, Billing provider price, Currency, Amount, Interval, Introductory and Active. The amounts are read from your billing provider; EdgeKit never changes them.

EdgeKit maps your billing provider’s prices to your offers. The console shows the mapping and has no action that changes it. An offer with no active price for your active billing provider cannot be bought: checkout answers 409 offer_not_priced.

When an offer has active prices in several currencies, checkout charges the first one. The buyer cannot choose the currency.

An introductory discount takes a percentage or a fixed amount off the first few billing periods. Every buyer gets it; there is no code to enter. An offer has at most one.

  1. In Discount, choose percentage off or fixed amount off.
  2. For a percentage, enter Percent, up to four decimals. It applies to every currency. 100 is free.
  3. For a fixed amount, enter an amount for each currency the offer sells in, in minor units: 2000 is 20.00. A fixed amount needs an active price, so the currency exists.
  4. Enter Periods: 1 is the first billing period, 3 the first three. A period is the price’s own interval.
  5. Enter the Billing provider coupon code: the coupon in your billing provider that takes this discount off the charge. Create the coupon in your billing provider first, then copy its code exactly, casing included. EdgeKit names the coupon and never creates one.
  6. Save, then deploy.

What the buyer is charged comes from the coupon. Percent, amounts and periods are what your page shows, and the Introductory column under Prices is an estimate from them. Keep the coupon and the discount in step.

The deploy is refused when:

  • a fixed discount has no amount, or no amount for a currency the offer sells in;
  • an offer that is on sale has a discount and no billing provider coupon code.

An offer not on sale with a discount and no coupon code deploys with a warning. Checkout never charges full price for a discount with no coupon code: it answers 409 offer_discount_unsupported.

To remove the discount, choose none and save.

  1. Check that Prices lists an active price.
  2. In Merchandising, tick Purchasable, keep Status active, and save.
  3. Add an offer_token field naming the offer to an outcome in Revenue › Decision Engine › Outcomes. That outcome is where your page gets the offer token checkout needs.
  4. Deploy from Delivery › Deployments › Versions.

The deploy is refused when an outcome’s offer_token field names an offer that is not purchasable or not active, so a live outcome never offers something checkout would refuse. It is also refused when an offer on sale has active prices from two billing providers.

Then sell it: see Sell an offer with checkout.

Clear Purchasable, or set Status to archived, and deploy. Either one stops new purchases and revokes nothing: every grant bought through the offer keeps working and keeps renewing with your billing provider.

First remove the offer from every outcome’s offer_token field, or the deploy is refused.

The console cannot delete an offer.

In Access set, pick another product and select Assign. Purchases from the next deployment on get a grant for the new product. Grants already written keep the product they were written with.

Upgrades shows both directions: the offers sold on top of this one (Upgrades to) and the offers that upgrade into it (Upgraded from). The console shows these paths and has no action that changes them.

The list shows each offer’s Offer, Product, Audience, Sale, Trial and Prices. Filter by product, by whether it is on sale and by trial. Search by name, code or product, and sort by name, code or product.