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 Quantity Price Applied Entry Used
1-9 units $100.00 Tier 1 (qty=1)
10-49 units $95.00 Tier 2 (qty=10)
50-99 units $90.00 Tier 3 (qty=50)
100+ units $85.00 Tier 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:

id entity_id customer_id qty value from_date to_date website_id
1 123 456 1 100.00 NULL NULL 0
2 123 456 10 95.00 NULL NULL 0
3 123 456 50 90.00 NULL NULL 0

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