At Dreamforce: The 1st Unofficial Unofficial SF SF Meetup

UPDATE: I TESTED POSITIVE FOR COVID THE NIGHT BEFORE DREAMFORCE, SO I WON’T BE AT THIS MEETUP. you might want to go anyways and see who shows, however.

Alex here…. If you’re coming to Dreamforce, drop by and say hello and tell me how you’re using Salesforce Automation and what you want to see in the future. I’ll be hanging out at Moscone West on the 2nd floor in back behind the session rooms, where they serve lunch, on Tuesday between 2:30-3:30pm. Would love to chat!

Complete the New Survey from the Salesforce Automation Design Team!

I’m pleased to pass on this new survey from the Salesforce Automation Design Team. I highly encourage everyone to fill it out. These are the key designers who are at the heart of all the changes we make to the user experience of Flow and Flow Orchestration. Giving them your latest thoughts on functional gaps, experiential challenges, and the like is a great way to influence the course of the products. This data will also be reviewed by the product manager group.

Hello everyone! We at the Salesforce design team are working on new and improved automation capabilities for Flow, and as part of that process we want to hear from our customers. We’ve created this 10 minute survey so that we can learn more about your automation experience in Salesforce, and would greatly appreciate anyone here taking the time to fill it out. Specifically we’re gathering feedback around:

  • What sorts of automations you’ve created, or want to create
  • What needs you have for accessing data outside of SFDC in your automations, if any
  • If you’ve previously used any other automation tools besides Flow

If you’ve ever created an automation in Flow before, you’re exactly who we’re looking to hear from! Every little bit of feedback matters, so please help us create the best product we possibly can for you.

Here is a link to the survey! (edited) 

Summer ’22 Sneak Peek: Flow, Orchestrator, NBA

Here’s what you can look forward to in Summer ’22 – hopefully this post will make your ‘Summer 22 Treasure Hunt’ posts a little easier!

Note that this is not the complete list of changes and you should carefully check the Release Notes for changes that may impact your org.

Record Triggered Flows

No-Code Flow Testing Arrives (Beta)

Imagine a scenario where your organization has a team of 15 people managing your Salesforce instance and multiple people making changes to Flows. There’s often a risk that somebody could unintentionally break some business rule logic. With the introduction of Flow Tests, you can check to ensure that you’ve maintained your business-critical logic from version to version. 

Flow Tests allow you to set up assertions or ‘assumptions’ about your results that you want to always stay the same. Those assertions protect your future self or others on the team from making costly mistakes in the future. 

Note: You can currently only create Flow Tests for After-Save and Before-Save flows.

Be on the lookout for a bigger post with a video walkthrough of Flow Tests in the coming weeks.

New Formula Builder With Syntax Checking in Entry Conditions

Get a sneak peak of our new and improved Formula builder in action on Entry Criteria in Record Triggered Flows.  Yep – that means you can now use a formula for your entry conditions! Before this new formula experience existed, you generally had to hope your syntax was accurate and only received feedback about your formula when you went to save your Flow.

Features: 

  • Select predefined operators to build your formula versus starting out with a blank slate
  • Check syntax to validate that your formula works within the context of your Flow
  • Traverse through relationships using Formulas and reference Global Variables

As noted above, you can now traverse through parent fields in Entry Criteria – one of the most common scenarios is checking for the Record Type’s Developer Name!

Keep in mind that complex formulas in entry criteria will negatively affect performance, so if you are able, stick with non-formula based conditions.  Be on the lookout for this new formula building experience to come to other areas of Flow, like Formula resources, in a future release. 

Workflow Rule Converter Goes GA

Our Workflow Rule converter is now GA – You can now convert even more workflow rules to Flows using our nifty conversion tool. We added support for Formulas and also added support for Null checks.

There will still be some Workflow Rules that are not convertible, namely:

  • Formulas featuring:
    • Hour/Minute/Second/TimeNow/TimeValue
    • IsClone
    • $RecordType

Be on the lookout for the official release notes covering all of the additions and considerations.

Flow Trigger Explorer Enhancements

Check out all the awesome improvements to Flow Trigger Explorer below.

Create New Flows Directly From Trigger Explorer

We’ve added the ability to create a new flow directly from Trigger Explorer – save time by pressing ‘New Flow’ for each trigger category. It even autofills the type and object for you!

