Master Data Management Across ERPs: Golden Record, Survivorship Rules & Sync Patterns

Type: ERP Integration System: Informatica MDM, Reltio, SAP MDG, Profisee Confidence: 0.88 Sources: 7 Verified: 2026-03-02 Freshness: evolving

TL;DR

System Profile

This card covers cross-ERP Master Data Management — the architecture, survivorship logic, and synchronization patterns needed to maintain a single golden record across multiple ERP and CRM systems. It is platform-agnostic but references the four dominant MDM platforms for concrete implementation details. This card does NOT cover single-system data governance, product information management (PIM), or one-time data migration.

SystemRoleAPI SurfaceDirection
MDM Hub (Informatica / Reltio / Profisee)Golden record authority, match/merge engineREST, GraphQL, StreamingHub <-> All systems
SAP S/4HANAERP — financial master, material masterOData v4, RFC/BAPI, IDocsBidirectional
SalesforceCRM — customer/account masterREST v62.0, Bulk API, Platform EventsBidirectional
Oracle ERP CloudERP — financials, procurementREST, FBDIBidirectional
NetSuiteERP — mid-market financials, inventorySuiteTalk REST/SOAPBidirectional
Microsoft Dynamics 365ERP/CRM — sales, finance, supply chainOData v4, Dataverse APIBidirectional

API Surfaces & Capabilities

MDM platforms expose APIs for match, merge, golden record CRUD, survivorship configuration, and event subscription.

MDM PlatformMatch APIGolden Record APIEvent/CDCBulk ImportLatency (p95)Auth
Informatica IDMCREST /matchREST /entity CRUDKafka, webhooksCSV batch, 300+ connectors~500msOAuth 2.0
ReltioREST /entities/matchREST /entities, GraphQLStreaming API, webhooksREST bulk, S3 ingest<300msOAuth 2.0, API key
SAP MDGRFC/BAPI matchOData entity CRUD, staging workflowIDocs, AIF, CPI eventsFBDI, batch input~1-2s (approval workflow)SAP OAuth, X.509
ProfiseeREST /matchREST /records CRUDWebhooks, Azure Event GridREST bulk, Azure Data Factory~400msOAuth 2.0, Azure AD

ERP-Side API Surfaces for Master Data Sync

ERP SystemRead APIWrite APICDC/EventsBulkRate Limit
SAP S/4HANAOData v4OData v4, BAPIBusiness Events, AIFIDocs batchFair-use, throttled
SalesforceREST SOQL, Bulk API 2.0REST, CompositePlatform Events, CDCBulk API 2.0 (150MB/file)100K calls/24h (Enterprise)
Oracle ERP CloudRESTREST, FBDIBusiness EventsFBDI (250MB/file)Throttled per tenant
NetSuiteSuiteTalk REST/SOAPSuiteTalk REST/SOAPUser Event Scripts, SuiteScriptCSV import, SuiteTalk lists10 concurrent requests
Dynamics 365Dataverse OData v4Dataverse OData v4Webhooks, Azure Service BusData Import wizard6K requests/5min per user

Rate Limits & Quotas

MDM Hub Limits

PlatformAPI CallsConcurrent RequestsBulk Import SizeMatch Throughput
Informatica IDMCTier-based (contract)50 concurrent (default)500K records/batch~10K matches/min
ReltioTier-based (contract)100 concurrent (Enterprise)1M records/bulk load~50K matches/min (FERN)
SAP MDGNo hard API limit (shared with S/4)Work process pool (configurable)Unlimited (batch input)~5K matches/min (HANA)
ProfiseeTier-based (contract)25 concurrent (default)100K records/batch (REST)~8K matches/min

Per-Request Limits

Limit TypeInformaticaReltioSAP MDGProfisee
Max records per query1,00010,000500 (OData default)5,000
Max payload size10 MB50 MB100 MB (IDoc)25 MB
Match candidates returned50 (default)100 (configurable)20 (default)50 (default)
Golden record merge limit10 records/merge50 records/merge5 records/merge (workflow)20 records/merge

Authentication

