DrPlugin

Products and pricing tiers

Updated October 30, 2026

Create products in wp-admin, give them pricing tiers, build bundles, and file your catalog under categories and tags.

How products work

A product is anything you sell: a plugin, a theme, an ebook, a template pack. A product has no price of its own. You give it one or more pricing tiers, such as "Personal" for one site and "Agency" for many, and the buyer picks one.

When Licensed product is on, each purchase creates a license key that the buyer uses to activate your software and receive updates. Turn it off for products that need no activation, such as an ebook. License keys and activations covers what happens after the sale.

A bundle is a product that grants several other products at once.

All product screens need the manage_tiermint capability.

Find a product

Open TierMint → Products. The table shows each product's name, status, type, prices, categories and creation date. Click Name or Created to sort by that column.

Narrow the list with the controls above the table. Each one updates the list as you type or choose, and takes you back to the first page:

  • The search box matches the product name, slug, overview and full description, so you can find a product by a phrase in its copy.
  • All statuses filters by Draft, Published or Archived.
  • All categories and All tags filter by one category or tag.

Each category in the Categories column is a link that shows only that category. The link starts a fresh view and clears any search, status or tag filter you had set. The filter is part of the page address, so you can bookmark the view or send it to someone.

With no products yet, the screen says so and shows a New product button. When filters match nothing, it says that instead.

The Products screen with search, status, category and tag filters, and two products selected for a bulk action

Change several products at once

  1. Tick the products you want, or the box in the header row for the whole page.
  2. Pick Publish, Move to draft or Delete from Bulk actions.
  3. Click Apply.

A bulk delete asks you to confirm first. TierMint handles each product on its own, so one product that cannot change does not stop the rest. For example, an archived product cannot go straight back to published. The notice afterwards says how many products changed and names each one that did not, with the reason. Changing the page, a filter or the sort order clears the selection.

Deleting a product removes it, its pricing tiers, its category and tag assignments and its place in any bundle, and you cannot undo it. To stop selling a product but keep it, set its status to Archived instead.

Create or edit a product

  1. Click New product, or click a product's name in the list.
  2. Fill in the main column, the tabs and the sidebar.
  3. Click Save product in the Publish box.

Changes to the product wait for Save product. There is no autosave and no separate save for the Pricing or Bundle tab. The Releases tab is different: uploads and release changes there save with their own buttons. After you save a new product, the editor reopens it at its own address.

The editor has two columns. On a narrow screen, the sidebar moves below the main column.

The product editor with the name, permalink and Content panel, and the Publish, Product type and category boxes beside them

The main column holds:

Field What it does
Name The product name, shown to buyers and in wp-admin.
Permalink Once the product is saved and a product details page is set, the product's storefront address shows here as a link. Click Edit next to it to change the slug.
Slug The product's part of the address. Leave it empty on a new product to make one from the name. If another product already uses the slug, TierMint adds a number, such as my-plugin-2. Licensed software sends this slug as product_slug in its license and update requests, so do not change it once customers run your software.
Overview A short rich-text summary shown near the top of the product page. In the Content panel.
Full description The long description, shown on the product page and on pricing pages. In the Content panel.

Before the first save, the permalink area says to save the product first. If no product details page is set, it says to set one under Settings. See Storefront pages.

Under the Content panel are the product tabs: Pricing, Bundle (only when the type is Bundle) and Releases.

The sidebar holds:

Box What it holds
Publish Status: Draft, Published or Archived. And the Save product button.
Product type Type: Digital or Bundle. The Licensed product switch, and the Update slug field while it is on.
Product categories A tree of category checkboxes, with a form to add a new category.
Product tags The product's tags, with a form to add a new tag.
Media Main image, Thumbnail, Social share image and Screenshots.

A Draft product is not for sale. Published makes it live. Archived retires it from sale but keeps it, so orders and licenses that point at it stay valid. An archived product goes back through Draft before it can be published again. A licensed product needs at least one active pricing tier before you can publish it.

With TierMint Pro, an SEO panel for the product's search title and description also shows in the main column. See Product SEO fields.

Licensed product and update slug

Turn on Licensed product for software that buyers activate. The Update slug field then shows. Enter the folder name your plugin installs into, such as orbit-forms. TierMint puts it in update responses and uses it to name and check release packages. It must be unique across your products, so set it before you upload the first release. Update server and releases and Update client for your plugins explain the update side.

