1

Tier 1: Foundation

Solve first. Everything downstream depends on these. You cannot fix what you cannot define.

P1
Data Governance & Semantic Trust Deficit
No dependencies (this is the starting point)
DMBOK: Data Governance DCAM: Governance & Control

If “Revenue” means three different things to three departments, every downstream fix inherits the ambiguity. Shared vocabulary, ownership, and quality rules are prerequisite to all other work.

Problem Statement
  • No single source of truth for business terms. “Revenue” in Finance means COGS-excluded; in Operations means total gross billings. Same KPI calculated 5+ ways across the organization.
  • No data ownership. When a data quality issue surfaces in a board report, no one is accountable. “IT owns the data” is the default assumption.
  • Metrics proliferate without control. Each department builds its own aggregations. Report reconciliation consumes analyst hours every month-end.
  • Data quality issues found reactively. Problems discovered in production reports, not caught proactively at ingestion. Cost of fixing defects multiplies 5–10x.
  • No glossary, no taxonomy, no ontology. Business terms undefined or partially defined. No domain classification. No hierarchy of how entities relate semantically.
Root Causes
  • No governance council or stewardship program. Data governance treated as an IT responsibility, not a business function.
  • Business glossary either absent or maintained by a single team without cross-functional review or certification cycles.
  • RACI matrix for data domains not defined. No clear Responsible, Accountable, Consulted, or Informed roles per data entity.
  • Data quality rules not embedded in pipelines. Quality is a post-hoc audit, not a built-in gate.
  • No data literacy program. Consumers don’t understand the difference between master, transactional, and analytical data.
Solutions
  • Establish a Data Governance Council with business domain leads as voting members. CDO chairs; IT supports. Meet biweekly with published minutes and decision log.
  • Build a centralized business glossary with mandatory fields: business name, definition, owning domain, data steward, valid values, related terms, and regulatory classification (PII, SOX, GDPR).
  • Define RACI per data domain (Customer, Product, Sales, Supply Chain, Finance). Assign Data Owners (business) and Data Stewards (operational) for each. Publish in the data catalog.
  • Implement quality gates at ingestion. Every pipeline must check completeness, referential integrity, null rates, and valid value conformance before data reaches the serving layer.
  • Define ontology and taxonomy. Document entity relationships (Product IS-A SKU; Customer HAS-A LoyaltyProfile), domain hierarchies, and classification systems.
  • Introduce certification gates between CDM→LDM and LDM→PDM transitions. No model advances without business sign-off on definitions.
Implementation at ShaDey Inc.
  • Week 1–2: Form the Governance Council. Domain leads from Sales (SD/VBAK owner), Supply Chain (MM/EKKO owner), Finance (FI/BKPF owner), Marketing, and Warehouse (WM/EWM owner). CDO or VP Data chairs. IT provides tooling support only.
  • Week 3–6: Baseline business glossary. Start with the 24 PDM entities already defined on this platform. For each entity (dim_customer, dim_product, fact_sales, etc.), document: business name, definition agreed by Council, owning domain, data steward name, valid values, PII classification. Prioritize terms that appear in executive dashboards: Revenue, Net Sales, Margin, COGS, OTIF, Fill Rate.
  • Week 4–6: Define RACI matrix. For each data domain map: Product master → Merchandising team (Accountable), Supply Chain (Consulted). Customer master → Sales team (Accountable), Marketing (Consulted). Financial postings → Finance (Accountable), IT (Responsible for pipeline). Publish as a governed artifact in the data catalog.
  • Week 5–8: Embed quality gates. For every ECC extraction pipeline, add quality checks: MARA.MATNR null rate < 0.01%, KNA1.KUNNR referential integrity against dim_customer, VBRP.NETWR range validation, BKPF.BUKRS valid company code check. Block pipeline promotion to serving layer if any gate fails.
  • Ongoing: CDM→LDM certification gate. Every new entity request must pass through the glossary: does the business term exist? Is the definition approved? Only then does LDM design begin. Use the existing Governance Scenarios page as the training material for what happens when this gate is skipped.
Data Modeling Resolution
CDM Foundation: Glossary-Backed Entities
Conceptual Data Model (CDM)
├─ Customer    ← glossary term #001
├─ Product     ← glossary term #002
├─ Store       ← glossary term #003
├─ Supplier    ← glossary term #004
├─ Promotion   ← glossary term #005
├─ Sales       ← glossary term #006
├─ Inventory   ← glossary term #007
└─ Return      ← glossary term #008

Rule: No entity enters LDM without
a glossary entry signed by the Council.
How Modeling Resolves This Problem

The CDM is the single source of truth for business semantics. Every entity in the CDM maps 1:1 to a glossary term. Every attribute in the LDM inherits its definition from the glossary. Every column in the PDM carries a glossary_term_id metadata tag. This means:

Naming Convention dim_customer, not tbl_cust or customer_master_v2. The name itself encodes the entity type and business domain.

Certification Gate CDM→LDM transition requires business sign-off. LDM→PDM transition requires steward approval. No physical table is born without a semantic anchor.

Quality by Design Valid values defined in the glossary become CHECK constraints in the PDM. If the glossary says customer_type IN ('B2B','B2C','B2B2C'), the PDM enforces it.

Framework Alignment

DAMA DMBOK

KA 3: Data Governance: Operating model, decision rights, accountability. KA 12: Metadata Management: Business glossary, technical metadata, operational metadata. KA 13: Data Quality: Quality dimensions (completeness, accuracy, consistency, timeliness, validity, uniqueness).

EDM Council DCAM

Component 6: Data Governance: Policy framework, stewardship, issue management. Component 7: Data Control Environment: Lineage, quality measurement, monitoring. Targets: Level 4 (Managed) for governance, Level 3 (Defined) for quality.

Data Modeling Practice

CDM entities must have glossary-backed definitions before LDM design begins. Every attribute in the LDM must map to a glossary term. Naming conventions enforced by governance council: dim_customer, not tbl_cust.

P2
Data Modeling Anti-Patterns & Technical Debt
Depends on: P1 (Governance)
DMBOK: Data Modeling CDM / LDM / PDM

Governance gives you definitions; modeling gives you structure. Missing entities block entire use cases. Wrong grain produces misleading aggregations. Skipping CDM/LDM and jumping to PDM embeds business rules in SQL where no one can find them.

Problem Statement
  • Missing entities block entire use cases. Without dim_promotion at design time, you cannot answer “which promotions drove sales growth?” Without fact_return, reverse logistics analytics must be reverse-engineered from daily snapshots.
  • Wrong grain on fact tables. If fact_sales is at billing document header grain instead of line-item grain, product-level margin analysis is impossible without rebuilding the table.
  • CDM/LDM steps skipped. Teams jump straight to physical tables and embed business rules in transformation SQL. Rules become tribal knowledge locked inside pipelines.
  • No SCD Type 2 where history matters. Customer type changes (B2C → B2B) overwrite the previous value, making historical cohort analysis incorrect.
  • Naming collisions across domains. Three tables called customer in three schemas, each with different definitions, grain, and attributes.
Root Causes
  • No CDM→LDM→PDM progression enforced. Modeling treated as a physical database task, not a business design activity.
  • Data modelers work without business input. Entity definitions based on source system structure, not business semantics.
  • No enterprise data model. Each project creates its own schema in isolation. No reusable subject area models.
  • Temporal requirements not captured at CDM stage. Slowly-changing dimension patterns decided during ETL, not during modeling.
  • Naming conventions absent or unenforced. No standard for dimension prefix (dim_), fact prefix (fact_), or attribute naming (snake_case).
Solutions
  • Mandate CDM→LDM→PDM progression. No physical table created without a corresponding logical entity approved at a Domain Review Gate. CDM must be signed off by business owners before LDM begins.
  • Build an enterprise subject area model covering all major domains: Customer, Product, Sales, Inventory, Supply Chain, Finance. Reuse across projects.
  • Define entity completeness criteria at CDM. For each use case, validate that all required entities exist. “Can we answer the business question with this model?” is the acceptance criterion.
  • Enforce grain documentation. Every fact table’s grain must be explicitly stated in the LDM: “One row per billing line item per delivery date.”
  • Implement SCD Type 2 for all dimensions where historical tracking matters: dim_customer, dim_product, dim_supplier.
  • Publish and enforce naming standards. dim_ for dimensions, fact_ for facts, ref_ for reference, stg_ for staging, dp_ for data products. All attributes in snake_case.
Implementation at ShaDey Inc.
  • Audit the existing 24-entity PDM. Verify that every entity has a CDM ancestor with a glossary-backed definition. Check: does dim_promotion exist? Does fact_return exist? Does dim_date cover fiscal calendar attributes needed for ShaDey’s financial reporting?
  • Verify grain on all fact tables. fact_sales must be at VBRP line-item grain (one row per billing document item), not VBRK header grain. fact_inventory_snapshot must be at product-location-date grain from MARD, not plant-level aggregate.
  • Retrofit SCD Type 2 on three critical dimensions. dim_customer: track customer_type, credit_limit, sales_org changes. dim_product: track material_group, category, status changes. dim_supplier: track vendor_class, payment_terms changes. Add effective_from_ts, effective_to_ts, is_current_flag to each.
  • Establish naming standard enforcement. Add automated linting to the CI pipeline: reject any new entity not prefixed with dim_, fact_, ref_, stg_, dp_, or ml_. Reject any attribute not in snake_case. Document standard in the platform’s Modeling Tutorial page.
  • Publish the enterprise subject area model. Six subject areas: Customer, Product, Sales & Distribution, Supply Chain & Procurement, Manufacturing & Quality, Finance. Each subject area has its own CDM diagram maintained in the Interactive ER Modeler on this platform.
Data Modeling Resolution
CDM → LDM → PDM Progression
CDM (Business-approved)
  Customer, Product, Sales, Inventory...

LDM (3NF, domain-reviewed)
  Customer { id, name, type, region }
  Product  { id, name, category, uom }
  Sales    { customer, product, date, qty, amt }

PDM (Star Schema, implemented)
  dim_customer  ← SCD Type 2
  dim_product   ← SCD Type 2
  dim_date      ← role-playing (order/ship/bill)
  fact_sales    ← grain: 1 row per line item
    └ FK → dim_customer, dim_product, dim_date,
         dim_store, dim_promotion
How Modeling Resolves This Problem

