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
- Find all prices for current customer + product
- Filter by current website (if website_id set)
- Filter by current date (if from_date/to_date set)
- Find entries where qty <= cart quantity
- 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.00Save
Step 2: Add Additional Tiers
Click "Add New" again:
Customer: Same customer Product: Same product Quantity: 10 Price: 95.00Save
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.00Large 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-30Multi-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=€75Troubleshooting
Price Not Applying
Check:
- Customer is logged in
- qty value is correct (must be >= 1)
- No date restrictions preventing activation
- Website ID matches current website (or is 0)
- Cache cleared after creating tiers
Wrong Tier Applied
Verify:
- Cart quantity meets tier threshold
- No higher tier exists with lower price
- Date ranges don't conflict
- 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