Turning Licensed product off clears the update slug. License keys already sold stay, but new purchases no longer create one, so decide this before you start selling.

Overview and full description

Both fields use the standard WordPress editor. The Visual tab has a toolbar with Paragraph, Heading 2 to Heading 4, bold, italic, lists and links. The Code tab (Text on older WordPress versions) shows the HTML, so you can paste or edit markup by hand.

When you save, TierMint keeps paragraphs, line breaks, headings, bold, italic, links and lists, and drops everything else, such as a <div>, an inline style or a script. Content you paste from elsewhere keeps only that formatting.

The product name is already the main heading (H1) on the product page, so use Heading 2 or lower inside the copy. An <h1> typed on the Code tab is kept, but it then competes with the product name.

Images

The Main image, Thumbnail and Social share image fields each open the WordPress media library. Once you pick an image, the field shows it with Replace image and Remove image buttons.

Field Where it shows
Main image The primary image on the product page.
Thumbnail Product grids and listings.
Social share image When the product page is shared on social networks. Left empty, the main image is used.
Screenshots A gallery on the product page. Click Add images to pick several images, and use Move up, Move down and Remove to order them.

TierMint stores a reference to each media library image, so the alt text, sizes and cropping you set in WordPress apply.

Set up pricing tiers

The Pricing tab lists the product's pricing tiers, shown as Price 1, Price 2 and so on. Click Add price to add a tier, and Remove price to delete one. A product needs at least one tier before it can be bought.

Field What it does
Price name The name buyers see when they pick a tier, such as "Personal" or "Agency: 25 sites".
Amount The price in your store currency, as a decimal such as 49.00. The label shows the currency, for example Amount (USD).
Activation limit (0 = unlimited) How many sites one license from this tier can be activated on. A new tier starts at 0, which means no limit. Local and staging sites never count toward it.
License length Lifetime for a license that never expires, or Duration to set Length and Unit (Days, Weeks, Months or Years). When it shows Select a length, pick one: the product does not save until you do.
Minimum quantity The fewest units a buyer must take in one purchase. Defaults to 1. Set it to 5 to sell a tier only in packs of five or more.
Maximum quantity (0 = unlimited) The most units a buyer can take in one purchase.
Price status Active or Archived. An archived tier is hidden from new purchases.

The order of the tiers on this tab is the order buyers see them in.

The Pricing tab with a pricing tier's name, amount, activation limit, license length and quantity limits

When a tier has a maximum quantity, adding it to the cart again stops at the maximum. The cart and checkout keep each line between the tier's minimum and maximum, even if you change the limits after the buyer added it.

Archive a tier to retire it. Orders and licenses bought at that tier keep the activation limit and license length they were sold with, so nothing you have sold breaks.

If a stored license length is not one the editor recognizes, for example one set through the REST API, the tab shows it as "Custom:" and the stored value, with a Replace button. It stays as it is until you replace it.

Recurring subscription tiers are a TierMint Pro feature. Pro adds a Subscription switch to each tier, with the billing period, billing interval, trial days and the plans a subscriber can switch to. See Subscriptions.

The free plugin stores no billing schedule, so without Pro every tier is a one-time tier. Pro keeps each recurring schedule in its own table. If you deactivate Pro, it takes its recurring tiers off sale. If you deactivate Pro explains what happens.

Build a bundle

A bundle is a product that grants other products. When someone buys a bundle, TierMint creates one license for each licensed product in it. The bundle itself gets no license. Each license then works on its own, so the buyer can deactivate a site on one without touching the others.

  1. Create a product and set Type to Bundle in the Product type box. A Bundle tab appears.
  2. Open the Bundle tab and click Add bundle item.
  3. Pick a product in the Bundled product list.
  4. Repeat for each product the bundle grants. Click Remove item to take one out.
  5. Click Save product.

The Bundle tab with two bundled products, each with a Remove item button, and the Add bundle item button

Each license a bundle grants follows the bundled product's default pricing tier: its first active tier in the order on the Pricing tab. That tier sets the license's activation limit and length. The REST API can pick a specific tier for each bundled product instead. Saving the bundle in the editor keeps that tier, unless you pick a different product in its row.

TierMint checks a bundle when you save it:

  • A bundle can hold only Digital products. It cannot hold another bundle or itself.
  • Each bundled product must be published.
  • A product can appear in the same bundle only once.

