Named Pricelist Management
Organize product prices into named containers that act as logical pricing units.
Overview
Named pricelists are containers that group product prices together under a descriptive name. Instead of assigning individual prices to customers/groups, you create pricelists like "Wholesale 2025" or "VIP Tier" and manage entire pricing structures as units.
Key Advantages
1. Logical Organization
- Group prices by business logic (season, tier, region, contract)
- Easy to find and manage related prices
- Clear naming conventions
2. Bulk Operations
- Activate/deactivate entire pricing structures instantly
- One toggle affects thousands of products
- Schedule future campaigns
3. Date-Based Control
- Set from_date/to_date on container
- Automatic activation/deactivation
- No manual intervention
4. Priority Management
- Each pricelist has priority value
- Control which pricing wins conflicts
- Fine-grained resolution
Pricelist Container Fields
Name (Required)
Descriptive identifier for the pricelist.
Naming Conventions:
- Temporal: "Q1 2025 Pricing", "Summer Sale 2025"
- Segment: "Wholesale Bronze", "VIP Gold Tier"
- Regional: "US Standard", "EU VAT Pricing"
- Contract: "Contract - ACME Corp 2025"
- Campaign: "Black Friday 2025", "Flash Sale #42"
Best Practices:
- Include year for time-bound pricing
- Include segment/tier for clarity
- Avoid generic names ("Test", "New", "Pricing")
Is Active (Boolean)
Toggle pricelist on/off without deleting.
Use Cases:
- Inactive during setup: Prepare pricelist, activate when ready
- Temporary disable: Turn off problematic pricelist quickly
- Seasonal rotation: Deactivate winter pricing, activate summer
Effect:
- Active = Yes: Pricelist evaluated for customer matching
- Active = No: Pricelist completely ignored
Priority (0-999)
Numeric value for conflict resolution.
Default: 0 Range: 0-999 Rule: Higher priority wins
Recommended Hierarchy:
- 0-9: Base pricelists
- 10-19: Standard pricelists
- 20-29: Promotional pricelists
- 30-39: VIP/Contract pricelists
- 40+: Emergency overrides
Example:
- "Standard Wholesale" (Priority 15)
- "Summer Campaign" (Priority 25) → Overrides standard during summer
- "VIP Contract" (Priority 35) → Always wins for VIP customers
From Date / To Date
Date range for automatic activation/deactivation.
Format: YYYY-MM-DD or NULL
Scenarios:
Permanent (Both NULL):
from_date: NULL to_date: NULLActive forever (or until manually deactivated).
Future Start (From Date set):
from_date: 2025-06-01 to_date: NULLActivates June 1st, runs forever.
Fixed Campaign (Both set):
from_date: 2025-11-29 to_date: 2025-12-02Black Friday campaign, auto-expires after Cyber Monday.
Grace Period:
from_date: 2025-01-01 to_date: 2026-01-31Annual contract + 1 month grace period for renewal.
Website ID
Website scope for multi-website installations.
Options:
- Specific website (US Website, EU Website)
- All websites (website_id = 0)
Use Case:
- US Website: USD pricing
- EU Website: EUR pricing with VAT
- UK Website: GBP pricing
Is Base Pricelist (Boolean)
Designate as fallback pricelist for website.
Rules:
- Only ONE base pricelist per website
- Enforced by
enable_base_pricelist_validation - Lowest priority (usually 0)
- No matching attributes (applies to everyone without specific pricelist)
Purpose:
- Ensure all customers see some pricing
- Prevent "no price" situations
- Fallback for new customers
Customer Matching Attributes
These fields enable automatic customer assignment.
Customer Group ID
Match by Magento customer group.
Example:
- Group 2 = Wholesale
- All wholesale customers get this pricelist
Company Name
Match by company field in customer account.
Example:
- Company: "ACME Corporation"
- All ACME employees get contract pricing
Matching Mode:
- Loose (
match_exact_type = No): "ACME" matches "ACME Corp" - Exact (
match_exact_type = Yes): Must be exactly "ACME"
Tax/VAT Number
Match by tax identification number.
Example:
- Tax: "DE123456789"
- German VAT-registered businesses
Postcode
Match by billing/shipping postcode.
Example:
- Postcode: "90210"
- Beverly Hills residents
Region
Match by state/province/region.
Example:
- Region: "California"
- California-specific pricing
Country
Match by country code.
Example:
- Country: "US"
- United States pricing
Multi-Attribute Matching:
All filled attributes must match (AND logic).
Example:
Customer Group: Wholesale (2) Country: US Region: CaliforniaOnly wholesale customers in California, USA match.
Database Structure
Table: pricesystem_pricelist
CREATE TABLE pricesystem_pricelist ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, is_active TINYINT DEFAULT 1, priority INT DEFAULT 0, from_date DATE DEFAULT NULL, to_date DATE DEFAULT NULL, website_id INT NOT NULL, is_base_pricelist TINYINT DEFAULT 0, -- Customer matching attributes customer_group_id INT DEFAULT NULL, customer_company VARCHAR(255) DEFAULT NULL, customer_tax VARCHAR(255) DEFAULT NULL, address_postcode VARCHAR(255) DEFAULT NULL, address_region VARCHAR(255) DEFAULT NULL, address_country VARCHAR(2) DEFAULT NULL, created_at TIMESTAMP, updated_at TIMESTAMP, FOREIGN KEY (website_id) REFERENCES store_website(website_id), FOREIGN KEY (customer_group_id) REFERENCES customer_group(customer_group_id) );Admin Interface
Location
Admin Panel >Catalog > Pricelists
Grid Columns
- ID
- Name
- Active (Yes/No)
- Priority
- From Date
- To Date
- Website
- Base Pricelist (Yes/No)
- Created
- Actions (Edit/Delete)
Grid Features
- Filter by name, active status, website
- Sort by any column
- Mass activate/deactivate
- Export to CSV (with add-on)
Edit Form
Tabs:
- General - Name, active, priority, dates, website, matching attributes
- Products - Add/manage product prices within pricelist
- Groups - Assign customer groups
- Customers - Manual customer assignments
- Users - Admin user assignments
Common Workflows
Workflow 1: Annual Pricing Cycle
Goal: Replace 2024 pricing with 2025 pricing on Jan 1.
Setup:
- Existing: "Wholesale 2024" (Priority 15, from_date: 2024-01-01, to_date: 2024-12-31)
- New: "Wholesale 2025" (Priority 15, from_date: 2025-01-01, to_date: 2025-12-31)
- Result: Auto-switch on January 1st, no downtime
Workflow 2: Promotional Override
Goal: Black Friday sale overrides standard pricing.
Setup:
- Standard: "Wholesale 2025" (Priority 15, permanent)
- Campaign: "Black Friday 2025" (Priority 25, from: 2025-11-29, to: 2025-12-02)
- Result: Higher priority campaign wins during Black Friday, then reverts to standard
Workflow 3: Regional Expansion
Goal: Launch EU pricing alongside US pricing.
Setup:
- US: "US Standard Pricing" (website_id: US, country: US)
- EU: "EU Standard Pricing" (website_id: EU, country: DE/FR/IT/etc)
- Result: Automatic regional pricing based on customer country
Workflow 4: VIP Program
Goal: VIP customers always get best pricing.
Setup:
- Standard: Various pricelists (Priority 10-20)
- VIP: "VIP Exclusive" (Priority 35, group_id: VIP)
- Result: VIP pricelist always wins due to highest priority
Best Practices
Naming
- "Wholesale Q1 2025" - Clear, dated
- "Contract - ACME Corp 2025-2026" - Contract with dates
- "US Region Standard Pricing" - Region + tier
- "Test" - Too generic
- "Pricing 2" - No context
- "asdf" - Not descriptive
Priority Values
- Use consistent tiers (0, 10, 20, 30)
- Leave gaps (10, 15, 20 not 10, 11, 12)
- Document your hierarchy
- Avoid priority 999 (emergency only)
Date Ranges
- Include grace periods for renewals
- Overlap dates deliberately (e.g., campaign + standard)
- Don't leave gaps between annual cycles
- Test date transitions in staging
Activation
- Prepare inactive pricelists in advance
- Test before activating
- Activate during low-traffic periods
- Monitor after activation
Troubleshooting
Pricelist Not Applying
Check:
- Is Active = Yes?
- Date range valid? (from <= today <= to)
- Website matches customer's website?
- Matching attributes correct?
- Customer actually matches attributes?
- Cache cleared?
Multiple Pricelists Conflict
Expected! Use priority system.
Check:
- Priority values set correctly?
- Merge config (
merge_pricelist_qtys) set as desired? - Date ranges overlap intentionally?
Can't Create Base Pricelist
Cause: Base pricelist already exists for website.
Resolution:
- Find existing base pricelist for website
- Either deactivate it or set is_base_pricelist = No
- Then create new base pricelist
