Skip to main content

Feed

Connect with fellow Trailblazers. Ask and answer questions to build your skills and network.

Hello. I'll be using UTAM for our Automation Framework.     For the setup, I did install the following:      1. Install UTAM  npm i utam      2/ INSTALL WDIO  npm init wdio    3. INSTALL UTAM WDIO SERVICE  npm i wdio-utam-service --save-dev    4. INSTALL DOTENV  npm install dotenv    4. INSTALL SALESFORCE PAGE OBJECTS  npm i salesforce-pageobjects    5. ADD UTAM AS DEV-DEPENDENCY  npm add --dev utam    6. ADD BUILD to package.json      "test:ui:compile": "utam -c utam.config.js",      "test:ui:generate:login": "node scripts/generate-login-url.js",      8. Add UTAM in wdio.config.js  require('dotenv').config();  const { UtamWdioService } = require('wdio-utam-service');    services: [          [              UtamWdioService,              {                  implicitTimeout: 0,                  injectionConfigs: ['salesforce-pageobjects/ui-global-components.config.json'],              },          ],      ]    -----------  However, whenever I run the test, it's still giving me either a reference error of "utam is not defined" or the import modules (e.g. import {DesktopLayoutContainer} from '/salesforce-pageobjects/dist/navex/pageObjects/desktopLayoutContainer' cannot be found'    I tried uninstalling and installing the node_modules and tried everything in https://www.geeksforgeeks.org/node-js/how-to-resolve-a-cannot-find-module-error-using-node-js/ and     What am I missing?   

1 answer
  1. Jan 21, 11:40 AM

    Hi @Aira Gutierrez

     

    The "UTAM not defined" and module import errors in 2026 typically stem from missing compiler generation steps or an incomplete link between your testing environment and the generated code.

    1. Resolve "UTAM is not defined"

    In 2026, the global utam object is not provided by default in standard Node.js scripts; it must be imported or generated via the compiler.

    • Ensure Compilation: Your wdio.config.js and tests depend on JavaScript files that are compiled from .utam.json files. Run the compiler command you added to your package.json:

    npm run test:ui:compile

     

    • Manual npx check: If the script fails, try running it directly to see specific error messages:

    npx utam -c utam.config.js

     

    • WDIO Global Hooks: Ensure your wdio.config.js properly exports the UtamWdioService. If you are trying to use utam in a test script, you must use the utam object injected by the service. In your test file, you typically don't import a global "utam"; you use the browser object or the injected loader: 

      javascript-

    // Instead of calling a global utam 

    const loader = browser.utam; // The service adds this to the browser object 

     

    2. Fix "Module not found" for Salesforce Page Objects

    The salesforce-pageobjects package contains JSON definitions that must be compiled into JavaScript before they can be imported. 

    • Correct Import Paths: In 2026, the standard package structure for salesforce-pageobjects does not always require the /dist/ path in the import string. Try importing from the package root: 

      javascript-

    // Use this 

    import { DesktopLayoutContainer } from 'salesforce-pageobjects/pageObjects/desktopLayoutContainer'; 

    // Instead of 

    import { DesktopLayoutContainer } from '/salesforce-pageobjects/dist/navex/...';

     

    • Update Package Version: Ensure you are using a version compatible with the current Salesforce release (Winter '26). Check for updates:

    npm install salesforce-pageobjects@latest --save-dev

     

    • Check utam.config.js: Ensure your configuration file explicitly lists salesforce-pageobjects in the injectionConfigs. An empty or missing configuration will prevent the generator from finding the Salesforce definitions. 

    3. Verify WebDriverIO Configuration

    If you recently upgraded to WebDriverIO v8 or v9 (standard in 2026), ensure your wdio.conf.js is using the newer object-based service definition. 

    • Service Configuration: Ensure the UtamWdioService is properly imported and added: 

      javascript-

    const { UtamWdioService } = require('wdio-utam-service'); 

    exports.config = { 

        // ... 

        services: [ 

            [UtamWdioService, { 

                implicitTimeout: 0, 

                injectionConfigs: ['salesforce-pageobjects/ui-global-components.config.json'] 

            }] 

        ], 

    };

     

    Final Troubleshooting Step: If imports still fail, check your node_modules folder manually to confirm the file path salesforce-pageobjects/pageObjects/desktopLayoutContainer.js exists. If only .json files exist there, the package was not compiled correctly.

0/9000

Environment:

Tableau Desktop, data source built from a self-joined extract (cloud data warehouse connection). 

Goal: Build a 5x5 risk matrix (Likelihood x Impact, both discrete integers 1-5) that always renders all 25 cells, even when a given filter selection (e.g. a category/group dimension) has records that don't cover all 25 combinations. (Like below)Scaffold table for dense 5x5 matrix collapses when filtering on a dimension not present in the scaffold

Setup:

  • Main data source: a single table, self-joined on a parent/child key relationship to attach parent-record fields to child rows.
  • To try to always render all 25 combinations, we added (and later removed, see below) a Custom SQL scaffold table generating all 25 combinations of two numeric fields (1-5 x 1-5), joined/related to the main table on those two fields.
  • Columns: Impact (numeric, discrete), Rows: Likelihood (numeric, discrete), Shape/Label driven by record-level fields (ID, a derived score).

Problem: When no filters are applied, all 25 cells render correctly (scaffold rows with no matching record show as empty cells, which is the desired behavior).

As soon as a filter is applied on any dimension NOT present in the scaffold table (e.g. a group/category field), the filter also removes the scaffold rows (since they have NULL for that dimension), collapsing the matrix back down to only the combinations that have actual records for that filter selection. 

 

What we tried:

  1. Blending instead of joining - not usable. The main data source contains a self-join (logical tables), and Tableau blocks logical-table sources from being used as a secondary blend source ("Data sources that contain logical tables cannot be used as secondary data sources for data blending").
  2. Fixed axis range on the two numeric fields - not usable since both fields are discrete, not continuous. Converting them to continuous was tested but rejected: with continuous axes, the shape marks overlap/stack instead of sitting centered per cell, which is unacceptable for this visual.
  3. Show Missing Values - not available. This option only appears on discrete date fields/bins, not on a plain discrete numeric/integer dimension pulled from a join.
  4. Bins with Show Missing Values - not attempted in full, flagged as a partial solution: bins only densify between the min and max value actually present after filtering, so a filtered selection with max value 4 would still be missing the "5" column. Would need to be paired with a way to force-anchor the endpoints.
  5. Null-tolerant filters - partially worked, then broke on a data quality issue. Rewrote each filter as ISNULL([ID]) OR <original condition>, and included Null in the relevant quick filter, so scaffold rows (no ID) always pass regardless of filter selection. This worked correctly for that filter in isolation. However, it broke down because a subset of real records in the source data have a genuinely NULL value on that same filter field (a data quality gap, not scaffold rows), so including "Null" in the filter also pulled in those orphan records on every filter selection - contaminating the matrix with records that don't belong to the selected group. Distinguishing scaffold rows from genuine null-value records would require either a dedicated is_scaffold flag column in the Custom SQL, or a calculated dimension like IF ISNULL([ID]) THEN "(Scaffold)" ELSEIF ISNULL([Group]) THEN "Unassigned" ELSE [Group] END used as the filter field instead of the raw dimension - not implemented yet.

Current state: Removed the Custom SQL scaffold table entirely, since none of the above approaches held up once real filters were applied. The matrix currently just shows fewer than 25 cells when filtered to selections with limited record coverage.

 

Question for the community: Is there a native Tableau way to force a discrete dimension pulled from a joined/related table to always show its full domain (1-5 on both axes) regardless of filters applied on unrelated dimensions, without a pipeline-level fix and without hitting the logical-table blending restriction? Specifically interested in:

  • Whether a table calculation or a different LOD structure can force-render the missing combinations
  • Whether there's a supported way to flag scaffold rows distinctly from genuine NULLs in a self-joined source, so null-tolerant filters don't accidentally include unrelated orphan data

Happy to share the exact Custom SQL and calculated field text (genericized) if useful. 

 

#Tableau Desktop & Web Authoring

2 answers
  1. Oct 2, 10:19 PM

    If you relate the scaffold on matching fields then the filtering will carry over.  I would reinstate the 5x5 scaffold and relate it using a relationship of 1=1 - that way the grid is never filtered by anything from the main data - then perform the “join” for each cell in a calculation instead of the relationship, something like:

    SUM(IF [Likelihood] = [Likelihood scaffold]

    AND [Impact] = [Impact Scaffold] Then [Measure] END)

0/9000
2 answers
  1. Eric Burté (DEVOTEAM) Forum Ambassador
    Oct 2, 10:06 PM

    Hello @Priyanka Kote, +1, and in your trailblazer profile page (trailblazer.me) you can also filter your badges view by badges/supebadges/modules, but not per trailmixes. That can be explained because anyone can create a trailmix, and they can be modified after you take it.Hello , +1, and in your trailblazer profile page () you can also filter your badges view by badges/supebadges/modules, but not per trailmixes.Eric

0/9000

Hi Tableau Community! I am looking to create a License Matrix for my org. We are currently going through a merger and acquisition, and we want to do an inventory of both environments.  

I have data prepped through Tableau Prep. Attached Excel file is the dummy data of the Output. 

I have also attached the Tableau .twbx of a WIP file.

 

Below is the License Matrix we want to create (numbers are not accurate. This is just a mock of what we want to recreate).

How to Create a Matrix?

 

Much appreciate the help! Any tips would be great. Please note I can use Tableau Prep to massage the data if required. 

 

#Tableau Desktop & Web Authoring  #Flow  #Reports & Dashboards

4 answers
  1. Oct 2, 9:35 PM

    I'm glad you're figuring this out. Your data and/or LOD calc needs to be cleaned up as it is not returning a single value per user (see image below). But to fix your user counts you need to change the CNT(User) on the License Matrix sheet to CNTD(User) to count distinct users.I'm glad you're figuring this out. Your data and/or LOD calc needs to be cleaned up as it is not returning a single value per user (see image below).

     

    image.png

     

     

0/9000

I complete all the steps, and my end result is working as expected (screenshot below), but it still doesn't pass me: "The 'Translate Survey Input' action is either missing, named incorrectly, or not positioned after the existing Get elements in the 'Translate Fitness Survey Input' flow. Review the 'Work with the Prompt Template in a Flow' scenario and related Help article for element configuration."

 

Agentblazer Innovator | Superbadge: Translate Text with a Prompt Template and Record-Triggered Flow

 

I've started from scratch a few times and used a new org, but no luck. Can anyone help? Am I missing something? 

 

Screenshots from my setup: 

 

Screenshot 2026-10-02 at 4.02.40 PM.png

 

 

Screenshot 2026-10-02 at 4.02.57 PM.png

 

 

Screenshot 2026-10-02 at 4.03.50 PM.png

 

 

 

 

 

 

#Trailhead Challenges  #AgentblazerInnovator  #Trailhead Superbadges  #Prompt Builder  #Flow

1 answer
  1. Eric Burté (DEVOTEAM) Forum Ambassador
    Oct 2, 10:02 PM

    Hello @Caroline Fearey concerning the action, check your API name; it is written " Label the action Translate Survey Input with API name Translate_Survey_Input using any description you’d like". Yours has an extra "Fitness" in it.Hello concerning the action, check your API name; it is writtenEric

0/9000
Hello,

 

I am stuck on this trailhead (https://trailhead.salesforce.com/content/learn/modules/identity_external/identity_external_social?trailmix_creator_id=strailhead&trailmix_slug=prepare-for-your-salesforce-advanced-administrator-credential) when i try to complete the challenge for google login it comes up with the error message below.

 

"NO_ACCESS: Unable to find a user"

 

Have followed all the steps, but this error message provides absolutely no helpful information.

 

Any assitance appreciated thanks,

 

Daniel

 

 
4 answers
  1. Nov 22, 2020, 10:49 AM
    Fixed it by creating a brand new google ID. Have seen this trailhead error pop up in other areas so leaving this here.
0/9000

Unable to get course marked completed. 

 

I keep receiving this message:  

We see you're using the Agentforce org from the quick start. But it's not prepared for agent deployment into Slack. Complete the steps from the quick start to ensure you can set up the agent.

 

Einstein is turned ON 

Einstein Bots are turned ON 

Agentforce Agents are turned ON 

Product Management Agent is connected to SLACK 

Org is Connected to Slack 

Connected Apps OAuth has been installed. 

Agent is live and running in my test environment.  

 

PHOTOS ATTACHED!!! 

 

In Slack, my Agent is viewable and accessible. Org shows connected in Slack.  

 

 

#Trailhead Challenges  #Trailhead  #Salesforce Developer  #Help

2 answers
  1. Oct 2, 8:28 PM

    I tried deactivating and reactivating multiple times.  Create an enhanced bot.  Still getting the same error.   

     

    We see you're using the Agentforce org from the quick start. But it's not prepared for agent deployment into Slack. Complete the steps from the quick start to ensure you can set up the agent.

    Open a case for this.

0/9000

I have split records into respective Service Territories: I want to be able to see a count per Service Territory using the same criteria, excluding two filter conditions: is this possible? Record count required illustrated by red below and criteria I need removing highlighted: Report record query: is it possible to create a linked record count from a smaller filtered list?

 

 

image.png

 

 

 

#Reports & Dashboards  #Reporting  #Reports  #Salesforce Admin

11 answers
  1. Oct 2, 8:24 PM

    Unfortunately, I don;t think this is going to be possible with a Report Summary Formula, and you only get 1 Row-Level Formula per Report.  

     

    I thnk you're gonna need to create an "array" of custom Formula Fields on the Object

0/9000

Working with the Trailhead badge: Discover Agentforce Grid 

https://trailhead.salesforce.com/content/learn/modules/agentforce-grid/discover-agentforce-grid?trail_id=become-an-agentblazer-innovator-2026

 

 

And after following module instructions, I'm having the next error message: 

Challenge not yet complete in Agentforce Grid Org

We can't find the special settings preinstalled in this org. Make sure to use the special org made for this badge and linked in this unit's scenario. 

 

However, I've followed the instructions and loaded the provided development org for this specific module. 

 

Can someone provide a tip or solution? 

 

Thx in advance..!! 

 

#Trailhead Challenges

3 answers
0/9000

I am trying to proof out an idea around "Twinning" a value from the Catalog object or Category object to the Quote Line Item in Revenue Cloud.  

 

Context:  

Looking at using Catalogs to represent a store branch. On the Catalog we would have a custom field for that branch id. I need to travel/twin this value from the catalog to the quote line item for pricing.  

 

Use Case: 

A user would browse catalog, representing a specific branch where they would select a product and add it to the quote lines. On that quote line I want to be able to move the value of branch id from that catalog the product was selected from to the quote line for pricing.  

A different branch might not carry the product or have different pricing coming from SAP.  

 

I've reviewed concepts around context definition for product2 to quote line item that works without problem. How do we do something similar with this object or the category under the catalog? 

 

Any help here around setting up the context definitions to make this work would be appreciated. 

0/9000