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: NULL

Active forever (or until manually deactivated).

Future Start (From Date set):

from_date: 2025-06-01 to_date: NULL

Activates June 1st, runs forever.

Fixed Campaign (Both set):

from_date: 2025-11-29 to_date: 2025-12-02

Black Friday campaign, auto-expires after Cyber Monday.

Grace Period:

from_date: 2025-01-01 to_date: 2026-01-31

Annual 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: California

Only 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:

  1. General - Name, active, priority, dates, website, matching attributes
  2. Products - Add/manage product prices within pricelist
  3. Groups - Assign customer groups
  4. Customers - Manual customer assignments
  5. Users - Admin user assignments

Common Workflows

Workflow 1: Annual Pricing Cycle

Goal: Replace 2024 pricing with 2025 pricing on Jan 1.

Setup:

  1. Existing: "Wholesale 2024" (Priority 15, from_date: 2024-01-01, to_date: 2024-12-31)
  2. New: "Wholesale 2025" (Priority 15, from_date: 2025-01-01, to_date: 2025-12-31)
  3. Result: Auto-switch on January 1st, no downtime

Workflow 2: Promotional Override

Goal: Black Friday sale overrides standard pricing.

Setup:

  1. Standard: "Wholesale 2025" (Priority 15, permanent)
  2. Campaign: "Black Friday 2025" (Priority 25, from: 2025-11-29, to: 2025-12-02)
  3. Result: Higher priority campaign wins during Black Friday, then reverts to standard

Workflow 3: Regional Expansion

Goal: Launch EU pricing alongside US pricing.

Setup:

  1. US: "US Standard Pricing" (website_id: US, country: US)
  2. EU: "EU Standard Pricing" (website_id: EU, country: DE/FR/IT/etc)
  3. Result: Automatic regional pricing based on customer country

Workflow 4: VIP Program

Goal: VIP customers always get best pricing.

Setup:

  1. Standard: Various pricelists (Priority 10-20)
  2. VIP: "VIP Exclusive" (Priority 35, group_id: VIP)
  3. 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:

  1. Is Active = Yes?
  2. Date range valid? (from <= today <= to)
  3. Website matches customer's website?
  4. Matching attributes correct?
  5. Customer actually matches attributes?
  6. Cache cleared?

Multiple Pricelists Conflict

Expected! Use priority system.

Check:

  1. Priority values set correctly?
  2. Merge config (merge_pricelist_qtys) set as desired?
  3. Date ranges overlap intentionally?

Can't Create Base Pricelist

Cause: Base pricelist already exists for website.

Resolution:

  1. Find existing base pricelist for website
  2. Either deactivate it or set is_base_pricelist = No
  3. Then create new base pricelist

Found an issue with this documentation? Let us know