# Free Salesforce Omnistudio Developer Practice Questions

*Last updated September 2026 · https://www.certifyforce.com/salesforce-omnistudio-developer-practice-exam/free-questions*

18 free Omnistudio Developer practice questions from the Certifyforce bank of 300 reviewed questions, spread across the 6 official exam sections in proportion to their weight. Each has the correct answer, an explanation, and the official documentation it was verified against.

## Omnistudio Fundamentals (18%)

### Question 1

Cumulus Financial's source and target orgs run Omnistudio Standard Runtime on a current release (a release after Spring '26, because the new metadata types require API version 67.0, newer than the Spring '26 baseline), and it turned on Clean Metadata Deployment in both. Its pipeline still retrieves Omniscripts with this manifest, and the retrieve no longer returns them:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
        <members>*</members>
        <name>OmniScriptConfig</name>
    </types>
    <version>66.0</version>
</Package>
```
Which change fixes the retrieve?

- A. Change the type name to OmniscriptDefinition and set the manifest version to 67.0 or later, the version that the new metadata types require.
- B. Change the type name to OmniProcess, because Omniscripts are stored in the OmniProcess standard object once Clean Metadata Deployment is on.
- C. Keep OmniScriptConfig and list each member with its version suffix, such as Type_SubType_English_3, because the wildcard skips versions.
- D. Turn Clean Metadata Deployment off in both orgs for the retrieve, then turn it back on before the deployment step runs in the pipeline.

**Correct answer:** A. Change the type name to OmniscriptDefinition and set the manifest version to 67.0 or later, the version that the new metadata types require.

**Explanation:** Help lists OmniscriptDefinition as the new metadata type for Omniscripts under Clean Metadata Deployment, marks OmniScriptConfig as a legacy type that's no longer supported, and says the new types require API version 67.0 or later. OmniProcess is the standard object, not the Clean Metadata type to retrieve. Clean Metadata exposes a single version with version-agnostic names, so version suffixes on the legacy type don't help. Help recommends not turning the setting off, and turning it off requires Salesforce Customer Support. The stem sets a current-org context because Clean Metadata Deployment's metadata types need API 67.0, newer than the Spring '26 exam baseline.

**Sources:** [Clean Metadata Deployment for Omnistudio](https://help.salesforce.com/s/articleView?id=xcloud.os_clean_metadata_deployment.htm&language=en_US&type=5), [Set Up Clean Metadata Deployment](https://help.salesforce.com/s/articleView?id=xcloud.os_set_up_clean_metadata_deployment.htm&language=en_US&type=5)

### Question 2

On the Managed Package Runtime, a Bloomington Caregivers developer must see exactly what changed between versions 4 and 5 of a patient-intake Omniscript in the same sandbox before deploying version 5. Which tool should the developer use?

- A. The IDX Workbench Version Compare dashboard, selecting the Omniscript component, version 4 as the base and version 5 as the target.
- B. The Omniscript Designer's Preview, opening version 4 and version 5 in two tabs and comparing the Data JSON panels side by side.
- C. The IDX Workbench Test Console, running both versions as Test Procedures and comparing the step results in the Test Results pane.
- D. The Omnistudio Migration Assistant in Assess mode, whose Assessment Report lists the element differences between each pair of versions.

**Correct answer:** A. The IDX Workbench Version Compare dashboard, selecting the Omniscript component, version 4 as the base and version 5 as the target.

**Explanation:** For the managed package runtime, Help's Version Compare dashboard in IDX Workbench compares two versions of an Omniscript or Integration Procedure in the same source or target org: you choose the component type, component, base version and target version, then click Find Differences. Comparing Data JSON in Preview shows run-time data, not definition differences. The Test Console runs Test Procedures, which are Integration Procedures that perform unit tests, not Omniscript version diffs. The Migration Assistant's Assess mode reports migration readiness, not version-to-version changes.

**Sources:** [Compare Omniscript and Integration Procedure Versions (Managed Package)](https://help.salesforce.com/s/articleView?id=xcloud.os_compare_omniscript_and_integration_procedure_versions.htm&language=en_US&type=5)

### Question 3

Northern Trail Outfitters is assessing its Omnistudio for Managed Packages implementation before moving to the Omnistudio Standard Runtime. Which two features in use today need a replacement plan, because the standard runtime does not support them? Choose 2 answers.

- A. Vlocity Actions configured on the Flexcards that agents use to launch processes.
- B. The Omnistudio Tracking Service that records Omniscript interaction events.
- C. List Actions inside the Integration Procedures that process order line arrays.
- D. LWC Omniscripts that are embedded on the company's LWR Experience Cloud site.
- E. Cloning file-based Omniscripts to create a starting point for new processes.

**Correct answers:** A. Vlocity Actions configured on the Flexcards that agents use to launch processes.; B. The Omnistudio Tracking Service that records Omniscript interaction events.

**Explanation:** The supported-features comparison marks Vlocity Actions and the Tracking Service as available only in Omnistudio for Managed Packages; the Tracking Service is not implemented in the standard runtime and is unavailable after migration. List Actions in Integration Procedures are supported in both. LWC Omniscripts on LWR Experience sites are supported in both. Cloning file-based Omniscripts is supported in both as well.

**Sources:** [Supported Features in Omnistudio and Omnistudio for Managed Packages](https://help.salesforce.com/s/articleView?id=sf.os_omnistudio_and_omnistudio_for_vlocity_products_and_features_support.htm&language=en_US&type=5)

## Flexcards (15%)

### Question 4

On Omnistudio Standard Runtime, a Cloud Kicks button on a Flexcard runs two actions in order: a Custom event named stepone, then a Custom event named steptwo. The card's stepone event listener runs a Data action that calls an Integration Procedure, followed by a Set Values action. The steptwo event listener runs a Card > Reload action. During testing, the Data action in the stepone listener fails. What happens next?

- A. The failure stops every later action that came from the button, so neither the Set Values action nor the Reload runs.
- B. Both the Set Values action and the Reload run, because a failure stops only actions that navigate away from the card.
- C. The Set Values action still runs after the failed Data action, but the Reload in the steptwo listener is skipped.
- D. The Set Values action in the stepone listener is skipped, and the Reload in the steptwo listener still runs.

**Correct answer:** D. The Set Values action in the stepone listener is skipped, and the Reload in the steptwo listener still runs.

**Explanation:** Omnistudio runs a sequence top to bottom and doesn't run the later actions in that sequence if one fails, so the Set Values after the failed Data action is skipped. Help adds that when sequential custom or pubsub events each trigger their own listener sequences, a failing action doesn't stop the next listener's sequence, so the Reload still runs. That rules out the choice where the failure stops everything from the button. Failures aren't limited to navigation actions, so the choice where both still run is wrong. The choice where Set Values runs and the Reload is skipped reverses the documented behaviour.

**Sources:** [Set Up Actions on a Flexcard](https://help.salesforce.com/s/articleView?id=xcloud.os_add_an_action_to_a_flexcard_25672.htm&language=en_US&type=5)

### Question 5

An AW Computing developer on Omnistudio Standard Runtime configures a SOQL Query data source on Contact and then adds Field elements. The query includes Fax, but the Fax field never appears in the field picker. Other fields from the query do appear, and the developer's profile can read Fax on Contact. What is the most likely reason?

- A. SOQL queries are encrypted, so the field picker lists only the fields that already appear in the Flexcard's Input Map.
- B. The Fax field needs a Result JSON Path of ['Fax'] before the field picker can list it alongside the other query fields.
- C. Field-level security hides the Fax field from the developer's profile until EnableQueryWithFLS is changed to false.
- D. The field picker lists only fields with non-null values on the test record, and the test record has no Fax value.

**Correct answer:** D. The field picker lists only fields with non-null values on the test record, and the test record has no Fax value.

**Explanation:** Help notes that when you map fields from a SOQL data source, the field picker shows only fields with non-null values for the record in the test query, so you should pick a test record that has values for every field you want to map. SOQL queries are encrypted so the query isn't visible on the client, but that has nothing to do with which fields the picker lists. Result JSON Path selects a node in the response and isn't needed to list an ordinary field. Turning EnableQueryWithFLS off would only stop enforcing field-level security, and nothing suggests the developer lacks access to Fax.

**Sources:** [Set Up a Data Source on a Flexcard](https://help.salesforce.com/s/articleView?id=xcloud.os_configure_a_data_source_on_a_flexcard_35864.htm&language=en_US&type=5)

### Question 6

A Universal Containers Flexcard on Omnistudio Standard Runtime repeats one card for each of about 150 open shipments. Each card has a Set Values action that changes a status field. Testers report that the whole list redraws slowly every time one shipment is updated. Which configuration should the developer change?

- A. Keep Repeat Records selected and enter a render key, such as the shipment Id, so only the updated card record is regenerated.
- B. Deselect Repeat Records so that one card holds every shipment and the list is redrawn only once when a status changes.
- C. Set a Refresh Interval (ms) on the data source so changed shipments reload quietly in the background instead.
- D. Enter a Delay (ms) on the data source so its call is bundled with the Set Values updates into a single server request.

**Correct answer:** A. Keep Repeat Records selected and enter a render key, such as the shipment Id, so only the updated card record is regenerated.

**Explanation:** Configure Flexcard Settings says a render key identifies the repeated card record to update in the DOM, so Omnistudio regenerates only the updated record, which is the performance fix described. Deselecting Repeat Records is meant for data tables, charts, lists and containers, and the shipment cards still need one card per record. A Refresh Interval makes the card check for changed data and reload, which adds work instead of narrowing the redraw. Delay (ms) prevents a data source call from being bundled with other server requests, the opposite of what that option claims, and it doesn't affect rendering.

**Sources:** [Configure Flexcard Settings](https://help.salesforce.com/s/articleView?id=xcloud.os_set_up_a_flexcard_in_the_flexcard_designer_37646.htm&language=en_US&type=5)

## Omniscripts (20%)

### Question 7

Universal Containers uses an Edit Block in an Omniscript on Omnistudio Standard Runtime to manage service contacts. Instead of deleting a contact, the Delete option must call an Integration Procedure that marks the contact inactive. What should the developer do?

- A. Add an Integration Procedure Action inside the Edit Block and give it an element name ending in Delete, such as ArchiveContactDelete.
- B. Add an Integration Procedure Action inside the Edit Block and name it with the Global suffix so that it replaces the default Delete action on every entry.
- C. Add a Delete Action element after the Edit Block and point its Record Id at the Edit Block's array so that it overrides the default delete behavior.
- D. Edit the Edit Block's properties as JSON and set a deleteAction property to the Type_SubType name of the Integration Procedure that should run.

**Correct answer:** A. Add an Integration Procedure Action inside the Edit Block and give it an element name ending in Delete, such as ArchiveContactDelete.

**Explanation:** To replace a default Edit Block action, Help says to add an action element inside the Edit Block and append the action type to its name, for example RemoveAccountDelete for Delete, and Integration Procedure Actions are supported in Edit Blocks. The Global suffix creates a global action that runs on the whole Edit Block JSON and displays outside the entries, so it does not replace the per-entry Delete option. A separate Delete Action after the block deletes records outright, which is the behavior the requirement wants to avoid, and it does not replace the Edit Block's menu option. No deleteAction JSON property is documented for Edit Blocks.

**Sources:** [Add, Edit, and Delete Records with Edit Block Actions | Salesforce Help](https://help.salesforce.com/s/articleView?id=xcloud.os_addeditand_delete_records_with_edit_block_actions_14582.htm&language=en_US&type=5)

### Question 8

Universal Containers wants an Omniscript on Omnistudio Standard Runtime to be available on its Case record page, but agents want it to open only when they click a button instead of showing inline on the page. What should the developer do?

- A. Add the standard Omniscript component in Lightning App Builder, set Display to open with a button, and pick an SLDS button variant.
- B. Add the standard Omniscript component and set Component Visibility filters so that it appears only after a button is clicked.
- C. Add the standard Omniscript component and select the Newport theme, because only the Newport theme can render behind a launch button.
- D. Add the Omniscript's generated LWC from Custom Components, because the standard component can only render inline.

**Correct answer:** A. Add the standard Omniscript component in Lightning App Builder, set Display to open with a button, and pick an SLDS button variant.

**Explanation:** Help says that the standard Omniscript component on a Lightning page has a Display setting that either shows the Omniscript on the page or uses a button to open it, and a button can use one of the SLDS button variants. Component Visibility adds filters that control whether the component appears, not a launch button. The Theme setting picks SLDS or Newport and can be switched at any time, and neither theme is tied to the button. Help recommends the standard component, and the standalone generated LWC applies only to the managed package designer on standard runtime.

**Sources:** [Add Your Omniscript to a Lightning Page](https://help.salesforce.com/s/articleView?id=xcloud.os_add_your_omniscript_to_a_lightning_page_19957.htm&language=en_US&type=5), [How to Launch Omniscripts](https://help.salesforce.com/s/articleView?id=xcloud.os_how_to_launch_19862.htm&language=en_US&type=5)

### Question 9

Northern Trail Outfitters adds a custom LWC to an Omniscript on Omnistudio Standard Runtime through a Custom LWC element with Standalone LWC selected, because the component does not extend OmniscriptBaseMixin. The component must now place a calculated value into the Custom LWC element's node in the data JSON. How should the developer do this?

- A. Call this.omniUpdateDataJson() from the component, which every component placed in a Custom LWC element can use to update data.
- B. Call this.omniApplyCallResp() with the value, because standalone components are allowed to merge responses into the root node.
- C. Publish the value through the pubsub module, which is the only messaging channel that a standalone component can use with Omniscript.
- D. Dispatch an omniaggregate CustomEvent with bubbles and composed set to true and a detail object that holds data and elementId.

**Correct answer:** D. Dispatch an omniaggregate CustomEvent with bubbles and composed set to true and a detail object that holds data and elementId.

**Explanation:** A standalone component cannot extend OmniscriptBaseMixin or interact with the data JSON directly; Help shows it building nodes in the Custom LWC element by dispatching an omniaggregate CustomEvent whose detail carries data and elementId, with bubbles, cancelable and composed set. omniUpdateDataJson and omniApplyCallResp are OmniscriptBaseMixin methods, so a component that does not extend the mixin cannot call them. Help says a standalone component interacts with the Omniscript through the aggregate event, and the Communicate from Omniscript to a Lightning Web Component page notes that the pubsub module doesn't operate when the Standard Runtime is enabled, so pubsub isn't the route here.

**Sources:** [Create a Standalone Custom Lightning Web Component | Salesforce Help](https://help.salesforce.com/s/articleView?id=xcloud.os_create_a_standalone_custom_lightning_web_component_18102.htm&language=en_US&type=5), [Requirements for Custom Lightning Web Components for Omniscripts | Salesforce Help](https://help.salesforce.com/s/articleView?id=xcloud.os_requirements_for_creating_a_custom_lightning_web_component_for_omniscripts.htm&language=en_US&type=5), [Communicate from Omniscript to a Lightning Web Component](https://help.salesforce.com/s/articleView?id=xcloud.os_communicate_with_omniscript_from_a_lightning_web_component_18222.htm&language=en_US&type=5)

## Integration Procedures (15%)

### Question 10

On the Managed Package Runtime, a Get Cloudy Consulting Integration Procedure has a Loop Block over a list of appointments, with a Data Mapper Transform Action named FormatSlot inside it. A Response Action after the loop should return the formatted slots, but the loop's output in Preview contains only an entry of { "success": "OK" } for each appointment. What should the developer do?

- A. Add a Loop Output key-value pair on the Loop Block, such as Slots with the value %FormatSlot%, so that the action's response is available after the loop.
- B. Set the Loop Block's Execution Conditional Formula to %FormatSlot% != null, so that only appointments with a formatted slot are added to the output.
- C. Enable Chain On Step on the FormatSlot action, so that each iteration's result is committed in its own transaction and saved after the loop.
- D. Set Send JSON Path on the Response Action to the Loop List node, so that the formatted slots stored in the list are returned to the caller.

**Correct answer:** A. Add a Loop Output key-value pair on the Loop Block, such as Slots with the value %FormatSlot%, so that the action's response is available after the loop.

**Explanation:** On the managed package runtime, the Loop Output property holds key-value pairs that are available to later steps, with the value set to the response of an action inside the loop by merge field syntax, and if no pairs are specified a response of { "success": "OK" } is returned for each item processed. An Execution Conditional Formula only controls whether the Loop Block runs. Chain On Step moves an action into its own transaction to reduce governor-limit risk, but it doesn't expose the loop's results. The Loop List node holds the original array, not the transformed slots, so returning it doesn't help.

**Sources:** [Loop Block Properties (Managed Package)](https://help.salesforce.com/s/articleView?id=xcloud.os_loop_block_properties.htm&language=en_US&type=5), [Process Arrays Using Loop Blocks (Managed Package)](https://help.salesforce.com/s/articleView?id=xcloud.os_process_arrays_using_loop_blocks.htm&language=en_US&type=5)

### Question 11

One step of an AW Computing Integration Procedure on Omnistudio Standard Runtime regularly needs more CPU time than the 10,000-millisecond default maximum of the Chainable CPU Limit, even when chaining is enabled. The developer considers the Queueable Chainable settings. Which two statements are true? Choose 2 answers.

- A. A queueable chainable step can start a queueable job that runs as an Async Apex Job, with a default CPU maximum of 60,000 milliseconds.
- B. Starting a queueable job removes governor limits entirely and makes the procedure run faster than chaining in synchronous transactions.
- C. If both a Queueable Chainable setting and its Chainable equivalent are set, the Queueable Chainable setting overrides it.
- D. The Queueable Chainable Heap Size Limit keeps the 6 MB default of the Chainable Heap Size Limit, since only CPU and SOQL limits rise.
- E. Queueable chaining has no stack depth limit, so a Developer Edition org can chain queueable jobs as many times as the run needs.

**Correct answers:** A. A queueable chainable step can start a queueable job that runs as an Async Apex Job, with a default CPU maximum of 60,000 milliseconds.; C. If both a Queueable Chainable setting and its Chainable equivalent are set, the Queueable Chainable setting overrides it.

**Explanation:** Help says a chainable step can start a queueable job that runs as an Async Apex Job with higher CPU, SOQL and heap limits, and the Queueable Chainable CPU Limit has a default maximum of 60,000 milliseconds; Queueable Chainable settings override their Chainable equivalents if both are set. The same page warns that queueable jobs help avoid governor limits but can reduce performance, so they neither remove limits nor speed things up. The Queueable Chainable Heap Size Limit defaults to 12 MB, not 6 MB. In Developer Edition and Trial orgs the maximum stack depth for chained jobs is 5.

**Sources:** [Settings for Long-Running Integration Procedures](https://help.salesforce.com/s/articleView?id=xcloud.os_settings_for_long_running_integration_procedures_56206.htm&language=en_US&type=5)

### Question 12

In an Ursa Major Solar Integration Procedure on Omnistudio Standard Runtime, an HTTP Action named GetRates runs first and adds this output to the data JSON. The procedure input also has a top-level Price node.
```json
{
    "GetRates": {
        "rates": {
            "gold": 0.15
        }
    },
    "Price": 200
}
```
A later Set Values action must store the discount amount as a number in an element named Discount. Which Element Value Map value should the developer use?

- A. `%GetRates:rates:gold% * %Price%`, because merge fields are evaluated as numbers wherever they appear in a value.
- B. `=%rates:gold% * %Price%`, because each step's output is merged into the top level of the data JSON.
- C. `=%GetRates:rates:gold% * %Price%`, which reads the earlier step's node by its element name inside a formula.
- D. `=GetRates.rates.gold * Price`, because formulas in Integration Procedures reference nodes with dot notation.

**Correct answer:** C. `=%GetRates:rates:gold% * %Price%`, which reads the earlier step's node by its element name inside a formula.

**Explanation:** In a Set Values action, a merge field such as %LocationData:Code% retrieves data from the earlier step by its element name, with colons between levels, and calculations start with an equals sign, as in =%Inputs:GrossIncome% * 0.7. Every calculation in Help's examples starts with that equals sign; a value without it follows the pattern Help uses for literal and concatenated text, such as Code is %LocationData:Code%. The step output stays under the GetRates node, so %rates:gold% doesn't point to it. Dot notation without percent signs isn't the merge-field syntax Help shows for Set Values.

**Sources:** [Set Values Action for Integration Procedures](https://help.salesforce.com/s/articleView?id=xcloud.os_set_values_for_integration_procedures_50310.htm&language=en_US&type=5)

## Data Mappers (17%)

### Question 13

An AW Computing developer on Omnistudio Standard Runtime creates a Data Mapper with Interface Type Load and wants it to return a JSON summary of the saved data to the calling Omniscript. In the Output Type list, the only option is sObject. What explains this?

- A. JSON appears in the Output Type list only after the Input Type is set to JSON and the Load is saved.
- B. A Load's output options are limited to sObject, because the Load writes its output to Salesforce objects.
- C. JSON output on a Load needs the Input Type set to Custom, so the list shows sObject until a custom input class is entered.
- D. The Output Type list stays limited until at least one object is added on the Load's Objects tab.

**Correct answer:** B. A Load's output options are limited to sObject, because the Load writes its output to Salesforce objects.

**Explanation:** The Trailhead unit lists the Output Type options for each Interface Type and shows sObject as the only option for a Load, because Loads write only to Salesforce objects, while Transforms offer formats such as JSON and XML. The Custom Input and Output page agrees: a Load takes custom input, but its output is always a Salesforce object. Help pages differ in how broadly they describe custom output (the Omnistudio Data Mappers overview groups Load with Extract and Turbo Extract as handling custom input and output); this question relies only on the Output Type list that the designer offers for a Load, which the Trailhead unit and the Custom Input and Output page both describe. Choosing JSON as the Input Type doesn't add JSON output. A custom input class doesn't change a Load's output, which stays a Salesforce object. Adding objects on the Objects tab doesn't change the output options.

**Sources:** [Design Data Mappers for Performance (Trailhead)](https://trailhead.salesforce.com/content/learn/modules/omnistudio-data-mapper-fundamentals/design-data-mappers-for-performance), [Custom Input and Output for Omnistudio Data Mappers in Omnistudio](https://help.salesforce.com/s/articleView?id=xcloud.os_custom_input_and_output_for_dataraptors_in_omnistudio_47987.htm&language=en_US&type=5), [Omnistudio Data Mappers](https://help.salesforce.com/s/articleView?id=xcloud.os_omnistudio_dataraptors_45587.htm&language=en_US)

### Question 14

An AW Computing Data Mapper Transform on Omnistudio Standard Runtime receives a partner payload in which one node holds JSON text: `"Specs": "{\"Watts\": 400, \"Cells\": 72}"`. The Transform's Output Type is JSON, and a Flexcard must read Specs:Watts from the output. Which two statements about the Output Data Type for the Specs mapping are true? Choose 2 answers.

- A. Object deserializes the string as a Map<String, Object>, so the output Specs node holds Watts and Cells keys
- B. List<Map> parses the JSON text into a list of maps, which the Flexcard can then read with the path Specs:Watts
- C. JSON serializes the value as JSON, and Help says to omit it when the Output Type is JSON unless you embed JSON in JSON
- D. String parses the JSON text into nodes, because String is the output data type that Transforms use for text input
- E. Double casts the text to a number and returns 400, the first numeric value that it finds in the JSON string

**Correct answers:** A. Object deserializes the string as a Map<String, Object>, so the output Specs node holds Watts and Cells keys; C. JSON serializes the value as JSON, and Help says to omit it when the Output Type is JSON unless you embed JSON in JSON

**Explanation:** Help's output data types list Object, which deserializes a String as Map<String, Object> or List<Object>, so mapping Specs with Object turns the JSON text into a node the Flexcard can read. The same page describes JSON as serializing the value, to be omitted when the Transform output type is JSON unless you must embed JSON in JSON, which would keep Specs as text. List<Map> converts a map to a list of maps; it doesn't parse a string. String keeps the value as text. Double is a numeric type and isn't described as extracting numbers from JSON text.

**Sources:** [Omnistudio Data Mapper Output Data Types](https://help.salesforce.com/s/articleView?id=xcloud.os_dataraptor_output_data_types_47661.htm&language=en_US&type=5), [Inputs and Outputs for Omnistudio Data Mappers](https://help.salesforce.com/s/articleView?id=xcloud.os_inputs_outputs_for_data_mappers.htm&language=en_US&type=5)

### Question 15

A Get Cloudy Consulting Data Mapper Transform on Omnistudio Standard Runtime flags a contract with `IF(%EndDate% < %ReviewDate%, "Expired", "Active")`. Some inputs use dates such as 03/15/2026 and others 2026-01-31, and the flag is often wrong. What should the developer do?

- A. Wrap both dates in TOSTRING, so that the < operator compares the two values as text instead of as dates
- B. Use `DATEDIFF(%EndDate%, %ReviewDate%) > 0`, because comparison operators treat dates as strings
- C. Use the ~= operator instead of <, because ~= compares two dates regardless of the format each one uses
- D. Set the Output Data Type of the EndDate mapping to Date, so that the formula compares both values as dates

**Correct answer:** B. Use `DATEDIFF(%EndDate%, %ReviewDate%) > 0`, because comparison operators treat dates as strings

**Explanation:** Help's operator reference says comparison operators treat dates and times as strings, so don't rely on them to compare dates; mixed formats make the string comparison wrong. DATEDIFF subtracts the first date from the second and returns the number of days, so a positive result means EndDate is before ReviewDate. TOSTRING would only confirm the string comparison that causes the problem. The ~= operator is a case-insensitive string equality test that doesn't evaluate dates. An output data type changes how a mapped value is output, not how a formula compares its inputs.

**Sources:** [Supported Data Mapper and Integration Procedure Operators](https://help.salesforce.com/s/articleView?id=xcloud.os_omnistudio_data_mapper_and_integration_procedure_operators.htm&language=en_US&type=5), [Omnistudio Date and Time Functions](https://help.salesforce.com/s/articleView?id=xcloud.os_omnistudio_date_and_time_functions.htm&language=en_US&type=5)

## Troubleshooting and Debugging (15%)

### Question 16

A Universal Containers admin who configures Omnistudio on the standard object model turns on the Omnistudio Metadata setting in Omnistudio Settings so the team can deploy components with Metadata API. An error appears right after the setting is enabled. Which three things should the admin check? Choose 3 answers.

- A. Component names that aren't valid unique names, because the setting checks names when it registers existing components.
- B. Data Mapper version numbers, which Help lists among the things to check when this setting raises an error.
- C. Whether the Omnistudio configuration tables are populated, because the setting creates entries for existing components.
- D. Whether Clean Metadata Deployment is already turned on in the target org, because the two settings must be enabled together.
- E. Whether the admin holds the Omnistudio Admin permission set license, because the setting reads only components the admin owns.

**Correct answers:** A. Component names that aren't valid unique names, because the setting checks names when it registers existing components.; B. Data Mapper version numbers, which Help lists among the things to check when this setting raises an error.; C. Whether the Omnistudio configuration tables are populated, because the setting creates entries for existing components.

**Explanation:** Omnistudio Settings says that when the Omnistudio Metadata setting is enabled, Omnistudio checks for valid unique names and creates entries for existing components in the Omnistudio configuration tables. Its troubleshooting note says to check for invalid component names, Data Mapper version numbers and populated configuration tables when an error appears after enabling it. Clean Metadata Deployment is a separate setting that requires the standard runtime; Help doesn't make it a condition of enabling Omnistudio Metadata. Nothing on the page ties the setting to the components that one admin owns.

**Sources:** [Omnistudio Settings](https://help.salesforce.com/s/articleView?id=sf.os_omnistudio_settings.htm&language=en_US&type=5)

### Question 17

Universal Containers controls who can run its Integration Procedures on Omnistudio Standard Runtime with Salesforce Sharing Settings: only users who are shared the procedure's record should be able to run it. Metadata caching is on. A security review finds that users without that sharing access can still run the procedures. Which change should the developer make?

- A. Set CheckCachedMetadataRecordSecurity to true, which adds a record-level security check for cached metadata at a small performance cost.
- B. Create an Omni Interaction Configuration named EnforceDMFLSAndDataEncryption set to true, so that cached procedures check each user's access.
- C. Change the Salesforce Platform Cache Type of each procedure to Session Cache, so that each user's session builds its own secured copy of the data.
- D. Leave the Required Permission property of each procedure blank, so that the Sharing Settings become the only access check that Omnistudio applies.

**Correct answer:** A. Set CheckCachedMetadataRecordSecurity to true, which adds a record-level security check for cached metadata at a small performance cost.

**Explanation:** Help's security settings table says cached metadata isn't secured by default when Sharing Settings or Sharing Sets control access, and that setting CheckCachedMetadataRecordSecurity to true adds a record-level security check for cached metadata, slightly reducing the performance benefit. The setting isn't needed when Custom Permissions secure access. EnforceDMFLSAndDataEncryption enforces field-level security for Data Mappers, not record-level sharing on cached procedures. Changing the Platform Cache Type changes where results are cached, and the security settings table doesn't list it as a way to secure cached metadata. A blank Required Permission lets any user run the procedure unless DefaultRequiredPermission is set, so it removes a check instead of adding one.

**Sources:** [Omnistudio Data Mapper and Integration Procedure Security Settings](https://help.salesforce.com/s/articleView?id=sf.os_dataraptor_and_integration_procedure_security_settings_56587.htm&language=en_US&type=5), [Security for Omnistudio Data Mappers and Integration Procedures](https://help.salesforce.com/s/articleView?id=xcloud.os_security_for_dataraptors_and_integration_procedures_56519.htm&language=en_US&type=5)

### Question 18

Users of an Ursa Major Solar quote Omniscript on Omnistudio Standard Runtime say that a Messaging element's warning about an invalid panel count appears only after they click out of the field, so they keep typing without feedback. What should the developer do so validation runs while users type?

- A. In the Setup properties, click Edit as JSON and add `"commitOnChange": true`, noting that LWC Omniscripts run it after a half-second delay.
- B. Change the field's Conditional View to Set Element to Required if True, so that the field is validated on every keystroke.
- C. Move the Messaging element into an Edit Block with the panel count field, so each change is validated as the row is edited.
- D. Set the Validation property of the Step's actions to None, so the field is validated before the user leaves it instead of after.

**Correct answer:** A. In the Setup properties, click Edit as JSON and add `"commitOnChange": true`, noting that LWC Omniscripts run it after a half-second delay.

**Explanation:** Help says Omniscripts run validation when a user clicks out of a field by using the onBlur function, and that to run validation as the user types you edit the Setup properties as JSON and add "commitOnChange": true; in LWC Omniscripts the onChange behavior runs after a half-second delay. Set Element to Required if True only makes the element required when its condition is true. Help says LWC Omniscripts don't support the Messaging element in an Edit Block. The Validation property of an action only decides whether Step validation runs before that action is invoked.

**Sources:** [Display Messages in Omniscripts](https://help.salesforce.com/s/articleView?id=xcloud.os_display_messages_in_omniscripts_19551.htm&language=en_US&type=5), [Conditionally Display Omniscript Elements](https://help.salesforce.com/s/articleView?id=xcloud.os_conditionally_display_elements_using_the_conditional_view_property_19389.htm&language=en_US&type=5), [Common Action Element Properties](https://help.salesforce.com/s/articleView?id=xcloud.os_common_action_element_properties_11090.htm&language=en_US&type=5)

## Related pages

- [Salesforce Omnistudio Developer practice exam](https://www.certifyforce.com/salesforce-omnistudio-developer-practice-exam)
- [Practice exam packs](https://www.certifyforce.com/practice-exams)
- [Official Omnistudio Developer exam guide](https://help.salesforce.com/s/articleView?id=005298971&language=en_US&type=1)