PlatformFlowToken LifetimeRefresh?Notes
Informatica IDMCOAuth 2.0 client credentials30 minYesService-to-service recommended
ReltioOAuth 2.0, API key1h (OAuth), permanent (API key)Yes (OAuth)API key for dev; OAuth for production
SAP MDGOAuth 2.0, X.509, SAMLSession-based (configurable)YesX.509 for server-to-server
ProfiseeOAuth 2.0 / Azure AD1hYesAzure AD integration native

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START — User needs cross-ERP Master Data Management
├── What's the primary use case?
│   ├── Analytics / reporting only (no writeback needed)
│   │   └── CONSOLIDATION style
│   │       ├── Batch ETL from all ERPs nightly
│   │       ├── Match/merge → golden records
│   │       └── Feed BI/analytics; source ERPs unchanged
│   ├── Cross-reference lookup (which records match across systems?)
│   │   └── REGISTRY style
│   │       ├── MDM hub as index/cross-reference only
│   │       ├── Minimal disruption, fast deployment
│   │       └── WARNING: Rarely viable in production — data quality stays poor
│   ├── Operational sync (golden records used in real-time operations)
│   │   ├── Can you designate one hub as sole master data author?
│   │   │   ├── YES → CENTRALIZED style (18-24+ months, most disruptive)
│   │   │   └── NO → COEXISTENCE style (most common enterprise pattern)
│   │   │       ├── MUST define per-attribute ownership rules
│   │   │       └── MUST implement conflict resolution before go-live
│   │   └── How many data domains?
│   │       ├── Single domain → 3-6 months
│   │       ├── 2-3 domains → 9-12 months
│   │       └── Enterprise-wide → 12-18+ months
│   └── Hybrid (different styles per domain)
│       ├── Customer data → coexistence (operational)
│       ├── Product data → consolidation (analytics)
│       └── Vendor data → centralized (procurement-owned)
├── Which MDM platform?
│   ├── SAP-heavy landscape → SAP MDG (native integration)
│   ├── Multi-vendor, cloud-first → Reltio (<300ms, LLM matching)
│   ├── Enterprise, 100+ sources → Informatica IDMC (300+ connectors)
│   └── Microsoft/Azure stack → Profisee (Azure-native)
└── What middleware for ERP sync?
    ├── SAP CPI → SAP-to-SAP + SAP-to-cloud
    ├── MuleSoft → Multi-vendor, API-led connectivity
    ├── Boomi → Cloud-to-cloud, rapid deployment
    └── Azure Integration Services → Microsoft ecosystem

Quick Reference

Survivorship Rule Types

Rule TypeHow It WorksBest ForExample
Source priorityRank source systems per attribute; highest-rank winsRegulated environments with clear data ownershipCRM owns email; ERP owns billing address
Most recentNewest timestamp wins for the attributeFrequently changing data (phone, email)CRM phone updated yesterday; ERP has last year's → CRM wins
FrequencyMost common value across sources winsStable attributes with many sources3 of 4 systems say "New York"; 1 says "NY" → "New York" wins
CompletenessMost complete (non-null) value winsSparse data environmentsCRM has name + email; ERP has name only → CRM email survives
AggregationCombine values from multiple sourcesMulti-valued attributesMerge all known phone numbers, deduplicate
ConditionalApply different rules based on data contextComplex business rulesIf country = US, trust ERP for tax ID; if EU, trust CRM
Stacked (composite)Chain rules: try priority first, fall back to recencyProduction environments needing fallbackTrust CRM for email → if null, use most recent from any source

MDM Architecture Style Comparison

CapabilityRegistryConsolidationCoexistenceCentralized
Golden record persistenceNo (federated)Yes (read-only)Yes (read-write)Yes (authoritative)
Source system changesNoneNoneWriteback to sourcesSources become read-only
Sync directionRead-only from sourcesSources → hubBidirectionalHub → sources
Implementation time4-8 weeks3-6 months9-18 months18-24+ months
Governance strengthLowMediumMedium-HighHighest
Disruption levelMinimalLowMediumHigh
Data quality improvementMinimalModerateHighHighest
Real-time operational useLimitedNo (batch)YesYes
Conflict resolution neededNoNoYes (critical)No (single author)
Production prevalenceRareCommon (starting point)Most commonAspirational

Step-by-Step Integration Guide

1. Assess master data landscape and select MDM style

Map all systems that create or consume master data. For each data domain, identify the current system of record and data quality issues. [src6]

# Inventory: list all systems with master data
# system,domain,records,dup_rate,completeness,api,update_freq,sor
# SAP S/4HANA,vendor,150000,8%,92%,"OData v4, BAPI",real-time,yes
# Salesforce,customer,500000,15%,78%,"REST v62.0, Bulk API",real-time,yes
# NetSuite,customer,200000,12%,85%,"SuiteTalk REST",hourly,no

