WKS - Parent Customer Data Aggregation
Workshop on to cover requirements for aggregation of customer master data.
Participants
Name | Company | Role |
|---|---|---|
Teemu Salonen | Valio | Pricing Analyst |
Tomi Toivonen | Valio | Pricing Manager |
Omar Bendada | Ben Consulting Services | Business Analyst |
Sofia Simaria | Ben Consulting Services | Proxy Product Owner |
Alain Becker | Pearson Ham Group | Operation Manager |
Goal
In this workshop we define the processes to aggregate customer master data from child to parent, so it can be used in CPQ.
Workshop materials
Topic | Document | Comment |
|---|---|---|
Customer master data aggregation | Tab ‘Parent_Customer_Master’ -mockup of Parent Customer master Table | |
Main results
Challenge Overview
The central problem discussed is that the customer master table (from SAP/ERP, currently consumed by Price Manager) is defined at a child customer level, while the CPQ tool requires customer information aggregated to a parent customer level for quoting and pricing purposes.
Key Fields Required at Parent Customer Level for CPQ
Parent Customer ID:
Logic: Distinct value ASO_ID_2 (remove duplicates).
Purpose: The primary identifier for the parent customer in CPQ.
Parent Customer Name (Title):
Logic: Max ASO_Name_2 (or any consistent method, as names should typically be the same across children for a parent).
Purpose: Mandatory field in CPQ customer records.
Salesperson ID / Name:
Logic: Select the salesperson associated with the highest cumulative revenue for the parent customer (across all its child customers). This ensures the salesperson representing the most significant volume is assigned to the parent.
Purpose: To populate the salesperson associated with the parent customer in CPQ. The Salesperson ID will be used in CPQ, assuming it links to the list of system users.
Geographical Region ID (e.g., A1, A2, etc.):
Logic:
STEP1: Aggregate volume (or revenue) at the postcode level across all child customers.
STEP 2: Identify the postal code with the highest volume for the parent customer.
STEP 3: From that highest-volume postcode, pick one address (e.g., the address with the highest volume within that postcode, or "the first one").
STEP 4: Use this selected postal code/address to retrieve the "Geographical Region ID" using an existing lookup table (which is already in Zilliant).
Purpose: To define the "center of gravity" for the customer's volume, used for calculating geographically dependent charges (e.g., delivery charges) and for pricing optimization. This should be a custom field in CPQ.
Clarification: This is a geographical reference for pricing purposes, not necessarily the actual delivery address for all children. It will not be directly populated from the sales representative's input, but derived from the aggregated data.
TMA ID / Name (Industry Type / Customer Category):
Logic: Select the TMA ID/Name associated with the highest revenue for the parent customer.
Purpose: To categorize the parent customer for pricing guidance. This will be a custom field in CPQ.
Customer Annual Revenue:
Logic: Sum of the total revenue for all child customers associated with the parent.
Purpose: To represent the overall size/volume of the parent customer. This will be a custom field in CPQ.
Implementation Approach:
Parent Customer Master Table Creation: It was decided that a new, aggregated parent customer master table needs to be created. This table should contain only one row per parent customer with the aggregated fields..
Responsibility for Aggregation: The aggregation logic and the creation of this new parent customer master table should ideally be performed by the Zilliant team. This work will be more complex than simple API calls and may involve a "sequel script" running within a job workflow.
CPQ Consumption: CPQ will then consume this aggregated table via API, rather than directly processing raw child-level customer master data, which would be too complex and unperformant.
Future CRM Integration: The discussion also touched upon the broader context of customer data from future CRM systems (C4C) and ERP (S/4HANA). The aim is to create a solution that is flexible enough to adapt to these changing "bricks" in the overall architecture. The current technical choice of relying on a "steady source" (Zilliant Price Manager for customer data) is seen as a short-term, but not long-term, solution..
Detailed Customer Data Aggregation Logic for Zilliant Price Manager - to share with Zilliant Team
The objective is to create a new, aggregated "Parent Customer Master Table" where each row represents a unique parent customer, and key attributes are derived from their associated child customers using the following logic:
Input Data:
'Child' Customer Master Data: Contains fields like
Customer_ID,Customer_Name,ASO_ID_2,ASO_Name_2,Salesperson_ID,Salesperson_Name,Postal_Code,Address,TMA_ID,TMA_Name,Annual_Revenue(at child level).
Aggregation Logic per Parent Customer:
Parent Customer ID (ASO_ID_2):
Logic: Select the distinct
ASO_ID_2from theCustomer_Master_Data. This will be the primary key of the new aggregated table.
Parent Customer Name (ASO_Name_2):
Logic: Get
ASO_Name_2, for eachASO_ID_2. If multiple names exist under the ID , aMAX()orMIN()aggregation could be applied for consistency.
Salesperson ID:
Logic: For each
ASO_ID_2, identify theSalesperson_IDwhose associatedCustomer_IDs (under this parent) collectively contribute the highest cumulative revenue over the defined historical period.This involves summing
Annual_RevenueperSalesperson_IDwithin eachASO_ID_2group and selecting theSalesperson_IDwith the maximum sum.
Geographical Region ID:
Logic:
For each
ASO_ID_2, sumAnnual_Revenuefor each uniquePostal_Codeacross all its child customers.Identify the
Postal_Codewith the highest cumulative revenue for thatASO_ID_2.Map this highest-revenue
Postal_Codeto its correspondingGeographical_Region_IDusing the existingPostal_CodetoRegion_IDlookup table within Zilliant.This
Geographical_Region_IDwill be the value for the parent customer.
TMA ID / Name (Industry Type / Customer Category):
Logic: For each
ASO_ID_2, identify theTMA_ID/TMA_Nameassociated with theCustomer_IDs (under this parent) that collectively contribute the highest cumulative revenue over the defined historical period.Similar to Salesperson ID, this involves summing
Annual_RevenueperTMA_IDwithin eachASO_ID_2group and selecting theTMA_IDwith the maximum sum.
Customer Annual Revenue:
Logic: Calculate the sum of total revenue (
Annual_Revenue) for all child customers associated with theASO_ID_2.
Output:
A new, flat "Parent Customer Master Table" containing
ASO_ID_2as the primary key, and the derived aggregated fields (Parent Customer Name (ASO_Name_2), Salesperson ID, Geographical Region ID, TMA ID/Name, Customer Annual Revenue).
Process & Maintenance:
This aggregation logic should be implemented as an automated job (e.g., a SQL script or similar data transformation process) within Zilliant Price Manager.
The job should run regularly (e.g., daily or weekly) to ensure the aggregated data remains in sync with new customer additions, updates, and changes in historical volumes.
The output table will be made available for API consumption by the CPQ tool.
Action list
- @a user to write the for this parent customer master table, including the logic for each field, to be shared with the Zilliant team. (Done in the section above)
- Valio Team to discuss this potential implementation with Zilliant.
Decisions
- Parent Customer Master Table Creation: It was decided that a new, aggregated parent customer master table needs to be created. This table should contain only one row per parent customer with the aggregated fields..
- Responsibility for Aggregation: The aggregation logic and the creation of this new parent customer master table should ideally be performed by the Zilliant team. This work will be more complex than simple API calls and may involve a "sequel script" running within a job workflow.
- No Address Fields in CPQ (for aggregation logic): The system should rely solely on the calculated postal code/geographical region ID for pricing rules, without needing to store or use an actual street address for the parent in this context.
List of requirements
Parent Customer Data Consumption: Implement integration to consume a pre-aggregated "Parent Customer Master Table" from an external source (to be provided by Zilliant). Ensure this table contains a single row per parent customer, free of child-level duplication.
Core Parent Customer Fields (for CPQ Quote Population):
Ingest and utilize the Parent Customer ID as the primary identifier in CPQ.
Ingest and utilize the Parent Customer Name (Title) for mandatory customer name fields in CPQ.
Ingest and utilize the Salesperson ID (associated with highest cumulative revenue) to populate the salesperson field in CPQ.
Ingest and utilize the Geographical Region ID (derived from highest volume postcode) to populate a custom field for pricing and charges calculation.
Ingest and utilize the TMA ID/Name (Industry Type/Customer Category, associated with highest revenue) to populate a custom field for customer categorization.
Ingest and utilize the Customer Annual Revenue (sum of total revenue) to populate a custom field representing the parent customer's overall size.
Integration & Data Handling:
Ensure CPQ queries this aggregated table via API for performance, rather than storing a full replica locally.
Design CPQ's customer record to rely on these pre-aggregated fields, avoiding complex child-to-parent aggregation logic within CPQ itself.
Define fields in CPQ as custom attributes as needed for the ingested aggregated customer data.
Support automatic updates to the customer data in CPQ when the aggregated table is refreshed (e.g., when new customer master data is received and aggregated).
Session recording
https://tldv.io/app/meetings/68416adabf460a00135436b3/