Products and Pricing
Define products, group them into collections, configure prices including tiered pricing, and create discount codes
Products define what you sell and how you price it. RevKeen supports fixed one-time prices, recurring subscriptions, quantity-based tiered pricing, and usage-based billing. This page covers products, collections, prices, discounts, and where tiered pricing fits.
What is a Product?
A Product represents something you sell. Products do not have prices directly attached to them. Instead, you create one or more Prices for each product, which allows you to offer:
- Multiple plan options (for example, Basic, Pro, and Enterprise)
- Different billing intervals (monthly vs. annual)
- Various currencies for international customers
- Quantity-based tiered pricing on a single fixed price
Every price on a product shares the product's pricing model, which you choose once for the product: one-time, recurring or usage based. A new price takes the product's model. A one-time product can have variants. A recurring product can have several billing options, such as monthly and annual. A usage-based product has one meter and one usage pricing model, with no price list.
Product Types
| Kind | Description | Use Case |
|---|---|---|
one_time | Single purchase | Setup fees, one-off services |
subscription | Recurring billing | Monthly plans, memberships |
service | Service or package | Treatment packages, service bundles |
Product Fields
| Field | Type | Description |
|---|---|---|
name | string | Display name shown to customers |
description | string | Detailed product description |
fulfillment_type | enum | physical, digital, or none (service) |
is_active | boolean | Whether product is available for sale |
media | array | Product images and media files |
metadata | object | Custom key-value data for your use |
Fulfillment Types
The fulfillment type determines how the product is delivered to customers:
| Type | Use Case | Examples |
|---|---|---|
physical | Shipped items requiring delivery | Books, merchandise, equipment, hardware |
digital | Downloads or digital access | Software, e-books, courses, digital files |
none | Services with no delivery | Consulting, subscriptions, memberships |
Creating Products
Via Dashboard
- Navigate to Products > Catalogue
- Click Create product
- Enter the name and description, and choose the pricing model: One-time, Recurring or Usage based. Every price on the product takes this model.
- Under Images, add the main image and any further images. See Product images.
- Set the default price, which is used when a checkout or invoice selects the product without a specific price. Add more prices with + Add price; they are listed under Other prices. On a one-time product, a price can also carry variant options, a SKU and an image.
- For a recurring product, open Billing schedule and set the renewal date, free trial, first payment, how the subscription ends, and whether the saved card is charged automatically. The schedule is one for the whole product.
- Set the other rows as needed: Storefront, Fulfilment, Checkout fields, After purchase, Tax and Developer.
- Select Create product. If a field needs attention, the drawer opens the page that holds the first problem.
After the product is created, the drawer shows a confirmation such as "Wool jumper is ready to sell". A product has no checkout link of its own. Create one from Checkout links.
Switching the pricing model when prices already exist shows a confirmation that says what changes. A product that becomes recurring keeps its images, but its variant options and SKUs are removed. A product that becomes one-time loses its billing intervals and billing schedule. Switching to Usage based sets your prices aside, and they come back if you switch back before creating the product.
The default price is used when a checkout or invoice selects the product without a specific price. Usage products use the currency selected in their usage configuration.
The billing schedule's preview uses example dates. Use Starts on to see how the cadence, trial and renewal date affect example invoices. This does not set a shared start date for every buyer: the actual start belongs to each customer's subscription.
Product checkout fields are included when a checkout link containing that product is opened. Fields shared by multiple products appear once and remain required if any linked product requires them.
Via API
Recurring Product (Subscription)
import { RevKeenClient } from "@revkeen/sdk";
const client = new RevKeenClient({ apiKey: process.env.REVKEEN_API_KEY! });
const { data: product } = await client.products.create({
product_id: "pro_monthly", // your own product code
name: "Pro Plan",
description: "Full access to all features",
kind: "subscription",
pricing_model: "recurring",
amount_minor: 2900, // £29.00
currency: "GBP",
interval: "month",
interval_count: 1,
trial_days: 14,
});One-Time Product
const { data: setupFee } = await client.products.create({
product_id: "setup_fee",
name: "Setup Fee",
description: "One-time onboarding and configuration",
kind: "one_time",
pricing_model: "one_time",
amount_minor: 9900, // £99.00
currency: "GBP",
});See Create a product for every field, including fulfilment and stock.
Listing Products
// List products, 20 per page
const { data: products } = await client.products.list({ limit: 20, page: 1 });
// Search by name
const { data: matches } = await client.products.list({ search: "Pro" });Updating Products
await client.products.update("prod_xxxxxxxx", {
name: "Pro Plan (2026)",
amount_minor: 3900, // £39.00
});Updating a product's price or billing schedule does not rewrite live subscriptions. The subscription created at sale time is the runtime snapshot. New sales use the updated catalogue template.
Archiving Products
// Hide a product from new purchases
await client.products.update("prod_xxxxxxxx", { is_active: false });Editing a product
Edit product opens the same drawer as creating a product, filled in with the saved product. Saved prices follow these rules:
- Amount, billing scheme, tiers and billing period cannot change. To change them, archive the price and add a new one.
- Archive, restore and default. You can archive a saved price, restore it, or make it the default price. A saved price cannot be removed. An unsaved draft price can be removed.
- Name, SKU, options and image can change. Saving one of these creates a new version of the price.
- Options of a variant that has sold cannot change. Archive the price and add a new one.
- Billing schedule changes apply to new sales only. Subscriptions already sold keep the terms they were sold with.
An archived price is not offered for new purchases. Select Save changes to save your edits.
Product Collections
A product collection is a named, ordered group of products, such as "Treatments" or "Gift sets". Collections organise your catalogue; they do not change a product's prices. Each collection has a name, a URL handle (slug) that is unique for your business, an optional description and image, and an ordered list of product_ids.
Manage collections through the REST API. They are not in the TypeScript SDK yet.
const response = await fetch("https://api.revkeen.com/v2/product-collections", {
method: "POST",
headers: {
"x-api-key": process.env.REVKEEN_API_KEY!,
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Gift sets",
slug: "gift-sets",
description: "Ready-to-give bundles",
product_ids: [
"66666666-6666-4666-8666-666666666666",
"77777777-7777-4777-8777-777777777777",
],
}),
});- Every product in
product_idsmust belong to your business. - Updating a collection's
product_idsreplaces its membership in the order you send. Sendexpected_versionto refuse the change if someone else edited the collection since you read it. - Deleting a collection does not change or delete its products.
Reference: List, Create, Get, Update, Delete.
Product Benefits
Benefits describe what is included with a product. They appear on checkout pages to help customers understand the value of what they are purchasing.
Benefits are displayed as a feature list on checkout pages. Add 3-5 key benefits to highlight the most important features.
Example benefits:
- Unlimited users
- 24/7 email support
- Advanced analytics dashboard
- Custom integrations
- Priority feature requests
Product Best Practices
- Use clear, descriptive names -- Names should be instantly recognizable to customers (for example, "Pro Plan" not "SKU-12345").
- Write compelling descriptions -- Explain the value proposition, not just technical specs.
- Offer multiple price options -- Monthly and annual pricing can increase conversions and improve cash flow.
- Add quality images -- Use high-resolution product photos or illustrations.
- Highlight key benefits -- List 3-5 benefits that matter most to your customers.
Billing schedule
A recurring product has one billing schedule, set on the product's Billing schedule page. It sets the renewal date, the free trial, the first payment, how the subscription ends (until cancelled or for a fixed number of billing cycles), and whether the saved card is charged automatically. The billing interval belongs to each recurring price.
How that template is used at sale time:
| Surface | Schedule behaviour |
|---|---|
| Product | Owns the template. Edits apply to new sales only. |
| Checkout link | Inherits the product schedule. There is no per-link schedule override. |
| Invoice / order | Prefills the product schedule. Leave Customize for this invoice off to use the product standard. Turn it on to set the same Billing Schedule fields for that sale only. |
| Subscription | Frozen snapshot created at sale. Later product edits do not rewrite it. |
On an invoice, customized subscription_terms win when present. When they are absent, RevKeen falls back to the product schedule.
Prices
Prices define how much a product costs and how it is billed. A single product can have multiple prices, enabling flexible pricing strategies like offering both monthly and annual billing options.
Price Types
One-Time Price -- A single payment for a product. Perfect for physical goods, digital downloads, or services with a fixed scope. Example: software licence for £299.
Recurring Price -- Repeated billing at a specified interval. Used for subscriptions, memberships, and ongoing services. Billing intervals: Daily, Weekly, Monthly, Yearly, or custom intervals (for example, every 3 months, every 6 weeks).
Pay-What-You-Want -- Let customers choose their own price. You can set minimum and suggested amounts. Great for donations, tips, or flexible pricing experiments. Example: minimum £5, suggested £25.
Tiered Price -- A fixed price whose total changes with quantity. RevKeen supports both graduated and volume tiering modes for bulk discounts, seat-style quantity pricing, and quantity-based subscription billing. See Tiered Pricing for the full model.
Usage-Based (Metered) -- Charge based on actual consumption. Track usage with meters and bill at the end of each billing period. Supports per-unit, graduated tiers, volume tiers, and package pricing. Metered products do not charge upfront. They accumulate usage throughout the billing period and add the calculated charge to the invoice at renewal. See the full Usage-Based Billing guide for setup.
Price Fields
| Field | Type | Description |
|---|---|---|
unit_amount | integer | Price in minor units (pence): £29.99 = 2999 |
currency | string | ISO currency code (GBP, EUR, etc.) |
type | enum | one_time or recurring |
pricing_model | enum | fixed, pay_what_you_want, or free |
interval | enum | day, week, month, year (recurring only) |
interval_count | integer | Number of intervals between charges (default: 1) |
trial_period_days | integer | Free trial duration in days (recurring only) |
billing_scheme | enum | per_unit, tiered, or percentage |
tiers_mode | enum | graduated or volume when billing_scheme = tiered |
tiers | array | Tier configuration with up_to, unit_amount_minor, and optional flat_amount_minor |
transform_quantity | object | Optional advanced quantity transform before billing calculation |
active | boolean | Whether price is available for new purchases |
Creating Prices
One-Time Price
const { data: price } = await client.prices.create({
product_id: "prod_xxxxxxxx",
unit_amount: 29900, // £299.00
currency: "GBP",
type: "one_time",
});
console.log(price.id);Monthly Subscription
const { data: monthlyPrice } = await client.prices.create({
product_id: "prod_xxxxxxxx",
unit_amount: 2900, // £29.00/month
currency: "GBP",
type: "recurring",
interval: "month",
interval_count: 1,
trial_period_days: 14, // 14-day free trial
});Annual Subscription (with discount)
// Annual price with 2 months free (£290 instead of £348)
const { data: annualPrice } = await client.prices.create({
product_id: "prod_xxxxxxxx",
unit_amount: 29000, // £290.00/year
currency: "GBP",
type: "recurring",
interval: "year",
interval_count: 1,
});Quarterly Billing (Custom Interval)
// Bill every 3 months
const { data: quarterlyPrice } = await client.prices.create({
product_id: "prod_xxxxxxxx",
unit_amount: 7500, // £75.00 every 3 months
currency: "GBP",
type: "recurring",
interval: "month",
interval_count: 3,
});See Create a price for every field.
Trial Periods
For recurring prices, you can offer a free trial period. During the trial:
- Customer gets full access to the product
- No payment is collected
- Subscription status is
trialing - At trial end, the first invoice is generated and charged
In the Products drawer, the free trial is set once on the product's billing schedule and applies to every recurring price on that product. Through the API, a price carries its own
trial_period_days.
Multiple Prices per Product
A single product can have multiple prices. Common patterns include:
| Pattern | Example | Benefit |
|---|---|---|
| Monthly + Annual | £29/mo or £290/yr | Capture both preference types |
| Multiple plans | Basic £19, Pro £49, Enterprise £199 | Different feature levels |
| Multi-currency | £24 GBP, €28 EUR | Localised pricing |
A one-time setup fee and a monthly subscription are two products, because every price on a product shares one pricing model. A link can offer several specific products, so you can sell them together.
Tiered Pricing
Tiered pricing lets one fixed price change as quantity grows. Use it when you want bulk discounts, seat-style quantity pricing, or subscriptions where the charge depends on how many units the customer selects.
| Mode | How RevKeen calculates | Best for |
|---|---|---|
graduated | Each tier is billed separately, then summed | Marginal discounts as quantity grows |
volume | The matched tier rate applies to all units | Simple bulk pricing tables |
Use separate prices for different billing intervals such as monthly vs annual. Use tiered pricing when the same price should change based on quantity.
In the Products drawer, a tiered price needs at least two tiers, and the last tier has no upper bound. Tiers cannot be changed after the price is created. Archive the price and add a new one.
For the full setup guide, API fields, examples, and invoice behavior, see Tiered Pricing.
Pricing Best Practices
- Always offer annual pricing -- Annual plans with a discount improve cash flow and reduce churn.
- Use trial periods strategically -- 7-14 day trials work well for most SaaS products.
- Price in minor units -- Always use pence/minor units to avoid floating point issues (£29.99 = 2999).
- Archive, do not delete -- Archive prices (or set
active: false) instead of deleting them to preserve history.
Billing Intervals
| Interval | intervalCount | Description |
|---|---|---|
day | 1 | Daily billing |
week | 1 | Weekly billing |
week | 2 | Bi-weekly billing |
month | 1 | Monthly billing |
month | 3 | Quarterly billing |
year | 1 | Annual billing |
Discounts
Discounts let you offer promotional pricing to customers. Create discount codes that customers can apply at checkout, or apply discounts directly to orders and subscriptions.
Discount Types
Percentage Off -- Reduce the total by a percentage (for example, 20% off). Example: £100 with 20% off = £80.
Fixed Amount -- Reduce the total by a specific amount (for example, £25 off). Example: £100 with £25 off = £75.
Free Trial -- Extend the trial period for subscriptions (for example, 30-day trial instead of 14). Example: Add 30 days free trial period.
Discount Fields
| Field | Type | Description |
|---|---|---|
code | string | Discount code customers enter (for example, SUMMER20) |
type | enum | percentage, fixed, or free_trial |
amount_off | integer | Fixed amount in minor units (for fixed type) |
percent_off | number | Percentage discount (for percentage type) |
trial_days | integer | Trial period in days (for free_trial type) |
max_redemptions | integer | Maximum number of times discount can be used |
expires_at | datetime | When the discount code expires |
is_active | boolean | Whether discount is currently usable |
Discount Scope
Control what the discount applies to:
| Scope | Description |
|---|---|
entire_order | Applies to the total order/subscription amount |
specific_products | Only applies to selected products |
subscription_only | Only valid for recurring purchases |
one_time_only | Only valid for one-time purchases |
Creating Discounts
Via Dashboard
- Navigate to Products > Discounts
- Click + New Discount
- Enter discount code (for example, SUMMER20)
- Select discount type and amount
- Configure scope and limits
- Save the discount
Via API
Discounts are managed in the dashboard. There is no public discounts API yet.
Using Discounts at Checkout
For checkout links, enable discount codes in the link settings:
- Edit the checkout link
- Enable Allow discount codes
- Customers will see a discount code input field
- Valid codes are applied automatically
If you build your own cart with the Cart API, apply a code to a cart session with client.cart.sessionsApplyDiscountCode.
Tracking Redemptions
Track how discounts are being used:
- Redemption count -- How many times the code has been used
- Total discounted -- Sum of all discount amounts applied
- Revenue impact -- How much revenue was affected
View discount analytics in Products > Discounts by clicking on any discount.
Discount Best Practices
- Use memorable codes -- SUMMER20, WELCOME10, BLACKFRIDAY are easy to remember and type.
- Set expiration dates -- Create urgency and prevent indefinite discount usage.
- Limit redemptions -- Control promotion costs by capping total uses.
- Track performance -- Monitor redemption rates and revenue impact.
- Deactivate, do not delete -- Set
is_active: falseto preserve history.
Related
- Tiered Pricing -- Configure quantity-based graduated and volume pricing
- Subscriptions -- Create subscriptions with products
- Usage-Based Billing -- Meter-based pricing for variable usage
- Checkout Links -- Sell products through reusable hosted checkout URLs
Billing schedule previews
A product's start date is an example for previewing the schedule. Each customer's subscription determines the actual start date.
The payment preview includes any initial prorated payment, followed by full billing cycles. A fixed limit of three billing cycles means three full-cycle payments; an initial prorated payment is additional. The displayed total includes that initial payment and is shown before taxes and discounts.
A selected price's trial applies to that purchase, including an explicit zero-day trial. In the Products drawer the free trial is set once for the product and applies to each of its recurring prices. Existing subscriptions keep their accepted terms when the product changes. Trials apply to the subscription group when multiple recurring items share a subscription.
Deferred and prorated billing are available only when enabled for your account. The editor shows their availability. Checkout refuses unavailable schedules rather than substituting an immediate full-price charge.
Renewal reminders, receipts and failed-payment messages follow your merchant notification and recovery settings. The product schedule editor does not configure message timing or guarantee delivery.
Owner: david · Reviewed 14 Oct 2026 · Next review 30 Oct 2026