Grain Declaration Every fact table documents its grain in the LDM metadata. fact_sales: “One row per billing line item (VBRP) per fiscal period.” Grain changes require a formal model change request; no silent redefinition.

SCD Type 2 Dimensions that need historical tracking carry effective_from_ts, effective_to_ts, is_current_flag. This is declared at CDM stage (“do we need to track changes to customer type?”), not discovered during ETL.

Conformed Dimensions dim_customer is shared across fact_sales, fact_order, fact_return, and dp_customer_360. One definition, one surrogate key, one SCD policy. Eliminates naming collisions by design.

Entity Completeness Before PDM implementation, validate: “Can we answer every business question in the use-case backlog with these entities?” Missing dim_promotion is caught at CDM review, not after 6 months of production.

Framework Alignment

DAMA DMBOK

KA 5: Data Modeling & Design: Conceptual, logical, physical model progression. Normalization to 3NF in LDM, denormalization with documented justification in PDM. KA 4: Data Architecture: Enterprise data model, subject area models.

EDM Council DCAM

Component 3: Data Architecture: Logical and physical architecture alignment. Models must be traceable to business requirements. Target: Level 3 (Defined) with progression to Level 4 (Managed).

Data Modeling Practice

Kimball star schema for analytical models. Inmon 3NF for enterprise data warehouse. Grain declaration mandatory. Conformed dimensions shared across fact tables. Surrogate keys on all dimensions. Natural keys preserved for lineage.

P3
Master Data Fragmentation
Depends on: P1 (Governance), P2 (Modeling)
DMBOK: Reference & Master Data DCAM: Data Quality

Material master sprawled across 12+ SAP tables (MARA, MARC, MVKE, MARM, MEAN, MBEW, T023). Customer and vendor maintained as separate objects (KNA1 vs LFA1). Every transaction and analytic is only as good as the master data behind it.

Problem Statement
  • Material master inconsistencies. UoM conversion errors in MARM cascade through procurement (wrong order quantities), warehousing (incorrect stock counts), and billing (mispriced invoices).
  • Customer/vendor maintained separately. KNA1 (customer) and LFA1 (vendor) have no cross-reference. A supplier who is also a customer has two unlinked master records, blocking 360-degree relationship views.
  • Duplicate and stale master records. 15% of material master records in MARA have no transactions in 24 months. Duplicate customers from acquisition integrations inflate customer counts by 8–12%.
  • Classification gaps. KLAH/KSML classification incomplete; 30% of products lack category assignment, blocking assortment analytics and recommendation engines.
  • No golden record. Three systems hold customer data (ECC, CRM, e-commerce). No master data management process determines the surviving record.
Root Causes
  • No master data management (MDM) program. Master data created locally per system without cross-system harmonization.
  • No data stewards assigned to master data domains. Material master changes made by procurement without downstream impact assessment.
  • ECC architecture splits master data across 12+ tables by design (MARA, MARC, MVKE, etc.). Integration requires deep SAP knowledge.
  • No match-and-merge process. Acquisitions add new customer/vendor records without deduplication against existing masters.
  • Reference data (UoM codes, country codes, material groups in T023) managed in spreadsheets, not centrally governed code tables.
Solutions
  • Implement an MDM hub (SAP MDG or equivalent) for Customer, Product, Supplier, and Store domains. Define golden record rules: survivorship logic, match thresholds, merge policies.
  • Model conformed dimensions that unify fragmented SAP tables. dim_product consolidates MARA + MAKT + MARC + MVKE + MARM + MBEW. dim_customer consolidates KNA1 + KNB1 + KNVV + KNVP.
  • Assign domain stewards with authority to approve master data changes. Material steward reviews MARA changes; customer steward reviews KNA1/BUT000 changes.
  • Build completeness scorecards. Track % of products with complete classification (KLAH), valid UoM (MARM), and active pricing (KONP). Publish weekly to governance council.
  • Centralize reference data. Move UoM codes, material groups, customer types, and region codes into governed reference tables. Enforce as foreign keys in the PDM.
  • Plan for BUT000 consolidation. In S/4HANA, KNA1 + LFA1 merge into BUT000. Model dim_customer and dim_supplier to support both ECC and S/4 source patterns.
Implementation at ShaDey Inc.
  • Product master consolidation (Sprint 1). Extract from MARA (general), MAKT (descriptions), MARC (plant-level), MVKE (sales org), MARM (UoM conversions), MBEW (valuations), KLAH/KSML (classification). Build a single stg_product staging table that joins all 7 sources on MATNR. Apply deduplication rules: flag materials with zero transactions in 24 months (check against MSEG/MATDOC) for steward review.
  • Customer master consolidation (Sprint 2). Extract from KNA1 (general), KNB1 (company code), KNVV (sales area), KNVP (partner functions), KNKK (credit). Run match-and-merge: fuzzy match on NAME1 + STRAS + ORT01, threshold 85%. Identify 8–12% duplicate rate from prior acquisitions. Submit merge candidates to Customer Data Steward for approval.
  • Reference data governance (Sprint 2). Migrate material groups (T023), UoM codes (T006), customer account groups (T077D), and region codes from spreadsheets to governed ref_* tables in the PDM. Add foreign key constraints: dim_product.material_group_code → ref_material_group.code.
  • Completeness scorecards (Sprint 3). Build automated weekly report: % products with KLAH classification (target: 95%), % materials with valid MARM UoM conversions (target: 99%), % customers with complete address (target: 98%). Dashboard published to Governance Council.
  • BUT000 readiness. Design dim_customer and dim_supplier with a source_system discriminator column. During ECC→S/4 coexistence, the staging layer maps KNA1 and BUT000 into the same target schema. The PDM does not change; only the source adapter changes.
Data Modeling Resolution
Conformed Dimension: dim_product
dim_product (SCD Type 2)
├─ product_sk          INT         [surrogate key]
├─ product_id          VARCHAR(18) [MARA.MATNR]
├─ product_name        VARCHAR     [MAKT.MAKTX]
├─ material_type       VARCHAR     [MARA.MTART]
├─ material_group      VARCHAR     [MARA.MATKL → T023]
├─ category_code       VARCHAR     [KLAH/KSML]
├─ base_uom            VARCHAR     [MARA.MEINS]
├─ sales_uom           VARCHAR     [MVKE.VRKME]
├─ standard_cost       DECIMAL     [MBEW.STPRS]
├─ plant_code          VARCHAR     [MARC.WERKS]
├─ effective_from_ts   TIMESTAMP
├─ effective_to_ts     TIMESTAMP
└─ is_current_flag     BOOLEAN

Sources: 7 SAP tables → 1 dimension
Conformed Dimension: dim_customer
dim_customer (SCD Type 2)
├─ customer_sk         INT         [surrogate key]
├─ customer_id         VARCHAR(10) [KNA1.KUNNR / BUT000.PARTNER]
├─ customer_name       VARCHAR     [KNA1.NAME1 / BUT000.NAME_ORG1]
├─ customer_type       VARCHAR     [B2B / B2C / B2B2C]
├─ city                VARCHAR     [KNA1.ORT01]
├─ region              VARCHAR     [KNA1.REGIO]
├─ sales_org           VARCHAR     [KNVV.VKORG]
├─ credit_limit        DECIMAL     [KNKK.KLIMK]
├─ source_system       VARCHAR     [ECC / S4HANA]
├─ effective_from_ts   TIMESTAMP
├─ effective_to_ts     TIMESTAMP
└─ is_current_flag     BOOLEAN

Sources: KNA1+KNB1+KNVV+KNVP+KNKK (ECC)
         or BUT000+roles (S/4HANA)

The conformed dimension is the modeling solution to master data fragmentation. Instead of 7 scattered SAP tables, a single dim_product with surrogate keys becomes the shared reference across all fact tables. SCD Type 2 preserves history. The source_system discriminator enables dual-source support during migration.

Framework Alignment

DAMA DMBOK

KA 10: Reference & Master Data: Golden record management, match-merge, survivorship. KA 13: Data Quality: Profiling, cleansing, standardization, monitoring.

EDM Council DCAM

Component 5: Data Quality Management: Quality rules on master data, profiling, remediation. Component 3: Data Architecture: Master data integration patterns (hub, registry, coexistence).

Data Modeling Practice

Conformed dimensions are the modeling solution to master data fragmentation. Dimension tables consolidate multiple source tables into one SCD Type 2 entity with surrogate keys. Natural keys preserved for lineage.

P4
Data Lineage & Regulatory Exposure
Depends on: P1 (Governance), P2 (Modeling), P3 (Master Data)
DMBOK: Metadata Mgmt DCAM: Control Environment

Before migrating or building new pipelines, you must know what feeds what. Without lineage, migration is blind surgery. Without regulatory traceability, audits fail.

Problem Statement
  • Cannot trace a reported number to source. When the CFO asks “where does this revenue figure come from?”, the answer takes 3 days of manual investigation across 4 teams.
  • Forward impact analysis impossible. “If we change the MATNR field in MARA, which reports break?” requires tribal knowledge, not a system query.
  • GDPR right-to-deletion gaps. Customer PII from KNA1 propagates into 8+ downstream tables. No automated inventory of where PII lands after extraction.
  • SOX audit trail missing. Financial reconciliation between CO-PA (CE1xxxx) and FI (BSEG) lacks documented lineage. Auditors spend weeks manually verifying data flow.
  • Trade compliance exposure. EIKP/EIPO foreign trade data has no lineage to reporting. Customs declarations cannot be verified against source documents.
Root Causes
  • No metadata management platform or data catalog. Lineage exists only in pipeline code and developer memory.
  • ETL transformations not documented. Business rules embedded in SQL without comments, version control, or mapping specifications.
  • PII classification never performed at the column level. Data classification tags (public, internal, confidential, restricted) not applied.
  • No data contract framework. Producers and consumers have no agreed schema, SLA, or quality guarantees.
Solutions
  • Deploy a data catalog with automated lineage capture. Every pipeline registers its source→transformation→target mapping. Column-level lineage traces each PDM field back to its SAP source column and glossary term.
  • Classify all columns for PII. Tag every column in the PDM with its data classification level. Automate PII detection using pattern matching. Enforce masking rules at the serving layer.
  • Implement data contracts. Every pipeline output has a published contract: schema version, SLA (freshness), quality thresholds (null rate < 0.1%), owner, consumers, and breaking-change policy.
  • Model lineage as a graph. Use Neo4j to store source-to-target lineage. Enables both forward impact and backward root-cause analysis in Cypher.
  • Build regulatory lineage views. For GDPR: “show me everywhere KNA1.NAME1 appears.” For SOX: “trace this P&L line item back to BKPF/BSEG/ACDOCA.”
