Multi-Attribute Matching
Advanced customer attribute matching with configurable AND/OR logic for precise targeting.
Overview
Multi-Attribute Matching enables sophisticated customer targeting by combining multiple customer attributes with flexible logic operators. Unlike simple pricelists where attributes use fixed AND logic, Product-Customer Matrix allows you to configure AND or OR relationships between attributes for each matrix.
Key Advantages
- Flexible Logic: Choose AND (all must match) or OR (any can match) per matrix
- Multiple Values: Assign multiple values per attribute (e.g., multiple groups)
- Complex Scenarios: (Group A OR Group B) AND (Region X) patterns
- Attribute Table: Dedicated table for scalable attribute storage
- Real-Time Evaluation: Attributes evaluated on login and profile updates
How It Works
Attributes Relation Field
Each matrix has an attributes_relation field that controls how multiple attributes combine.
Options:
- AND (Default): ALL filled attributes must match
- OR: ANY filled attribute can match
Attribute Storage
Attributes stored in dedicated table: pricesystem_product_customer_matrix_attribute
Structure:
CREATE TABLE pricesystem_product_customer_matrix_attribute ( id INT PRIMARY KEY AUTO_INCREMENT, matrix_id INT NOT NULL, attribute_code VARCHAR(50) NOT NULL, -- 'group', 'company', 'tax', etc. attribute_value VARCHAR(255) NOT NULL, FOREIGN KEY (matrix_id) REFERENCES pricesystem_product_customer_matrix(id) ON DELETE CASCADE );Example Data:
matrix_id | attribute_code | attribute_value ----------|----------------|---------------- 1 | group | 2 (Wholesale) 1 | group | 4 (VIP) 1 | country | USThis means: (Group = 2 OR Group = 4) AND (Country = US)
Evaluation Process
Step-by-Step
Input:
- Customer ID: 123
- Customer attributes: Group=2 (Wholesale), Country=US, Region=California, Company="ACME Corp"
Process:
Step 1: Get Active Matrices
SELECT * FROM pricesystem_product_customer_matrix WHERE is_active = 1 AND website_id = 1 AND (from_date IS NULL OR from_date <= CURDATE()) AND (to_date IS NULL OR to_date >= CURDATE());Result: 3 active matrices
Step 2: Load Attributes for Each Matrix
SELECT matrix_id, attribute_code, attribute_value FROM pricesystem_product_customer_matrix_attribute WHERE matrix_id IN (1, 2, 3);Result:
Matrix 1 (attributes_relation='AND'): - group: 2 - country: US Matrix 2 (attributes_relation='OR'): - group: 2 - group: 4 - region: California Matrix 3 (attributes_relation='AND'): - company: ACME - country: US - region: CaliforniaStep 3: Evaluate Each Matrix
Matrix 1 (AND logic):
Check: group=2? YES (customer group = 2) ✓ Check: country=US? YES (customer country = US) ✓ Result: MATCH (all attributes matched)Matrix 2 (OR logic):
Check: group=2? YES (customer group = 2) ✓ (OR logic: stop here, already matched) Result: MATCH (at least one attribute matched)Matrix 3 (AND logic):
Check: company=ACME? YES (customer company contains "ACME") ✓ Check: country=US? YES ✓ Check: region=California? YES ✓ Result: MATCH (all three attributes matched)Step 4: Assign Matching Matrices
Customer assigned to: Matrix 1, Matrix 2, Matrix 3
Supported Attributes
Customer Group
Attribute Code: group
Source: Customer entity → group_id field
Example:
Attribute: group = 2 (Wholesale) Customer: group_id = 2 Match: YESMultiple Values:
Attributes: - group = 2 (Wholesale) - group = 4 (VIP) Logic: Customer matches if group=2 OR group=4Use Case:
- Target multiple customer segments
- VIP + Partner programs
- Wholesale + Retail (different tiers)
Company Name
Attribute Code: company
Source: Customer entity → company attribute
Example:
Attribute: company = ACME Customer: company = "ACME Corporation" Match: YES (loose mode contains "ACME")Matching Mode:
- Loose: Partial string match, case-insensitive
- Exact: Strict equality, case-sensitive
Configuration:pricesystem/productcustomermatrix/match_exact_type
Multiple Values:
Attributes: - company = ACME - company = XYZ - company = Global Logic: Customer matches if company contains any of these stringsUse Case:
- Multi-company B2B contracts
- Partner programs with multiple companies
- Corporate group pricing
Tax/VAT Number
Attribute Code: tax
Source: Customer entity → taxvat attribute
Example:
Attribute: tax = DE123456789 Customer: taxvat = DE123456789 Match: YESUse Case:
- EU VAT-registered businesses
- Tax-exempt organizations
- B2B verified accounts
Notes:
- Usually exact match (even in loose mode)
- Format-sensitive (include dashes, spaces as stored)
- Verify data quality
Postcode
Attribute Code: postcode
Source: Customer address → postcode
Example:
Attribute: postcode = 90210 Customer billing: postcode = 90210 Match: YESAddress Checking:
- Checks BOTH billing AND shipping addresses
- Match if EITHER address matches
Loose Matching:
Attribute: postcode = 9021 Customer: postcode = 90210 Match: YES (contains "9021")Multiple Values:
Attributes: - postcode = 90210 - postcode = 90211 - postcode = 90212 Logic: Customer matches if any address has any of these postcodesUse Case:
- ZIP code-based regional pricing
- Local delivery zones
- Metropolitan area targeting
Region
Attribute Code: region
Source: Customer address → region text field
Example:
Attribute: region = California Customer billing: region = California Match: YESData Quality:
- Magento stores region as text (not ID)
- "California" vs "CA" might not match
- Standardize or use loose matching
Multiple Values:
Attributes: - region = California - region = Nevada - region = Arizona Logic: Customer matches if any address in any of these regionsUse Case:
- State/province-specific pricing
- Regional campaigns
- Tax jurisdiction targeting
Country
Attribute Code: country
Source: Customer address → country_id (ISO 2-letter code)
Example:
Attribute: country = US Customer billing: country_id = US Match: YESFormat:
- Always 2-letter ISO codes: US, DE, GB, FR, IT, ES, etc.
- Exact match even in loose mode
Multiple Values:
Attributes: - country = US - country = CA - country = MX Logic: North American customers (USMCA)Use Case:
- Country-specific pricing
- Currency localization
- Regulatory compliance
- Continental targeting (EU, APAC, etc.)
AND Logic Patterns
Pattern 1: Precise Targeting
Goal: California wholesale customers only.
Matrix Configuration:
attributes_relation: AND Attributes: - group = 2 (Wholesale) - country = US - region = CaliforniaMatching:
Customer A: Wholesale, US, California → MATCH ✓ Customer B: Wholesale, US, Texas → NO MATCH (wrong region) Customer C: Retail, US, California → NO MATCH (wrong group) Customer D: Wholesale, DE, California → NO MATCH (wrong country)Use Case: Very specific regional + segment targeting.
Pattern 2: B2B Company + Location
Goal: ACME Corp employees in US only.
Matrix Configuration:
attributes_relation: AND Attributes: - company = ACME - country = USMatching:
Customer A: ACME Corp, US → MATCH ✓ Customer B: ACME Corp, DE → NO MATCH (wrong country) Customer C: XYZ Inc, US → NO MATCH (wrong company)Use Case: Multi-national B2B contracts with regional restrictions.
Pattern 3: Triple Attribute Precision
Goal: Wholesale California customers from ACME Corp.
Matrix Configuration:
attributes_relation: AND Attributes: - group = 2 (Wholesale) - company = ACME - region = CaliforniaMatching:
Customer A: Wholesale, ACME, California → MATCH ✓ Customer B: Wholesale, ACME, Texas → NO MATCH (wrong region) Customer C: VIP, ACME, California → NO MATCH (wrong group)Use Case: Highly specific targeting with multiple conditions.
OR Logic Patterns
Pattern 1: Multiple Customer Groups
Goal: Wholesale OR VIP customers.
Matrix Configuration:
attributes_relation: OR Attributes: - group = 2 (Wholesale) - group = 4 (VIP)Matching:
Customer A: Wholesale → MATCH ✓ Customer B: VIP → MATCH ✓ Customer C: Retail → NO MATCHUse Case: Target multiple customer segments with same pricing.
Pattern 2: Multi-Region Campaign
Goal: Customers in California, Nevada, or Arizona.
Matrix Configuration:
attributes_relation: OR Attributes: - region = California - region = Nevada - region = ArizonaMatching:
Customer A: California → MATCH ✓ Customer B: Nevada → MATCH ✓ Customer C: Texas → NO MATCHUse Case: Regional campaigns covering multiple states.
Pattern 3: Multi-Country Pricing
Goal: North American customers (US, Canada, Mexico).
Matrix Configuration:
attributes_relation: OR Attributes: - country = US - country = CA - country = MXMatching:
Customer A: US → MATCH ✓ Customer B: CA → MATCH ✓ Customer C: DE → NO MATCHUse Case: Continental/regional pricing zones.
Complex Scenarios
Scenario 1: (Group A OR Group B) AND (Region X)
Goal: Wholesale OR VIP customers in California.
Challenge: Need OR for groups, AND for region.
Solution: Create TWO matrices:
Matrix 1: Wholesale + California (Priority 20)
attributes_relation: AND - group = 2 (Wholesale) - region = CaliforniaMatrix 2: VIP + California (Priority 20)
attributes_relation: AND - group = 4 (VIP) - region = CaliforniaResult:
- Wholesale California customers: Matrix 1
- VIP California customers: Matrix 2
- Same priority, same products/prices
Scenario 2: (Company A OR Company B) AND (Country US)
Goal: ACME Corp OR XYZ Inc, but only in US.
Solution: Create TWO matrices:
Matrix 1: ACME + US
attributes_relation: AND - company = ACME - country = USMatrix 2: XYZ + US
attributes_relation: AND - company = XYZ - country = USAlternative (if same pricing): Use single matrix with manual customer assignments instead of attributes.
Scenario 3: Exclusion Logic (NOT)
Goal: All customers EXCEPT wholesale.
Challenge: System doesn't support NOT operator.
Workaround 1: Use OR with all other groups:
attributes_relation: OR - group = 1 (General) - group = 4 (VIP) - group = 5 (Partner) (exclude group = 2 Wholesale by not listing it)Workaround 2: Create separate matrices with higher priority for excluded segment.
Attribute Data Quality
Best Practices
1. Standardize Data Entry:
Good: Company = "ACME Corporation" Bad: Company = "acme corp.", "ACME Corp", "Acme Corporation"2. Validate on Registration:
- Require company name for B2B customers
- Validate tax IDs (format + checksum)
- Use dropdown for regions (not free text)
- Use ISO country codes
3. Data Cleanup:
-- Find company name variations SELECT DISTINCT company FROM customer_entity WHERE company LIKE '%ACME%'; -- Standardize company names UPDATE customer_entity SET company = 'ACME Corporation' WHERE company LIKE '%ACME%';4. Use Loose Matching:
- Forgives typos and variations
- "ACME" matches "ACME Corp", "acme corporation"
- Trade-off: Less precise
Testing Multi-Attribute Logic
Test Case 1: AND Logic
Setup:
Matrix: "Test AND Logic" attributes_relation: AND Attributes: - group = 2 (Wholesale) - country = USTest Customers:
Customer A: Wholesale, US → Expected: MATCH ✓ Customer B: Wholesale, DE → Expected: NO MATCH Customer C: Retail, US → Expected: NO MATCH Customer D: Retail, DE → Expected: NO MATCHVerify:
- Log in as each customer
- Check assigned matrices (admin or API)
- Verify expectations
Test Case 2: OR Logic
Setup:
Matrix: "Test OR Logic" attributes_relation: OR Attributes: - group = 2 (Wholesale) - group = 4 (VIP)Test Customers:
Customer A: Wholesale → Expected: MATCH ✓ Customer B: VIP → Expected: MATCH ✓ Customer C: Retail → Expected: NO MATCHVerify: Same as Test Case 1.
Test Case 3: Multiple Values per Attribute
Setup:
Matrix: "Multi-Country" attributes_relation: OR Attributes: - country = US - country = CA - country = MXTest Customers:
Customer A: US → Expected: MATCH ✓ Customer B: CA → Expected: MATCH ✓ Customer C: MX → Expected: MATCH ✓ Customer D: DE → Expected: NO MATCHDatabase Queries
View Matrix Attributes
SELECT m.id, m.name, m.attributes_relation, ma.attribute_code, ma.attribute_value FROM pricesystem_product_customer_matrix m LEFT JOIN pricesystem_product_customer_matrix_attribute ma ON ma.matrix_id = m.id WHERE m.id = 1 ORDER BY ma.attribute_code, ma.id;Example Output:
id | name | attributes_relation | attribute_code | attribute_value ---|--------------------|--------------------|----------------|---------------- 1 | Wholesale US 2025 | AND | country | US 1 | Wholesale US 2025 | AND | group | 2Find Customers Matching Attributes
Complex Query (AND Logic Example):
SELECT DISTINCT ce.entity_id, ce.email, ce.group_id, ad.country_id FROM customer_entity ce JOIN customer_address_entity ad ON ad.parent_id = ce.entity_id AND ad.is_default_billing = 1 WHERE ce.group_id = 2 -- Wholesale AND ad.country_id = 'US' AND ce.website_id = 1;Result: All wholesale customers in US (matches AND logic).
Count Potential Matches
-- How many customers would match this matrix? SELECT COUNT(DISTINCT ce.entity_id) AS potential_matches FROM customer_entity ce JOIN customer_address_entity ad ON ad.parent_id = ce.entity_id WHERE ce.group_id = 2 -- Wholesale AND ad.country_id = 'US';Troubleshooting
Attributes Not Matching
Checklist:
- ✓ Correct
attributes_relation(AND/OR)? - ✓ Attribute codes correct? (group, company, tax, postcode, region, country)
- ✓ Attribute values exact? (check customer data)
- ✓ Matching mode? (loose vs exact)
- ✓ Data quality? (typos, case differences)
- ✓ Address vs customer? (some attributes check addresses)
Debug SQL:
-- Check customer attributes SELECT ce.entity_id, ce.email, ce.group_id, ce.company, ce.taxvat FROM customer_entity ce WHERE ce.entity_id = 123; -- Check customer addresses SELECT ad.postcode, ad.region, ad.country_id FROM customer_address_entity ad WHERE ad.parent_id = 123; -- Check matrix attributes SELECT ma.attribute_code, ma.attribute_value FROM pricesystem_product_customer_matrix_attribute ma WHERE ma.matrix_id = 1;OR Logic Not Working
Common Issue: Mixing AND and OR expectations.
Example:
Matrix (attributes_relation=OR): - group = 2 - country = US Customer: group=1 (Retail), country=US Expected (incorrect): NO MATCH (thinking AND logic) Actual: MATCH (OR logic: country matches)Fix: Review attributes_relation field. If AND needed, create separate matrices or change to AND.
Too Many/Too Few Matches
Issue: Attribute logic too broad or too narrow.
Debug:
- Check how many customers have each attribute value
- Test with known customers
- Review attributes_relation logic
- Consider splitting into multiple matrices
Best Practices
Attribute Selection
- Start simple: Single attribute (group)
- Add complexity: Group + Country
- Test thoroughly: Edge cases
- Document logic: Why these attributes?
Logic Choice
- AND: Use for precise targeting (3-4 attributes max)
- OR: Use for broad targeting (multiple groups/regions)
- Complex: Split into multiple matrices
Data Quality
- Standardize company names
- Validate tax IDs
- Use consistent region naming
- Encourage complete profiles
Performance
- Fewer attributes = faster evaluation
- Group + Country very fast (indexed)
- Company matching slower (text search)
- Regular data cleanup
Related Documentation
- Creating Matrices - Step-by-step matrix creation
- Matrix Pricing System - Core architecture and workflow
- Priority Resolution - Handling multiple matches
