Last updated: May 2026
Plat-Dev-210 — Salesforce Certified OmniStudio Developer
Test your knowledge with official exam-style questions
Questions and options are shuffled each attempt
▶Salesforce Certified Omnistudio Developer — Practice Exam Set 1: All Questions & Explanations
Full question text, answer options, and explanations for this practice set — a spoiler-free alternative is the interactive quiz above for scored, shuffled practice.
1. An OmniScript developer wants to add custom JavaScript logic when a user clicks Next on a specific step. Which OmniScript customization approach is recommended?
- A. Edit the OmniScript's generated HTML file directly
- B. Create a Custom Lightning Web Component (LWC) and use it as a custom element within the OmniScript step, implementing the custom logic in the LWC's JavaScript(correct)
- C. Add a JavaScript formula element that executes on step transition
- D. Override the entire OmniScript with a custom Apex controller
Explanation: OmniStudio supports extending OmniScripts with custom Lightning Web Components. A custom LWC can be registered and used as an element within an OmniScript step. The LWC implements the OmniScript LWC API (omniscriptBaseMixin) to access and update the DataJSON, handle navigation events, and execute custom JavaScript logic. This approach extends OmniScript declaratively without modifying generated files.
2. To implement a custom LWC element in an OmniScript, which base mixin must the LWC extend?
- A. LightningElement from 'lwc'
- B. OmniscriptBaseMixin(LightningElement) from 'omnistudio/omniscriptUtils'(correct)
- C. NavigationMixin(LightningElement) from 'lightning/navigation'
- D. OmniDataMixin(LightningElement) from 'vlocity/datautils'
Explanation: Custom LWC elements used in OmniScripts must extend `OmniscriptBaseMixin(LightningElement)`, imported from `omnistudio/omniscriptUtils`. This mixin provides the LWC with access to the OmniScript's DataJSON, methods to update data nodes (`omniUpdateDataJson`), and integration with OmniScript navigation events. Without this mixin, the LWC has no connection to the OmniScript's data context.
3. A developer is debugging an OmniScript that is not saving data correctly to Salesforce. Which two tools can help diagnose the issue? (Choose 2)
- A. The OmniScript Preview with the JSON view enabled, showing the live DataJSON state at each step(correct)
- B. Salesforce Debug Logs capturing DataRaptor and Integration Procedure server-side execution(correct)
- C. The Salesforce Workbench SOQL query tool to verify if records were created
- D. The Salesforce Setup Audit Trail showing OmniScript configuration changes
Explanation: For OmniScript debugging: (1) The OmniScript Preview with JSON view shows the live DataJSON state at every step — developers can see exactly what data is being passed to DataRaptor Loads, helping identify mapping issues; (2) Salesforce Debug Logs capture DataRaptor and Integration Procedure execution details server-side, showing SOQL queries, DML operations, and any errors during the save process. Setup Audit Trail tracks configuration changes, not runtime behavior. Workbench verifies results but not the cause of issues.
4. An OmniScript has a custom LWC element that needs to navigate to the next step programmatically after completing its internal logic. Which method from the OmniscriptBaseMixin is used?
- A. this.omniNextStep()(correct)
- B. this.navigate('next')
- C. this.dispatchEvent(new CustomEvent('omniscript_step_next'))
- D. this.omniApply({})
Explanation: The OmniscriptBaseMixin provides `this.omniNextStep()` as the method to programmatically navigate to the next step from within a custom LWC element. This triggers the OmniScript's navigation logic (including any configured validation) as if the user had clicked the Next button. `omniApply()` is used to update the DataJSON, not navigate. Dispatching a CustomEvent directly to the OmniScript navigation system is not a supported pattern.
5. An OmniScript developer needs to validate user input in a custom LWC element and prevent the user from proceeding to the next step until the validation passes. Which two approaches implement this? (Choose 2)
- A. Return `false` from the LWC's `omniReturnResults()` method when validation fails(correct)
- B. Set a validity property using `this.omniSetError('fieldName', 'errorMessage')` to mark the field as invalid(correct)
- C. Throw a JavaScript Error in the LWC's click handler to block navigation
- D. Use the OmniScript's built-in Required property on the custom element to enforce non-blank validation
Explanation: To prevent OmniScript navigation from a custom LWC: (1) Implement `omniReturnResults()` in the LWC and return `false` when validation fails — OmniScript calls this method before navigating and cancels the navigation if it returns false; (2) Use `omniSetError()` (or the validity API) to mark the custom element as invalid, which the OmniScript checks during navigation validation. Throwing JavaScript errors creates unhandled exceptions rather than controlled validation feedback.
6. An OmniScript is configured with 'Show Checkbox to Save Progress' enabled. What does this enable?
- A. Users can save the OmniScript's current state (partial completion) and resume later from the same step(correct)
- B. The OmniScript auto-saves to Salesforce after every step
- C. A checkbox appears on each element for the user to mark it as complete
- D. The OmniScript progress is saved to a browser cookie
Explanation: When 'Resume Save' is configured for an OmniScript, users can optionally save their progress at any step and return to the OmniScript later to resume from where they left off. The OmniScript state is saved to a Vlocity/OmniStudio OmniProcess record. This is critical for long multi-step processes where users may not complete them in a single session (e.g., insurance applications, enrollment forms).
7. Which OmniScript element type displays read-only text computed from the DataJSON using a formula or expression?
- A. Text Block — displays a formula-evaluated text value
- B. Display Text element with a merge field referencing the DataJSON path(correct)
- C. Formula element that computes and displays a value
- D. Read-Only Input element
Explanation: The Display Text element in OmniScript displays static or dynamic read-only text to the user. It can include merge fields referencing DataJSON values using `%JSONPath%` notation to display computed or fetched values. For example, displaying 'Total Price: %orderSummary:totalPrice%' shows the value from the DataJSON path. The Text Block element also supports HTML content. Formula elements compute values but don't directly display them to users.
8. An OmniScript needs to be embedded in an Experience Cloud site for customer self-service. Which two configurations are required? (Choose 2)
- A. Add the OmniStudio OmniScript component to the Experience Cloud page using Experience Builder(correct)
- B. Configure the OmniScript to use the Guest User security context for unauthenticated access, or ensure Experience Cloud users have OmniScript permission(correct)
- C. Export the OmniScript as a standalone web component and host it on the Experience Cloud CDN
- D. Create a Salesforce Community API for each OmniScript action element
Explanation: To embed an OmniScript in Experience Cloud: (1) Add the OmniStudio OmniScript Lightning component to the Experience Cloud page via Experience Builder, configuring the OmniScript Type and SubType to point to the correct OmniScript; (2) Ensure the appropriate security context — for authenticated users, they need OmniStudio user permissions; for guest access, configure the OmniScript and its DataRaptor/Integration Procedure actions to work within guest user access constraints. OmniScripts are not exported as standalone web components.
9. In a DataRaptor Extract, what does the 'Field Level Filter' do compared to 'Object Level Filter'?
- A. Object Level Filter filters the entire object's records by a condition; Field Level Filter filters which fields are returned for each record(correct)
- B. Object Level Filter is for standard objects; Field Level Filter is for custom objects
- C. They both filter records but Object Level Filter runs server-side while Field Level Filter runs client-side
- D. Field Level Filter is applied in the DataRaptor Output mapping; Object Level Filter is applied in the Input mapping
Explanation: In DataRaptor Extract: Object Level Filters work like SOQL WHERE clauses — they filter which RECORDS are returned (e.g., WHERE Status = 'Active'). Field Level Filters work like SOQL field-level conditions that filter within relationship traversals or specific field conditions applied after the initial record retrieval. Understanding this distinction is important for designing DataRaptor Extracts that efficiently retrieve the correct data set.
10. A DataRaptor Load is configured to upsert records using an External ID field. The upsert fails because the same External ID value appears in multiple source records. What is the most likely cause?
- A. The External ID field is not marked as 'External ID' in Salesforce object configuration
- B. DataRaptor Loads do not support upsert; only insert and update are available
- C. Duplicate External ID values in the input data cause the upsert to fail because the system cannot determine which source record to match to the Salesforce record(correct)
- D. The External ID field cannot be used as a match key in DataRaptor Loads
Explanation: When using External ID fields for upsert operations, the External ID value must be unique in the input data. If multiple source records contain the same External ID value, the system cannot determine which one to upsert and the operation fails. This is a data quality issue in the source JSON — each record should have a distinct External ID. The DataRaptor Load does support upsert using External ID fields (when the field is marked as External ID in Salesforce).
11. A DataRaptor Extract needs to retrieve Case records with their related Contact.Name and Account.Name in a single call. Which two configurations enable this relationship traversal? (Choose 2)
- A. In the DataRaptor Extract's Input tab, specify the Object as 'Case' and traverse relationships using dot notation: 'Contact.Name', 'Account.Name'(correct)
- B. In the DataRaptor Extract's Field Mapping, map source fields 'Contact.Name' and 'Account.Name' to their respective output JSON keys(correct)
- C. Configure a separate DataRaptor Extract for Contact and another for Account, then join them in a DataRaptor Transform
- D. DataRaptor Extracts cannot traverse Salesforce relationships; only flat object fields are supported
Explanation: DataRaptor Extracts support relationship field traversal. To retrieve related fields from parent objects: (1) In the Input Object configuration, specify the base object (Case) and include related object fields using dot notation (Contact.Name, Account.Name) — DataRaptor generates the appropriate SOQL relationship query; (2) Map these traversed fields to output JSON keys in the Field Mapping. This retrieves all data in one SOQL query without separate DataRaptor calls.
12. A DataRaptor Transform needs to convert a flat JSON input into a nested JSON structure (e.g., wrapping a list of products under a 'lineItems' key in an 'order' object). Which feature enables this structural transformation?
- A. DataRaptor Transform automatically detects the required output structure
- B. The Output Path notation in the DataRaptor Transform's Field Mapping, using JSON path expressions to define the target nested structure(correct)
- C. A JavaScript formula in the DataRaptor Transform that reshapes the JSON
- D. DataRaptor Transform can only map flat structures; nested output requires a DataRaptor Load
Explanation: DataRaptor Transform uses JSON path expressions in the Output Path column of the Field Mapping to define the target structure of the output JSON. Using dot notation and array notation in the Output Path (e.g., `order:lineItems:0:productName`), the Transform can construct nested JSON objects and arrays from flat input data. This powerful path-based mapping allows arbitrary restructuring of JSON data without any code.
13. In DataRaptor, the 'Bundle' feature is used to:
- A. Bundle multiple DataRaptor files into a single deployable package
- B. Execute multiple DataRaptor actions (Extract, Load, Transform) in sequence within a single DataRaptor configuration for complex parent-child save operations(correct)
- C. Bundle an OmniScript and its related DataRaptors into a single deployment unit
- D. Combine the output of multiple DataRaptor Extracts into a single JSON object
Explanation: DataRaptor Bundles (also called Bundle Bundles or multi-object DataRaptor Loads) allow configuring a single DataRaptor to perform sequential DML operations on multiple related Salesforce objects. For example, a Bundle DataRaptor Load can Insert a parent Account record, then Insert multiple Contact records using the newly created Account ID as the foreign key, all in a single DataRaptor execution. This simplifies complex parent-child creation scenarios.
14. A DataRaptor Load needs to process an array of line items (from OmniScript DataJSON) and insert each as a separate Salesforce record. Which two configurations achieve this? (Choose 2)
- A. Set the Input Type of the DataRaptor Load to 'Array' and configure the Input Path to point to the array in the DataJSON(correct)
- B. Use the 'For Each' option in the DataRaptor Load to iterate over the array and insert one record per iteration(correct)
- C. Call the DataRaptor Load multiple times from an OmniScript loop element, once per array item
- D. DataRaptor Loads automatically detect and iterate arrays in the input JSON
Explanation: To process an array of items with a DataRaptor Load: (1) Set the Input Type to handle arrays by configuring the input path to reference the array in the DataJSON; (2) Enable the 'For Each' iteration setting that tells the DataRaptor Load to process each element in the input array as a separate Salesforce record insert. This allows a single DataRaptor Load call to bulk-process all line items. Calling the DataRaptor from an OmniScript loop makes multiple server round trips, which is less efficient.
15. In an Integration Procedure, what does the 'Conditional' element do?
- A. Conditionally loads a DataRaptor based on a filter condition
- B. Implements if/else branching logic — executes different child elements based on whether a condition is true or false(correct)
- C. Conditionally enables or disables the entire Integration Procedure
- D. Validates input data before the Integration Procedure executes
Explanation: The Conditional element in Integration Procedures provides if/else branching. It evaluates a condition expression against the current data context and routes execution to either the 'true' branch or 'false' branch of child elements. This enables dynamic orchestration where different DataRaptor calls, HTTP actions, or Apex Remote calls are executed based on data values. It is the equivalent of an if/else statement in procedural code.
16. An Integration Procedure needs to call multiple DataRaptor Extracts where each call is independent (no dependencies between them). Which element optimizes this for parallel execution?
- A. Loop element that iterates over the DataRaptor calls
- B. Matrix element that creates a matrix of all possible combinations
- C. Configure the independent DataRaptor actions at the same hierarchy level in the Integration Procedure — elements at the same level execute in parallel(correct)
- D. Parallel execution is not supported in Integration Procedures; all elements run sequentially
Explanation: Integration Procedures execute child elements that are at the same hierarchy level (siblings without parent-child nesting) in parallel. To parallelize independent DataRaptor Extracts, place them as sibling elements at the same level in the Integration Procedure structure (not nested within each other). This allows them to execute concurrently, reducing total execution time significantly compared to sequential execution. Nested elements execute sequentially.
17. An Integration Procedure's HTTP Action needs to authenticate to an external API using OAuth 2.0. Which two configurations support this? (Choose 2)
- A. Configure a Salesforce Named Credential with OAuth 2.0 and reference it in the HTTP Action(correct)
- B. Add a preceding HTTP Action that calls the OAuth token endpoint and stores the Bearer token in the data context, then pass it as a header in the main API call(correct)
- C. Enable the 'OAuth 2.0 Auto-Auth' setting in the Integration Procedure settings
- D. Hardcode the OAuth client credentials directly in the HTTP Action URL parameters
Explanation: Secure OAuth 2.0 authentication in Integration Procedure HTTP Actions: (1) Named Credentials configured with OAuth 2.0 protocol handle token acquisition and refresh automatically — the HTTP Action references the Named Credential and Salesforce manages authentication; (2) An explicit token acquisition pattern: a first HTTP Action calls the OAuth /token endpoint to get an access token, stores it in the IP data context, and a subsequent HTTP Action passes the token as an Authorization: Bearer header. Hardcoding credentials violates security best practices.
18. An Integration Procedure needs to iterate over an array of records and call a DataRaptor Load for each item. Which element enables this looping?
- A. Conditional element with a recursive reference
- B. Loop element that iterates over an array in the data context, with the DataRaptor Load as a child element(correct)
- C. For Each element with the DataRaptor Load nested inside
- D. Matrix element configured with the array as the iteration source
Explanation: The Loop element in Integration Procedures iterates over an array in the data context. Child elements nested inside the Loop execute once per array item, with the current item's data accessible to child elements. A DataRaptor Load nested inside a Loop will execute for each record in the input array. The current item can be referenced using a configured loop variable in the child element's Input JSON paths.
19. An Integration Procedure's HTTP Action receives a JSON response that needs to be mapped to a specific structure in the data context before it is returned to the OmniScript. Which approach handles this transformation?
- A. The HTTP Action automatically reshapes all API responses to match the OmniScript DataJSON structure
- B. After the HTTP Action, add a DataRaptor Transform element to reshape the response JSON to the target structure(correct)
- C. Configure the HTTP Action's output mapping to rename and restructure the response fields
- D. Use a Set Values element to manually copy each field from the response to the target path
Explanation: After an HTTP Action retrieves the API response, a DataRaptor Transform element can be used to reshape the response JSON into the required structure. DataRaptor Transform's path-based field mapping provides flexible restructuring (renaming keys, nesting/flattening, filtering fields) without code. While the HTTP Action has basic output path configuration, complex structural transformations are best handled by a subsequent DataRaptor Transform.
20. A developer wants to unit test an Integration Procedure's HTTP Action without calling the real external API. Which two approaches achieve this? (Choose 2)
- A. Use the Integration Procedure's Test Execute feature with mock input data and intercept the HTTP call using a Mock API server
- B. In the Integration Procedure's HTTP Action configuration, enable the 'Mock Response' option and specify the mock response JSON to return during testing(correct)
- C. Run the Integration Procedure in a sandbox that has network access to the real external API
- D. Replace the HTTP Action temporarily with a Set Values element that injects the expected response JSON for testing(correct)
Explanation: For testing HTTP Actions without real API calls: (1) Some OmniStudio versions support a Mock Response configuration on the HTTP Action element that returns a predefined JSON response during test runs; (2) Temporarily replacing the HTTP Action with a Set Values element that injects the expected response JSON allows testing the Integration Procedure's logic (DataRaptor Loads, Conditionals, Loops) in isolation from the external API. Both are practical developer testing strategies.
21. A FlexCard developer wants to conditionally show different card content based on the value of a field (e.g., show 'Active' card layout when Status = 'Active' and 'Inactive' layout when Status != 'Active'). Which FlexCard feature implements this?
- A. FlexCard States — different visual configurations of the card that are displayed based on conditional criteria(correct)
- B. Two separate FlexCards placed on the Lightning page with FLS restrictions
- C. Conditional Visibility on each FlexCard component using the same data source
- D. A JavaScript function in the FlexCard that toggles the displayed template
Explanation: FlexCard States are distinct visual configurations of the same FlexCard that are shown based on conditions evaluated against the card's data. Each State can have completely different layouts, fields, actions, and styling. State transition conditions (e.g., State 'Active' shows when Status = 'Active') are configured declaratively in the FlexCard designer. This enables rich conditional UI without needing multiple separate FlexCards or custom code.
22. A FlexCard developer needs to add a custom LWC element inside a FlexCard. Which requirement must the custom LWC meet?
- A. The custom LWC must extend FlexCardMixin(LightningElement) and implement the required interface methods(correct)
- B. Any standard LWC can be used directly in a FlexCard without modifications
- C. Custom LWCs cannot be used in FlexCards; only standard OmniStudio components are supported
- D. The LWC must be registered as a FlexCard Custom Component in OmniStudio Settings
Explanation: To use a custom LWC inside a FlexCard, the LWC must extend `FlexCardMixin(LightningElement)` (imported from `omnistudio/flexCardUtils`). This mixin provides the LWC with access to the FlexCard's data context and event system. The LWC must also be registered as a FlexCard custom component using the OmniStudio Custom Components feature. Standard LWCs without the mixin cannot receive data from the FlexCard's data source.
23. A FlexCard is loading slowly because its data source (DataRaptor Extract) retrieves too many related records. Which two performance optimizations should a developer apply? (Choose 2)
- A. Add filter conditions to the DataRaptor Extract to limit the records returned (e.g., only Active records, or records in the last 90 days)(correct)
- B. Switch from a DataRaptor Extract to a DataRaptor Turbo Extract for read-only data retrieval without complex transformations(correct)
- C. Enable FlexCard caching to store the data in the user's browser between sessions
- D. Reduce the number of FlexCard states to a maximum of two
Explanation: For FlexCard performance: (1) Adding filter conditions to the DataRaptor Extract reduces the number of records returned from Salesforce, directly reducing data transfer and processing time; (2) DataRaptor Turbo Extract is faster than standard Extract for simple read operations as it executes a lightweight SOQL without the full DataRaptor engine overhead. FlexCard caching improves repeat-access performance but doesn't fix slow initial loads. The number of FlexCard States does not affect data retrieval performance.
24. A FlexCard displays a list of orders with an 'Activate' button on each row. Clicking 'Activate' should update the order status and refresh the FlexCard data. Which FlexCard action and behavior achieves this?
- A. An Integration Procedure action button that calls the Integration Procedure to update the order, followed by a DataRaptor Extract action to reload data
- B. A DataRaptor Load action button configured to update the order status, with the FlexCard's 'Refresh Data After Action' option enabled(correct)
- C. A Navigate action that navigates to the record, updates it, then navigates back
- D. An Apex Remote action that updates the order and returns the new status to the FlexCard
Explanation: FlexCard action buttons can be configured with DataRaptor Load as the action type (to perform a DML operation like updating the order status). Enabling 'Refresh Data After Action' on the button causes the FlexCard to re-execute its DataRaptor Extract data source after the action completes, automatically refreshing the displayed data without a full page reload. An Integration Procedure can also be used for more complex updates, with the same Refresh Data setting.
25. A developer needs to pass data from a parent FlexCard to a child (nested) FlexCard. How is data shared between parent and child FlexCards?
- A. Child FlexCards automatically inherit all data from the parent FlexCard's data source
- B. Configure the child FlexCard's Input parameters in the parent FlexCard's child configuration, mapping parent data fields to child input parameters(correct)
- C. Use a shared DataRaptor Extract that both parent and child FlexCards reference
- D. Data cannot be shared between parent and child FlexCards; each must have independent data sources
Explanation: When a child FlexCard is nested within a parent FlexCard, data is passed from parent to child through the child FlexCard's Input parameters configuration in the parent. The parent's data fields (from its DataRaptor or Integration Procedure source) are mapped to the child FlexCard's defined Input parameters. The child uses these inputs as its data source or as filter parameters for its own DataRaptor calls. Child FlexCards do not automatically inherit parent data.