Control Trigger Ordering

You can now control your record-triggered flow order directly from Trigger Explorer! Before this, ordering had to be done within each Flow’s advanced settings. Note that if you change the ordering of an active flow, a new version will automatically be created and activated for you. Keep this in mind if you decide to revert a Flow to an older version which may conflict with another flow’s trigger order.

Link: Flow Trigger Ordering Guidelines

Flow Triggers and Trigger Explorer Available in Object Setup Menu

Save time and get a picture of all of an object’s record-triggered flows directly from the Object Manager. You can even create a new flow or open up Trigger Explorer from the object’s setup menu! No more digging around in your org’s Flows list view.

Screen Flows

Add Descriptive and Collapsible Section Headers to Your Flow Screens

New in Summer ‘22, admins can add headings to sections in their Flow screens.

When a section has a heading, the end user is able to collapse or expand the section as they progress through the screen. Currently, all sections are expanded by default.

With section headings, admins can provide additional context and visual hierarchy for their end users, making it easier for users to make sense of a long block of inputs or multiple tasks in one screen. 

Additionally, section headings give visually impaired users the hierarchy they need to assess where in the screen they are. 

Dynamic Forms for Flow (Beta) – Name and Address Fields Added

You can now add Address and Name fields from the Fields tab in Screen Flows. For example, dragging the Name field on a Contact record will bring over all of the associated name fields like Salutation, First Name, Last Name, and more.

Dynamic Forms Address Field – Now with Google Typeahead!

Note that one of the coolest features of the newly added Address field support with Dynamic Forms for Flow is that it now supports typeahead results to automatically populate address data – a huge data integrity and time savings improvement. Check out how fast and accurate it was to fill in the Billing and Shipping address information for a new account.

Screen Editor Accessibility Improvements

We’ve made the following improvements to the Screen Editing experience for visually impaired users:

  • When you open the screen editor, the focus is automatically set to the Label field in the screen properties pane (for new screens) or the Edit button that enables you to edit a screen’s label (for existing screens). 
  • After you create a component visibility condition in a screen component, focus is set to the condition you created.
  • After you create a choice resource from a value field, focus is set back to the value field where you created the choice.

Screen Flows Can Now Run in LWR Experience Sites

Screen Flows can now be run in LWR Experience Cloud Sites.  

What is LWR?

With Lightning Web Runtime (LWR) on Node.js, you can build digital experiences that meet the high scale, security, and performance demands of modern web applications. LWR is a non-opinionated way to configure and load the modules, services, and dependency providers you need to build a JavaScript app.

Some benefits of LWR are:

  • Performance—Thanks to page generation at build time, not runtime, our bar is set at subsecond full-page loads.
  • Friction-Free—An enjoyable local development experience.
  • Power—All the power of Lightning Web Components and the Salesforce platform at your disposal.

Important Notes About Running Flows in LWR

LWR is a strict ‘no aura’ environment, which means there cannot be any aura-based local actions or custom aura components in your Flow.

Additionally, Flows with the following screen components / features are not yet supported:

  • File Upload
  • Image
  • Screen Inputs generated using Dynamic Forms for Flow

Lastly, Flows run in LWR Sites cannot be paused or resumed.

Orchestrator

Orchestrations Now Deployable with Change Sets

Admins that use Change Sets to deploy changes through their environments can now deploy orchestrations and the associated flows with the change set tool. Keep in mind you still need to activate the orchestrations upon successful deployment.

New $Orchestration System Variable

We introduced the new $Orchestration global variable that you can reference at any place throughout an orchestration. This new variable allows you to reference the Orchestration Instance Id which is handy for complex orchestrations that involve external systems which may pause or resume the orchestration with platform events.

Open Associated Flows from an Orchestration.

You can now save time to make quick edits by opening evaluation, screen, or autolaunched flows directly in Flow Builder from within an orchestration step.

More Orchestration History Tracked

You can now track more orchestration events from the Orchestration History. orchestration. The following events were added to the history: 

  • An orchestration is canceled
  • A stage or step is discontinued
  • An orchestration, stage, or step encounters an error
  • A work item is reassigned

Order Triggered Orchestrations with Flow Trigger Explorer

Triggered orchestrations can now be ordered along with other After-Save Flow Triggers within Flow explorer. This makes maintaining the order of your automations easier and ensures your orchestrations occur exactly when you want.