Verify: Complete system inventory with duplicate rates and data quality scores for each domain.

2. Design match keys and survivorship rules

Define matching criteria (deterministic + probabilistic) and attribute-level survivorship rules before touching any technology. [src2, src3]

# Match key design for Customer domain
match_rules:
  - name: "exact_match"
    type: deterministic
    keys: ["tax_id"]
    action: auto_merge
  - name: "fuzzy_match"
    type: probabilistic
    keys:
      - field: "company_name"
        algorithm: "jaro_winkler"
        threshold: 0.85
    min_score: 0.90
    action: auto_merge

# Survivorship rules
survivorship:
  customer_name:
    rule: source_priority
    priority: [CRM, ERP]
    fallback: most_recent
  billing_address:
    rule: source_priority
    priority: [ERP, CRM]
  email:
    rule: most_recent
    require_valid_format: true
  tax_id:
    rule: source_priority
    priority: [ERP]

Verify: Every attribute in your golden record has an explicit survivorship rule with fallback.

3. Configure MDM hub and initial data load

Deploy the MDM platform, configure match/merge rules, and perform initial bulk load from all source systems. [src1]

# Reltio initial data load via REST API
import requests
RELTIO_BASE = "https://{tenant}.reltio.com/reltio/api/{tenant_id}"
HEADERS = {"Authorization": "Bearer {token}", "Content-Type": "application/json"}

def load_entities_bulk(entities, entity_type="configuration/entityTypes/Customer"):
    BATCH_SIZE = 1000
    for i in range(0, len(entities), BATCH_SIZE):
        batch = entities[i:i + BATCH_SIZE]
        payload = [{"type": entity_type, "attributes": {...}, "crosswalks": [...]} for e in batch]
        resp = requests.post(f"{RELTIO_BASE}/entities", headers=HEADERS, json=payload)
        if resp.status_code == 429:
            sleep(2)  # Rate limit backoff

Verify: GET /entities?filter=crosswalks.type==*&max=1 returns entities with cross-references.

4. Implement ongoing synchronization

Set up event-driven sync between ERP systems and the MDM hub using CDC or Platform Events. [src1, src4]

# Salesforce CDC -> MDM Hub sync
def process_cdc_event(event):
    changed_fields = event["payload"]["ChangeEventHeader"]["changedFields"]
    delta_payload = {field: event["payload"][field] for field in changed_fields if field in FIELD_MAP}
    mdm_client.update_entity(crosswalk=("Salesforce", event["recordId"]), attributes=delta_payload)

Verify: Update a record in Salesforce, wait <5s, verify golden record in MDM hub reflects the change.

5. Implement conflict resolution and data stewardship

Configure automated and manual conflict resolution for bidirectional sync scenarios. [src1, src2]

# Conflict detection: competing updates within 60s window
def resolve_conflict(golden_record, update_a, update_b, survivorship_rules):
    for attr in conflicting_attrs:
        rule = survivorship_rules.get(attr)
        if rule["rule"] == "source_priority":
            # Higher-priority source wins
        elif rule["rule"] == "most_recent":
            # Newer timestamp wins
        else:
            create_stewardship_task(golden_record["id"], attr)  # Manual review

Verify: Simulate a conflict — update same customer in two ERPs within 60s. Confirm survivorship resolves or creates stewardship task.

Code Examples

Python: Bulk entity load with cross-references

# Input:  Source system extracts (JSON) from SAP, Salesforce, NetSuite
# Output: Golden records created in MDM hub with cross-references
import requests
from time import sleep

def load_entities_bulk(entities, base_url, headers, batch_size=1000):
    results = {"created": 0, "matched": 0, "errors": 0}
    for i in range(0, len(entities), batch_size):
        batch = entities[i:i + batch_size]
        resp = requests.post(f"{base_url}/entities", headers=headers, json=batch)
        if resp.status_code == 200:
            r = resp.json()
            results["created"] += r.get("created", 0)
            results["matched"] += r.get("matched", 0)
        elif resp.status_code == 429:
            sleep(2)
            continue
        else:
            results["errors"] += len(batch)
    return results

cURL: Test match API

# Input:  OAuth token, entity attributes to match
# Output: List of potential duplicate entities with match scores