Organize products with categories and tags

Categories and tags help buyers find products on your store. Categories nest: "Plugins" can have "Forms" and "Booking" under it. Tags are flat labels, such as "Bestseller" or "New".

They are separate from the categories and tags WordPress uses for posts. Product categories never show under Posts → Categories, and post categories never show in TierMint.

Manage categories and tags

Open TierMint → Categories & Tags. The screen has a Categories panel and a Tags panel, each with an add form at the top and the list below it.

To add one, enter a Name. Slug (optional) and Description (optional) can stay empty. For a category, pick a Parent, or leave it at None (top level). Then click Add category or Add tag. Click Edit on a row to change it, or Delete to remove it after a confirmation.

The Categories and tags screen with the category tree, the tag list and their add forms

Leave the slug empty to make one from the name. A slug has to be unique only among terms of the same kind, so a category and a tag can share one. If the slug is taken, TierMint adds a number: a second category named "Add-ons" gets the slug add-ons-2.

When you delete a category, its child categories move up to the deleted category's parent. A deleted term is removed from every product that had it. The products themselves stay.

Assign categories and tags to a product

In the product editor, use the Product categories and Product tags boxes in the sidebar. A product can have any number of each.

  • Tick a category to file the product under it, or untick it to take it off. Ticking a parent files the product under the parent only. Each child category is a separate tick.
  • Under Tags, start typing and pick an existing tag from the suggestions. Click the cross on a tag to remove it.

You can also make a new term here. Type a name under Add a new category or Add a new tag and click Add category or Add tag. TierMint creates the term at once and assigns it to this product. For a category, pick a Parent category first to make a child category. If a term with that name already exists, the box says so instead of making a duplicate.

The Product categories tree with a child category ticked, and the Product tags box with one tag

The assignments are saved with the product when you click Save product.

Let buyers filter the store

The Product Grid block and the [tiermint_product_grid] shortcode can show only some categories or tags, and can show a filter bar that buyers use themselves. A category filter also includes products in its child categories unless you turn that off. See Blocks and patterns and Shortcodes for the settings.

The store page with a category filter and tag checkboxes above the product cards for the Plugins category

Manage products with the REST API

Every route is under the tiermint/v1 namespace and needs the manage_tiermint capability. None of them are public. The Licensing REST API page explains how to authenticate.

Route What it does
GET /tiermint/v1/products Lists products, paginated. Takes search, status, orderby (id, name or created_at), order, category, tag and include_children.
POST /tiermint/v1/products Creates a product.
GET /tiermint/v1/products/{id} Returns one product with its prices and bundle_items.
PUT /tiermint/v1/products/{id} Updates a product. Fields you leave out keep their value.
DELETE /tiermint/v1/products/{id} Deletes a product.
PUT /tiermint/v1/products/{id}/terms Replaces the product's categories, tags or both, each as a list of term ids.
POST /tiermint/v1/products/batch Publishes, moves to draft or deletes up to 100 products. Send action (publish, unpublish or delete) and ids.
GET /tiermint/v1/terms?taxonomy=category Lists categories, or tags with taxonomy=tag.
POST /tiermint/v1/terms Creates a term. Send taxonomy (category or tag), name, and optionally slug, description and, for a category, parent.
GET, PUT or DELETE /tiermint/v1/terms/{id} Reads, updates or deletes one term.

Product fields