Next Best Action

Limit Recommendation Repetitions

You can now limit the number of times Next Best Action recommendations are repeated with the new Limit Repetitions Flow element.

Available for strategies built using the Recommendation Strategy Flow type.

Example Use Cases

  • Limit a recommendation from repeating for 3 months when an employee accepts an action to reset password. 
  • Limit a recommendation from repeating for a year when a customer rejects an offer to purchase an add-on for a discount.

Usage

  • When the Flow runs on an object page, it limits repetitions by record. Otherwise, it limits by runtime user.
  • Add Limit Repetitions element after you have your collection of recommendations and you have your recommendation IDs or keys.
  • Customize limits based number of responses within a specific number of days.
  • Save a step by assigning values to the RecommendationOutput right within the Advanced section versus adding the Assignment element. 

All Flows

Autolayout’s Go-To Connectors Now Highlight Referenced Elements 

We introduced Go-To connectors as a way to summarize the outbound connections an element may have in autolayout. For elements with long names, it was often hard to see the element a Go-To connector referenced.

Now, you can find connected elements in your flow by clicking the Go-To connector – Flow will now highlight and the target elements. As an added benefit, we’ll also adjust the Zoom level to ensure the Go-To connector and all of the target element(s) are all in view. 

Custom Icons for Invocable Actions

Take note ISVs and Partners – invocable actions can now have their own unique icons in Flow Builder. This provides fantastic opportunities for branding and at-a-glance ease of use.

  • Developers creating invocable actions can choose to specify either Salesforce Lightning Design System (SLDS) icons or custom SVG files (added as a Static Resources in the org) to use as the icons for their actions in Flow Builder.
  • Developers specify action icons through a new iconName modifier in the invocableMethod annotation in the Apex code for actions: @invocableMethod(iconName=’icon’).
  • Note that custom icons are only displayed in flows using auto-layout.

Use Standard SLDS Icons

Below is a quick example of an out of the box SLDS icon – all I did here was add the SLDS path to the icon in the invocable action @InvocableMethod piece of the Apex Class: 

@InvocableMethod(iconName=’slds:custom:custom47‘)

The format expected is slds:<slds Icon category>:<icon name>

Using Custom Icons – SVG Files

The real power and pizazz of this feature comes from being able to use custom SVG files. SVG (Scalable Vector Graphic) files are vectorized and contain XML metadata about how they should be displayed. 

Suppose I have a static resource named ‘slacklogo’ – an SVG file. The naming convention expected in the invocable method is resource:staticResourceName:svgID. The SVG g-tag Id can be found in the actual metadata of the file. If one doesn’t exist, you’ll need to add one (via Notepad or your IDE of choice).

SVG files must meet the following requirements:

  • The <svg> element in the file includes an id, xmlns, and viewBox attribute
  • The <svg> element in the file doesn’t include a style, height, or width attribute
  • The file doesn’t include a <clipPath> element
  • Each <path> element in the file includes a fill attribute

Here’s an example with a custom slack icon uploaded as a static resource:    @InvocableMethod(iconName=’resource:slacklogo:slack’)

Be on the lookout for more info in the official release notes for best practices and setup help with custom action icons.

Delete Flow and Process Versions from Managed Packages

ISVs and Partners – this one is a biggie for you. You can now delete a flow or process version from a managed package in the org that uploads the package. After you delete the version, the org that subscribes to the package keeps the version until someone manually deletes the version in the subscriber org. This is a great change for ISVs as it means orgs will no longer hit the Flow version limit when new flow versions are pushed from package upgrades.

Note: To turn on this feature, contact Salesforce Support.




UnofficialSF has a new Service Cloud Channels Section

UnofficialSF.com has added a new section devoted to Service Cloud channel functionality, which is increasingly driven by flow-based services.

Check it out here. If you know of a good post or page on the topic, don’t hesitate to let us know via the form on the home page.

Video: Building NBA Recommendation Strategies with Flow Part 1

This video shows how to use Flow Builder to create a Recommendation Strategy flow that filters recommendations that can be displayed in the Next Best Action component.

Go to the Next Best Action hub

Tracking Consumption of NBA Requests

Track consumption of NBA requests in your org in the Setup –> Company Settings –> Company Information page. There are two published metrics:

In the Usage-based Entitlements section, you’ll find ‘Maximum Next Best Action Requests available’:

This will show, in the Allowance column, the sum of the 5000 monthly ‘freemium’ org allocation and any allocation purchased via the Einstein Next Best Action Additional Requests SKU. The Amount Used column rolls over monthly. Note that it does not roll over on the first day or last day of the month. The rollover date varies from org to org.

Orgs that have been provisioned with the Einstein Next Best Action -Unlimited Requests permission set license will see the available and consumed licenses in the Permission Set Licenses section:

This license is included in several SKUs, including Service Cloud Einstein and Platform Plus. It also gets provisioned when ISV’s incorporate Platform Plus into their ISV Solution. That can be confusing because there’s no clear linkage in the UI between the licenses and the ISV package you’ve installed. Note that when ISV’s do this, their license restricts the use of NBA to their own application, so it’s not allowable to use these licenses for general purpose NBA.

Requests that are generated by users with the Unlimited Requests SKU do not get counted in the Amount Used column of the Usage-Based Entitlements.

Building NBA Recommendation Strategies with Flow Builder in Spring ’22

Here’s a new presentation that reviews the new way to build NBA strategies. This is the recommended path, going forward, and there won’t be additional improvements to the original Strategy Builder.

Here’s a list of some of the new features that NBA Recommendation Strategies inherit when they are built in Flow Builder

Spring 22 Sneak Preview: Flow, Orchestrator & Next Best Action

Compiled this time as a collaboration between Alex Edelstein and Adam White.

Here’s what you can look forward to on Spring ’22. Try it out here: https://www.salesforce.com/form/signup/prerelease-spring22/

Salesforce Orchestrator Goes GA

New enhancements in Spring ’22:

Assignment to Queues and Groups
Work Items can be assigned to multiple users

Reassignment of Work Items
Allow users to reassign Work Items to others

Cancel a running orchestration
A run can be canceled from the list of runs

API access to trigger Orchestrations
Initiate an Orchestration via the Flow REST API

API access to monitor Orchestrations (Connect API)
Inspect running Orchestration instances

CI/CD & SFDX
All Orchestrator components can be deployed

Flow Support Has Been Extended to Standard Support Customers

Until now, technical support for Flow required Premium or Signature support. As of 12/1/21, it is now available to Standard support. This is, needless to say, a big deal.

Generate Next Best Action Recommendations Using Flow

You can now use Flow Builder to craft recommendation strategy flows that generate actionable recommendations that work with the specialized Next Best Action lightning component on Lightning Pages and the Suggested Actions in Community Pages. Previously, doing this required the use of a separate builder

Create recommendation strategies from the New Flow window:

Automatically Migrate your Workflow Rules to Flows

A New Element Joins the Fray – Collection Filter!

A new way to filter and find records in a collection joins the growing number of out of the box collection processors. Instead of looping to find a set of records within a collection, you’ll now be able to specify record criteria or create a formula to filter down an existing collection into a smaller one. This opens up a world of possibilities as it will allow you to handle greater amounts of records without hitting the ‘Iteration Limit Exceeded’ error that plagues transactions with bigger loops. Need to filter down a collection of 500 contacts? Collection Filter can do that for you!

Check out the separate post about Filter here on USF!

Sneak Preview: The New ‘Collection Filter’ Element

View All of an Object’s Record-Triggered Flows with Flow Explorer…

Flow explorer shows an ordered list of all the flows affected by a specific triggering event.

You will also get a nice side panel that allows you to open the flow directly and view all of the versions associated with the Flow. Notice how you’ll also be able to activate previous versions in the same place.

…AND Control the Order of Your Triggered Flows

You can apply numeric values to order your triggered flows.

  • Flows with the same trigger (before- or after-save) on the same object with trigger order values from 1 to 1,000 run in ascending
    order (1, 2, 3, and so on). Multiple flows with the same trigger order value run in alphabetical order based on the flows’ API nam
  • Flows without trigger order values run next and in the order of their created dates. Flows in Winter ’22 and before run and continue
    to run in this order, unless you define a trigger order value for them.
  • Flows with trigger order values from 1,001 to 2,000 run next and in ascending order. Any ties are settled using the flows’ API names.

(Note that the team does expect, in a future release, to marry this ordering process to the Flow Explorer shown above for a drag and drop reordering capability.)

Dynamic Forms for Flow (Beta) Supports Additional Field Types

