Multi-Website Configuration
Overview
Manage different customer prices across multiple websites within your Magento installation. Set region-specific pricing, handle multi-currency scenarios, and maintain separate price lists for different storefronts.
How It Works
The website_id field determines which website(s) a price applies to:
- website_id = 0: Price applies to all websites (global)
- website_id = 1, 2, 3, etc.: Price applies only to that specific website
When resolving prices, the system:
- Checks for prices with matching website_id
- Falls back to website_id = 0 if no website-specific price exists
- Applies standard catalog price if no customer price matches
Website ID Reference
Finding Website IDs
Admin Method:
Navigate to: Stores >All Stores
View your website structure:
Main Website (ID: 1) └─ Main Store └─ English Store View └─ German Store View EU Website (ID: 2) └─ EU Store └─ EU English View └─ EU German View US Website (ID: 3) └─ US Store └─ US English ViewDatabase Query:
SELECT website_id, code, name FROM store_website;Example output:
| website_id | code | name | |------------|--------|--------------| | 0 | admin | Admin | | 1 | base | Main Website | | 2 | eu | EU Website | | 3 | us | US Website |Use Cases
Regional Pricing Strategy
Scenario: Different prices for US and EU customers
US Website (website_id=3): Customer: ACME Corp Product: Widget ABC Quantity: 1 Price: $100.00 Website: US Website EU Website (website_id=2): Customer: ACME Corp (same customer) Product: Widget ABC Quantity: 1 Price: €90.00 Website: EU WebsiteSame customer sees different prices based on which website they're browsing.
Multi-Currency Handling
Example: Product with different currency pricing
Main Website (USD): - Price: $100.00 - Website ID: 1 UK Website (GBP): - Price: £75.00 - Website ID: 4 EU Website (EUR): - Price: €85.00 - Website ID: 2Global Price with Regional Overrides
Scenario: Default price everywhere, but cheaper in specific region
Global Default: - Customer: Beta Ltd - Product: Widget ABC - Quantity: 1 - Price: $100.00 - Website: All Websites (0) EU Override: - Customer: Beta Ltd - Product: Widget ABC - Quantity: 1 - Price: €80.00 - Website: EU Website (2)Browsing EU website: €80.00 Browsing any other website: $100.00
Admin Setup
Step 1: Create Website-Specific Price
Navigate to: Catalog >Customer Prices > Add New
Step 2: Fill Basic Information
Customer: Select customer Product: Select product Quantity: 1 Price: 100.00Step 3: Select Website
Website Dropdown Options:
- All Websites (ID: 0)
- Main Website (ID: 1)
- EU Website (ID: 2)
- US Website (ID: 3)
Select the specific website this price should apply to.
Step 4: Save
Click Save to create the website-specific price.
Advanced Scenarios
Per-Website Quantity Tiers
Example: Different tier structure by region
US Website (website_id=3): qty=1, price=$100, website_id=3 qty=50, price=$95, website_id=3 qty=100, price=$90, website_id=3 EU Website (website_id=2): qty=1, price=€85, website_id=2 qty=25, price=€80, website_id=2 qty=75, price=€75, website_id=2Same customer, same product, but different tier breakpoints and currency per region.
Time-Based Regional Campaigns
Example: Seasonal promotion only in EU
EU Q1 Campaign (website_id=2): - qty=1 - price=€70 - from_date=2025-01-01 - to_date=2025-03-31 - website_id=2 US Standard (website_id=3): - qty=1 - price=$95 - from_date=NULL - to_date=NULL - website_id=3EU customers see promotional price Jan-Mar, US customers see standard price year-round.
Shared Customers Across Websites
Important: If a customer can access multiple websites, they can have different prices on each:
Customer ID: 456 (Global B2B Customer) On US Website: - Sees $100.00 (website_id=3 price) On EU Website: - Sees €85.00 (website_id=2 price) On APAC Website: - Sees $110.00 (website_id=4 price)Database Structure
Schema
CREATE TABLE pricesystem_customerprice ( id INT PRIMARY KEY AUTO_INCREMENT, entity_id INT NOT NULL, customer_id INT NOT NULL, qty DECIMAL(12,4) NOT NULL, value DECIMAL(12,4) NOT NULL, from_date DATE NULL, to_date DATE NULL, website_id INT NOT NULL DEFAULT 0, CONSTRAINT fk_website FOREIGN KEY (website_id) REFERENCES store_website(website_id) ON DELETE CASCADE, CONSTRAINT UNIQUE (entity_id, customer_id, qty, from_date, to_date, website_id) );Unique Constraint
You can have:
- Same customer/product/qty with different website_id
- Same customer/product/website with different qty
- Exact duplicate including website_id (avoid)
Foreign Key Constraint
The foreign key ensures:
- You can only use valid website IDs
- If a website is deleted, associated prices are automatically removed
- Data integrity is maintained
Price Resolution Logic
Resolution Order
When a customer views a product, the system:
- Find all customer prices for entity_id + customer_id
- Filter by website:
- Include prices where website_id = current website
- Include prices where website_id = 0 (global)
- Filter by date (if from_date/to_date set)
- Filter by quantity (qty <= cart quantity)
- Select best price:
- Website-specific price (if exists)
- Global price (website_id=0) as fallback
- Highest qty tier that matches
Example Resolution
Setup:
Customer: 456 Product: 123 Current Website: 2 (EU) Cart Quantity: 15 Price Entries: Entry A: qty=1, price=$100, website_id=0 (global) Entry B: qty=10, price=$95, website_id=0 (global) Entry C: qty=1, price=€85, website_id=2 (EU) Entry D: qty=10, price=€80, website_id=2 (EU)Resolution:
- Filter by website: Keep Entry A, B, C, D (all match website 2 or 0)
- Filter by quantity: Keep Entry A, C, D (qty 10 ≤ 15)
- Select best price:
- Website-specific: Entry D (qty=10, €80, website_id=2)
- Entry D wins (website-specific + highest matching qty)
Result: €80.00 applied
Frontend Display
Product Page
Shows website-specific pricing:
Product: Widget ABC Your Price: €85.00 (Viewing EU Website)Cart
Displays active website price:
Widget ABC Website: EU Website Quantity: 1 Unit Price: €85.00Customer Account
"Download My Prices" CSV includes website info:
Product,SKU,Quantity,Price,Currency,Website Widget ABC,WGT-ABC,1,85.00,EUR,EU Website Widget ABC,WGT-ABC,1,100.00,USD,US Website Widget ABC,WGT-ABC,1,95.00,USD,All WebsitesBest Practices
Website Configuration
Do:
- Use website_id=0 for default/fallback pricing
- Set website-specific prices only when needed
- Document which websites use which currencies
- Test customer experience on each website
- Consider tax implications per region
Don't:
- Create prices for non-existent website IDs
- Forget to set global fallback prices
- Mix currencies on the same website
- Create unnecessary website-specific entries
Regional Strategy
Centralized Pricing
All pricing at website_id=0 (global)Good for: Single-currency stores, simple setups
Hybrid Approach
Global defaults + regional overridesGood for: Most multi-website scenarios
Fully Separated
Every website has its own price entriesGood for: Complex multi-currency, independent regions
Troubleshooting
Wrong Price on Website
Check:
- Current website ID matches price entry
- Global fallback (website_id=0) exists
- Customer is logged in
- Website filter in admin grid
- Cache cleared after changes
Debug Query:
SELECT * FROM pricesystem_customerprice WHERE entity_id = 123 AND customer_id = 456 AND (website_id = 2 OR website_id = 0) ORDER BY website_id DESC, qty DESC;Price Not Found on Website
Verify:
- Price entry exists with correct website_id
- Foreign key constraint hasn't deleted it
- Website ID is valid in store_website table
- Customer has access to that website
Duplicate Entry Error
Error Message:
Duplicate entry '123-456-1-NULL-NULL-2' for key 'UNIQUE'Cause: Trying to create duplicate entry for same:
- entity_id + customer_id + qty + dates + website_id
Solution:
- Edit existing entry, or
- Change website_id, or
- Change qty, or
- Change date range
Combining Features
Full Feature Combination Example
Multi-Website + Quantity Tiers + Time-Based: US Website Q1 Campaign: qty=1, price=$90, from=2025-01-01, to=2025-03-31, website_id=3 qty=50, price=$85, from=2025-01-01, to=2025-03-31, website_id=3 qty=100, price=$80, from=2025-01-01, to=2025-03-31, website_id=3 EU Website Q1 Campaign: qty=1, price=€80, from=2025-01-01, to=2025-03-31, website_id=2 qty=25, price=€75, from=2025-01-01, to=2025-03-31, website_id=2 qty=75, price=€70, from=2025-01-01, to=2025-03-31, website_id=2 Global Fallback (Year-Round): qty=1, price=$100, from=NULL, to=NULL, website_id=0 qty=50, price=$95, from=NULL, to=NULL, website_id=0Reporting
Prices by Website Query
SELECT w.name as website, c.email as customer, p.sku, cp.qty, cp.value FROM pricesystem_customerprice cp JOIN store_website w ON cp.website_id = w.website_id JOIN customer_entity c ON cp.customer_id = c.entity_id JOIN catalog_product_entity p ON cp.entity_id = p.entity_id WHERE cp.website_id = 2 ORDER BY c.email, p.sku;Global vs Website-Specific Count
SELECT CASE WHEN website_id = 0 THEN 'Global' ELSE 'Website-Specific' END as type, COUNT(*) as count FROM pricesystem_customerprice GROUP BY website_id = 0;Coverage Analysis
-- Products with website-specific pricing SELECT p.sku, GROUP_CONCAT(DISTINCT w.name) as websites FROM pricesystem_customerprice cp JOIN catalog_product_entity p ON cp.entity_id = p.entity_id JOIN store_website w ON cp.website_id = w.website_id WHERE cp.website_id >0 GROUP BY p.sku;Migration Scenarios
Converting Global to Website-Specific
Step 1: Export existing global prices
SELECT * FROM pricesystem_customerprice WHERE website_id = 0;Step 2: Create website-specific copies
INSERT INTO pricesystem_customerprice (entity_id, customer_id, qty, value, from_date, to_date, website_id) SELECT entity_id, customer_id, qty, value, from_date, to_date, 2 as website_id FROM pricesystem_customerprice WHERE website_id = 0;Step 3: Adjust website-specific values as needed
Step 4: Optionally remove global entries
