
Sf Omnistudio
- 37 installs
- 12 repo stars
- Updated July 14, 2026
- clientell-ai/salesforce-skills
sf-omnistudio turns a coding agent into a Salesforce OmniStudio specialist: it detects which namespace an org runs (Core, vlocity_cmt, vlocity_ins) and maps object and field API names across all three variants.
About
sf-omnistudio makes a coding agent behave like a Salesforce OmniStudio specialist for developers building or migrating OmniScripts, FlexCards, Integration Procedures, and Data Mappers. Its core move is namespace detection: before touching metadata it probes the connected org with sf data query (OmniProcess for Core, vlocity_cmt__OmniScript__c for CMT, vlocity_ins__OmniScript__c for INS), reading INVALID_TYPE errors as absence, so generated SOQL and retrieve/deploy commands use the API names that org actually has. Side-by-side tables then map every concept across the three namespaces, and a 12-row gotchas table encodes the traps that break agent-written code: the long-form OmniDataTransformationId foreign key, the plural IntegrationProcedures data source type on FlexCards, IP caching silently skipping DML, and drafts not being retrievable. It also carries a 7-step Vlocity-to-Core migration sequence and enforces bottom-up deploy order: Data Mappers, then Integration Procedures, then OmniScripts, then FlexCards. Requires Salesforce CLI v2+ and an org licensed for OmniStudio or Industries Cloud.
- Namespace detection via ordered probe queries: OmniProcess for Core, then the vlocity_cmt and vlocity_ins objects
- Side-by-side object mapping for OmniScripts, elements, FlexCards, and Data Mappers across all three namespaces
- 12-row gotchas table: OmniDataTransformationId spelling trap, plural IntegrationProcedures, IP cache DML skips
- 7-step Vlocity-to-Core migration sequence with bottom-up deploy order: Data Mappers, IPs, OmniScripts, FlexCards
- CLI quick reference: sf data query inventories plus retrieve and deploy commands per OmniStudio metadata type
Sf Omnistudio by the numbers
- 37 all-time installs (skills.sh)
- Ranked #3,308 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/clientell-ai/salesforce-skills --skill sf-omnistudioAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 37 |
|---|---|
| repo stars | ★ 12 |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 14, 2026 |
| Repository | clientell-ai/salesforce-skills ↗ |
What it does
Building, reviewing, or troubleshooting Salesforce OmniStudio components with the sf CLI, and migrating Vlocity CMT/INS metadata to the OmniStudio Core namespace in dependency order.
Who is it for?
Salesforce developers using Claude Code with the sf CLI against Industries Cloud orgs, especially teams migrating Vlocity CMT or INS components to OmniStudio Core
Skip if: Standard Salesforce development outside OmniStudio (Apex classes, plain Lightning Web Components, Screen Flows) or orgs without an OmniStudio or Industries Cloud license.
When should I use this skill?
Working with OmniStudio components: building or debugging OmniScripts, FlexCards, Integration Procedures, or Data Mappers, tracing dependencies before a change, or migrating Vlocity CMT/INS metadata to OmniStudio Core.
What you get
The agent probes the org before querying, uses namespace-correct API names, deploys bottom-up (Data Mappers, IPs, OmniScripts, FlexCards), and avoids traps like cached Integration Procedures skipping DML.
- Namespace detection verdict for the connected org
- Namespace-correct SOQL queries and sf retrieve/deploy commands
- Dependency map linking Data Mappers, Integration Procedures, OmniScripts, and FlexCards
By the numbers
- 4 component types covered: OmniScript, FlexCard, Integration Procedure, Data Mapper
- 3 namespace variants mapped: Core, vlocity_cmt, vlocity_ins
- 12-row gotchas table of OmniStudio traps
Files
OmniStudio Development Guide
You are a Salesforce OmniStudio specialist. Build, review, and troubleshoot all OmniStudio components: OmniScripts, FlexCards, Integration Procedures, and Data Mappers.
OmniStudio Overview
OmniStudio is Salesforce Industries' declarative development framework for building guided digital experiences without code. It provides four primary component types that work together:
| Component | Purpose | Analogy |
|---|---|---|
| OmniScript | Multi-step guided wizard for user interaction | Screen Flow |
| FlexCard | At-a-glance UI card displaying data | Lightning Component |
| Integration Procedure | Server-side process orchestration | Apex Service Layer |
| Data Mapper | Data extraction, transformation, and loading | SOQL + DML abstraction |
Component dependency chain (build bottom-up):
Data Mapper --> Integration Procedure --> OmniScript --> FlexCard
(data) (orchestration) (wizard) (display)Data Mappers read/write Salesforce data. Integration Procedures orchestrate Data Mappers, Apex, and HTTP calls. OmniScripts present guided UIs that invoke Integration Procedures. FlexCards display summary data and can launch OmniScripts.
Namespace Guide
OmniStudio exists in three namespace variants. You MUST detect the namespace before querying any component metadata.
| Namespace | Package | Industry |
|---|---|---|
| Core (no prefix) | OmniStudio managed package / Industries Cloud | All industries (Spring '22+) |
| vlocity_cmt | Vlocity CMT | Communications, Media, Energy |
| vlocity_ins | Vlocity INS | Insurance, Health |
Namespace Detection
Try querying a known object from each namespace. An INVALID_TYPE error means that variant isn't installed; a valid response (even totalSize: 0) confirms it.
| Namespace | Test Query | Object to Probe |
|---|---|---|
| Core | sf data query -q "SELECT Id FROM OmniProcess LIMIT 1" -o <org> | OmniProcess |
| vlocity_cmt | sf data query -q "SELECT Id FROM vlocity_cmt__OmniScript__c LIMIT 1" -o <org> | vlocity_cmt__OmniScript__c |
| vlocity_ins | sf data query -q "SELECT Id FROM vlocity_ins__OmniScript__c LIMIT 1" -o <org> | vlocity_ins__OmniScript__c |
Start with Core (the modern path) and fall back to Vlocity variants if it fails.
Object Name Mapping
| Concept | Core | vlocity_cmt | vlocity_ins |
|---|---|---|---|
| OmniScript / IP | OmniProcess | vlocity_cmt__OmniScript__c | vlocity_ins__OmniScript__c |
| Elements | OmniProcessElement | vlocity_cmt__Element__c | vlocity_ins__Element__c |
| FlexCard | OmniUiCard | vlocity_cmt__VlocityUITemplate__c | vlocity_ins__VlocityUITemplate__c |
| Data Mapper | OmniDataTransform | vlocity_cmt__DRBundle__c | vlocity_ins__DRBundle__c |
| Data Mapper Item | OmniDataTransformItem | vlocity_cmt__DRMapItem__c | vlocity_ins__DRMapItem__c |
See references/omnistudio-reference.md for the complete field-level mapping.
OmniScripts
OmniScripts are multi-step, interactive guided experiences (wizards). They collect user input, call server-side logic, and present results -- all declaratively.
Identification
Every OmniScript is uniquely identified by a Type / SubType / Language triplet (e.g., ServiceRequest / NewCase / English). Multiple versions can exist; only one is active per triplet.
In Core namespace, OmniScripts are stored in OmniProcess with IsIntegrationProcedure = false.
Element Types
Containers: Step, Conditional Block, Loop Block, Edit Block
Inputs: Text, Text Area, Number, Date, Date/Time, Checkbox, Radio, Select, Multi-select, Type Ahead, File, Currency, Email, Telephone, URL, Signature, Password, Range, Time
Display: Text Block, Headline, Aggregate, Disclosure, Image, Chart
Actions: DataRaptor Extract Action, DataRaptor Load Action, Integration Procedure Action, Remote Action, Navigate Action, Email Action, DocuSign Envelope Action
Logic: Set Values, Validation, Formula, Submit Action
Element Hierarchy
Elements use Level and Order fields to form a tree. Level 0 = Steps (pages in the wizard). Level 1+ = elements within steps. Order determines sequence within a level.
Data Flow
OmniScripts maintain a single JSON data structure passed through all steps. Elements read from and write to this shared JSON using merge field syntax (%fieldName%). Action elements map input/output between the JSON and server calls.
LWC-Enabled OmniScripts
LWC OmniScripts render using Lightning Web Components instead of Aura. Key differences:
- Use
omnistudio-omniscriptbase component - Custom elements must extend
OmniscriptBaseMixin - CSS styling uses SLDS tokens instead of Aura-specific classes
- Event model differs (LWC custom events vs Aura events)
- Cannot embed Aura components inside LWC OmniScripts
OmniScript Best Practices
- Limit to 7-10 input elements per Step for usability
- Add validation on all required inputs
- Configure error handling on every action element (
showError,errorMessage) - Use conditional visibility (
showexpressions) to hide irrelevant fields - Fire data-loading actions on step entry, not on OmniScript load
- Never embed OmniScript A in B if B embeds A (circular embedding causes infinite loops)
- Never hardcode Salesforce record IDs in PropertySetConfig
FlexCards
FlexCards are declarative UI cards that display at-a-glance information with data from Integration Procedures, SOQL, or REST sources.
Data Sources
FlexCards bind to data sources configured in the DataSourceConfig JSON field on OmniUiCard. Core namespace splits what Vlocity stored in a single Definition blob into separate DataSourceConfig and PropertySetConfig fields.
| Source Type | dataSource.type Value | Use Case |
|---|---|---|
| Integration Procedure | IntegrationProcedures (must be plural) | Primary pattern for live data |
| SOQL | SOQL | Direct queries (prefer IP for abstraction) |
| Apex Remote | ApexRemote | Custom Apex class invocation |
| REST | REST | External API via Named Credential |
Data sources pass context via input parameters (e.g., {recordId}) and map response fields to card elements using {fieldName} merge syntax.
Layout Types
| Layout | Use Case |
|---|---|
| Single Card | Record summary display |
| Card List | Repeating cards from array data |
| Tabbed Card | Multiple views as tabs |
| Flyout Card | Expandable detail panel |
Actions and Child Cards
FlexCards can launch OmniScripts via action buttons, passing context data as input. Cards can embed other FlexCards as child cards (limit nesting to 2 levels for performance). LWC FlexCards follow the same patterns but render as Lightning Web Components.
FlexCard Best Practices
- Always configure empty-state messaging when data source returns no records
- Use SLDS design tokens for styling (no hardcoded colors)
- Add
aria-labelon all interactive elements for accessibility - Limit child card nesting to 2 levels
- Verify all referenced Integration Procedures are active before deployment
Integration Procedures
Integration Procedures (IPs) are server-side orchestrations that combine Data Mapper actions, Apex calls, HTTP callouts, and conditional logic into declarative multi-step operations.
Identification
IPs use a Type / SubType pair as their key (e.g., AccountOnboarding / Standard). In Core namespace, IPs are stored in OmniProcess with IsIntegrationProcedure = true.
Action Types
| Element Type | Purpose | Key PropertySet Fields |
|---|---|---|
| DataRaptor Extract Action | Read Salesforce data | bundle (Data Mapper name) |
| DataRaptor Load Action | Write Salesforce data | bundle |
| DataRaptor Transform Action | In-memory data reshaping | bundle |
| Remote Action | Call Apex class method | remoteClass, remoteMethod |
| Integration Procedure Action | Call nested IP | ipMethod (Type_SubType format) |
| HTTP Action | External API callout | path, method, httpUrl |
| Matrix Action | Decision table lookup | matrixName |
| Email Action | Send email | emailTemplateId |
| Conditional Block | Branching logic | condition expression |
| Loop Block | Iterate over collections | loop source path |
| Set Values | Assign variables | key-value pairs |
Response Mapping
Each element's output is namespaced under its element name in the response JSON. Reference upstream outputs in downstream inputs using %elementName:keyPath% syntax.
Caching
IPs support platform cache for read-heavy orchestrations. Set cacheType and cacheTTL in the procedure's PropertySet. Never cache procedures that perform DML -- cached results bypass actual data operations.
Integration Procedure Best Practices
- Deploy all referenced Data Mappers before deploying the IP
- Set LIMIT on all DataRaptor Extract actions to avoid governor limits
- Wrap DataRaptor Load actions in error handling (try/catch or conditional checks)
- Never create circular IP call chains (A calls B calls A)
- Use parallel execution for independent elements
- Never hardcode Salesforce IDs or API credentials in PropertySetConfig
- Use Named Credentials for external API authentication
Data Mappers / DataRaptors
Data Mappers (formerly DataRaptors) provide declarative data access for OmniStudio. They handle Extract, Transform, and Load operations against Salesforce objects.
Types
| Type | Purpose | Reads Data | Writes Data | Naming Prefix |
|---|---|---|---|---|
| Extract | Query records with relationship support | Yes (SOQL) | No | DR_Extract_ |
| Turbo Extract | High-volume compiled queries (10x faster) | Yes (compiled) | No | DR_TurboExtract_ |
| Transform | In-memory data reshaping (JSON-to-JSON) | No | No | DR_Transform_ |
| Load | Insert, update, upsert, or delete records | No | Yes (DML) | DR_Load_ |
Metadata Structure
Data Mappers are stored as OmniDataTransform records (parent) with OmniDataTransformItem records (field mappings). Watch out: the child-to-parent lookup field uses the unabbreviated spelling OmniDataTransformationId — developers often mistakenly try OmniDataTransformId, which doesn't exist.
Turbo Extract Limitations
Turbo Extract does NOT support: formula fields, related lists, aggregate queries, polymorphic fields. Fall back to standard Extract for these cases.
Data Mapper Best Practices
- Always specify explicit field lists (no wildcards)
- Add LIMIT and filter conditions on all Extract queries
- Validate field-level security before deploying Load Data Mappers
- Use upsert keys to prevent duplicate records on Load
- Activate Data Mappers after deployment (inactive ones are not callable)
- Name using
DR_[Type]_[Object]_[Purpose]convention in PascalCase
Dependency Mapping
OmniStudio components form a directed dependency graph. Trace dependencies to understand impact before modifying any component.
Dependency Sources
| Component | Where Dependencies Live | What to Parse |
|---|---|---|
| OmniScript | PropertySetConfig on OmniProcessElement | bundle (Data Mapper), ipMethod (IP), omniScriptKey (nested OS) |
| Integration Procedure | PropertySetConfig on OmniProcessElement | bundle, remoteClass, integrationProcedureKey, httpUrl |
| FlexCard | DataSourceConfig on OmniUiCard | dataSource.value.ipMethod (IP), dataSource.value.className (Apex) |
| Data Mapper | InputObjectName / OutputObjectName on OmniDataTransformItem | Source and target sObjects |
Dependency Queries (Core Namespace)
# OmniScript/IP elements with config
sf data query -q "SELECT Id, OmniProcessId, Name, Type, PropertySetConfig FROM OmniProcessElement WHERE OmniProcessId = '<id>'" -o <org> --json
# FlexCard data sources
sf data query -q "SELECT Id, Name, DataSourceConfig FROM OmniUiCard WHERE IsActive = true" -o <org> --json
# Data Mapper object references
sf data query -q "SELECT Id, OmniDataTransformationId, InputObjectName, OutputObjectName FROM OmniDataTransformItem" -o <org> --jsonImpact Analysis
When modifying a component, trace all dependents upstream: 1. Changing a Data Mapper? Find all IPs and OmniScripts referencing its bundle name 2. Changing an IP? Find all OmniScripts with matching ipMethod and FlexCards with matching data source 3. Changing an OmniScript? Find all FlexCards with launch actions targeting it 4. Check both active and inactive components -- inactive ones may become active later
Migration Patterns
Vlocity to OmniStudio Core Migration
When migrating from Vlocity (vlocity_cmt or vlocity_ins) to OmniStudio Core:
1. Inventory: Catalog all components in the source namespace using analysis queries 2. Namespace conversion: Map all object and field API names from Vlocity to Core equivalents (see Namespace Guide above) 3. Export: Extract component definitions as JSON from source org 4. Transform: Convert namespace-prefixed field references in PropertySetConfig, DataSourceConfig, and element configurations 5. Deploy order: Data Mappers first, then Integration Procedures, then OmniScripts, then FlexCards 6. Validate: Run each component in the target org, verifying data flow end-to-end 7. Decommission: Deactivate Vlocity components only after Core equivalents are verified
Key conversion points:
vlocity_cmt__OmniScript__cbecomesOmniProcessvlocity_cmt__PropertySet__cbecomesPropertySetConfigvlocity_cmt__DRBundle__cbecomesOmniDataTransformvlocity_cmt__Definition__con FlexCards becomesDataSourceConfigonOmniUiCardIsIntegrationProcedureboolean discriminates OmniScripts from IPs in Core
Gotchas
| Issue | Detail |
|---|---|
| Namespace conflicts | During migration, both old and new namespace objects may exist. Always detect namespace before querying. |
| DataRaptor vs Data Mapper naming | "DataRaptor" is the legacy name. Core namespace uses "Data Mapper" terminology and OmniDataTransform API name, but element types in PropertySetConfig still say "DataRaptor". |
| Versioning | Only one version can be active per Type/SubType/Language triplet. Activating a new version automatically deactivates the previous one. |
| LWC vs Aura OmniScripts | LWC OmniScripts cannot embed Aura components. CSS classes differ. Event handling is different. Test both if migrating. |
| IP caching with DML | Caching an IP that performs DML silently skips the DML on cache hits. Never cache write operations. |
| Deployment order | Components must deploy bottom-up: Data Mappers, then IPs, then OmniScripts, then FlexCards. Deploying out of order causes broken references. |
| FlexCard stores config differently in Core | Core namespace OmniUiCard splits configuration across DataSourceConfig and PropertySetConfig fields — there is no single Definition blob like Vlocity used. |
| OmniProcessType is computed | The OmniProcessType picklist on OmniProcess is derived from IsIntegrationProcedure. You cannot set it directly on create. |
| CLI record creation fails for JSON fields | Textarea fields containing JSON (like PropertySetConfig) break sf data create record. Instead, POST the full record body via sf api request rest --body @file.json. |
| Foreign key spelling trap | OmniDataTransformItem links to its parent via OmniDataTransformationId — the field uses the long-form spelling, which trips up queries using the short form. |
| Data source type is plural | When configuring a FlexCard to call an IP, the dataSource.type value must be IntegrationProcedures — the singular form silently fails. |
| Draft components | Draft Data Mappers cannot be retrieved via sf project retrieve start. Only active ones are retrievable. |
Workflow
1. Detect namespace using the probe queries above 2. Inventory existing components -- query all OmniScripts, IPs, FlexCards, and Data Mappers 3. Map dependencies between components before making changes 4. Build bottom-up -- Data Mappers, then IPs, then OmniScripts, then FlexCards 5. Deploy in dependency order to avoid broken references 6. Activate components after deployment (inactive components are not callable at runtime) 7. Test end-to-end -- verify data flows from Data Mapper through IP to OmniScript/FlexCard
CLI Quick Reference
# List OmniScripts
sf data query -q "SELECT Id,Type,SubType,Language,IsActive,VersionNumber FROM OmniProcess WHERE IsIntegrationProcedure=false" -o <org>
# List Integration Procedures
sf data query -q "SELECT Id,Type,SubType,IsActive FROM OmniProcess WHERE IsIntegrationProcedure=true" -o <org>
# List FlexCards
sf data query -q "SELECT Id,Name,IsActive FROM OmniUiCard" -o <org>
# List Data Mappers
sf data query -q "SELECT Id,Name,Type,IsActive FROM OmniDataTransform" -o <org>
# Retrieve OmniStudio metadata
sf project retrieve start -m OmniScript:<Name> -o <org>
sf project retrieve start -m OmniIntegrationProcedure:<Name> -o <org>
sf project retrieve start -m OmniUiCard:<Name> -o <org>
sf project retrieve start -m OmniDataTransform:<Name> -o <org>
# Deploy OmniStudio metadata (respect dependency order)
sf project deploy start -m OmniDataTransform -o <org>
sf project deploy start -m OmniIntegrationProcedure -o <org>
sf project deploy start -m OmniScript -o <org>
sf project deploy start -m OmniUiCard -o <org>References
- OmniStudio Reference -- namespace field mapping, metadata structures, element types, deployment order, migration checklist
OmniStudio Reference
Deep reference for OmniStudio component metadata, namespace mappings, and operational guidance.
Namespace Detection Queries
Run these queries sequentially. The first successful result identifies the installed namespace.
-- Probe 1: Core (Industries Cloud, Spring '22+)
SELECT COUNT() FROM OmniProcess
-- Probe 2: Vlocity CMT (Communications, Media, Energy)
SELECT COUNT() FROM vlocity_cmt__OmniScript__c
-- Probe 3: Vlocity INS (Insurance, Health)
SELECT COUNT() FROM vlocity_ins__OmniScript__cA successful query returns exit code 0 with totalSize in JSON output. An INVALID_TYPE error means that namespace is absent.
Complete Namespace Field Mapping
Primary Objects
| Concept | Core | vlocity_cmt | vlocity_ins |
|---|---|---|---|
| OmniScript / IP container | OmniProcess | vlocity_cmt__OmniScript__c | vlocity_ins__OmniScript__c |
| OmniScript / IP elements | OmniProcessElement | vlocity_cmt__Element__c | vlocity_ins__Element__c |
| FlexCard | OmniUiCard | vlocity_cmt__VlocityUITemplate__c | vlocity_ins__VlocityUITemplate__c |
| Data Mapper | OmniDataTransform | vlocity_cmt__DRBundle__c | vlocity_ins__DRBundle__c |
| Data Mapper Item | OmniDataTransformItem | vlocity_cmt__DRMapItem__c | vlocity_ins__DRMapItem__c |
Key Fields
| Concept | Core Field | vlocity_cmt Field | vlocity_ins Field |
|---|---|---|---|
| Script type | Type | vlocity_cmt__Type__c | vlocity_ins__Type__c |
| Script subtype | SubType | vlocity_cmt__SubType__c | vlocity_ins__SubType__c |
| Language | Language | vlocity_cmt__Language__c | vlocity_ins__Language__c |
| Active flag | IsActive | vlocity_cmt__IsActive__c | vlocity_ins__IsActive__c |
| Version number | VersionNumber | vlocity_cmt__Version__c | vlocity_ins__Version__c |
| Element config | PropertySetConfig | vlocity_cmt__PropertySet__c | vlocity_ins__PropertySet__c |
| Is Integration Procedure | IsIntegrationProcedure | vlocity_cmt__IsIntegrationProcedure__c | vlocity_ins__IsIntegrationProcedure__c |
| FlexCard data sources | DataSourceConfig | vlocity_cmt__Definition__c | vlocity_ins__Definition__c |
| FlexCard layout | PropertySetConfig | PropertySetConfig | PropertySetConfig |
| DM input object | InputObjectName (on Item) | vlocity_cmt__InterfaceObject__c | vlocity_ins__InterfaceObject__c |
| DM output object | OutputObjectName (on Item) | vlocity_cmt__TargetFieldObjectType__c | vlocity_ins__TargetFieldObjectType__c |
OmniScript / IP Metadata Structure (Core)
OmniProcess fields: Id, Name, Type, SubType, Language, VersionNumber, IsActive, IsIntegrationProcedure (boolean discriminator), OmniProcessType (computed), PropertySetConfig (JSON), LastModifiedDate.
OmniProcessElement fields: Id, OmniProcessId (parent lookup), Name, Type (element type), Level (0=Step, 1+=children), Order (sequence), PropertySetConfig (JSON), IsActive.
PropertySetConfig Structure (Action Elements)
DataRaptor Extract/Load Action:
{
"bundle": "DR_Extract_Account_Details",
"inputMap": {
"AccountId": "%ContextId%"
},
"outputMap": {},
"optionsMap": {},
"showError": true,
"errorMessage": "Failed to retrieve account data"
}Integration Procedure Action:
{
"ipMethod": "AccountOnboarding_Standard",
"inputMap": {
"accountId": "%AccountId%",
"requestType": "new"
},
"outputMap": {},
"optionsMap": {
"useFuture": false
},
"showError": true,
"errorMessage": "Onboarding procedure failed"
}Remote Action:
{
"remoteClass": "AccountService",
"remoteMethod": "validateAddress",
"inputMap": {
"street": "%Street%",
"city": "%City%"
},
"outputMap": {}
}FlexCard Metadata Structure
OmniUiCard fields: Id, Name, IsActive, VersionNumber, OmniUiCardType, AuthorName, DataSourceConfig (JSON -- data sources), PropertySetConfig (JSON -- layout/states/actions), LastModifiedDate. There is NO Definition field on OmniUiCard in Core namespace.
DataSourceConfig Structure
{
"dataSource": {
"type": "IntegrationProcedures",
"value": {
"ipMethod": "AccountSummary_Fetch",
"vlocityAsync": false,
"inputMap": {
"recordId": "{recordId}"
},
"resultVar": ""
},
"orderBy": {
"name": "",
"isReverse": ""
},
"contextVariables": []
}
}Valid dataSource.type values: IntegrationProcedures (must be plural), SOQL, ApexRemote, REST, Custom.
Context variables for input: {recordId} (record page), {userId} (running user), {param.customKey} (URL/parent card).
Merge field syntax: {fieldName}, {Object.Field}, {records[0].Name}.
Integration Procedure Response Pattern
Each element writes output namespaced under its element name. Reference upstream outputs with %elementName:keyPath%:
Input JSON --> [GetAccount] --> [ValidateData] --> [CreateCase] --> Output JSON
Result: { "GetAccount": { "Name": "Acme" }, "ValidateData": { "isValid": true }, ... }Caching: Set cacheType, cacheTTL (seconds), cachePartition in PropertySet. Only cache read-only IPs. Cached results bypass execution on cache hit.
DataRaptor / Data Mapper Examples
Extract Configuration
Query Account with related Contacts:
OmniDataTransform:
Name: DR_Extract_Account_Details
Type: Extract
IsActive: true
OmniDataTransformItem records:
Item 1: InputObjectName=Account, OutputObjectName=Account
Field: Id -> AccountId
Field: Name -> AccountName
Field: Industry -> Industry
Filter: Id = :AccountId (input parameter)
LIMIT: 1
Item 2: InputObjectName=Contact, OutputObjectName=Contacts
Field: Id -> ContactId
Field: FirstName -> FirstName
Field: LastName -> LastName
Field: Email -> Email
Relationship: AccountId = Account.Id
LIMIT: 50Transform Configuration
Flatten nested Account-Contact structure:
OmniDataTransform:
Name: DR_Transform_Account_Flatten
Type: Transform
IsActive: true
OmniDataTransformItem records:
Item 1: InputObjectName=Account:Name, OutputObjectName=AccountName
Item 2: InputObjectName=Contacts[0]:FirstName, OutputObjectName=PrimaryContactFirst
Item 3: InputObjectName=Contacts[0]:LastName, OutputObjectName=PrimaryContactLastTransform operates entirely in memory -- no SOQL or DML.
Load Configuration
Create a new Case record:
OmniDataTransform:
Name: DR_Load_Case_Create
Type: Load
IsActive: true
OmniDataTransformItem records:
Item 1: InputObjectName=Subject, OutputObjectName=Case:Subject
Item 2: InputObjectName=Description, OutputObjectName=Case:Description
Item 3: InputObjectName=AccountId, OutputObjectName=Case:AccountId
Item 4: InputObjectName=Priority, OutputObjectName=Case:Priority
DML Operation: InsertCommon OmniScript Element Types
Input Elements Configuration
| Element | Required PropertySetConfig Keys | Notes |
|---|---|---|
| Text | label, placeholder | Optional: pattern (regex validation), maxLength |
| Number | label, min, max | Optional: step, format (decimal places) |
| Select | label, options or optionSource | Static: options array. Dynamic: optionSource with Data Mapper |
| Type Ahead | label, dataSource, searchField | minCharacters for search threshold, resultField for display |
| Date | label, dateFormat | Optional: minDate, maxDate for range constraints |
| Checkbox | label, defaultValue | Boolean input; defaultValue is true/false |
| File | label, maxFileSize, allowedExtensions | File upload with size and type constraints |
Container Elements Configuration
| Element | Required PropertySetConfig Keys | Notes |
|---|---|---|
| Step | chartLabel | show expression for conditional visibility |
| Conditional Block | conditionType, show | conditionType: "Hide if True" or "Show if True" |
| Loop Block | loopData | JSON path to the array to iterate over |
IP Action Type Reference
| Action Type | PropertySetConfig Key | Value Format | Purpose |
|---|---|---|---|
| DataRaptor Extract | bundle | Data Mapper name (string) | Read Salesforce data |
| DataRaptor Load | bundle | Data Mapper name (string) | Write Salesforce data (insert/update/upsert/delete) |
| DataRaptor Transform | bundle | Data Mapper name (string) | In-memory data reshaping |
| DataRaptor Turbo | bundle | Data Mapper name (string) | High-volume compiled read |
| Remote Action | remoteClass, remoteMethod | Apex class and method names | Invoke Apex logic |
| Integration Procedure | ipMethod | Type_SubType (string) | Call nested IP |
| HTTP Action | path, method | URL path, HTTP method | External API callout |
| Matrix Action | matrixName | Decision matrix name | Lookup value from decision table |
| Email Action | emailTemplateId | Template ID | Send email notification |
| Set Values | elementValueMap | Key-value JSON | Assign variables |
Deployment Order for OmniStudio Components
Always deploy in dependency order to avoid broken references:
1. OmniDataTransform (Data Mappers -- no dependencies on other OmniStudio)
2. OmniIntegrationProcedure (IPs -- depend on Data Mappers, Apex classes)
3. OmniScript (OmniScripts -- depend on IPs and Data Mappers)
4. OmniUiCard (FlexCards -- depend on IPs, may launch OmniScripts)Deploy each type sequentially, then activate components via IsActive=true update.
Dependency Mapping Queries
Find All Components Referencing a Data Mapper
-- Find IPs/OmniScripts using a specific Data Mapper (by bundle name in element config)
SELECT Id, OmniProcessId, Name, Type, PropertySetConfig
FROM OmniProcessElement
WHERE PropertySetConfig LIKE '%DR_Extract_Account_Details%'Find All FlexCards Using a Specific IP
SELECT Id, Name, DataSourceConfig
FROM OmniUiCard
WHERE DataSourceConfig LIKE '%AccountSummary_Fetch%'
AND IsActive = trueFind All OmniScripts Calling a Specific IP
SELECT Id, OmniProcessId, Name, Type, PropertySetConfig
FROM OmniProcessElement
WHERE Type = 'Integration Procedure Action'
AND PropertySetConfig LIKE '%AccountOnboarding_Standard%'Component Inventory
Use SELECT COUNT() FROM <object> with appropriate filters (IsIntegrationProcedure=true/false for OmniProcess) to inventory components. Add GROUP BY IsActive for active/inactive breakdown.
Migration Checklist: Vlocity to Core
Pre-Migration
- [ ] Identify installed Vlocity namespace (vlocity_cmt or vlocity_ins)
- [ ] Run full component inventory in source org
- [ ] Map all cross-component dependencies
- [ ] Document custom Apex classes referenced by Remote Actions
- [ ] Identify components with external HTTP callout configurations
- [ ] Verify target org has Industries Cloud / OmniStudio Core license
- [ ] Confirm target org API version supports Core namespace (API 234.0+ / Spring '22+)
Object and Field Conversion
- [ ] Replace
vlocity_cmt__OmniScript__creferences withOmniProcess - [ ] Replace
vlocity_cmt__Element__creferences withOmniProcessElement - [ ] Replace
vlocity_cmt__VlocityUITemplate__creferences withOmniUiCard - [ ] Replace
vlocity_cmt__DRBundle__creferences withOmniDataTransform - [ ] Replace
vlocity_cmt__DRMapItem__creferences withOmniDataTransformItem - [ ] Update field references:
vlocity_cmt__PropertySet__ctoPropertySetConfig - [ ] Update field references:
vlocity_cmt__Type__ctoType - [ ] Update field references:
vlocity_cmt__SubType__ctoSubType - [ ] Update FlexCard:
vlocity_cmt__Definition__ctoDataSourceConfig - [ ] Update DM items:
vlocity_cmt__InterfaceObject__ctoInputObjectName - [ ] Update DM items:
vlocity_cmt__TargetFieldObjectType__ctoOutputObjectName
Deployment
- [ ] Deploy Data Mappers to target org and activate
- [ ] Deploy Integration Procedures to target org and activate
- [ ] Deploy OmniScripts to target org and activate
- [ ] Deploy FlexCards to target org and activate
- [ ] Test each component individually
- [ ] Test end-to-end flows (FlexCard -> OmniScript -> IP -> Data Mapper)
Post-Migration
- [ ] Verify all components appear in OmniStudio Designer
- [ ] Confirm LWC OmniScripts render correctly (if applicable)
- [ ] Run regression tests on all business processes
- [ ] Monitor error logs for namespace-related failures
- [ ] Deactivate Vlocity components in source org (after validation period)
- [ ] Document any components that required manual adjustment
Troubleshooting Common Errors
| Error | Cause | Resolution |
|---|---|---|
INVALID_TYPE: OmniProcess | Core namespace not installed | Verify Industries Cloud license; try Vlocity namespace queries |
sObject type 'vlocity_cmt__OmniScript__c' is not supported | Vlocity CMT not installed | Use Core namespace queries instead |
Entity cannot be found on retrieve | Component is in Draft state | Activate the component, then retrieve |
| IP action returns null | Referenced IP is inactive or Type_SubType mismatch | Verify IP is active; check ipMethod format matches exactly |
| FlexCard shows no data | IP data source misconfigured | Ensure dataSource.type uses the plural form IntegrationProcedures; verify IP is active |
| Data Mapper Load fails | Missing required fields or FLS violation | Check all required fields are mapped; verify profile has field-level access |
OmniDataTransformId field not found | Foreign key uses long-form spelling | The correct field is OmniDataTransformationId — the abbreviated name doesn't exist |
| Circular dependency error | IP A calls IP B which calls IP A | Map call graph; restructure to eliminate cycles |
| OmniScript not rendering | Component inactive or element hierarchy broken | Check IsActive=true; verify Level/Order values form valid tree |
| Deployment fails with missing reference | Dependency not yet deployed | Follow deployment order: DM -> IP -> OS -> FlexCard |
| Cached IP returns stale data | TTL not expired; DML cached incorrectly | Clear cache partition; never cache IPs with DML operations |
| PropertySetConfig truncated in SOQL | Long text field exceeds SOQL return limit | Use Tooling API or REST API to fetch full field value |
Related skills
How it compares
Unlike general Salesforce development skills, sf-omnistudio is scoped to the OmniStudio/Vlocity declarative stack and its namespace fragmentation; it does not cover Apex-only, plain LWC, or standard Screen Flow work.
FAQ
How does sf-omnistudio detect which OmniStudio namespace an org uses?
It probes a known object from each variant with sf data query: OmniProcess for Core, vlocity_cmt__OmniScript__c for CMT, and vlocity_ins__OmniScript__c for INS. An INVALID_TYPE error means that package is not installed; a valid response, even with totalSize 0, confirms it.
In what order should OmniStudio components be deployed?
Bottom-up along the dependency chain: Data Mappers first, then Integration Procedures, then OmniScripts, then FlexCards. Deploying out of order causes broken references, and components must be activated after deployment because inactive ones are not callable at runtime.
Does sf-omnistudio cover Vlocity-to-Core migration?
Yes. It ships a 7-step sequence: inventory, namespace conversion, export, transform, deploy in order, validate, decommission. Key conversions: vlocity_cmt__OmniScript__c becomes OmniProcess and the FlexCard Definition blob splits into DataSourceConfig and PropertySetConfig.
Is Sf Omnistudio safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.