You can now additionally add Email, Phone, and Picklist fields by simply dragging the fields onto the screen:

This features remains in Beta. Keep in mind that if you want to create an easy form to enable the creation of a new record using this feature, create a new record variable to contain it and select it in the ‘Record Variable’ field in the upper right. (later the team plans to make that step automatic and unnecessary)

Auto-Layout Improvements

Autolayout Mode has gone GA and filled in a couple of coverage gaps:

Perhaps the best new Auto-Layout feature is…

Open Subflows Directly from the Canvas in Auto-layout

An often requested quality of life feature, you can now open subflows directly from the canvas and when creating a Subflow! In the future (safe harbor) we plan to add the Subflow description to the canvas as well.

Shortcuts provide faster access to preconfigured elements

In Record-Triggered Flows in Autolayout Mode, shortcuts will appear to facilitate email sending and record updating:

Accessibility Enhancements

1) Flow Achieves Full WCAG 2.0 Accessibility Support

2) Create and Edit Flows with Your Keyboard

3) Screen Flows launched via a URL-based method now meet the contrast requirements of
Web Content Accessibility Guidelines (WCAG) 2.1 Level AA

Flow’s accessibility services have been improved. Keyboard traversal is fully supported in Screen Builder as wells as the Flow runtime. You can navigate between sections of Flow Builder, and screen readers work across the full product.

Custom Footer Labels are Translatable

The Custom Footer Labels that became available last release are now fully translatable.

Choices Enhancements: Use a Record Collection to Generate Your Choices

If you have a collection of records or strings from earlier in your flow, you can now use that to generate a set of radio buttons, checkboxes, or picklist items.

Supercool Pilot Updates – Reactive Screens

See this post for an example of how reactive screens allow powerful dynamic effects on Flow screens. If you want to join the pilot, go here.

New Ordering Changes take effect for flows configured to run on the latest API version (54.0)

After-Save Record-Triggered Flows Now Run Before Entitlements are Executed

Entitlements can now include any updates made by traditional after-save flows.

Approval and Time-Based Workflow Field Updates Now Execute Before-Save and After-Save Record-Triggered Flows

This change allows field changes made by approval processes to trigger flows.

Keep in mind that this will not affect any existing flows unless you choose to click Save As and ‘upgrade’ the flow to use version 54 or higher.

Enhanced Einstein Discovery Flow Action supports Multiclass Models

Multiclass models predict the most likely outcome among up to ten possible outcomes. For example, if you offer seven insurance products, use a multiclass model
to predict which insurance product a new customer will likely purchase. When you run the flow, the output of this action is the predicted
value (the predicted winning insurance product, for example), along with a bar chart of ranked probabilities by value (all insurance
products). Optionally, you can include top predictors.

Order Management: New Flow Actions, and Rollback

The Order Management flows are updated to use the Roll Back Records element, which cancels pending record changes when a flow
exits due to an error. In addition, the following new actions are available:

Find Routes With Fewest Splits Using OCI
Find inventory availability using Omnichannel Inventory and identify the fulfillment routes with fewest splits for an order summary.
This action combines the existing Omnichannel Inventory Service Get Availability and Find Routes With Fewest Splits actions.


Add Order Item Summary
Add order item summaries to an order summary

In addition, you’ll enjoy improved order throughput with the flows in the DOM Routing Flow package. We’ve updated them to use multithreaded processing
with scheduled paths.

Additionally, an Even Exchange standard flow is now available.

Easily Keep Track of your Flows in your Browser Tabs

The flow’s name and version now appear on your browser tab titles, so you can quickly
scan your workspace and find your flow.

More Places Where You Can Use a Flow to Override Standard Behavior

More Salesforce product teams are implementing functionality using standard flows and allowing users to override the functionality with custom flows.

Health Cloud: Adding Patient Medication

Event Monitoring enables flows to be created that respond to Security Events

ApiAnomalyEvent, CredentialStuffingEvent, ReportAnomalyEvent, and SessionHijackingEvent are exposed as selectable platform events in Platform-Event triggered flow start elements.

Salesforce Surveys now ships Sentiment Analysis flows out-of-the-box