Implementation at ShaDey Inc.
  • Catalog all 95+ ECC source tables. Register every SAP extraction in the data catalog with metadata: table name, module (MM/SD/FI/PP/QM/WM), extraction frequency, row volume, known data quality issues. Use the SAP ECC Source Tables page on this platform as the starting inventory.
  • Build column-level lineage for all 24 PDM entities. For each column, document: source_system (ECC/S4), source_table (e.g., KNA1), source_column (e.g., NAME1), transformation_rule (e.g., “TRIM + UPPER”). Use the ECC-to-PDM and S/4HANA-to-PDM mapping pages as the source-to-target specification.
  • Deploy Neo4j lineage graph. Load all 95+ source tables, all transformations, all 24 PDM entities, and all downstream reports as graph nodes. Relationships: (:SourceTable)-[:EXTRACTS]→(:Column)-[:TRANSFORMS_INTO]→(:PDMColumn)-[:FEEDS]→(:Report). Use the graph-database.html data lineage use case as the design pattern.
  • PII classification sprint. Tag all columns across the 24 PDM entities: dim_customer.customer_name = CONFIDENTIAL/PII, dim_customer.customer_id = INTERNAL, fact_sales.net_amount = INTERNAL. Build a GDPR deletion view: “Given customer_id X, show all tables and columns where this customer’s data exists.”
  • SOX lineage trace. Document the full path: BKPF/BSEG (ECC) or ACDOCA (S/4) → stg_financial_posting → fact_sales (net_amount, tax_amount) → dp_netsales → P&L dashboard. Auditors can traverse this path in the catalog without contacting IT.
Data Modeling Resolution
Lineage Graph Model (Neo4j)
Graph Schema
(:SourceTable {name, module, system})
  -[:HAS_COLUMN]→
(:SourceColumn {name, datatype, pii_flag})
  -[:TRANSFORMS_INTO {rule, owner}]→
(:PDMColumn {name, entity, glossary_term_id})
  -[:BELONGS_TO]→
(:PDMEntity {name, grain, scd_type})
  -[:FEEDS]→
(:Report {name, owner, certification})

Cypher: Forward impact
MATCH (s:SourceColumn {name:"MATNR"})
      -[:TRANSFORMS_INTO*]→(r:Report)
RETURN r.name, r.owner
PDM Metadata Columns for Lineage
Every PDM column carries:
├─ source_system       [ECC / S4HANA / CRM]
├─ source_table        [e.g., KNA1]
├─ source_column       [e.g., NAME1]
├─ transformation_rule  [e.g., TRIM+UPPER]
├─ pii_classification  [PUBLIC/INTERNAL/
│                      CONFIDENTIAL/RESTRICTED]
├─ glossary_term_id    [links to CDM]
└─ data_contract_id    [links to SLA/schema]

This metadata IS the lineage backbone.
No visualization tool can replace it.

Data modeling resolves lineage by embedding traceability into the model itself. Every PDM column carries metadata attributes that link it back to its source. The Neo4j graph makes this traversable. Together, they make “where does this number come from?” a 5-second query, not a 3-day investigation.

Framework Alignment

DAMA DMBOK

KA 12: Metadata Management: Active metadata, lineage, data catalogs. KA 7: Data Security: PII classification, access control, encryption. KA 8: Data Integration: Documented transformation logic, data contracts.

EDM Council DCAM

Component 7: Data Control Environment: Lineage documentation, quality measurement, regulatory reporting. Component 4: Technology Architecture: Catalog and lineage tooling.

Data Modeling Practice

Every PDM column should carry metadata attributes: source_system, source_table, source_column, transformation_rule, pii_flag. This is the column-level lineage backbone.

2

Tier 2: Platform

Structural changes that enable operational fixes. Requires the foundation layer to be in place.

P5
ECC to S/4HANA Migration Risk
Depends on: P1–P4 (full foundation layer)
DMBOK: Data Architecture DCAM: Technology Arch

Nine major structural changes hitting simultaneously: BUT000 consolidation, MATDOC denormalization, EWM replacement, Material Ledger mandatory, MRP Live, ACDOCA Universal Journal, PRCD_ELEMENTS, UKM credit engine, LIS elimination. Each breaks existing queries, reports, and interfaces.

