Quantity-Based Pricing Tiers

Overview

Quantity-based pricing allows you to offer different prices based on the quantity a customer orders. Create graduated pricing where customers receive better rates when ordering larger quantities.

How It Works

The system checks cart quantity against all price entries for the customer-product combination and automatically selects the best applicable price.

Price Selection Logic

  1. Find all prices for current customer + product
  2. Filter by current website (if website_id set)
  3. Filter by current date (if from_date/to_date set)
  4. Find entries where qty <= cart quantity
  5. Select entry with highest qty that's still <= cart quantity

Creating Quantity Tiers

Example: Volume Discount

Create multiple entries with increasing quantity thresholds:

Customer: ACME Corp Product: Widget ABC (SKU: WGT-ABC) Tier 1: qty=1, price=$100.00 (1-9 units) Tier 2: qty=10, price=$95.00 (10-49 units) Tier 3: qty=50, price=$90.00 (50-99 units) Tier 4: qty=100, price=$85.00 (100+ units)

Price Application

Cart QuantityPrice AppliedEntry Used
1-9 units$100.00Tier 1 (qty=1)
10-49 units$95.00Tier 2 (qty=10)
50-99 units$90.00Tier 3 (qty=50)
100+ units$85.00Tier 4 (qty=100)

Admin Setup

Step 1: Create First Tier

Navigate to: Catalog >Customer Prices > Add New

Customer: Select customer Product: Select product Quantity: 1 Price: 100.00

Save

Step 2: Add Additional Tiers

Click "Add New" again:

Customer: Same customer Product: Same product Quantity: 10 Price: 95.00

Save

Repeat for each tier.

Best Practices

Tier Design

Do:

  • Use standard breakpoints (1, 10, 25, 50, 100, 250, 500)
  • Ensure meaningful price differences between tiers
  • Document tier structure in customer contracts
  • Test price display in cart

Don't:

  • Create too many tiers (3-5 is optimal)
  • Use odd breakpoints (e.g., qty=7, qty=23)
  • Create overlapping date ranges
  • Set tier prices higher than previous tier

Common Patterns

Simple Bulk Discount

qty=1: $100 (base price) qty=25: $90 (10% off for 25+) qty=100: $80 (20% off for 100+)

Fine-Grained Tiers

qty=1: $10.00 qty=10: $9.50 qty=25: $9.00 qty=50: $8.50 qty=100: $8.00

Large Volume Only

qty=500: $7.50 (only activates at 500+) qty=1000: $7.00 (1000+ units)

Frontend Display

Product Page

Shows available tier pricing:

  • "Buy 10 for $95.00 each"
  • "Buy 50 for $90.00 each"

Cart

Displays applied tier:

  • Quantity: 15
  • Unit Price: $95.00 (Tier 2 applied)

Customer Account

"Download My Prices" includes all tiers in CSV export.

Technical Details

Database Structure

Each tier is stored as a separate row:

identity_idcustomer_idqtyvaluefrom_dateto_datewebsite_id
11234561100.00NULLNULL0
21234561095.00NULLNULL0
31234565090.00NULLNULL0

Unique Constraint

The combination must be unique:

  • entity_id + customer_id + qty + from_date + to_date + website_id

This prevents duplicate tier definitions.

Combining with Other Features

Time-Based Tiers

Create seasonal tier pricing:

Q1 2025 Tiers: qty=1, price=$95, from_date=2025-01-01, to_date=2025-03-31 qty=50, price=$85, from_date=2025-01-01, to_date=2025-03-31 Q2 2025 Tiers (different pricing): qty=1, price=$100, from_date=2025-04-01, to_date=2025-06-30 qty=50, price=$90, from_date=2025-04-01, to_date=2025-06-30

Multi-Website Tiers

Different tiers per region:

US Website (website_id=1): qty=1, price=$100 qty=50, price=$90 EU Website (website_id=2): qty=1, price=€85 qty=50, price=€75

Troubleshooting

Price Not Applying

Check:

  1. Customer is logged in
  2. qty value is correct (must be >= 1)
  3. No date restrictions preventing activation
  4. Website ID matches current website (or is 0)
  5. Cache cleared after creating tiers

Wrong Tier Applied

Verify:

  1. Cart quantity meets tier threshold
  2. No higher tier exists with lower price
  3. Date ranges don't conflict
  4. Website filter is correct

Duplicate Entry Error

Cause: Attempting to create duplicate tier

Solution: Modify existing tier or change one of:

  • qty value
  • from_date
  • to_date
  • website_id

Next Steps

Found an issue with this documentation? Let us know