Loading...
Loading...
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 omnistudio-integration-procedure-generate), authoring OmniScripts (use omnistudio-omniscript-generate), or analyzing cross-component dependencies (use omnistudio-dependencies-analyze).
npx skill4agent add forcedotcom/sf-skills omnistudio-datamapper-generateomnistudio-integration-procedure-generateomnistudio-omniscript-generateomnistudio-flexcard-generateomnistudio-dependencies-analyze| 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. |
Glob: **/OmniDataTransform*Glob: **/omnistudio/**| Type | Use Case | Naming Prefix | Supports DML | Supports SOQL |
|---|---|---|---|---|
| Extract | Read data from one or more objects with relationship queries | | No | Yes |
| Turbo Extract | High-volume read-only queries, server-side compiled | | No | Yes (compiled) |
| Transform | In-memory data reshaping between procedure steps | | No | No |
| Load | Write data (insert, update, upsert, delete) | | Yes | No |
[Prefix][Object]_[Purpose]DR_Extract_Account_DetailsDR_TurboExtract_Case_ListDR_Transform_Lead_FlattenDR_Load_Opportunity_Createassets/omni-data-transform-extract.jsonassets/omni-data-transform-transform.jsonassets/omni-data-transform-load.jsonassets/omni-data-transform-item.jsonassets/completion-summary-template.md"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 |
Entity cannot be foundsfdx-project.jsonOmniDataTransformsf apex log list -o <org>allOrNone=falseisSuccess=falseassets/completion-summary-template.md| Category | Points | Key Rules |
|---|---|---|
| Design & Naming | 20 | Correct type selection; naming follows |
| 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 |
sf data query -q "SELECT Id,Name,Type FROM OmniDataTransform LIMIT 200" -o <org>sf data query -q "SELECT Id,Name,InputObjectName,OutputObjectName,LookupObjectName FROM OmniDataTransformItem WHERE OmniDataTransformationId='<id>' LIMIT 200" -o <org>sf project retrieve start -m OmniDataTransform:<Name> -o <org>sf project deploy start -m OmniDataTransform:<Name> -o <org>assets/omni-data-transform-*.jsonassets/omni-data-transform-item.jsonassets/completion-summary-template.md| From Skill | To omnistudio-datamapper-generate | When |
|---|---|---|
| omnistudio-dependencies-analyze | -> omnistudio-datamapper-generate | "Analyze dependencies before creating Data Mapper" |
| platform-custom-object-generate / platform-custom-field-generate | -> omnistudio-datamapper-generate | "Describe target object fields before mapping" |
| platform-soql-query | -> omnistudio-datamapper-generate | "Validate Extract query logic" |
| From omnistudio-datamapper-generate | To Skill | When |
|---|---|---|
| omnistudio-datamapper-generate | -> omnistudio-integration-procedure-generate | "Create Integration Procedure that calls this Data Mapper" |
| omnistudio-datamapper-generate | -> platform-metadata-deploy | "Deploy Data Mapper to target org" |
| omnistudio-datamapper-generate | -> omnistudio-omniscript-generate | "Wire Data Mapper output into OmniScript" |
| omnistudio-datamapper-generate | -> omnistudio-flexcard-generate | "Display Data Mapper Extract results in FlexCard" |
| Issue | Resolution |
|---|---|
| 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., |
| 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 |
| Draft Data Mapper not retrievable | |
| Foreign key field name wrong | The parent lookup on |
assets/completion-summary-template.mdsf api request rest --method POST --body @file.jsonsf data create record --values| File | When to Read |
|---|---|
| Phase 3 Generation — template for Extract type OmniDataTransform records |
| Phase 3 Generation — template for Transform type OmniDataTransform records |
| Phase 3 Generation — template for Load type OmniDataTransform records |
| Phase 3 Generation — template for each OmniDataTransformItem field mapping |
| Phase 3 & 5 — scoring output format and completion summary template |
| Phase 3 Guardrails — detailed patterns for field mapping, query optimization, null handling, and performance |
| Phase 2 Design — full naming rules for all Data Mapper types and field mapping conventions |