Skip to content

Configuration

Tiers is configured on one screen: WooCommerce → Tiers. All settings are stored in a single tiers_settings option (an array), there are no custom tables. The fields below list the key each setting is saved under.

Tiers applies discounts whenever you have at least one valid tier saved. There is no global on/off toggle. To stop discounting, remove your tiers; to stop showing the table while keeping the discount, turn Show pricing table off (below).

The core of the page. Each tier is three values:

  • Min. quantity (min_qty, integer), the cart-line quantity at which the band unlocks.
  • Discount % (discount_percent, float), taken off the product’s regular price. Stored to two decimals.
  • Label (label, optional text), copy the merchant can show; not required.

The builder adds and removes rows in place with a live, shopper-facing preview. On save, the sanitize callback drops any row whose min_qty is not positive or whose discount_percent is <= 0 or > 100, then sorts the survivors by quantity ascending. Tiers are global in the free edition, the same ladder applies to every product.

On by default. Controls whether the volume pricing table renders on single product pages. Turning it off does not affect the cart discount, the band still applies when a shopper carts enough units; only the on-page table disappears. Useful for a quiet discount, or when you place the table manually and don’t want a duplicate.

Where the table is auto-inserted on the product page. The stored key maps to a WooCommerce hook:

ChoiceStored valueHook (priority)
Product summary (below price)summarywoocommerce_single_product_summary (26)
Before the add-to-cart formbefore_cartwoocommerce_before_add_to_cart_form (10)
After the add-to-cart formafter_cartwoocommerce_after_add_to_cart_form (10)
Product meta areaproduct_metawoocommerce_product_meta_start (5)
Only where I place itshortcode(no auto-placement)

summary is the default. Choosing Only where I place it suppresses automatic placement so the table renders only via the [tiers_table] shortcode or the Volume pricing table block.

Optional text rendered above the table, for example Buy more, save more. Leave it blank to show just the table. The heading also becomes the table’s screen-reader <caption>; when blank, the caption falls back to Volume pricing tiers.

Off by default. When on, the table gains a fourth You save column showing the cash saved per unit at each tier, next to the Quantity, Discount and Price columns.

Off by default. When on, each discounted cart line gets a short You save {amount} note appended to its subtotal, the amount being the saving across that line’s full quantity. This is display-only: it hooks woocommerce_cart_item_subtotal and prints text; the discount itself is applied separately in the cart.

The table always has Quantity, Discount and Price columns (plus You save when enabled). Quantities render as ranges derived from the next tier, 5, 9, then 10+ for the top band. When there is more than one tier, the row with the deepest discount is flagged with a Best value badge and an is-best-tier class for styling.

To change the table markup, copy the bundled template into your theme at:

yourtheme/tiers/single-product/pricing-table.php

The loader checks the active theme first (locate_template), then falls back to the plugin’s templates/, so your override survives updates. Inside the template the variables are prefixed with tiers_, $tiers_product, $tiers_tiers, $tiers_heading, $tiers_show_savings.

All hooks below are merchant/developer-facing and stable.

// Swap in per-product or role-based tiers (this is what Tiers PRO builds on).
add_filter( 'tiers_product_tiers', function ( array $tiers, WC_Product $product ): array {
return $tiers;
}, 10, 2 );
// Add a parameter to each active tier row as it is read (e.g. allowed_roles).
add_filter( 'tiers_active_tier', function ( array $tier, array $raw ): array {
return $tier;
}, 10, 2 );
// Add the same parameter as a tier row is sanitised on save.
add_filter( 'tiers_sanitize_tier', function ( array $tier, array $raw ): array {
return $tier;
}, 10, 2 );
// Inject a column into the admin tier builder table.
add_action( 'tiers_admin_settings_table_header', function (): void { /* <th> */ } );
add_action( 'tiers_admin_settings_table_row', function ( array $tier, int $index ): void { /* <td> */ }, 10, 2 );
// Adjust template variables / resolved template path.
add_filter( 'tiers/template/args', function ( array $args, string $template ): array {
return $args;
}, 10, 2 );
add_filter( 'tiers/template/path', function ( string $path, string $template ): string {
return $path;
}, 10, 2 );

The cart filter tiers_product_tiers runs on every product on every cart recalculation, so keep it cheap.

Tiers creates no custom database tables. Deleting the plugin runs uninstall.php, which removes the single tiers_settings option, leaving the database as it was. Deactivating (rather than deleting) stops the discount and hides the table but keeps your settings.