Problem Statement
  • Customer/Vendor merge breaks downstream. KNA1 + LFA1 → BUT000 (Business Partner). Role assignments differ from legacy master maintenance. Customer-vendor cross-references lost if migration not mapped correctly.
  • Material document redesign. MKPF (header) + MSEG (items) → MATDOC (single denormalized table). Every goods movement query must be rewritten.
  • Warehouse management replacement. Classic WM (LQUA/LAGP) fully removed. Embedded EWM (/SCWM/*) has different bin structure, putaway logic, and wave management.
  • Financial consolidation into ACDOCA. BSEG, CE1xxxx/CE2xxxx, and ~50 index tables collapse into the Universal Journal. Custom CO-PA dimensions may not migrate automatically.
  • MRP engine parallelization. Classic MD01/MD02 is deterministic and sequential. MRP Live runs in parallel on HANA. Results may differ in timing and sequence.
Root Causes
  • SAP S/4HANA is an architecture rewrite, not an upgrade. Nine table-level structural changes require rethinking extraction, transformation, and consumption patterns.
  • No impact analysis tooling. Without lineage (P4), teams cannot identify which reports, interfaces, and pipelines break per structural change.
  • Custom ABAP code references deprecated tables. Code remediation scope unknown without automated scanning.
  • Hybrid coexistence period (ECC + S/4) requires dual-source extraction pipelines. PDM must abstract over both sources.
Solutions
  • Model PDM entities to abstract over both ECC and S/4HANA sources. dim_customer accepts data from KNA1 (ECC) or BUT000 (S/4) via an adapter pattern. The PDM schema does not change; the source mapping changes.
  • Build a migration impact matrix. For each of the 9 structural changes, document: affected PDM entities, affected pipelines, affected reports, custom code references, and remediation owner.
  • Use lineage graph (P4) for impact analysis. Traverse the graph to find every downstream consumer of a deprecated table.
  • Implement dual-source pipelines during coexistence. Each pipeline has an ECC adapter and an S/4 adapter. A configuration flag switches the active source per entity.
  • Design ACDOCA consumption patterns. Replace CO-PA + FI + ML separate extractions with a single ACDOCA extraction.
Implementation at ShaDey Inc.
  • Migration Impact Matrix (Week 1–3). For each of the 9 changes, map to ShaDey’s PDM: (1) BUT000 → affects dim_customer, dim_supplier; (2) MATDOC → affects fact_inventory_snapshot, all goods movement analytics; (3) ACDOCA → affects fact_sales, all financial analytics; (4) Embedded EWM → affects dim_warehouse_location; (5) PRCD_ELEMENTS → affects dim_promotion pricing logic; (6) UKM → affects dim_customer credit attributes; (7) MRP Live → affects demand planning feeds; (8) Material Ledger → affects dim_product valuation; (9) LIS removal → affects all pre-aggregated operational reports.
  • Dual-source adapter layer (Week 3–8). Build stg_customer_ecc (from KNA1+KNB1+KNVV) and stg_customer_s4 (from BUT000+BP roles). Both feed the same dim_customer target through a unified transformation. Configuration flag active_source = 'ECC'|'S4' per entity. Same pattern for stg_material_movement_ecc (MKPF+MSEG) and stg_material_movement_s4 (MATDOC).
  • ACDOCA consumption redesign (Week 4–8). Replace separate extractions from BSEG + CE1xxxx + COEP with a single ACDOCA extraction. Map custom CO-PA dimensions to ACDOCA fields or CDS view annotations. Rebuild fact_sales financial attributes from ACDOCA.RACCT, ACDOCA.RCNTR, ACDOCA.HSL.
  • Custom code remediation scan. Identify all custom ABAP programs referencing deprecated tables (MSEG, MKPF, BSEG, KONV, LQUA, LAGP). Classify each as: migrate, retire, or rewrite. Use lineage graph from P4 to identify downstream report impact per custom program.
  • Parallel run validation (Week 8–12). During cutover, run both ECC and S/4 adapters simultaneously. Compare PDM outputs row-for-row. Variance > 0.01% triggers investigation before S/4 adapter goes live.
Data Modeling Resolution
Source-Agnostic PDM Architecture
Staging Layer (source-specific)
  stg_customer_ecc     ← KNA1+KNB1+KNVV
  stg_customer_s4      ← BUT000+BP roles
       │                     │
       └────── UNION ──────┐
                  │
PDM Layer (source-agnostic)
  dim_customer (unchanged schema)
    ├─ customer_sk
    ├─ customer_id
    ├─ customer_name
    ├─ source_system  [ECC / S4HANA]
    └─ ...all other attributes

Key insight: PDM schema is STABLE.
Source changes are absorbed by staging.
Star schema consumers see no change.
How Modeling Resolves Migration Risk

Adapter Pattern The staging layer absorbs all 9 structural changes. stg_*_ecc and stg_*_s4 tables are the only place where source-specific logic exists. The PDM star schema remains stable across the entire migration.

Schema Stability fact_sales consumers query dim_customer.customer_name regardless of whether it came from KNA1.NAME1 or BUT000.NAME_ORG1. The join key is customer_sk (surrogate), not the source natural key.

Dual-Source Coexistence During migration, both adapters run in parallel. source_system column in every dimension enables filtering and reconciliation. Variance detection built into the pipeline.

This is the primary value of the CDM→LDM→PDM progression: physical tables represent business entities, not source system structures. Source systems can be swapped without reshaping the analytical layer.

Framework Alignment

DAMA DMBOK

KA 4: Data Architecture: Technology migration planning, integration architecture. KA 8: Data Integration & Interoperability: ETL redesign, API adapter patterns, coexistence strategies.

EDM Council DCAM

Component 4: Technology Architecture: Platform migration planning, dual-stack support. Component 3: Data Architecture: Logical model must be stable across technology changes.

Data Modeling Practice

The PDM should be source-agnostic. Adapter/staging layer absorbs source changes; the star schema remains stable. This is the primary value of the CDM→LDM→PDM progression.

P6
Analytics & Reporting Fragmentation
Depends on: P5 (Migration), P1 (Governance)
DMBOK: DW & BI DCAM: Data Quality

CO-PA tells one story, FI tells another, LIS S-tables tell a third. Each department builds its own aggregations. S/4HANA merges everything into ACDOCA, but existing BI extracts all break.

Problem Statement
  • Reports don’t reconcile. Finance reports from BSEG/BKPF differ from CO-PA reports from CE1xxxx by 3–5% every quarter due to different posting logic, timing, and currency conversion.
  • Pre-aggregated LIS S-tables eliminated in S/4HANA. Teams dependent on S001 and other S-tables for operational reporting must rebuild on CDS views.
  • Each department owns its own BI stack. Finance uses SAP BW, Marketing uses a separate analytics platform, Supply Chain uses spreadsheets. No shared semantic layer.
  • Metric definitions vary by report. “Net Sales” calculated differently in 4 dashboards. No single published metric catalog tied to the data model.
Root Causes
  • No shared semantic layer or metrics store. Metrics defined per report, not per data model.
  • ECC architecture separates FI and CO-PA into different table families with different update logic.
  • LIS S-tables were pre-aggregated shortcuts that masked the need for a proper analytical model.
  • No governance over report creation. Anyone can build a dashboard without verifying metric alignment.
Solutions
  • Build a shared metrics layer on top of the PDM. Define each metric once in a metrics catalog, tied to specific fact/dimension columns.
  • Design data products as governed, reusable analytical datasets: dp_netsales, dp_salesdaily, dp_promoeff. Each has a published schema, owner, SLA, and quality contract.
  • Migrate from LIS S-tables to ACDOCA + CDS views. Map each S-table to its ACDOCA equivalent. Build CDS view consumption patterns that replace pre-aggregation.
  • Implement report certification. Every dashboard must reference metrics from the metrics catalog. Uncertified reports flagged and retired on a published schedule.
Implementation at ShaDey Inc.
  • Metrics catalog (Sprint 1). Define the top 25 business metrics with exact formulas tied to PDM columns: net_sales = fact_sales.gross_amount - fact_sales.discount_amount - fact_sales.return_amount, gross_margin = (net_sales - fact_sales.cogs_amount) / net_sales, OTIF = COUNT(on_time AND in_full) / COUNT(total_deliveries). Each metric owned by a business domain lead from the Governance Council (P1).
  • Data product layer (Sprint 2–3). Build three priority data products: dp_netsales (daily net sales at product-store grain, SLA: available by 6AM), dp_salesdaily (daily sales summary at store grain with YoY comparison), dp_promoeff (promotion effectiveness at product-store-promo-week grain). Each has a published schema, version, owner, and data contract.
  • LIS S-table migration mapping (Sprint 2). Inventory: which S-tables does ShaDey use? Map each to its ACDOCA/CDS equivalent. S001 (customer sales stats) → CDS view on ACDOCA filtered by RACCT + RCNTR. S011 (purchasing stats) → CDS view on EKBE. S031 (inventory stats) → CDS view on MATDOC.
  • Report certification program (Sprint 3). Inventory all existing dashboards across Finance, Marketing, Supply Chain. For each: verify metric formulas match the metrics catalog. Certified reports get a “Governed” badge. Uncertified reports get a 90-day retirement deadline. Target: 80% certification in 6 months.
  • Shared semantic layer deployment. Deploy a metrics layer tool (dbt metrics, Cube, or equivalent) that reads from the PDM star schema and exposes governed metrics to all BI tools. Every dashboard must query the semantic layer, not raw PDM tables.
Data Modeling Resolution
Data Product Layer in the PDM
Star Schema (Foundation)
  fact_sales × dim_customer × dim_product
  × dim_store × dim_date × dim_promotion

Data Product Layer (Governed Aggregates)
  dp_netsales
    ├─ date_key           [FK → dim_date]
    ├─ product_sk         [FK → dim_product]
    ├─ store_sk           [FK → dim_store]
    ├─ gross_amount       [SUM(fact_sales)]
    ├─ discount_amount    [SUM conditions]
    ├─ return_amount      [SUM(fact_return)]
    └─ net_sales          [calculated]

  Grain: product × store × day
  SLA: refreshed daily by 6:00 AM
  Owner: Finance domain lead
How Modeling Resolves Fragmentation

Single Source of Metrics Data products are first-class PDM entities, not ad-hoc views. dp_netsales is modeled with its own grain, attributes, source lineage, and refresh cadence. Every dashboard that shows “Net Sales” queries this entity.

Aggregate Fact Tables Data products are modeled as aggregate facts derived from the star schema. They pre-compute common metrics so dashboards don’t need complex joins. But unlike LIS S-tables, they are governed, versioned, and have published contracts.

ACDOCA Integration The fact_sales entity is redesigned to source from ACDOCA (single table) instead of BSEG + CE1xxxx separately. This eliminates the 3–5% reconciliation gap at the model level: one source table, one extraction, one truth.

Framework Alignment

DAMA DMBOK

KA 11: DW & Business Intelligence: Dimensional modeling for analytics, semantic layers, metrics catalogs. KA 3: Data Governance: Report certification, metric ownership.

EDM Council DCAM

Component 5: Data Quality Management: Cross-source reconciliation rules. Component 1: Data Management Strategy: Single semantic layer as strategic goal.

Data Modeling Practice

Data products are modeled as aggregate fact tables derived from the star schema. They are first-class PDM entities with documented grain, source lineage, and refresh cadence.

3

Tier 3: Operational

Business process optimization. Needs a clean, governed, migrated platform underneath.

P7
Demand Sensing & Forecast Accuracy
Depends on: P6 (Analytics), P3 (Master Data)
DMBOK: DW & BI Fact Tables / ML Features

Demand forecasts consistently miss by 20–30%. Classic MRP (MD01/MD02) uses manual tuning. IBP and DDMRP offer ML-driven alternatives, but only if historical demand data is trustworthy and planning parameters in MARC are correct.

Problem Statement
  • Fragmented demand signals. POS data, e-commerce orders, and wholesale orders flow through different channels with different latencies. No consolidated demand signal at product-location-day grain.
  • MRP parameters stale. Safety stock levels, reorder points, and lot sizes in MARC set during go-live and never recalibrated. Planning file (MDVM) not maintained.
  • S&OP disconnected from execution. Demand plans in PLSC/IBP don’t flow into MRP execution. Manual adjustments override system-generated planned orders (PLAF).
  • No ML feature store for demand. Historical sales patterns, seasonality, promotion lift, and weather correlation not available as reusable ML features.
Root Causes
  • No unified demand fact table at the right grain. Sales data (VBRK/VBRP) and order data (VBAK/VBAP) not joined with POS data.
  • Planning parameters treated as static configuration, not data-driven outputs that should be recalculated.
  • APO/IBP planned in a separate system; results not integrated back into operational execution.
Solutions
  • Build fact_demand_signal at product-location-day grain, combining POS, e-commerce, and wholesale channels.
  • Create dp_demand_forecast as a governed data product: historical demand + seasonality indices + promotion calendar + weather features.
  • Build ML feature store (ml_feature_store) sourced from the PDM. Features: rolling 7/30/90-day sales velocity, promotion lift coefficients, stockout frequency, price elasticity.
  • Automate MRP parameter tuning. Feed demand forecast outputs back into MARC safety stock and reorder point fields via a closed-loop pipeline.
Implementation at ShaDey Inc.
  • Build fact_demand_signal (Sprint 1). Source from three channels: (1) VBRP billing items for wholesale (grain: material + plant + billing date), (2) POS transaction feed for retail stores (grain: material + store + transaction date), (3) e-commerce order API for online (grain: material + ship-to + order date). Unify into product-location-day grain using dim_product.product_sk and dim_store.store_sk as conformed keys.
  • Build dp_demand_forecast (Sprint 2). Join fact_demand_signal (12 months history) with: dim_date seasonality flags, dim_promotion active promo calendar, external weather API data. Publish as a data product with daily refresh SLA. Grain: product × location × day × forecast_horizon (7d, 30d, 90d).
  • ML feature store (Sprint 3). Compute features from the PDM: rolling_7d_velocity (AVG qty from fact_demand_signal last 7 days), promo_lift_coefficient (ratio of promo vs. baseline sales from dp_promoeff), stockout_frequency_30d (COUNT days where fact_inventory_snapshot.qty_available = 0), price_elasticity (regression on price changes vs. demand changes). Store in ml_feature_store entity with feature versioning.
  • MRP parameter feedback loop (Sprint 4). Use dp_demand_forecast 90-day horizon to recalculate: safety stock = Z-score × σ(demand) × √(lead_time). Write recalculated values back to MARC.EISBE (safety stock) and MARC.MINBE (reorder point) via RFC or S/4 API. MRP Live on HANA re-plans automatically. Target: reduce forecast MAPE from 25% to <15%.
Data Modeling Resolution
fact_demand_signal + ML Feature Store
fact_demand_signal (transactional fact)
  Grain: product × location × day
  ├─ demand_signal_sk    [surrogate key]
  ├─ product_sk          [FK → dim_product]
  ├─ store_sk            [FK → dim_store]
  ├─ date_key            [FK → dim_date]
  ├─ channel             [POS/ECOM/WHOLESALE]
  ├─ demand_qty          [units demanded]
  └─ demand_amount       [value demanded]

ml_feature_store (derived entity)
  ├─ product_sk
  ├─ store_sk
  ├─ feature_date
  ├─ rolling_7d_velocity
  ├─ rolling_30d_velocity
  ├─ promo_lift_coeff
  ├─ stockout_freq_30d
  └─ feature_version     [v1, v2, ...]
How Modeling Resolves Demand Blindness

Atomic Grain fact_demand_signal at product-location-day grain captures demand from all channels in one place. This is the single input for both statistical forecasting and ML models; no more fragmented signals.

Conformed Keys Demand signals from POS, e-commerce, and wholesale all join to the same dim_product and dim_store via surrogate keys. Channel-specific attributes are measures in the fact, not separate tables.

Feature Store as PDM Entity ML features are derived attributes modeled in their own entity with versioning. They are computed from the star schema (not raw source data), making them governed, reproducible, and auditable. Feature engineering is a modeling activity, not a notebook hack.

Closed-Loop Design The PDM enables a feedback loop: fact_demand_signal → ml_feature_store → dp_demand_forecast → MARC parameters → better inventory → better demand fulfillment. The model architecture makes this loop possible.

Framework Alignment

DAMA DMBOK

KA 11: DW & BI: Fact table design at the correct grain. KA 14: Big Data & Data Science: Feature engineering, ML model management, feature stores as governed assets.

EDM Council DCAM

Component 3: Data Architecture: Demand signal integration across channels. Component 5: Data Quality: Historical data completeness for training ML models.

Data Modeling Practice

Demand fact at atomic grain (product-location-day). ML features modeled as derived attributes in the data product layer. Feature store is a separate PDM entity with its own refresh cadence.

P8
Production Planning & Quality Blind Spots
Depends on: P7 (Demand), P3 (Master Data)
DMBOK: Data IntegrationProcess Fact Tables

Manufacturing variance between planned and actual is hard to trace. BOM accuracy issues across MAST/STKO/STPO. Batch recall requires manual traversal of MCH1 → MCHA → QALS → LIPS.

Problem Statement
  • Planned vs. actual variance invisible. AFKO/AFVC (planned operations) vs. COBK/COEP (actual cost postings) not joined for variance analysis at operation level.
  • BOM accuracy unknown. MAST/STKO/STPO BOMs not version-controlled in analytics. When a BOM changes mid-production, costing shifts without trace.
  • Batch recall takes days. Tracing a defective batch from MCH1 through MCHA to QALS to LIPS requires manual SQL across 4+ tables.
  • Capacity planning disconnected. CRHD/KAKO work center capacity not linked to actual production throughput.
Root Causes
  • No production analytics fact table. PP module data (AUFK, AFKO, AFVC) not modeled in the PDM.
  • Quality data (QM module) treated as operational, never integrated into the analytical layer.
  • BOM versioning exists in SAP but not captured in the warehouse with effective dating.
Solutions
  • Model fact_production_order at production order + operation grain. Join AUFK → AFKO → AFVC → COBK/COEP. Calculate variance per operation.
  • Model batch lineage in Neo4j. Batch → Production Order → Product → Delivery → Customer. Batch recall becomes a single graph traversal.
  • Version BOMs with SCD Type 2. dim_bom with effective_from_ts / effective_to_ts.
  • Build quality scorecards from QALS/QASR/QAVE, feeding dp_quality_metrics.
Implementation at ShaDey Inc.
  • Build fact_production_order (Sprint 1). Extract AUFK (order header: order number, order type, material, plant), AFKO (order operations header: planned start/finish, actual start/finish), AFVC (operations: work center, setup time, run time), COBK/COEP (actual costs: cost element, amount). Join on AUFNR. Grain: one row per production order × operation. Calculate variance: planned_cost - actual_cost, planned_hours - actual_hours.
  • Build dim_bom with SCD Type 2 (Sprint 2). Extract MAST (BOM header link), STKO (BOM header: usage, status, valid-from), STPO (BOM items: component material, quantity, UoM). Track BOM versions with effective_from_ts / effective_to_ts. Production orders reference the BOM version active at order creation via dim_bom.bom_sk.
  • Deploy batch lineage graph in Neo4j (Sprint 2). Load: MCH1 (batch master) as (:Batch), MCHA (plant assignment) as relationship, QALS (inspection lot) as (:InspectionLot), LIPS (delivery items) as (:DeliveryItem), KNA1/BUT000 as (:Customer). Graph: (:Batch)-[:USED_IN]→(:ProductionOrder)-[:PRODUCED]→(:Product)-[:DELIVERED_VIA]→(:Delivery)-[:SHIPPED_TO]→(:Customer). Batch recall: single Cypher query returns all affected customers in seconds.
  • Build dp_quality_metrics (Sprint 3). Extract QALS (inspection lot header), QASR (inspection results), QAVE (usage decisions). Compute: inspection pass rate by product, defect category Pareto (top 5 defect types), supplier quality score (correlation between LFA1/BUT000 supplier and defect rates). Publish weekly to quality and procurement teams.
Data Modeling Resolution
fact_production_order + dim_bom
fact_production_order (process fact)
  Grain: production order × operation
  ├─ prod_order_sk       [surrogate key]
  ├─ order_number        [AUFK.AUFNR]
  ├─ product_sk          [FK → dim_product]
  ├─ bom_sk              [FK → dim_bom (versioned)]
  ├─ work_center_sk      [FK → dim_work_center]
  ├─ planned_start_date  [AFKO]
  ├─ actual_start_date   [AFKO]
  ├─ planned_cost        [AFVC planned]
  ├─ actual_cost         [COBK/COEP actual]
  └─ variance_amount     [calculated]

dim_bom (SCD Type 2)
  ├─ bom_sk, bom_id, material_sk
  ├─ component_list (JSON or child table)
  ├─ effective_from_ts, effective_to_ts
  └─ is_current_flag
How Modeling Resolves Production Blindness

Operation-Level Grain fact_production_order at operation grain (not order-header grain) enables variance analysis per manufacturing step. “Which operation caused the cost overrun?” becomes a simple WHERE clause.

Versioned BOM dim_bom with SCD Type 2 links each production order to the BOM version active at creation time. When a BOM changes mid-quarter, old orders reference old BOM, new orders reference new BOM. Costing accuracy preserved.

Graph for Multi-Hop Traversal Batch recall is inherently a multi-hop problem: batch → production order → product → delivery → customer. Neo4j traverses this in milliseconds. The star schema handles aggregation (“total defect cost this quarter”); the graph handles traversal (“who received batch X?”).

Framework Alignment

DAMA DMBOK

KA 8: Data Integration: Cross-module integration (PP + QM + MM). KA 5: Data Modeling: Process-centric fact tables with operation-level grain.

EDM Council DCAM

Component 3: Data Architecture: Operational data integration into analytical platform. Cross-domain entity relationships.

Data Modeling Practice

Production fact at operation grain. BOM as a versioned dimension (SCD2). Batch lineage modeled as a graph for multi-hop traversal. Quality metrics as a data product.

P9
Inventory Imbalance & Warehouse Inefficiency
Depends on: P8 (Production), P5 (Migration / EWM)
DMBOK: Data StorageSnapshot Facts

Simultaneous overstock in one location, stockouts in another. Physical inventory discrepancies (IKPF/ISEG vs. MARD). Classic WM (LQUA/LAGP) fully removed in S/4HANA, replaced by Embedded EWM.

Problem Statement
  • No real-time inventory visibility across locations. MARD (storage location stock) queried per plant. No aggregated view of network-wide stock position.
  • Physical inventory discrepancies unresolved. IKPF/ISEG show 4–6% variance from book stock in MARD. Root causes not analyzed.
  • Consignment stock poorly tracked. MKOL stock at customer locations not included in available-to-promise calculations.
  • Embedded EWM migration gap. Classic WM bin strategies (LQUA/LAGP) don’t map cleanly to /SCWM/* structures.
Root Causes
  • fact_inventory_snapshot not refreshed frequently enough. Daily snapshots miss intraday stock movements.
  • Physical inventory processes not integrated into the analytical layer. IKPF/ISEG data stays in SAP.
  • Consignment stock modeled differently from owned stock in SAP. No unified inventory dimension.
Solutions
  • Redesign fact_inventory_snapshot at product-location-batch grain with multiple daily snapshots or near-real-time via MATDOC CDC.
  • Build dp_inventory_position data product: owned + consignment + in-transit + reserved stock.
  • Model physical inventory as a process fact. fact_physical_inventory capturing IKPF/ISEG with variance analysis.
  • Abstract warehouse model over WM and EWM. dim_warehouse_location mapping both LAGP and /SCWM/LAGP.
Implementation at ShaDey Inc.
  • Redesign fact_inventory_snapshot (Sprint 1). Current grain is product-plant-day from MARD. New grain: product-storage_location-batch-date. Source: MARD (unrestricted stock), MCHB (batch stock), MKOL (consignment), MSKA (sales order stock). Capture multiple snapshots per day: 6AM (opening), 12PM (midday), 6PM (closing). In S/4HANA, switch to CDC on MATDOC for near-real-time updates.
  • Build dp_inventory_position (Sprint 2). Aggregate across all stock types: owned_qty (MARD), consignment_qty (MKOL), in_transit_qty (LIPS items not yet received), reserved_qty (MSKA). Single metric: available_to_promise = owned_qty - reserved_qty + in_transit_qty. Published as a data product with hourly refresh SLA during business hours.
  • Build fact_physical_inventory (Sprint 2). Extract IKPF (PI document header) + ISEG (PI document items). Calculate: book_qty (from MARD at count date), counted_qty (from ISEG), variance_qty, variance_pct, adjustment_reason_code. Enable root-cause analysis: “which storage locations have the highest variance?”, “which product categories are most undercounted?”
  • Build dim_warehouse_location (Sprint 3). During ECC-to-S/4 coexistence, map both schemas: LAGP (classic WM: warehouse, storage type, storage bin) and /SCWM/LAGP (EWM: warehouse, storage type, bin, activity area). Unified hierarchy: warehouse → zone → aisle → bin. source_system discriminator supports dual-source.
Data Modeling Resolution
Periodic Snapshot Fact Pattern
fact_inventory_snapshot (periodic snapshot)
  Grain: product × location × batch × date
  ├─ snapshot_sk         [surrogate key]
  ├─ product_sk          [FK → dim_product]
  ├─ store_sk            [FK → dim_store]
  ├─ warehouse_sk        [FK → dim_warehouse_location]
  ├─ batch_id            [MCH1 batch number]
  ├─ date_key            [FK → dim_date]
  ├─ snapshot_time       [06:00/12:00/18:00]
  ├─ owned_qty           [MARD unrestricted]
  ├─ consignment_qty     [MKOL]
  ├─ in_transit_qty      [LIPS pending]
  ├─ reserved_qty        [MSKA]
  └─ available_to_promise [calculated]
How Modeling Resolves Inventory Blindness

Periodic Snapshot Kimball’s periodic snapshot pattern captures stock levels at regular intervals. Multiple stock types (owned, consignment, transit, reserved) modeled as measures in one fact, not separate tables. This unifies ShaDey’s fragmented stock views.

Batch-Level Grain Adding batch_id to the grain enables batch-level traceability. “Where is batch X right now?” becomes a fact table query, not a multi-table SAP investigation.

dim_warehouse_location A single warehouse dimension abstracts over both WM (LAGP) and EWM (/SCWM/LAGP). The same star schema works before, during, and after the EWM migration. Bin structure changes are absorbed in the dimension, not in every query.

Near-Real-Time In S/4HANA, MATDOC CDC enables the accumulating snapshot variant: instead of periodic captures, update the snapshot on every goods movement. The model supports both patterns without schema change.

Framework Alignment

DAMA DMBOK

KA 6: Data Storage & Operations: Snapshot pattern design, CDC for near-real-time. KA 5: Data Modeling: Periodic snapshot vs. accumulating snapshot fact patterns.

EDM Council DCAM

Component 3: Data Architecture: Multi-source inventory integration. Component 4: Technology Architecture: CDC infrastructure for MATDOC streaming.

Data Modeling Practice

Inventory is a periodic snapshot fact. Grain = product × location × date. Multiple stock types as measures. Near-real-time requires accumulating snapshot pattern.

P10
Supply Chain Visibility & Resilience
Depends on: P9 (Inventory), P3 (Master Data)
DMBOK: Data IntegrationGraph Modeling

Can’t answer “if this supplier fails, who gets hurt?” without joining 4–5 tables. Single-source supplier risk invisible until disruption hits. Multi-tier visibility stops at tier-1.

Problem Statement
  • Supplier disruption blast radius unknown. When a key supplier fails a quality audit, determining affected products → stores → open orders → customers takes hours.
  • Single-source dependencies hidden. 12% of products sourced from a single supplier (EORD has one entry). No systematic risk scoring.
  • No multi-tier visibility. ShaDey knows tier-1 suppliers but not tier-2+. Sub-tier disruptions cascade without warning.
  • Shipment tracking gaps. LIKP/LIPS and VTTK/VTTP not joined for OTIF measurement.
Root Causes
  • Multi-hop supply chain questions are inherently graph problems. Star schema requires N joins for N hops.
  • EORD, EKKO/EKPO, and LIKP/LIPS are in different SAP modules with no pre-built cross-module analytics.
  • Tier-2+ supplier data not available in ECC/S4; requires external data integration.
Solutions
  • Model supply chain as a Neo4j graph. Supplier disruption impact becomes a single Cypher traversal.
  • Build supplier risk scoring in dp_supplier_risk: single-source flag, quality audit history, delivery reliability, geographic concentration.
  • Build fact_shipment at delivery-item grain for OTIF measurement.
  • Integrate tier-2 supplier data from external sources. Model as additional graph nodes.
Implementation at ShaDey Inc.
  • Build supply chain graph in Neo4j (Sprint 1). Load nodes from ShaDey’s SAP: (:Supplier) from LFA1/BUT000, (:Product) from MARA, (:Plant) from T001W, (:Store) from T001W (retail). Relationships: (:Supplier)-[:SUPPLIES {source_list: EORD}]→(:Product), (:Product)-[:STOCKED_AT]→(:Store), (:Customer)-[:ORDERED]→(:Product). Index: single-source flag = products where COUNT(DISTINCT supplier) = 1.
  • Build dp_supplier_risk (Sprint 2). Compute per supplier: single_source_product_count (from EORD), avg_quality_score (from dp_quality_metrics P8), delivery_OTIF_rate (from fact_shipment), geographic_concentration (% of suppliers in same country/region), financial_risk_score (from external data). Composite risk score: weighted average. Flag suppliers scoring > 7/10 for Governance Council review.
  • Build fact_shipment (Sprint 2). Join LIKP (delivery header: delivery date, ship-to party) + LIPS (delivery items: material, quantity, batch) + VTTK (shipment header: carrier, planned arrival) + VTTP (shipment items). Grain: one row per delivery item. Metrics: planned_delivery_date, actual_delivery_date, on_time_flag, in_full_flag, OTIF_flag. Target: network-wide OTIF visibility.
  • Tier-2 supplier integration (Sprint 3). Onboard external supplier data from SAP Business Network or Dun & Bradstreet. Model as: (:Tier2Supplier)-[:SUPPLIES]→(:Tier1Supplier). Disruption impact query: MATCH (t2:Tier2Supplier {country:"CN"})-[:SUPPLIES*1..3]→(p:Product) RETURN p.name, COUNT(t2). Enables “what if China shuts down?” scenario analysis.
Data Modeling Resolution
Dual-Paradigm: Star Schema + Graph
Star Schema (for aggregation)
  fact_shipment
    Grain: delivery item
    ├─ supplier_sk   [FK → dim_supplier]
    ├─ product_sk    [FK → dim_product]
    ├─ store_sk      [FK → dim_store]
    ├─ date_key      [FK → dim_date]
    ├─ planned_date, actual_date
    └─ otif_flag

Graph (for traversal)
  (:Tier2Supplier)-[:SUPPLIES]→
  (:Tier1Supplier)-[:SUPPLIES]→
  (:Product)-[:STOCKED_AT]→
  (:Store)-[:SERVES]→
  (:Customer)

Graph nodes carry PDM surrogate keys
for cross-paradigm joins.
How Modeling Resolves Supply Chain Blindness

Dual Paradigm Supply chain analytics requires two modeling paradigms: star schema for aggregation (“what is our average OTIF this quarter?”) and graph for traversal (“if supplier X fails, which customers are affected?”). The key is that graph nodes carry PDM surrogate keys (supplier_sk, product_sk), enabling cross-paradigm joins.

Multi-Hop Traversal “Supplier X fails → which products affected → which stores stocked out → which customers impacted?” is a 3-hop traversal in Neo4j. In a star schema, this requires 3 self-joins with exponentially degrading performance. The graph model makes this constant-time.

Risk as a Data Product dp_supplier_risk aggregates signals from multiple PDM entities (quality, delivery, sourcing) into a single risk score. This is a derived data product, a first-class modeled entity, not an ad-hoc calculation.

Framework Alignment

DAMA DMBOK

KA 8: Data Integration: Cross-module and external data integration. KA 14: Big Data: Graph analytics for network analysis.

EDM Council DCAM

Component 3: Data Architecture: Graph as complementary architecture. External data onboarding governance.

Data Modeling Practice

Supply chain modeled in two paradigms: star schema for aggregation, graph for traversal. Neo4j nodes map to PDM surrogate keys for cross-paradigm joins.

4

Tier 4: Customer-Facing

Last-mile optimization. Needs the operational layer working before these deliver value.

P11
Pricing, Promotions & Margin Leakage
Depends on: P6 (Analytics), P3 (Master Data)
DMBOK: DW & BIConformed Dimensions

Condition records scattered across KONH/KONP/A-tables/WPM with no unified view. Can’t answer “did this promotion actually drive incremental sales or just pull forward demand?”

Problem Statement
  • Promotion ROI unmeasured. No way to compare promoted vs. non-promoted sales lift at product-store-week grain.
  • Pricing errors from stale conditions. KONH/KONP condition records expire but are not systematically purged. Stale prices applied silently.
  • Margin leakage invisible. Discount depth, rebate accruals, and markdown cadence not unified into a single margin waterfall.
  • KONV → PRCD_ELEMENTS migration breaks pricing reports. Custom ABAP reading KONV must be remediated for S/4HANA.
Root Causes
  • No promotion dimension in the PDM. Promotions tracked as condition records (KONH/KONP) but never modeled as analytical entities with attributes like type, mechanic, target products, and effectiveness.
  • Pricing conditions spread across 30+ condition types in KONV/PRCD_ELEMENTS. No unified pricing decomposition model that breaks gross price into components (list price, trade discount, volume rebate, markdown, COGS).
  • Promotion planning (trade promotion management) disconnected from promotion execution (condition records) and promotion measurement (sales analysis). Three separate systems, no shared key.
  • Condition record lifecycle not monitored. KONH.DATAB (valid-from) and KONH.DATBI (valid-to) not checked against active material-sales org combinations.
Solutions
  • Model dim_promotion as a conformed dimension: promotion ID, type, start/end dates, mechanic (BOGO, % off, fixed), target products, target stores.
  • Build dp_promoeff: baseline sales, promoted sales, incremental lift, cost of promotion, ROI.
  • Build a margin waterfall. dp_margin_waterfall: gross → discounts → rebates → markdowns → COGS → net margin.
  • Automate condition record hygiene. Monitor KONH validity dates and flag expired conditions still referenced by active combinations.
Implementation at ShaDey Inc.
  • Build dim_promotion (Sprint 1). Source from KONH (condition header: promo key, valid dates) + KONP (condition items: amount, rate, scale) + A-tables (condition access: material, customer, sales org combinations) + WPM* (Retail promotion management, if applicable). Attributes: promotion_id, promo_name, promo_type (% off, BOGO, fixed price, markdown), start_date, end_date, mechanic_description, target_product_list, target_store_list, planned_spend. This dimension does not exist in the current 24-entity PDM; it must be added.
  • Build dp_promoeff (Sprint 2). Grain: product × store × promotion × week. Calculate: baseline_sales (avg of same weeks in non-promo periods), promoted_sales (actual during promo), incremental_lift (promoted - baseline), promo_cost (from dim_promotion.planned_spend), ROI ((incremental_revenue - promo_cost) / promo_cost). Join fact_sales with dim_promotion via promotion_sk. Publish weekly to Marketing and Merchandising.
  • Build dp_margin_waterfall (Sprint 3). Decompose each sale from gross to net using KONV/PRCD_ELEMENTS condition types: list_price (PR00) → trade_discount (K004/K005) → volume_rebate (BO01-BO05) → markdown (final selling price) → COGS (from MBEW.STPRS/ML actual cost) → net_margin. Grain: product × store × month. Enables: “where is margin leaking?” at any level of the product/store hierarchy.
  • Condition record hygiene pipeline (Sprint 2). Daily pipeline: query KONH where DATBI < today AND material-sales_org combination still active in MVKE. Flag stale conditions. Alert pricing team. Auto-disable stale conditions after 30-day grace period (with steward approval).
  • PRCD_ELEMENTS migration (Sprint 4, aligned with P5). Map all custom KONV reads to PRCD_ELEMENTS. Update dp_margin_waterfall source mapping: KONV.KSCHL → PRCD_ELEMENTS.KSCHL. Use the dual-source adapter pattern from P5.
Data Modeling Resolution
dim_promotion + Margin Waterfall
dim_promotion (conformed dimension)
  ├─ promotion_sk        [surrogate key]
  ├─ promotion_id        [business key]
  ├─ promo_type          [%OFF/BOGO/FIXED/MKDN]
  ├─ mechanic_desc       [human-readable]
  ├─ start_date          [KONH.DATAB]
  ├─ end_date            [KONH.DATBI]
  └─ planned_spend       [budget allocated]

dp_margin_waterfall (derived wide table)
  Grain: product × store × month
  ├─ list_price          [PR00]
  ├─ trade_discount      [K004/K005]
  ├─ volume_rebate       [BO01-BO05]
  ├─ markdown            [final price delta]
  ├─ cogs                [MBEW.STPRS]
  └─ net_margin          [calculated]
How Modeling Resolves Margin Leakage

Conformed Dimension dim_promotion is shared by fact_sales and dp_promoeff. Every sale that occurred during a promotion period is linked to the promotion via promotion_sk. This enables “was this sale promoted?” at the line-item level.

Margin Waterfall The waterfall is a derived wide table that decomposes price into named components. Each component maps to specific KONV/PRCD_ELEMENTS condition types. This makes margin leakage visible: if trade discounts grew 15% while volume only grew 3%, the model surfaces it.

Promotion Effectiveness Without dim_promotion, there is no analytical anchor for promo ROI. The dimension provides the structural capability to ask: “what was the incremental lift of this specific promotion on this specific product at this specific store?” This question is unanswerable without the modeled entity.

Framework Alignment

DAMA DMBOK

KA 11: DW & BI: Conformed dimensions shared across promotional and sales facts. KA 10: Reference & Master Data: Condition record management as reference data.

EDM Council DCAM

Component 5: Data Quality: Condition record validity monitoring. Component 1: Strategy: Margin visibility as strategic analytics capability.

Data Modeling Practice

dim_promotion is a conformed dimension shared by fact_sales and dp_promoeff. Margin waterfall is a derived wide table with named price components.

P12
Order Fulfillment & Customer Experience
Depends on: P9 (Inventory), P11 (Pricing)
DMBOK: Data IntegrationTransactional Facts

“Which location should fulfill this order?” requires real-time stock visibility that doesn’t exist. Classic ATP gives binary yes/no. Credit blocks (KNKK) stall orders silently.

Problem Statement
  • No optimal fulfillment routing. Orders default to nearest warehouse. No cost-based or availability-based optimization across the network.
  • Classic ATP is binary. No substitution logic, no allocation rules, no backorder processing. S/4HANA aATP requires clean master data.
  • Credit blocks delay fulfillment. KNKK credit limits static and infrequently updated. S/4HANA UKM engine offers real-time exposure but requires migration.
  • Order status invisible to customers. VBAK/VBAP → LIKP/LIPS → VTTK/VTTP chain not surfaced in a customer-facing view.
Root Causes
  • No order fact table that tracks the full order lifecycle (created → confirmed → delivered → billed → complete). Order data (SD module) and delivery data (LE module) not joined analytically.
  • Fulfillment logic is hard-coded in SAP configuration (delivery plant determination rules), not data-driven. No optimization model considers cost, availability, and lead time simultaneously.
  • Credit management data (KNKK) is a static master data field, not a real-time signal. Credit blocks discovered during order processing, not before.
  • Order-to-delivery chain spans three document categories (sales, delivery, shipment) in different SAP modules. No pre-built cross-document analytical view.
Solutions
  • Build fact_order joining VBAK + VBAP + VBEP + VBKD. Track order lifecycle states.
  • Build dp_order_fulfillment: order-to-delivery lead time, perfect order rate, fill rate by location, backorder aging.
  • Model fulfillment network as a graph. Use Dijkstra for lowest-cost fulfillment path.
  • Migrate credit management to UKM. Model credit exposure in dim_customer with real-time utilization.
Implementation at ShaDey Inc.
  • Build fact_order (Sprint 1). Extract VBAK (order header: order number, customer, order date, order type) + VBAP (order items: material, quantity, net value) + VBEP (schedule lines: confirmed qty, delivery date) + VBKD (business data: payment terms, incoterms). Grain: one row per order item per schedule line. Track lifecycle: order_created_date, order_confirmed_date (from VBEP), delivery_date (join to LIKP), billing_date (join to VBRK), completion_flag.
  • Build dp_order_fulfillment (Sprint 2). Derived metrics: order_to_delivery_days (delivery_date - order_created_date), perfect_order_flag (on_time AND in_full AND no_damage AND correct_invoice), fill_rate (confirmed_qty / requested_qty), backorder_age_days (today - order_created_date WHERE not yet delivered). Grain: customer × product × order_date. SLA: refreshed hourly during business hours. Published to Sales, Logistics, and Customer Service teams.
  • Fulfillment network graph in Neo4j (Sprint 3). Model: (:Order)-[:PLACED_BY]→(:Customer {location}), (:Store)-[:HAS_STOCK {qty, available_to_promise}]→(:Product), (:Store)-[:SHIPS_VIA {cost, lead_days}]→(:Carrier). Routing query: given an order for product X to customer Y, find the store with stock that minimizes (shipping_cost + lead_days × urgency_weight) using Dijkstra shortest path. This replaces static delivery plant determination rules with data-driven optimization.
  • Credit management enhancement (Sprint 3, aligned with P5). In ECC: add KNKK.KLIMK (credit limit) and KNKK.SKFOR (credit exposure) to dim_customer. In S/4HANA: migrate to UKM_* tables for real-time credit utilization. Add credit_utilization_pct to dim_customer and dp_order_fulfillment. Auto-flag orders where customer credit utilization > 90% for proactive review before order entry.
Data Modeling Resolution
fact_order (Transactional + Process Fact)
fact_order (transactional fact)
  Grain: order item × schedule line
  ├─ order_sk            [surrogate key]
  ├─ order_number        [VBAK.VBELN]
  ├─ customer_sk         [FK → dim_customer]
  ├─ product_sk          [FK → dim_product]
  ├─ store_sk            [FK → dim_store]
  ├─ order_date_key      [FK → dim_date (role)]
  ├─ delivery_date_key   [FK → dim_date (role)]
  ├─ requested_qty       [VBAP.KWMENG]
  ├─ confirmed_qty       [VBEP.BMENG]
  ├─ net_value           [VBAP.NETWR]
  ├─ lifecycle_state      [CREATED/CONFIRMED/
  │                      DELIVERED/BILLED/COMPLETE]
  └─ perfect_order_flag  [calculated]
How Modeling Resolves Fulfillment Gaps

Transactional Fact fact_order at order-line grain joins data from 4 SAP document categories (VBAK/VBAP/VBEP/VBKD) into one fact. The lifecycle_state column tracks each order through its states. This replaces the manual VBAK→LIKP→VTTK chain investigation.

Role-Playing Dimensions dim_date is used twice: once as order_date_key and once as delivery_date_key. This Kimball pattern enables “orders placed in January but delivered in March” analysis without self-joins.

Graph for Network Optimization The fulfillment graph overlays inventory data (dp_inventory_position) onto the network topology. This is fundamentally a shortest-path problem; the graph model enables real-time routing that the star schema cannot.

Framework Alignment

DAMA DMBOK

KA 8: Data Integration: Order-to-cash process integration across SD, LE, FI. KA 11: DW & BI: Operational BI for near-real-time fulfillment.

EDM Council DCAM

Component 4: Technology Architecture: Near-real-time data infrastructure. Component 5: Data Quality: Order data completeness for SLA measurement.

Data Modeling Practice

fact_order is a transactional fact at order-line grain. Role-playing dim_date for order vs. delivery date. Graph overlay for network optimization.

P13
Customer Intelligence Gap
Depends on: P12 (Fulfillment), P6 (Analytics)
DMBOK: Data ScienceData Products / Graph

No unified customer view. KNA1/KNB1/KNVV/KNVP/KNKK each hold a slice. Churn is invisible until the customer is gone. Segmentation is static and rule-based.

Problem Statement
  • No Customer 360. Customer data split across 5 ECC tables (or BUT000 + partner functions in S/4). No single view combining transactional history, credit exposure, and loyalty.
  • Churn invisible. No predictive model for customer churn risk. Lapsed customers discovered only during quarterly reviews.
  • Static segmentation. Customer segments defined by manual rules (top 5% by spend = VIP). No data-driven clustering.
  • “Customers who bought X also bought Y” requires graph. Product affinity via star schema requires expensive self-joins.
Root Causes
  • Customer master data fragmented across 5 tables (P3). Even with a governed dim_customer, the transactional behavior layer is missing: no pre-computed aggregates for lifetime value, purchase frequency, recency, or category preferences.
  • No ML infrastructure for customer analytics. Segmentation requires feature engineering, model training, and prediction serving; none of which exist in the current platform.
  • Product affinity is a graph problem (bipartite graph: customers and products connected by purchases). Star schema self-joins on fact_sales are O(n²) and impractical at scale.
  • Churn signal is latent: it’s the absence of activity. Detecting absence requires comparing current behavior to historical baselines, which needs a feature store with time-windowed aggregates.
Solutions
  • Build dp_customer_360: total lifetime value, order frequency, recency, average basket, preferred categories, channel mix, credit utilization, loyalty tier.
  • Build dp_customer_segmentation using ML clustering on 360 features. Replace static rules with data-driven segments.
  • Model customer networks in Neo4j. Apply Jaccard similarity and community detection for look-alike audiences.
  • Build churn prediction model. Features from dp_customer_360. Store predictions in ml_training_snapshot.
Implementation at ShaDey Inc.
  • Build dp_customer_360 (Sprint 1). Source from the PDM star schema: dim_customer (master attributes) + fact_sales (aggregated: total_lifetime_value, total_orders, avg_basket_value, days_since_last_order, top_3_categories) + fact_order (order_frequency, avg_lead_time) + fact_return (return_rate, return_reasons) + credit utilization from dim_customer. Grain: one row per customer. Refreshed daily. This is ShaDey’s single customer intelligence hub.
  • ML segmentation (Sprint 2). Features from dp_customer_360: recency, frequency, monetary value (RFM), category_diversity, channel_mix, return_rate. Apply k-means or DBSCAN clustering. Output: segment labels (e.g., “High-Value Loyal”, “At-Risk Declining”, “New Growth”, “Price-Sensitive Seasonal”). Write segment_id back to dim_customer as a slowly-changing attribute. Retrain monthly.
  • Customer product affinity graph in Neo4j (Sprint 2). Load: (:Customer)-[:PURCHASED {qty, date}]→(:Product) from fact_sales. Apply GDS algorithms: Jaccard similarity between customers based on purchase overlap, community detection (Louvain) for customer clusters, PageRank on products for “most connected” items. Output: look-alike audience lists for Marketing, product recommendation pairs for e-commerce.
  • Churn prediction model (Sprint 3). Training features from dp_customer_360: days_since_last_order (recency), order_frequency_trend (last 90d vs. prior 90d), return_rate_trend, category_concentration (Herfindahl index). Label: churned = no order in 120 days. Model: gradient boosting classifier. Store predictions in ml_training_snapshot with model_version, prediction_date, churn_probability. Alert Sales when high-value customers cross 70% churn probability threshold.
Data Modeling Resolution
dp_customer_360 + ML Entities
dp_customer_360 (wide aggregate table)
  Grain: one row per customer
  ├─ customer_sk          [FK → dim_customer]
  ├─ total_lifetime_value [SUM(fact_sales)]
  ├─ total_orders         [COUNT(fact_order)]
  ├─ avg_basket_value     [AVG order value]
  ├─ days_since_last_order[recency]
  ├─ top_categories       [JSON array]
  ├─ return_rate          [returns/orders]
  ├─ channel_mix          [POS/ECOM/WHOLESALE %]
  ├─ credit_utilization   [from dim_customer]
  ├─ segment_id           [ML-assigned]
  └─ churn_probability    [ML prediction]

ml_training_snapshot
  ├─ model_id, model_version
  ├─ customer_sk, prediction_date
  ├─ churn_probability, segment_id
  └─ feature_vector_hash
How Modeling Resolves Customer Blindness

Wide Aggregate Table dp_customer_360 pre-computes all customer metrics into a single row. This is a modeled data product, not an ad-hoc query. It aggregates from fact_sales, fact_order, fact_return, and dim_customer through documented transformations. Every customer question starts here.

ML as a Modeling Layer Segment labels and churn probabilities are derived attributes that flow back into the model. dim_customer.segment_id becomes a filter dimension: “show me sales trends for At-Risk customers.” ML outputs are first-class modeled entities with versioning, not ephemeral notebook outputs.

Graph for Affinity Customer-product affinity is a bipartite graph problem. Neo4j’s GDS library computes Jaccard similarity and community detection natively. The graph complements the star schema: the star schema answers “what did this customer buy?”; the graph answers “which customers are similar?”

Framework Alignment

DAMA DMBOK

KA 14: Big Data & Data Science: ML model lifecycle, feature engineering, model governance. KA 10: Reference & Master Data: Customer golden record as foundation for 360 views.

EDM Council DCAM

Component 1: Strategy: Customer analytics as strategic differentiator. Component 5: Data Quality: Customer data completeness drives ML model accuracy.

Data Modeling Practice

dp_customer_360 is a wide aggregate table. ML features stored in a feature store entity with versioning. Graph overlay for collaborative filtering.

P14
Returns & Reverse Logistics Black Box
Depends on: P12 (Fulfillment), P9 (Inventory), P8 (Quality)
DMBOK: Data ModelingMulti-Source Fact

Return data fragmented across 4 document types: sales return (VBAK type RE), return delivery (LIKP type LR), credit memo (VBRK type G2), and goods movements (MSEG 651/653). No unified return entity.

Problem Statement
  • No unified return fact. Returns exist as fragments across 4 SAP document types. Counting total returns requires querying all 4 sources and deduplicating.
  • Return reason codes inconsistent. Different return types use different reason code fields. No standardized return reason taxonomy.
  • Return cost unmeasured. Restocking labor, reverse shipping, quality re-inspection, write-downs not captured per return.
  • No return-to-root-cause linkage. Cannot determine whether returns correlate with specific suppliers, production batches, or customer segments.
Root Causes
  • Returns are not a first-class data domain in SAP. They are side effects of other processes: a return order is a sales document with type RE, a return delivery is a delivery with type LR, a credit memo is a billing document with type G2. No single SAP table represents “a return.”
  • Return reason codes are free-text or locally maintained in each document type. VBAK uses AUGRU (order reason), LIKP uses a different reason field, MSEG uses movement type qualifiers. No cross-document reason taxonomy.
  • Reverse logistics cost components (restocking, re-inspection, reverse shipping, write-down) are posted to cost centers in CO, not attributed to individual return items. Cost-per-return is invisible.
  • Root-cause analysis requires multi-hop traversal: return → original sale → product → batch → supplier. This crosses 5+ tables and 3 SAP modules (SD, MM, QM). No pre-built analytical path exists.
Solutions
  • Model fact_return as a multi-source fact table. Union all 4 document types. Deduplicate on return chain.
  • Standardize return reason taxonomy. Governed ref_return_reason reference table mapping all SAP reason codes to a unified hierarchy.
  • Build dp_return_analytics: return rate by product/category/supplier, cost per unit, time to credit.
  • Link returns to root causes via graph. Return → Product → Batch → Supplier for correlation analysis.
Implementation at ShaDey Inc.
  • Build fact_return (Sprint 1). Extract and union 4 sources: (1) VBAK/VBAP where AUART = 'RE' (return orders: customer, material, quantity, reason AUGRU), (2) LIKP/LIPS where LFART = 'LR' (return deliveries: actual returned qty, return date), (3) VBRK/VBRP where FKART = 'G2' (credit memos: credit amount, billing date), (4) MSEG where BWART IN ('651','653') (goods receipts for returns: batch, storage location). Deduplicate on return chain: link return order → return delivery → credit memo via VBFA (document flow table). Final grain: one row per returned line item.
  • Build ref_return_reason (Sprint 1). Map all SAP reason codes to a unified 4-level hierarchy: Level 1 (Defective, Wrong Item, Customer Changed Mind, Damaged in Transit, Other), Level 2 (subcategories within each), Level 3 (specific defect codes from QM), Level 4 (free text for edge cases). Add return_reason_sk as a foreign key in fact_return. The Governance Council (P1) approves the taxonomy; the Customer Data Steward maintains it.
  • Build dp_return_analytics (Sprint 2). Derive from fact_return + fact_sales + dim_product + dim_supplier: return_rate_by_product (returns / sales per product), return_rate_by_supplier (returns of products from supplier X / total sales of those products), avg_days_to_credit (credit_memo_date - return_order_date), return_cost_per_unit (estimated from CO cost center allocations). Serial returner detection: flag customers where return_rate > 3x category average.
  • Return root-cause graph in Neo4j (Sprint 3). Model: (:Return)-[:OF_PRODUCT]→(:Product)-[:FROM_BATCH]→(:Batch)-[:PRODUCED_BY]→(:Supplier). Query: “Are returns for product X concentrated in batches from supplier Y?” If 80% of returns for SKU-1234 come from batches produced at Plant A by Supplier Z, the root cause is supplier quality, not product design. Link to dp_quality_metrics (P8) for closed-loop quality improvement.
Data Modeling Resolution
fact_return (Multi-Source Fact)
fact_return (multi-source transactional fact)
  Grain: one row per returned line item
  ├─ return_sk            [surrogate key]
  ├─ return_order_number  [VBAK.VBELN type RE]
  ├─ customer_sk          [FK → dim_customer]
  ├─ product_sk           [FK → dim_product]
  ├─ store_sk             [FK → dim_store]
  ├─ return_reason_sk     [FK → ref_return_reason]
  ├─ return_date_key      [FK → dim_date]
  ├─ returned_qty         [LIPS.LFIMG]
  ├─ credit_amount        [VBRP.NETWR type G2]
  ├─ batch_id             [MSEG.CHARG]
  ├─ source_doc_type      [RE/LR/G2/651]
  └─ original_order_sk    [FK → fact_order]

ref_return_reason (junk dimension)
  ├─ return_reason_sk
  ├─ reason_level_1  [Defective/Wrong/...]
  ├─ reason_level_2  [subcategory]
  └─ reason_level_3  [specific code]
How Modeling Resolves the Returns Black Box

Multi-Source Fact fact_return unions 4 disparate SAP document types into a single fact with a source_doc_type discriminator. The grain (one row per returned line item) is consistent regardless of source. This is the modeling solution to the “returns are not a first-class entity” problem.

Junk Dimension for Reasons ref_return_reason uses the Kimball junk dimension pattern to standardize free-text and locally-maintained reason codes into a governed hierarchy. Every return in fact_return has a foreign key to this reference dimension, enabling return-reason analytics across all channels and document types.

Cross-Fact Linkage fact_return.original_order_sk links back to fact_order, enabling: return rate = COUNT(fact_return) / COUNT(fact_order) per customer, per product, per period. This cross-fact relationship is only possible because both facts share conformed dimensions.

Graph for Root Cause The Neo4j return-to-root-cause graph traverses: return → product → batch → supplier. Pattern detection: “80% of returns for this SKU come from this supplier’s batches” is a 3-hop query. The star schema quantifies the problem; the graph finds the cause.

Framework Alignment

DAMA DMBOK

KA 5: Data Modeling: Multi-source fact design: union disparate document types into a single fact. KA 10: Reference Data: Standardized reason code taxonomies.

EDM Council DCAM

Component 3: Data Architecture: Reverse logistics as a first-class data domain. Component 5: Data Quality: Return reason completeness and consistency.

Data Modeling Practice

fact_return is a multi-source transactional fact with a source_doc_type discriminator. Grain = returned line item. Return reasons as a junk dimension.

Dependency Chain
P1 Governance
 └─▸ P2 Data Modeling
      └─▸ P3 Master Data
           └─▸ P4 Lineage
                └─▸ P5 S/4HANA Migration
                     ├─▸ P6 Analytics ──▸ P11 Pricing ──▸ P12 Fulfillment ──▸ P13 Customer Intel
                     │                                                       │
                     └─▸ P7 Demand ──▸ P8 Production ──▸ P9 Inventory ──▸ P10 Supply Chain
                                                                    │
                                                                    └───────────────────▸ P14 Returns