curl -X POST "$RELTIO_BASE/entities/match" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "configuration/entityTypes/Customer",
    "attributes": {
      "Name": [{"value": "Acme Corporation"}],
      "PostalCode": [{"value": "10001"}]
    }
  }' | jq '.potentialMatches[] | {uri, score, attributes.Name}'
# Expected: Array of match candidates with scores 0.0-1.0

Data Mapping

Cross-ERP Field Mapping Reference (Customer Domain)

MDM Golden FieldSAP S/4HANASalesforceOracle ERP CloudNetSuiteGotcha
Customer NameBP_NAME (BUPA)Account.NameHZ_PARTIES.PARTY_NAMEcustomer.companyNameSAP max 40 chars; SF max 255
Address Line 1ADRC.STREETAccount.BillingStreetHZ_LOCATIONS.ADDRESS1customer.defaultAddress.addr1SAP structured; SF freeform
Postal CodeADRC.POST_CODE1Account.BillingPostalCodeHZ_LOCATIONS.POSTAL_CODEcustomer.defaultAddress.zipFormat varies by country
CountryADRC.COUNTRY (ISO 2)Account.BillingCountry (full name)HZ_LOCATIONS.COUNTRY (ISO 2)customer.defaultAddress.country (ISO 2)SF stores "United States"; others use "US"
Tax IDDFKKBPTAXNUM.TAXNUMAccount.Tax_ID__cZX_REGISTRATIONS.REGISTRATION_NUMBERcustomer.defaultTaxRegFormat validation per jurisdiction
EmailADR6.SMTP_ADDRContact.EmailHZ_CONTACT_POINTS.EMAIL_ADDRESScustomer.emailSAP may have multiple via ADR6
PhoneADR2.TEL_NUMBERAccount.PhoneHZ_CONTACT_POINTS.PHONE_NUMBERcustomer.phoneEnforce international format (+code)
Credit LimitKNKK.KLIMKAccount.Credit_Limit__cHZ_CUST_ACCT_SITES.CREDIT_LIMITcustomer.creditLimitCurrency conversion required
Payment TermsKNB1.ZTERMAccount.Payment_Terms__cRA_TERMS.NAMEcustomer.terms.nameCode vs. description mismatch

Data Type Gotchas

Error Handling & Failure Points

Common Error Patterns

Error PatternCauseImpactResolution
Over-merge (false positive)Match keys too looseDistinct customers merged; orders misattributedTighten thresholds; add negative match rules
Under-merge (false negative)Match keys too strictSame customer exists as multiple golden recordsAdd fuzzy matching; normalize data before matching
Sync loop (ping-pong)No change-origin trackingInfinite loop: ERP A → hub → ERP A → hub...Tag changes with source system; skip writeback to origin
Stale golden recordBatch sync delay (24h)Agent sees yesterday's data in operational contextMove to coexistence/centralized; add CDC for critical fields
Race conditionTwo ERPs update same attribute within sync windowLast-write-wins picks wrong valuePer-attribute ownership; vector clocks or priority-based resolution
Governance bypassDirect API calls skipping approval workflowUnvalidated data enters golden recordAPI gateway with validation middleware

Failure Points in Production

Anti-Patterns

Wrong: Record-level survivorship

# BAD — record-level survivorship discards valuable data
survivorship:
  customer_record:
    rule: source_priority
    winner: CRM  # CRM record wins entirely
    # Result: ERP billing address, credit limit, payment terms all lost

Correct: Attribute-level survivorship with fallbacks

# GOOD — each attribute has its own survivorship rule
survivorship:
  customer_name:
    rule: source_priority
    priority: [CRM, ERP]
    fallback: completeness
  billing_address:
    rule: source_priority
    priority: [ERP, CRM]  # ERP owns financial data
  credit_limit:
    rule: source_priority
    priority: [ERP]  # ONLY finance system sets this

Wrong: Point-to-point sync between ERPs

# BAD — N ERPs = N*(N-1)/2 integrations; no golden record
SAP <---> Salesforce (custom sync)
SAP <---> NetSuite (custom sync)
Salesforce <---> NetSuite (custom sync)
# 3 ERPs = 3 integrations; 5 ERPs = 10 integrations

Correct: Hub-and-spoke via MDM platform

# GOOD — N ERPs = N integrations; MDM hub is golden record authority
SAP <-> MDM Hub <-> Salesforce
              |
           NetSuite