To process text responses in bulk, use a flow:
• Perform Survey Sentiment Analysis for User-Selected Question: Screen flow. Lets you define custom values, such as survey, questions,
type of operation to perform on the responses, and date range to process responses in the selected timeline.
• Perform Survey Sentiment Analysis: Autolaunched flow. Lets you schedule bulk processing of responses.
Use the invocable action in the flow to define the operation to perform on the responses and the date range.

Tips and Tricks for Generating Recommendations from Accounts and Other SObjects

Suppose you want to recommend Accounts using Einstein NBA. You can build a list of Accounts and filter it, and then map the accounts to the recommendation format that the NBA Recommendation component understands. Users can then click to Accept or Reject those recommendations. Suppose you then want to generate a report to determine which Account recommendations were most frequently approved. Is this possible?

You can Load regular records (Account, Contact) into Strategy Builder but you must map them to recommendations

Consider the strategy below:

The Inspector shows that two accounts are being output from the strategy. Yet when we point a Next Best Action component at this strategy, we don’t see them:

The problem here is that the NBA component expects to receive data structured as Recommendation objects, not Account objects. So you need to generate corresponding recommendations with the Map element:

Let’s configure Map as follows:

We’re able to save and the Inspector shows two recommendations being output, but still nothing shows up:

To isolate the issue, I’m going to add some ‘plain’ recommendations to the strategy and see if those succesfully come through. You can see here that the strategy is output two recommendations generated from accounts and a bunch of ‘plain’ recommendations

When we look at the page, we see the plain recommendations but not the account-derived recommendations. That tells us something’s wrong with our mapping:

Now, next I’m going to use a useful little trick to further isolate the issue. Note that in the above image, Maximum Recommedations Displayed is set to 4. Watch what happens when I change it to 3:

Before continuing, you might want to take a moment and try to figure out what this tells us….

….well, the fact that only 1 of the plain recommendations shows when Maximum Recommendations Displayed is reduced to 3 suggests strongly that our 2 Account-derived Recommendations are successfully be delivered to the Next Best Action component, but it’s somehow failing to render them properly.

It turns out that the component is pretty finnicky about the fields of data that are provided to it. When you derive recommendations by mapping from SObjects, you really need to make sure all the fields that are required are properly there. (Of course, the right thing to do would be to provide some user-friendly validation, but so far Salesforce hasn’t been able to resource that).

Among the required fields: you MUST have an ActionReference that has as its value the literal name of an activated Screen Flow.

Note how the ActionReference shows up in Map with the label ‘Action’:

Once we have this, our Account-derived recommendations show up:

Note that, counter to usual practice, Description is a required field because it forms the core of the recommendation body. Not providing a Description as part of your Mapping will lead to strange unexpected behavior.

When you generate a report of recommendation reactions, the account-derived recommendations show up among the plain recommendations, and the Account Id is available in the report’s Recommendation Source Id field:

More information on Mapping

NBA Home

Solution: Extending ‘Limit Reoffers’ Capability

This request came in:

I have a customer trying to implement limiting re-offers, but wants to have differing time periods based on whether a user accepts or rejects the offer.  Specifically, a recommendation should appear after 6 months if the recommendation is rejected, and 4 months if the offer is accepted. 

This canbe done with two branches and a Limit Reoffers on each branch. A third branch would be used to represent recommendations that have neither been approved or rejected. All three branches would initially load the same set of recommendations.

Later in the strategy, you would use a Branch Select to decide which branch to allow through.

On each branch, your goal would be to filter the original set down. One branch would want to filter it to Only the Recs That This User Most Recently Rejected. The second branch would want to filter to Only the Recs That This User Most Recently Accepted. The third branch would be Only the Recs That Have Neither Been Approved or Rejected By This User.

Since the built-in Limit Reoffers doesn’t support the variability this customer needs, they would have to store their own information on User Accepts or Rejects so the filters have something to work with.

In order to do that, you’d need to store records that reflect whether a particular recommendation was accepted or rejected by a particular user. You’d create a custom object called something like ‘RecommendationUserResponse’. In the downstream flows, you’d create or update a RecommendationUserResponse record. It would have three fields: a Recommendation Id, a User Id, and a Response value of either ‘Accepted’ or ‘Rejected’.

To apply the filter logic, you would use the Enhance element and an invocable action. The Enhance element would call the action. The action would iterate through the provide recommendations and query for RecommendationUserResponses with a matching Recommendation Id and User Id. It would then use the Response field to determine whether to filter each recommendation out.