Priority-Based Resolution
Handle scenarios where customers match multiple matrices using numeric priority values and merge strategies.
Overview
Customers can match multiple matrices through:
- Different matching attributes (group + region + company)
- Manual matrix assignments
- Overlapping date ranges
- Broad attribute rules (OR logic)
The Priority System resolves these conflicts predictably and transparently.
Priority Field
Every matrix has a priority field:
- Type: Integer
- Range: 0-999
- Default: 0
- Rule: Higher value = higher precedence
Example:
- Matrix A: Priority 10
- Matrix B: Priority 20
- Winner: Matrix B
Configuration
Merge Matrix Quantities
Path: Stores > Configuration > Pricesystem > Product-Customer Matrix > Merge Matrix Qtys
Setting: pricesystem/productcustomermatrix/merge_matrix_qtys
Values:
No (Default): Select Highest Priority
When customer matches multiple matrices, use ONLY the highest priority matrix.
Example:
Customer matches: - Matrix A (Priority 10): Product X @ qty=1 ($100), qty=10 ($95) - Matrix B (Priority 20): Product X @ qty=1 ($98), qty=50 ($90) Result: Use ONLY Matrix B (higher priority) - qty=1: $98 - qty=50: $90 (Matrix A ignored completely)Use Case: Simple, predictable pricing. One matrix wins.
Yes: Merge Quantity Tiers
Combine quantity tiers from ALL matching matrices, taking best price at each tier.
Example:
Customer matches: - Matrix A (Priority 10): Product X @ qty=1 ($100), qty=10 ($95) - Matrix B (Priority 20): Product X @ qty=1 ($98), qty=50 ($90) Result: MERGE tiers, best price wins: - qty=1: $98 (from Matrix B, better than A's $100) - qty=10: $95 (from Matrix A, B has no qty=10) - qty=50: $90 (from Matrix B, A has no qty=50) Customer gets: qty=1 ($98), qty=10 ($95), qty=50 ($90) Best of both matrices!Use Case: Complex pricing scenarios, best-of-all-matrices strategy.
Priority Hierarchy Recommendations
Standard Hierarchy
0-9: Base/Fallback
- Priority 0: Base matrix (website default)
- Priority 5: Legacy/migration pricing
10-19: Standard Pricing
- Priority 10: Standard retail
- Priority 12: Standard wholesale
- Priority 15: Regional standard
20-29: Promotional Pricing
- Priority 20: Standard promotions
- Priority 22: Seasonal sales
- Priority 25: Flash sales
30-39: VIP/Contract
- Priority 30: VIP tier pricing
- Priority 32: Annual contracts
- Priority 35: Enterprise agreements
40-49: Emergency Overrides
- Priority 40: Temporary fixes
- Priority 45: Urgent campaigns
50+: Reserved
- Priority 50+: System overrides
- Priority 99: Testing
- Priority 999: Absolute override (avoid)
Resolution Scenarios
Scenario 1: Same Priority
Setup:
Matrix A: Priority 10 Matrix B: Priority 10Merge = No:
- Undefined behavior! (might be ID order, creation order, or random)
- Solution: Assign unique priorities (10 vs 11)
Merge = Yes:
- Merges tiers from both
- Best price wins at each tier
- Defined behavior
Best Practice: Avoid same-priority conflicts by using unique values.
Scenario 2: Clear Winner
Setup:
Matrix A: Priority 10 (Standard wholesale) Matrix B: Priority 30 (VIP contract)Merge = No:
- Use Matrix B only (Priority 30 >10)
Merge = Yes:
- Merge tiers from both
- VIP contract prices likely win at each tier (better pricing)
- But if wholesale has unique tiers, customer gets those too
Scenario 3: Three-Way Conflict
Setup:
Customer matches three matrices: - Matrix A: Priority 15 (Wholesale) - Matrix B: Priority 20 (California Regional) - Matrix C: Priority 30 (ACME Contract) Product X prices: - A: qty=1 ($100), qty=10 ($95) - B: qty=1 ($98), qty=25 ($92) - C: qty=1 ($96), qty=50 ($88)Merge = No:
- Use ONLY Matrix C (Priority 30)
- Customer gets: qty=1 ($96), qty=50 ($88)
Merge = Yes:
- Merge all three matrices
- Best price at each tier:
- qty=1: $96 (from C)
- qty=10: $95 (from A)
- qty=25: $92 (from B)
- qty=50: $88 (from C)
- Customer gets: qty=1 ($96), qty=10 ($95), qty=25 ($92), qty=50 ($88)
Analysis: Merge gives best pricing across all tiers.
Scenario 4: Date-Based Priority Shift
Setup:
Standard pricing: - Matrix: "Wholesale 2025" - Priority: 15 - Dates: 2025-01-01 to 2025-12-31 - Product X: qty=1 ($100) Campaign: - Matrix: "Black Friday 2025" - Priority: 25 - Dates: 2025-11-29 to 2025-12-02 - Product X: qty=1 ($75)Timeline:
Nov 28:
- Only Wholesale active: $100
Nov 29-30 (Black Friday):
- Both active, campaign wins (Priority 25 >15): $75
Dec 3+:
- Only Wholesale active again: $100
Key Point: Temporary high-priority campaigns override standard pricing.
Scenario 5: Product Not in High-Priority Matrix
Setup:
Matrix A (Priority 10): Products X, Y, Z Matrix B (Priority 20): Products X, Y (Z missing)Customer views Product Z:
Merge = No:
- Use Matrix B (higher priority)
- Product Z not in Matrix B
- Result: No matrix price (fallback to next pricesystem module)
Merge = Yes:
- Check all matrices
- Product Z found in Matrix A
- Result: Uses Matrix A price for Product Z
Lesson: Merge mode more forgiving when high-priority matrices have incomplete product sets.
Scenario 6: Customer-Specific Date Override
Setup:
Matrix: "Annual Contract - ACME" (Priority 35) - Matrix Dates: 2025-01-01 to 2025-12-31 - Company: ACME Customer #123: - Automatic assignment via company match - Manual override dates: 2025-01-01 to 2025-06-30 (6-month trial) Customer #456: - Automatic assignment via company match - No override dates (uses matrix dates)Result:
- Customer #123: Matrix active Jan 1 - Jun 30 only
- Customer #456: Matrix active Jan 1 - Dec 31 (full year)
Key Point: Customer-specific dates override matrix dates, allowing per-customer scheduling within same matrix.
Scenario 7: Priority + Merge with Overlapping Tiers
Setup:
Matrix A (Priority 10): - Product X: qty=1 ($100), qty=10 ($90), qty=50 ($80) Matrix B (Priority 20): - Product X: qty=1 ($95), qty=25 ($85), qty=100 ($75) Matrix C (Priority 30): - Product X: qty=1 ($98), qty=50 ($78)Customer orders 40 units.
Merge = No (Highest Priority Only):
Use Matrix C only (Priority 30) Best tier for qty=40: qty=1 ($98) Result: $98/unit × 40 = $3,920Merge = Yes (Best Price Wins):
Merge all tiers: - qty=1: Best of ($100, $95, $98) = $95 (Matrix B) - qty=10: Best of ($90, $95, $98) = $90 (Matrix A) - qty=25: Best of ($80, $85, $98) = $80 (Matrix A) - qty=50: Best of ($80, $75, $78) = $75 (Matrix B) - qty=100: $75 (Matrix B) Customer orders 40 units → Uses qty=25 tier: $80 Result: $80/unit × 40 = $3,200 Savings: $720 by using merge!Analysis: Merge can significantly benefit customers by combining best prices from multiple matrices.
Priority Management
Setting Priorities
At Creation:
- Identify purpose (standard/promo/VIP/contract)
- Check existing matrices in same tier
- Assign priority within tier
- Document reasoning
Example:
Creating "Summer Sale 2025" Purpose: Seasonal promotion Tier: 20-29 (promotional) Existing: Spring Sale (22) Assign: 23 (next in sequence) Document: "Summer campaign, overrides standard wholesale (15)"Changing Priorities
Caution: Affects all customers assigned to matrix.
Process:
- Understand current behavior
- Test priority change in staging
- Verify customer impact
- Update during low-traffic period
- Monitor after change
- Document change reason
Bulk Priority Updates
Scenario: Increase all VIP priorities by 10.
SQL:
UPDATE pricesystem_product_customer_matrix SET priority = priority + 10 WHERE name LIKE 'VIP%' OR id IN ( SELECT matrix_id FROM pricesystem_product_customer_matrix_attribute WHERE attribute_code = 'group' AND attribute_value = '4' -- VIP group );Caution: Test first! Affects all customers.
Testing Priority Logic
Test Case 1: Basic Priority
Setup:
- Create Matrix A (Priority 10) with Product X = $100
- Create Matrix B (Priority 20) with Product X = $90
- Assign test customer to both matrices (manually)
Test Merge = No:
- Expected: $90 (Matrix B wins)
- Verify: Log in, check Product X price
Test Merge = Yes:
- Expected: $90 (still $90, both have same tier)
- Verify: Same result
Test Case 2: Merge Benefit
Setup:
- Matrix A (Priority 10): Product X @ qty=1 ($100), qty=10 ($95)
- Matrix B (Priority 20): Product X @ qty=1 ($98), qty=50 ($90)
- Assign test customer to both
Test Merge = No:
- Expected: Only qty=1 ($98), qty=50 ($90) from Matrix B
- Verify: qty=10 tier NOT available
Test Merge = Yes:
- Expected: qty=1 ($98), qty=10 ($95), qty=50 ($90)
- Verify: qty=10 tier available (from Matrix A)
Test Case 3: Date-Based Priority Shift
Setup:
- Matrix A: Standard pricing (Priority 15, permanent)
- Matrix B: Campaign pricing (Priority 25, 7 days only)
- Assign customer to both
Test Before Campaign:
- Expected: Matrix A price
- Verify: Check product price
Test During Campaign:
- Expected: Matrix B price (higher priority)
- Verify: Price changed
Test After Campaign:
- Expected: Matrix A price again
- Verify: Price reverted
Best Practices
1. Use Tiers, Not Random Values
Good:
- 0, 10, 20, 30, 40 (clear tiers)
- 10, 15, 20, 25, 30 (with gaps)
Bad:
- 7, 13, 21, 29, 33 (no pattern)
- 1, 2, 3, 4, 5 (no gaps)
2. Leave Gaps
Allows inserting priorities later without renumbering.
Example:
- Current: 10, 20, 30
- Need to insert between 10 and 20: Use 15
- With consecutive (10, 11, 12): Must renumber everything
3. Document Hierarchy
Create internal documentation:
Priority Hierarchy - MageB2B Product-Customer Matrices 0-9: Base matrices 0 = Website default pricing 10-19: Standard pricing 10 = Standard retail 12 = Standard wholesale 15 = Regional standard 20-29: Promotional pricing 20 = Standard promotions 25 = Flash sales/urgent campaigns 30-39: VIP/Contract pricing 30 = VIP tier 35 = Enterprise contracts 40+: Emergency/testing4. Test Merge Configuration
Before enabling merge:
- Test with 2-3 matrices
- Verify expected behavior
- Check edge cases (missing products, same tiers)
- Monitor after enabling
5. Avoid Priority 999
Reserve for absolute emergencies only. Creates maintenance issues.
6. Audit Regularly
Quarterly review:
- List matrices by priority
- Find duplicates (same priority)
- Find gaps (orphaned tiers)
- Verify hierarchy still makes sense
Troubleshooting
Wrong Price Displaying
Checklist:
- ✓ Which matrices does customer match?
- ✓ What are their priorities?
- ✓ Is merge enabled?
- ✓ Does product exist in high-priority matrix?
- ✓ Are dates valid for all matrices?
- ✓ Cache cleared?
Debug SQL:
-- Find customer's matrices SELECT m.id, m.name, m.priority, m.is_active, m.from_date, m.to_date, CASE WHEN mc.from_date IS NOT NULL THEN mc.from_date ELSE m.from_date END AS effective_from_date, CASE WHEN mc.to_date IS NOT NULL THEN mc.to_date ELSE m.to_date END AS effective_to_date FROM pricesystem_product_customer_matrix m JOIN pricesystem_product_customer_matrix_customer mc ON mc.matrix_id = m.id WHERE mc.customer_id = 123 AND m.is_active = 1 ORDER BY m.priority DESC; -- Check product prices in those matrices SELECT m.name, m.priority, p.qty, p.price FROM pricesystem_pricelist_product p JOIN pricesystem_product_customer_matrix m ON m.id = p.pricelist_id WHERE p.product_id = 456 AND p.pricelist_id IN ( SELECT matrix_id FROM pricesystem_product_customer_matrix_customer WHERE customer_id = 123 ) ORDER BY m.priority DESC, p.qty ASC;Merge Not Working
Symptoms: Customer only sees one matrix's prices, not merged.
Checks:
- ✓
merge_matrix_qtys = Yesin config? - ✓ Config cache cleared?
- ✓ Customer actually assigned to multiple matrices?
- ✓ Matrices have different qty tiers to merge?
Test SQL:
-- Check merge config SELECT * FROM core_config_data WHERE path = 'pricesystem/productcustomermatrix/merge_matrix_qtys'; -- Check customer's matrices count SELECT COUNT(*) FROM pricesystem_product_customer_matrix_customer WHERE customer_id = 123;Same Priority Issues
Symptom: Unpredictable pricing behavior.
Cause: Multiple matrices with same priority.
Resolution:
- Find duplicates:
SELECT priority, COUNT(*) AS cnt FROM pricesystem_product_customer_matrix WHERE is_active = 1 GROUP BY priority HAVING cnt >1;- Assign unique priorities
- Test again
Priority Not Respected
Symptom: Lower priority matrix wins.
Possible Causes:
- High-priority matrix missing product
- High-priority matrix expired (date range)
- Customer-specific date override on lower-priority matrix
- Cache issue
Debug:
- Check product exists in all matrices
- Verify date ranges (matrix + customer)
- Clear cache
- Test with fresh customer session
Advanced: Manual Priority Override
For specific customers, override priority system:
Method 1: Highest Priority Matrix
Create customer-specific matrix with priority 50+.
Example:
- Standard matrices: 10-30
- Customer exception: Priority 60
- Always wins for that customer
Method 2: Date Range Stacking
Layer matrices with different date ranges but same customer.
Example:
Base: Priority 10, permanent Q1 Special: Priority 20, Jan-Mar Q2 Special: Priority 20, Apr-Jun VIP Override: Priority 30, permanentCustomer gets VIP pricing except during Q1/Q2 when specials might offer better prices (if merge enabled).
Method 3: Customer-Specific Date Restriction
Use customer-specific dates to limit when high-priority matrix applies.
Example:
Matrix: VIP Pricing (Priority 30, permanent at matrix level) Customer #123: - Override dates: 2025-01-01 to 2025-06-30 (6-month trial) - After Jun 30: Loses VIP pricing, falls back to lower-priority matrices Customer #456: - No override dates - Gets VIP pricing permanently (or until matrix expires)Integration with Other Pricesystem Modules
Matrix vs Pricelist Priority
Price Resolution Order:
- Shopping cart price rules
- Customer-specific prices
- Product-Customer Matrices ← Higher in chain
- Named Pricelists
- Category prices
- Catalog price
Key Point: Matrices evaluated BEFORE pricelists. If matrix price found, pricelist never checked.
Cross-Module Conflicts
Scenario: Customer has both matrix and pricelist pricing.
Resolution:
- Matrix price found → Use it (pricelist ignored)
- Matrix price NOT found → Fallback to pricelist
Recommendation: Use matrices OR pricelists, not both, to avoid confusion.
Performance Considerations
Priority Sorting
Indexed:
CREATE INDEX idx_matrix_priority ON pricesystem_product_customer_matrix(priority);Query Optimization:
- Matrices sorted by priority DESC
- Highest priority evaluated first
- If merge=No, stop after first match (fast)
- If merge=Yes, evaluate all matching matrices (slower)
Merge Impact
Merge = No:
- Fast: First matching matrix wins
- Single database query per product
Merge = Yes:
- Slower: All matrices must be checked
- Multiple queries to find best price at each tier
- Consider for VIP customers only
Related Documentation
- Creating Matrices - Step-by-step matrix creation
- Matrix Pricing System - Core architecture and workflow
- Multi-Attribute Matching - Attribute logic with AND/OR