Field Meaning
name, slug The name and the slug. A slug that is taken gets a number added. Licensed software sends the slug as product_slug.
status draft, published or archived.
type digital or bundle.
overview, description The two rich-text fields, as HTML.
is_licensed True to create a license key with each purchase. When you leave it out of a create request, it defaults to true. The product editor starts with Licensed product off.
update_slug The folder name of your plugin, used in update responses and release package names. A slug another product uses is refused. Cleared when is_licensed is false.
files Downloadable files for buyers that are not versioned software, such as an ebook. Each entry names a stored file by provider and key, with an optional label. Versioned plugin packages are releases, not files.
settings Per-product settings. The images are attachment ids under main_image, thumbnail and og_image, and a list of ids under screenshots.
prices The pricing tiers. See Pricing tier fields.
bundle_items For a bundle, the granted products. Each item has child_product_id, an optional child_price_id (the tier the bundle grants, or null for the product's default tier) and sort_order. Sending the list replaces the bundle's items.
categories, tags Lists of term ids. Sending a list replaces the product's current terms of that kind.

Pricing tier fields

Pricing tiers have no route of their own. They come back as the prices array in a product, and you change them by sending the whole prices array to PUT /tiermint/v1/products/{id}. The array replaces the product's tiers, so include every tier you want to keep with its id. Leave out id to add a new tier. The editor's Pricing tab saves the same way.

Field Meaning
name The tier name. Required.
amount The price as an integer in the currency's smallest unit, such as 4900 for 49.00.
activation_limit Sites per license. Send null for unlimited activations.
license_length A length such as +1 year or +6 months. Send null for a lifetime license. A plain number is refused.
min_quantity At least 1.
max_quantity At least min_quantity. Send null, or leave it out, for no limit. A 0 is refused here, although the editor shows 0 for no limit.
sort_order The display order, lowest first.
status active or archived.

Subscription fields, such as a billing period, are not tier fields in the free plugin. A request that sends them has them ignored. With TierMint Pro active, each tier also carries a recurring key that holds its billing schedule. See recurring tiers in the REST API.

Add your own product fields

Developers can add fields to the product editor with the tiermint_product_fields filter, and group them in a new panel with tiermint_product_field_panels. Each field has a type: text, textarea, rich_text, media or media_gallery. The type decides how the value is cleaned when a product is saved, unless the field brings its own sanitizer. A field's value is stored in the product settings by default, with no database change.

Keys in settings that are not registered fields are kept as sent. The built-in image keys (main_image, thumbnail, og_image and screenshots) are reserved, so do not store your own data under them. The overview and description have their own columns, so a value sent under settings.overview or settings.description is dropped.

Check product saves

Two filters run on every product save, except a new product with a bad name, type or status, or an update with a bad status change. tiermint_product_settings_before_save receives the settings, the pricing tiers, the stored product (null on create) and the price rows as sent, and returns the settings to store. An update that sends no settings passes the stored ones. tiermint_product_validation_errors receives the list of errors, the tiers, the settings, the stored product and the price rows as sent, and returns the list. Any error refuses the save, and the REST response lists it with the plugin's own errors under tiermint_invalid_params. A WP_Error adds its messages. Blank text and null entries are ignored. Any other entry, or a return that is neither a list nor a WP_Error, refuses the save with a generic message.

The price rows keep the keys the plugin does not use, so an extension can check its own data on each tier. They are an empty list when an update sends no prices.

After a product and its tiers are stored, the tiermint_product_saved action runs. It receives the stored product, a list that pairs each stored tier (price) with the row it was saved from (input) in the order sent, and the product as it was before the save (null on create). Tiers the save did not send are not in the list. If a listener fails, the error goes to the TierMint log and the save still succeeds. tiermint_product_deleted runs after a product is deleted and receives the product as it was.

tiermint_rest_product_price filters each tier in a products REST response. It receives the tier data, the tier and its product, and returns the data. An extension that stores its own data per tier adds it here.

In the editor, window.tierMint.admin.registerPriceTierExtension( { id, component } ) adds a component to every pricing tier card. The component receives price, index, prices, settings, updatePrice and updateSettings. Settings it writes, and keys it writes on a tier with updatePrice, go out with the product on save. Tier keys the plugin does not use are sent back as they were loaded.

Common questions

I archived a pricing tier my customers bought. Are their licenses broken?

No. Archiving only hides the tier from new purchases. Licenses already sold keep the activation limit and license length they were sold with.

Where do I upload the plugin zip for a licensed product?

On the product's Releases tab. Versioned packages with changelogs are releases. The tab opens once the product has been saved. Update server and releases covers uploading and publishing.

Why can't I put a bundle inside another bundle?

Bundles are one level deep, so it is always clear which products a buyer is licensed for. To offer overlapping groups, make separate bundles that each list the products directly.

Does deleting a category delete its products?

No. Deleting a category or a tag removes only the term and its assignments. The products stay. Child categories move up to the deleted category's parent.

Can I filter by more than one category or tag?

Yes. The REST API's category and tag parameters take several slugs, separated by commas. A product matches when it is in any of the categories. When you send both, a product must match at least one category and at least one tag. The Product Grid block and the [tiermint_product_grid] shortcode take several categories and tags too.