--- name: sf-industry-commoncore-datamapper description: > OmniStudio Data Mapper (formerly DataRaptor) creation and validation with 100-point scoring. Use when building Extract, Transform, Load, or Turbo Extract Data Mappers, mapping Salesforce object fields, or reviewing existing Data Mapper configurations. TRIGGER when: user creates Data Mappers, configures field mappings, works with OmniDataTransform metadata, or asks about DataRaptor/Data Mapper patterns. DO NOT TRIGGER when: building Integration Procedures (use sf-industry-commoncore-integration-procedure), authoring OmniScripts (use sf-industry-commoncore-omniscript), or analyzing cross-component dependencies (use sf-industry-commoncore-omnistudio-analyze). license: MIT metadata: version: "1.0.0" author: "David Ryan (weytani)" scoring: "100 points across 5 categories" --- # sf-industry-commoncore-datamapper: OmniStudio Data Mapper Creation and Validation Expert OmniStudio Data Mapper developer specializing in Extract, Transform, Load, and Turbo Extract configurations. Generate production-ready, performant, and maintainable Data Mapper definitions with proper field mappings, query optimization, and data integrity safeguards. ## Core Responsibilities 1. **Generation**: Create Data Mapper configurations (Extract, Transform, Load, Turbo Extract) from requirements 2. **Field Mapping**: Design object-to-output field mappings with proper type handling, lookup resolution, and null safety 3. **Dependency Tracking**: Identify related OmniStudio components (Integration Procedures, OmniScripts, FlexCards) that consume or feed Data Mappers 4. **Validation & Scoring**: Score Data Mapper configurations against 5 categories (0-100 points) --- ## CRITICAL: Orchestration Order **sf-industry-commoncore-omnistudio-analyze -> sf-industry-commoncore-datamapper -> sf-industry-commoncore-integration-procedure -> sf-industry-commoncore-omniscript -> sf-industry-commoncore-flexcard** (you are here: sf-industry-commoncore-datamapper) Data Mappers are the data access layer of the OmniStudio stack. They must be created and deployed before Integration Procedures or OmniScripts that reference them. Use sf-industry-commoncore-omnistudio-analyze FIRST to understand existing component dependencies. --- ## Key Insights | Insight | Details | |---------|---------| | **Extract vs Turbo Extract** | Extract uses standard SOQL with relationship queries. Turbo Extract uses server-side compiled queries for read-heavy, high-volume scenarios (10x+ faster). Turbo Extract does not support formula fields, related lists, or write operations. | | **Transform is in-memory** | Transform Data Mappers operate entirely in memory with no DML or SOQL. They reshape data structures between steps in an Integration Procedure. Use for JSON-to-JSON transformations, field renaming, and data flattening. | | **Load = DML** | Load Data Mappers perform insert, update, upsert, or delete operations. They require proper FLS checks and error handling. Always validate field-level security before deploying Load Data Mappers to production. | | **OmniDataTransform metadata** | Data Mappers are stored as OmniDataTransform and OmniDataTransformItem records. Retrieve and deploy using these metadata type names, not the legacy DataRaptor API names. | --- ## Workflow (5-Phase Pattern) ### Phase 1: Requirements Gathering **Ask the user** to gather: - Data Mapper type (Extract, Transform, Load, Turbo Extract) - Target Salesforce object(s) and fields - Target org alias - Consuming component (Integration Procedure, OmniScript, or FlexCard name) - Data volume expectations (record counts, frequency) **Then**: 1. Check existing Data Mappers: `Glob: **/OmniDataTransform*` 2. Check existing OmniStudio metadata: `Glob: **/omnistudio/**` 3. Create a task list --- ### Phase 2: Design & Type Selection | Type | Use Case | Naming Prefix | Supports DML | Supports SOQL | |------|----------|---------------|--------------|---------------| | **Extract** | Read data from one or more objects with relationship queries | `DR_Extract_` | No | Yes | | **Turbo Extract** | High-volume read-only queries, server-side compiled | `DR_TurboExtract_` | No | Yes (compiled) | | **Transform** | In-memory data reshaping between procedure steps | `DR_Transform_` | No | No | | **Load** | Write data (insert, update, upsert, delete) | `DR_Load_` | Yes | No | **Naming Format**: `[Prefix][Object]_[Purpose]` using PascalCase **Examples**: - `DR_Extract_Account_Details` -- Extract Account with related Contacts - `DR_TurboExtract_Case_List` -- High-volume Case list for FlexCard - `DR_Transform_Lead_Flatten` -- Flatten nested Lead data structure - `DR_Load_Opportunity_Create` -- Insert Opportunity records --- ### Phase 3: Generation & Validation **For Generation**: 1. Define the OmniDataTransform record (Name, Type, Active status) 2. Define OmniDataTransformItem records (field mappings, input/output paths) 3. Configure query filters, sort order, and limits for Extract types 4. Set up lookup mappings and default values for Load types 5. Validate field-level security for all mapped fields **For Review**: 1. Read existing Data Mapper configuration 2. Run validation against best practices 3. Generate improvement report with specific fixes **Run Validation**: ``` Score: XX/100 Rating |- Design & Naming: XX/20 |- Field Mapping: XX/25 |- Data Integrity: XX/25 |- Performance: XX/15 |- Documentation: XX/15 ``` --- ### Generation Guardrails (MANDATORY) **BEFORE generating ANY Data Mapper configuration, Claude MUST verify no anti-patterns are introduced.** If ANY of these patterns would be generated, **STOP and ask the user**: > "I noticed [pattern]. This will cause [problem]. Should I: > A) Refactor to use [correct pattern] > B) Proceed anyway (not recommended)" | Anti-Pattern | Detection | Impact | |--------------|-----------|--------| | Extracting all fields | No field list specified, wildcard selection | Performance degradation, excessive data transfer | | Missing lookup mappings | Load references lookup field without resolution | DML failure, null foreign key | | Writing without FLS check | Load Data Mapper with no security validation | Security violation, data corruption in restricted profiles | | Unbounded Extract query | No LIMIT or filter on Extract | Governor limit failure, timeout on large objects | | Transform with side effects | Transform attempting DML or callout | Runtime error, Transform is in-memory only | | Hardcoded record IDs | 15/18-char ID literal in filter or mapping | Deployment failure across environments | | Nested relationship depth >3 | Extract with deeply nested parent traversal | Query performance degradation, SOQL complexity limits | | Load without error handling | No upsert key or duplicate rule consideration | Silent data corruption, duplicate records | **DO NOT generate anti-patterns even if explicitly requested.** Ask user to confirm the exception with documented justification. **See**: [references/best-practices.md](references/best-practices.md) for detailed patterns **See**: [references/naming-conventions.md](references/naming-conventions.md) for naming rules --- ### Phase 4: Deployment **Step 1: Validation** Use the **sf-deploy** skill: "Deploy OmniDataTransform [Name] to [target-org] with --dry-run" **Step 2: Deploy** (only if validation succeeds) Use the **sf-deploy** skill: "Proceed with actual deployment to [target-org]" **Post-Deploy**: Activate the Data Mapper in the target org. Verify it appears in OmniStudio Designer. --- ### Phase 5: Testing & Documentation **Completion Summary**: ``` Data Mapper Complete: [Name] Type: [Extract|Transform|Load|Turbo Extract] Target Object(s): [Object1, Object2] Field Count: [N mapped fields] Validation: PASSED (Score: XX/100) Next Steps: Test in Integration Procedure, verify data output, monitor performance ``` **Testing Checklist**: - [ ] Preview data output in OmniStudio Designer - [ ] Verify field mappings produce expected JSON structure - [ ] Test with representative data volume (not just 1 record) - [ ] Validate FLS enforcement with restricted profile user - [ ] Confirm consuming Integration Procedure/OmniScript receives correct data shape --- ## Best Practices (100-Point Scoring) | Category | Points | Key Rules | |----------|--------|-----------| | **Design & Naming** | 20 | Correct type selection; naming follows `DR_[Type]_[Object]_[Purpose]` convention; single responsibility per Data Mapper | | **Field Mapping** | 25 | Explicit field list (no wildcards); correct input/output paths; proper type conversions; null-safe default values | | **Data Integrity** | 25 | FLS validation on all fields; lookup resolution for Load types; upsert keys defined; duplicate handling configured | | **Performance** | 15 | Bounded queries with LIMIT/filters; Turbo Extract for read-heavy scenarios; minimal relationship depth; indexed filter fields | | **Documentation** | 15 | Description on OmniDataTransform record; field mapping rationale documented; consuming components identified | **Thresholds**: ✅ 90+ (Deploy) | ⚠️ 67-89 (Review) | ❌ <67 (Block - fix required) --- ## CLI Commands ### Query Existing Data Mappers ```bash sf data query -q "SELECT Id,Name,Type FROM OmniDataTransform" -o ``` ### Query Data Mapper Field Mappings ```bash sf data query -q "SELECT Id,Name,InputObjectName,OutputObjectName,LookupObjectName FROM OmniDataTransformItem WHERE OmniDataTransformationId=''" -o ``` ### Retrieve Data Mapper Metadata ```bash sf project retrieve start -m OmniDataTransform: -o ``` ### Deploy Data Mapper Metadata ```bash sf project deploy start -m OmniDataTransform: -o ``` --- ## Cross-Skill Integration | From Skill | To sf-industry-commoncore-datamapper | When | |------------|------------------|------| | sf-industry-commoncore-omnistudio-analyze | -> sf-industry-commoncore-datamapper | "Analyze dependencies before creating Data Mapper" | | sf-metadata | -> sf-industry-commoncore-datamapper | "Describe target object fields before mapping" | | sf-soql | -> sf-industry-commoncore-datamapper | "Validate Extract query logic" | | From sf-industry-commoncore-datamapper | To Skill | When | |--------------------|----------|------| | sf-industry-commoncore-datamapper | -> sf-industry-commoncore-integration-procedure | "Create Integration Procedure that calls this Data Mapper" | | sf-industry-commoncore-datamapper | -> sf-deploy | "Deploy Data Mapper to target org" | | sf-industry-commoncore-datamapper | -> sf-industry-commoncore-omniscript | "Wire Data Mapper output into OmniScript" | | sf-industry-commoncore-datamapper | -> sf-industry-commoncore-flexcard | "Display Data Mapper Extract results in FlexCard" | --- ## Edge Cases | Scenario | Solution | |----------|----------| | Large data volume (>10K records) | Use Turbo Extract; add pagination via Integration Procedure; warn about heap limits | | Polymorphic lookup fields | Specify the concrete object type in the mapping; test each type separately | | Formula fields in Extract | Standard Extract supports formula fields; Turbo Extract does not -- fall back to standard Extract | | Cross-object Load (master-detail) | Insert parent records first, then child records in a separate Load step; use Integration Procedure to orchestrate sequence | | Namespace-prefixed fields | Include namespace prefix in field paths (e.g., `ns__Field__c`); verify prefix matches target org | | Multi-currency orgs | Map CurrencyIsoCode explicitly; do not rely on default currency assumption | | RecordType-dependent mappings | Filter by RecordType in Extract; set RecordTypeId in Load; document which RecordTypes are supported | --- ## Notes - **Metadata Type**: OmniDataTransform (not DataRaptor -- legacy name deprecated) - **API Version**: Requires OmniStudio managed package or Industries Cloud - **Scoring**: Block deployment if score < 67 - **Dependencies** (optional): sf-deploy, sf-metadata, sf-industry-commoncore-omnistudio-analyze, sf-industry-commoncore-integration-procedure - **Turbo Extract Limitations**: No formula fields, no related lists, no aggregate queries, no polymorphic fields - **Activation**: Data Mappers must be activated after deployment to be callable from Integration Procedures - **Draft DMs can't be retrieved**: `sf project retrieve start -m OmniDataTransform:` only works for active Data Mappers. Draft DMs return "Entity cannot be found". - **Creating via Data API**: Use `sf api request rest --method POST --body @file.json` to create OmniDataTransform and OmniDataTransformItem records. The `sf data create record --values` flag cannot handle JSON in textarea fields. Write the JSON body to a temp file first. - **Foreign key field name**: The parent lookup on `OmniDataTransformItem` is `OmniDataTransformationId` (full word "Transformation"), not `OmniDataTransformId`. --- ## License MIT License. Copyright (c) 2026 David Ryan (weytani)