# 3 ERPs = 3 integrations; 5 ERPs = 5 integrations

Wrong: Sync full records on every change

# BAD — sends ALL 150+ fields even if only email changed
def sync_to_mdm(salesforce_account):
    mdm_client.upsert_entity(salesforce_account.to_dict())

Correct: Delta sync — only changed fields

# GOOD — only sync changed attributes
def sync_to_mdm(cdc_event):
    changed_fields = cdc_event["changedFields"]
    delta = {f: cdc_event["payload"][f] for f in changed_fields if f in FIELD_MAP}
    mdm_client.update_entity(crosswalk=("Salesforce", cdc_event["recordId"]), attributes=delta)

Common Pitfalls

Diagnostic Commands

# Check golden record cross-references (Reltio example)
curl -H "Authorization: Bearer $TOKEN" \
  "$RELTIO_BASE/entities/{entity_uri}?options=crosswalks" | jq '.crosswalks'

# Verify survivorship — which source won for each attribute
curl -H "Authorization: Bearer $TOKEN" \
  "$RELTIO_BASE/entities/{entity_uri}?options=sourceValues" | jq '.attributes'

# Check match candidates
curl -X POST "$RELTIO_BASE/entities/match" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"type":"configuration/entityTypes/Customer","attributes":{"Name":[{"value":"Acme Corp"}]}}' \
  | jq '.potentialMatches'

# Monitor stewardship queue
curl -H "Authorization: Bearer $TOKEN" \
  "$RELTIO_BASE/tasks?status=OPEN&type=POTENTIAL_MATCH&max=10" | jq '.total'

# Verify sync status — last sync per source
curl -H "Authorization: Bearer $TOKEN" \
  "$RELTIO_BASE/entities?filter=crosswalks.type==configuration/sources/Salesforce&max=1&orderBy=-updatedTime" \
  | jq '.[0].updatedTime'

Version History & Compatibility

PlatformVersionRelease DateStatusKey Changes
Informatica IDMC2025.32025-10CurrentCLAIRE AI matching improvements; new Kafka connector
Informatica IDMC2024.32024-10SupportedGraphQL API GA; enhanced survivorship UI
Reltio2025.12025-03CurrentFERN LLM matching GA; <300ms p95 latency
Reltio2024.22024-06SupportedZero-shot learning matching; bulk API improvements
SAP MDGS/4HANA 2023 FPS022024-04CurrentCloud-native deployment; improved OData APIs
Profisee2024.12024-03CurrentAzure-native rewrite; REST API v2

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
2+ ERP systems with overlapping master data domainsSingle ERP with no external sourcesNative ERP data governance (SAP MDG standalone)
Customer/vendor duplicates across systems cause operational issuesData quality issues within a single system onlyData quality tools (Informatica DQ, Ataccama)
Regulatory compliance requires single customer view (KYC, GDPR)Compliance met with system-level controlsPer-system compliance tooling
M&A integration requires merging acquired company master dataOne-time migration without ongoing syncETL migration with reconciliation
100K+ records with >5% estimated duplicate rate<10K records with minimal duplicationSpreadsheet-based deduplication

Cross-System Comparison

CapabilityInformatica IDMCReltioSAP MDGProfiseeNotes
ArchitectureCloud-native SaaSCloud-native SaaSOn-premise + cloudCloud (Azure-native)
Matching EngineCLAIRE AI (ML + rules)FERN (LLM-powered)HANA-based fuzzy matchRules + MLReltio fastest
Match Latency (p95)~500ms<300ms~1-2s (incl. workflow)~400ms
Pre-built Connectors300+50+ (API-first)Native SAP, limited non-SAP30+ (Azure)Informatica widest
Survivorship RulesAttribute-level, stackedAttribute-level, confidenceField-level with workflowAttribute-level
Multi-domainYesYes (connected graph)Yes (BP, Material, Finance)Yes
Governance WorkflowBuilt-in stewardshipBuilt-in stewardshipFull change request + approvalBuilt-in stewardshipSAP strongest governance
Deployment Time3-6 months<90 days6-12 months3-6 monthsReltio fastest
Pricing ModelTier (records + API calls)Tier (entities + users)License + SAP infraTier (records)
Best ForEnterprise, 100+ sourcesCloud-first, real-timeSAP-heavy landscapeMicrosoft/Azure stack

Important Caveats

Related Units