NAV

Introduction

Gradient Works allows you to do lead matching and routing as well as assignment of any Salesforce object to any user. Workflows are implemented inside Flow using custom actions. This documentation provides a reference for using Gradient Works.

Getting Started

To get started, open the Gradient Works app from the Salesforce App Switcher. The app has six tabs:

Next, you'll probably want to set up some queues to do assignment. After that, you'll want to dive into Flow to set up routing automation.

Queues

Gradient Works manages assignments through Queues. You can think of queues as "pools" of users that are eligible to have an item assigned to them. Items can be any Salesforce object but are usually things like Leads, Accounts and Opportunities.

To set up a queue, click "New" in the "Gradient Works Queues" section of the Gradient Works Admin. The only required field you need to fill out is Name. This is a unique name for the queue. Set it to something that describes the group of users you're going to be assigning to (e.g. "BDRs", "Senior AEs"). Click "Save".

Queue Users

Queues exist to make it easy to manage assignment to groups of people. You can associate any Salesforce user with a queue.

Once you've created a queue, you'll be taken to the queue tab in the Gradient Works app. Click "Add Users" in the "Queue Users" section. This allows you to add any Salesforce users to your queue. These users will be eligible for assignment through the Queue.

Availability

Each user has an "Availability" section which allows you to control when that user is available to receive an item. You can control this in two ways:

When configuring availability it's a good idea to ensure that at least one user will be available at all times. If no user is available, the system will hold assignments until a user becomes available again. However, you may experience errors in your flows that use the Queues: Assign Single Item if there are no eligible users.

Temporary Skipping

To temporarily skip the next assignment for a user, go the Queue User edit page and set the number of skips in the "Skip Next Times" field. If you just want to skip the user that's up next, you can use the "Skip" button described in the Queue Slots section below.

Queue Slots

Queue assignment is built around the idea of round-robin "slots", each of which as a unique index and is assigned to a particular Queue User. Users with higher Weights will receive more slots.

The Queue maintains a Next Slot Index which points to the next slot that will be used for assignment. You can see this by clicking on a Queue name in the Gradient Works Admin. The next 10 slots are displayed at the bottom left.

You may skip the next scheduled user by clicking the "Skip" button on the slot labeled "Next Up". Note that availability status and working hours will impact whether a user receives an assignment so the "Next Up" user may be skipped depending on their availability at the time the assignment occurs.

Automation

Gradient Works matching, routing and assignment workflows use Salesforce Flow. Flow is built into every edition of Salesforce and allows you to automate business processes using a drag and drop interface. If you're not familiar with Flow, Salesforce offers a number of Trailhead tutorials that will have you up and running in no time.

Flows consist of building blocks that perform specific actions such as retrieving data, executing business logic or displaying content to users. Gradient Works integrates directly into Flow by providing custom actions.

Dashboard

After you have set up your assignment workflows, you'll need some way to observe the assignments that are being made by Gradient Works. The Dashboard provides a way to easily see the kinds of recent assignments being made and who they are getting assigned to. We've also provided the list of assignments powering the charts so that you can easily see more detail if needed.

Lead Matching

Many Lead routing workflows require that you first attempt to match a Lead to an Account, Contact or other Lead. Gradient Works enables you to easily add these to your Flows with the following actions:

Each action uses the same basic concepts to locate a best match: match criteria, filters and rankings (explained in more detail below). Each action outputs specialized matches which you can use later in your flow for assignment or lead conversion.

Match Criteria

Match Criteria provide a way to define candidate matches by comparing Lead fields with fields on a candidate (e.g. Account, Contact, other Lead). There are three types of matches:

Match candidates will be retrieved if they match any one of the specified criteria.

Filters

Filter conditions limit the candidate matches by ensuring they meet certain criteria. You can use familiar operators like equals, greater than and contains to define filters. Candidates must meet all filter criteria to be included.

Specify condition requirements to indicate how to handle multiple conditions:

Rankings

Ranking provides a way of determining which match is the best match in the event there are multiple match candidates after filtering. These act as tie breakers. Click and drag using the drag and drop icons to reorder them.

There are two types of rankers:

Flow Actions

Assign: Directly assign item to user

Assigns an item directly to a specific user. The item may be of any type (e.g. Account, Lead, etc). By default, the assignment is performed immediately.

Note that this action uses a User Id for the assignee. This allows you to use an Id field directly from another object instead of requiring that you always perform a Get Records action to fetch the User object.

You can access information about the assignment in the Assignment object included in the output. You can use this Assignment object as an input to other actions such as Notifications: Send Single Assignment Email.

Advanced options

By default, the item is assigned using the OwnerId field. If you want to use a different field, specify that value for the assignment field in the editor. This must be a User lookup field on the item being assigned.

By default, the assignment is updated immediately in the database. If you want to perform the assignment but delay the update (helpful in bulkifying flows), change Update Item in the editor to "Later, Using Update Records". This will set updateImmediately to false.

Inputs

Name Required Type Description
assigneeId No Id This id of the user to assign to. "Assignee User Id" in the editor.
item No SObject The salesforce object to assign if assigning a single item. "Item to Assign" in the editor.
itemField No String The field on the item to use for assignment. Defaults to OwnerId. "Assignment Field" in the editor.
updateImmediately No Boolean Set to false to perform the assignment but not to update the item record in the database. Defaults to true. "Update Item" in the editor.

Outputs

Name Type Description
assignment Assignment Information about the assignment, including who the item was assigned to

Collections: Build Record Map from Field

Takes a collection of records as input and the name of a field and builds a RecordMap where the keys are the values of the specified keyField. You can then use Collections: Get Record from Record Map to get a record based on a key.

To use the RecordMap later in your Flow, make sure to select Store Output Variables and assign it to a variable resource with a data type of Apex-Defined and an apex class of GradientWorks__RecordMap. When creating the resource, do not check "Allow multiple values (collection)".

For example, if you specify input as a collection of Leads and keyField as Id, this will generate a RecordMap you can use to look up a Lead based on its Id.

Inputs

Name Required Type Description
input Yes List<SObject> A collection of input records to use for creating a RecordMap
keyField Yes String The field on each record containing the value to use for that record's key in the RecordMap

Outputs

Name Type Description
recordMap RecordMap Contains records from the input collection that can be looked up using key values obtained from each item's keyField

Collections: Build Record Map from Lookup

Takes a collection of records as input and the name of a lookup field specified as lookupField. This will then query for all the related records of the object specified by the lookupField. The fields loaded for the related records are defined by selectFields. This provides an efficient way to query for a large number of related records at once.

To use the RecordMap later in your Flow, make sure to select Store Output Variables and assign it to a variable resource with a data type of Apex-Defined and an apex class of GradientWorks__RecordMap. When creating the resource, do not check "Allow multiple values (collection)".

For example, consider the following Flow structure:

  1. Use Get Records to retrieve a collection of Contacts
  2. Use a Loop over the collection of Contacts
  3. Use Get Records inside the loop to retrieve the Account related to each Contact using Contact.AccountId

This works, but performs an additional SOQL query for each Contact. If you have 50 Contacts, your Flow will perform 51 queries. One to get the original Contact list and then one per Contact. You will rapidly hit Salesforce governor limits and your Flow may run slowly.

This action allows for a pattern like so:

  1. Use Get Records to retrieve a collection of Contacts
  2. Use Collections: Build Record Map from Lookup with the Contacts as input to get a RecordMap of related Accounts using AccountId as the lookupField and store the RecordMap to an output variable.
  3. Use a Loop over the collection of Contacts
  4. Use Collections: Get Record from Record Map inside the loop with Contact.AccountId as the key to get the related Account

While this requires an extra step, it only uses 2 SOQL queries: one to get the list of contacts and one to retrieve all the related accounts. Your flow will be much less likely to hit governor limits and will run more quickly.

Inputs

Name Required Type Description
input Yes List<SObject> A collection of input records with lookup fields
lookupField Yes String The lookup field on each input record containing the reference to the record you want to put in the RecordMap. e.g. AccountId or OwnerId.
selectFields Yes String A commma-delimited list of fields on the related object you want to include. e.g. Id, Name, CustomField__c. You must specify at least one field.

Outputs

Name Type Description
recordMap RecordMap Contains records of the type referenced by the lookup field. The keys are the Ids of the related records. e.g. If your lookupField is a lookup for Account, the records in the RecordMap will be Account records and the key will be the Id of each Account.

Collections: Build Text Collection from Field

Takes a collection of records as input and the name of a field and builds a text collection containing the values of the specified field.

If you specify unique as true, the collection will only contain unique values, removing duplicates.

For example, if you specify input as a collection of Leads and field as Email, this will generate a collection containing a list of email addresses. Depending on the value for unique, duplicate email addresses will be removed.

Inputs

Name Required Type Description
field Yes String The name of the field to use to get the value for the collection. All values will be turned into text, regardless of the field's data type.
input Yes List<SObject> The collection of records to get values from
unique No Boolean If true, remove duplicates. Defaults to false.

Outputs

Name Type Description
collection List<String> The Text collection containing the values retrieved from the field on each input record (optionally with duplicates removed).

Collections: Execute SOQL

Takes a SOQL query and executes it within a Flow, retrieving the records according to the specified query. This provides a useful tool for getting around some of the limitations of the built-in Get Records action.

For example, consider the requirement to fetch a list of Users based on whether their Role name contains the word "Sales". Using Get Records will require you to use OR conditions with hard-coded Role Ids. Using this action, you can use SOQL's built-in relationship queries like so:

SELECT Id, Name, Email FROM User WHERE UserRole.Name LIKE '%Sales%'

Other use cases for this include IN/NOT IN queries or LIMIT clauses to retrieve only a subset of records.

To use the results, you'll need to store the output in a variable of type Record with the Object Type set to the object you're querying (e.g. User in the example above). Be sure to specify that the variable is a Collection.

When you use records retrieved by this action, only the fields you specify will be available.

Inputs

Name Required Type Description
query Yes String The SOQL query to be executed

Outputs

Name Type Description
records List<SObject> The collection of records retrieved by the SOQL query. The object type of these records is determined by the FROM clause in the SOQL query itself.

Collections: Get Record from Record Map

Retrieve a particular record from a RecordMap using the specified key. This will commonly be used inside a Loop to efficiently retrieve a related record.

For example, consider the following Flow structure:

  1. Use Get Records to retrieve a collection of Contacts
  2. Use Collections: Build Record Map from Lookup to get a RecordMap of related Accounts using their Id as the key
  3. Use a Loop over the collection of Contacts
  4. Use Collections: Get Record from Record Map inside the loop with Contact.AccountId as the key to get the related Account

This approach ensures that your Flow will run efficiently within the Salesforce Flow limits by reducing queries and CPU time.

Inputs

Name Required Type Description
key Yes String The key (usually an Id) to use for looking up a particular record
recordMap Yes RecordMap The RecordMap from a previous action to use for retrieval

Outputs

Name Type Description
record SObject The record retrieved based on the key. This may be null if there is no record assigned to the specified key.

Events: Convert ItemAssigned to Assignment

When Gradient Works makes an assignment, it fires a Salesforce platform event of type ItemAssigned__e. This action is a utility that converts those events to an Assignment which can be used as an input to other actions.

Inputs

Name Required Type Description
event Yes ItemAssigned__e The event indicating an item was assigned

Outputs

Name Type Description
assignment Assignment Information about the assignment represented by the event

Flows: Execute Subflow

Flow provides the ability to run a subflow natively through the Subflow element. However, that element is not available in all Flow types, specifically in record-triggered Flows. This leads to duplicate logic. This action is available to all Flow types.

The native Subflow element also requires you to select the Flow from a list of known Flows, preventing you from using logic in the calling Flow to choose a specific subflow to execute. This action provides the ability to invoke a Flow using the value of a resource in the calling Flow. This allows you to dynamically execute a subflow based on the result of a decision or formula in the calling Flow.

Please note the following limitations:

Inputs

Name Required Type Description
flowApiName Yes String The API name of the Flow to execute
flowInputData No String Data that describes the Flow inputs. See action overview for more information about supported inputs.

Outputs

This action does not currently support retrieving output variables from the subflow.

Flows: Failed

Pair this action with Flows: Start. Use it inside a fault path in a Flow to ensure proper Flow execution error tracing.

Inputs

Name Required Type Description
flowFaultMessage Yes String Automatically provided as $Flow.FaultMessage

Outputs

Name Type Description
flowFaultMessage String The Flow fault path message

Flows: Finish

Pair this action with Flows: Start. Use it at the very end of the Flow to ensure proper Flow execution tracing.

Inputs

Name Required Type Description
flowInterviewGuid Yes String Automatically provided as $Flow.InterviewGuid.
flowApiName No String Deprecated

Outputs

Name Type Description
flowInterviewGuid String The interview GUID

Flows: Resume

Pair this with Flows: Start and Flows: Finish. Use this action after a Screen Flow action to resume execution tracing for individual executions of the Flow ("interviews" in Flow-speak). Screen Flow actions can cause the transaction for the Flow execution to change which makes execution tracing difficult. Resuming tracking of the original transaction from the Flows: Start will allow us to continue to track the full Flow execution lifecycle.

Inputs

Name Required Type Description
flowInterviewGuid Yes String The Flows: Start interview GUID.
flowApiName No String The API name of the flow

Outputs

Name Type Description
flowInterviewGuid String The interview GUID

Flows: Start

Use this action at the very beginning of a Flow to turn on execution tracing for individual executions of the Flow ("interviews" in Flow-speak). Make sure to also place a Flows: Finish at the end of your Flow.

Inputs

Name Required Type Description
flowInterviewGuid Yes String Automatically provided as $Flow.InterviewGuid.
flowApiName No String The API name of the flow. Automatically provided if available.

Outputs

Name Type Description
flowInterviewGuid String The interview GUID

Leads: Convert Lead

Converts a Lead using functionality similar to that provided by the Convert Lead action in the UI and the Apex function Database.convertLead. Users may optionally supply an account, contact and opportunity to merge the converted lead into. If any of those are not specified they will be created.

Inputs

Name Required Type Description
convertedStatus Yes String The name of a lead status that represents a converted lead (i.e. where IsConverted=true)
lead Yes Lead The Lead to be converted
account No Account If specified, associate the converted lead with this Account
contact No Contact If specified, merge the Lead into this Contact
convertImmediately No Boolean Set to false to prepare the lead for conversion but not actually perform it immediately. Defaults to true.
createOpportunity No Boolean Whether or not to create an opportunity on conversion. Defaults to false. If opportunity is specified, this is ignored.
opportunity No Opportunity If specified, the Opportunity to associate with the converted Lead
opportunityName No String If creating an opportunity, the name of the opportunity to create. If opportunity is specified, this is ignored.
owner No User The user that should own any newly created Account, Contact or Opportunity after conversion.

Outputs

The result of converting the Lead. If conversion was successful, contains references to the Account, Contact and Opportunity the Lead was converted into.

Name Type Description
account Account The Account into which the converted Lead was merged. If an Account was specified in the request, this will be the same Account instance. If no account was specified, this will contain an Account object with the Id, Name and OwnerId fields. If conversion failed this will be null.
contact Contact The Contact into which the converted Lead was merged. If a Contact was specified in the request, this will be the same Contact instance. If no account was specified, this will contain a minimal Contact object with Id, FirstName, LastName and OwnerId. If conversion failed this will be null.
convertRequest ConvertLeadRequest If convertImmediately is false, the prepared conversion is returned.
errorMessage String A message describing any error during conversion.
lead Lead The lead that was included in the corresponding request. This lead will not be updated to reflect the conversion state. It will not contain IsConverted=true or any of the relevant Converted* fields. Minimal versions of the converted objects for Account, Contact and Opportunity are included in this result.
opportunity Opportunity The Opportunity into which the converted Lead was merged. If an Opportunity was specified in the request, this will be the same Opportunity instance. If no opportunity was specified, this will contain a minimal Opportunity object with Id, Name and OwnerId. If conversion failed, this will be null.
success Boolean True if the conversion succeeded; false if it failed. If this is false the errorMessage will be populated.

Leads: Convert Multiple Leads

Inputs

Controls how many lead conversions are passed to the convertLead method in a single call. This number cannot exceed 100 per the docs.

Name Required Type Description
requests Yes List<ConvertLeadRequest> The Leads to be converted

Outputs

Name Type Description
failureCount Integer Count of failed Lead conversions. Specific errors are provided in the individual result returned in results.
results List<ConvertLeadResult> List of conversion results.
successCount Integer Count of successful Lead conversions

Logs: Log Message

Publish a message to the Gradient Works Log. This is useful for debugging your Flows.

Inputs

Name Required Type Description
level Yes Integer The importance level of the log message: from TRACE (lowest level) to ERROR (highest level).
message Yes String The message to include in the log. Merge fields will be merged before publishing the log message.
flowInterviewGuid No String A unique identifier for the running Flow "interview". This will be automatically provided.

Outputs

Name Type Description
message String The message published to the log

Matching: Match Lead to Account

Takes a list of Leads from earlier in the Flow, finds matching Accounts and provides a list of LeadToAccountMatch results for use later in the Flow. The matches can be used for assignment or lead conversion.

For more information on how to use this action, see Lead Matching.

Inputs

Please note that you will not directly interact with these input fields as you do with some Flow Actions. Instead the Gradient Works custom editor takes care of the heavy lifting.

Name Required Type Description
accountDomainField No String Deprecated
accountNameField No String Deprecated
filterData No String Include matches that meet all the specified filters
lead No Lead The Lead to match to Accounts. Must fill out lead or leads.
leadCompanyNameField No String Deprecated
leadDomainField No String Deprecated
leads No List<Lead> The list of Leads to match to Accounts. Must fill out lead or leads.
matchCriteriaData No String Criteria for finding potential matching Accounts
rankerData No String If there are multiple matches, rank them according to the specified criteria

Outputs

For easy access later in the flow, we recommend you select "Manually assign variables" in the Flow editor and store the results value in a variable.

Name Type Description
count Integer The number of results
result LeadToAccountMatch The first result of matching Leads to Accounts. Can be used when working with a single Lead in place of results.
results List<LeadToAccountMatch> The results of matching Leads to Accounts

Matching: Match Lead to Contact

Takes a list of Leads from earlier in the Flow, finds matching Contacts and provides a list of LeadToContactMatch results for use later in the Flow. The matches can be used for assignment or lead conversion.

For more information on how to use this action, see Lead Matching.

Inputs

Please note that you will not directly interact with these input fields as you do with some Flow Actions. Instead the Gradient Works custom editor takes care of the heavy lifting.

Name Required Type Description
filterData No String Include matches that meet all the specified filters
lead No Lead The Lead to match to Contacts. Must fill out lead or leads.
leads No List<Lead> The list of Leads to match to Contacts. Must fill out lead or leads.
matchCriteriaData No String Criteria for finding potential matching Contacts
rankerData No String If there are multiple matches, rank them according to the specified criteria

Outputs

For easy access later in the flow, we recommend you select "Manually assign variables" in the Flow editor and store the results value in a variable.

Name Type Description
count Integer The number of results
result LeadToContactMatch The first result of matching Leads to Contacts. Can be used when working with a single Lead in place of results.
results List<LeadToContactMatch> The results of matching Leads to Contacts

Matching: Match Lead to Lead

Takes a list of Leads from earlier in the Flow, finds matching Leads and provides a list of LeadToLeadtMatch results for use later in the Flow. The matches can be used for assignment or lead conversion.

For more information on how to use this action, see Lead Matching.

Inputs

Please note that you will not directly interact with these input fields as you do with some Flow Actions. Instead the Gradient Works custom editor takes care of the heavy lifting.

Name Required Type Description
filterData No String Include matches that meet all the specified filters
lead No Lead The Lead to match to other Leads. Must fill out lead or leads.
leads No List<Lead> The list of Leads to match to other Leads. Must fill out lead or leads.
matchCriteriaData No String Criteria for finding potential matching Leads
rankerData No String If there are multiple matches, rank them according to the specified criteria

Outputs

For easy access later in the flow, we recommend you select "Manually assign variables" in the Flow editor and store the results value in a variable.

Name Type Description
count Integer The number of results
result LeadToLeadMatch The first result of matching Leads to other Leads. Can be used when working with a single Lead in place of results.
results List<LeadToLeadMatch> The results of matching Leads to other Leads

Notifications: Send Single Assignment Email

Use this action after performing an assignment to send an email notification to the person that received the assignment. Construct the email subject and body using merge fields and optionally BCC specific users.

Inputs

Name Required Type Description
assignment Yes Assignment An Assignment generated by a previous action in the flow.
body Yes String The body of the email to be sent. This may contain merge fields.
subject Yes String The subject of the email. This may contain merge fields.
bcc No String A comma-delimited list of email addresses to BCC.
orgWideEmailId No String If specified, this will be used as the from address.

Outputs

Name Type Description
success Boolean True if the email send was sent successfully.

Queues: Assign Multiple Items

Assigns a list of item to users associated with a Gradient Works Queue. The items may be of any type (e.g. Account, Lead, etc). The assignments are performed immediately.

You can access information about the users that received the items in the List of Assignment objects included in the output. You can loop over these and use them as input to other actions such as Notifications: Send Single Assignment Email.

If you specify a capacity using capacityValue or capacityValueField, that value will be used in capacity calculations when assigning the item to a user. For example, if you specify a capacityValue of 5, users must have an availableCapacity greater than or equal to 5 to be eligible for assignment.

Inputs

Name Required Type Description
queue Yes String The queue to add to. May be an Id or the queue name.
capacityValue No Long Capacity value to apply to all items
capacityValueField No String Retrieve capacity value from this field on each object
items No List<SObject> List of items to add to the queue. May be any Salesforce object.

Outputs

Name Type Description
assignments List<Assignment> Information about each of the assignments in the same order as the input items
count Integer The total number of assignments performed

Queues: Assign Pending Items for Multiple Queues

Performs immediate assignment of any pending items in the specified list of Queues. The results of each assignment are available in the List of Assignment objects provided in the output.

You will usually use this action to trigger assignments after adding items to Queues via Queues: Enqueue Multiple Items or Queues: Enqueue Single Item.

Inputs

Name Required Type Description
queues No List<String> Queues to assign pending items for. May be ids or queue names.

Outputs

Name Type Description
assignments List<Assignment> All assignments performed for pending items
count Integer The total number of assignments performed

Queues: Assign Pending Items for Single Queue

Performs immediate assignment of any pending items in the specified Queue. The results of each assignment are available in the List of Assignment objects provided in the output.

You will usually use this action to trigger assignments after adding items to a Queue via Queues: Enqueue Multiple Items or Queues: Enqueue Single Item.

Inputs

Name Required Type Description
queue Yes String Queue to assign pending items for. May be an id or name.

Outputs

Name Type Description
assignments List<Assignment> All assignments performed for pending items
count Integer The total number of assignments performed

Queues: Assign Single Item

Assigns an item to a user associated with a Gradient Works Queue. The item may be of any type (e.g. Account, Lead, etc). The assignment is performed immediately.

You can access information about the user that received the item in the Assignment object included in the output. You can use this Assignment object as an input to other actions such as Notifications: Send Single Assignment Email.

If you specify a capacity using capacityValue or capacityValueField, that value will be used in capacity calculations when assigning the item to a user. For example, if you specify a capacityValue of 5, users must have an availableCapacity greater than or equal to 5 to be eligible for assignment.

Inputs

Name Required Type Description
item Yes SObject The Salesforce object to assign
queue Yes String The target queue. May be an Id or the queue name.
capacityValue No Long Item capacity value
capacityValueField No String Retrieve capacity value from this field on the item

Outputs

Name Type Description
assignment Assignment Information about the assignment, including who the item was assigned to

Queues: Enqueue Multiple Items

Adds items to a Gradient Works Queue. The items may be of any type (e.g. Account, Lead, etc). This does not assign the items immediately, instead they are put in a pending state in the Queue.

If you specify a capacity using capacityValue or capacityValueField, that value will be used in capacity calculations when assigning the item to a user. For example, if you specify a capacityValue of 5, users must have an availableCapacity greater than or equal to 5 to be eligible for assignment.

Why use this instead of Queues: Assign Multiple Items? In some cases it can be more efficient to add many items to the queue through various steps in a Flow and then perform the assignments all at once. You can explicitly trigger assignment for a particular queue by including Queues: Assign Pending Items for Single Queue or Queues: Assign Pending Items for Multiple Queues in your Flow. If you don't explicitly trigger assignment in your Flow, Gradient Works will assign the pending items at some point in the near future.

Inputs

Name Required Type Description
queue Yes String The queue to add to. May be an Id or the queue name.
capacityValue No Long Capacity value to apply to all items
capacityValueField No String Retrieve capacity value from this field on each object
objects No List<SObject> List of items to add to the queue

Queues: Enqueue Single Item

Adds an item to a Gradient Works Queue. The item may be of any type (e.g. Account, Lead, etc). This does not assign the item immediately, instead it is put in a pending state in the Queue.

If you specify a capacity using capacityValue or capacityValueField, that value will be used in capacity calculations when assigning the item to a user. For example, if you specify a capacityValue of 5, users must have an availableCapacity greater than or equal to 5 to be eligible for assignment.

Why use this instead of Queues: Assign Single Item? In some cases it can be more efficient to add many items to the queue through various steps in a Flow and then perform the assignments all at once. You can explicitly trigger assignment for a particular queue by including Queues: Assign Pending Items for Single Queue or Queues: Assign Pending Items for Multiple Queues in your Flow. If you don't explicitly trigger assignment in your Flow, Gradient Works will assign the pending items at some point in the near future.

Inputs

Name Required Type Description
item Yes SObject Item to add to the queue
queue Yes String The queue to add to. May be an Id or the queue name.
capacityValue No Long Item capacity value
capacityValueField No String Retrieve capacity value from this field on the item

Users: Update Capacity

This action allows you to build flows that update the capacity values on users associated with a Queue. This allows you to control the available capacity for a user based on custom logic.

Capacity requires two values: a maximum and an amount used. max - used is the available capacity which is used for assignment.

There are two ways of using this action. You can either specify explicit values to use for capacity via usedCapacityValue and maxCapacityValue or you can "join" data from fields on the User via usedCapacityValueField and maxCapacityValueField. The "join" method will retrieve the values for the specified field from each User and copy them over to the custom object that associates the User with the Queue.

Inputs

Name Required Type Description
queue Yes String The queue the users are assigned to
users Yes List<User> List of users to update capacity values for
maxCapacityValue No Long Max capacity value for the user for the specified queue
maxCapacityValueField No String User field from which to retrieve max capacity value for the specified queue
usedCapacityValue No Long Used capacity value for the user for the specified queue
usedCapacityValueField No String User field from which to retrieve used capacity value for the specified queue

Users: Update Weight

This action allows you to build flows that update the weight values on users associated with a Queue. This allows you to control the relative number of "slots" that the user receives for round robin assignment.

There are two ways of using this action. You can either specify explicit values to use for weight via weightValue or you can "join" data from a field on the User via weightField. The "join" method will retrieve the value for the specified field from each User and copy it over to the custom object that associates the User with the Queue.

Inputs

Name Required Type Description
queue Yes String The name or id of a Gradient Works queue
users No List<User> Limit updates to only these users. Leave blank to update all users assigned to the queue.
weight No Long Weight to assign to users
weightField No String Retrieve weight value from this field on User object

Outputs

Name Type Description
weights List<QueueUserWeight> Information about the weights applied to each user

Models

AccountMatchResult

API Name: GradientWorks__AccountMatchResult

Holds an Account that was matched as a result of executing a match action like Matching: Match Lead to Account

Properties

Name Type Description
account Account The account that matched
score Double Unused

Assignment

API Name: GradientWorks__Assignment

Actions such as Queues: Assign Single Item and Queues: Assign Multiple Items provide these to communicate the results of assignment. You can also use them as input into other actions like Notifications: Send Single Assignment Email.

Properties

Name Type Description
assignedTo User The User that the item was assigned to. Only the Id, Email, Name, Alias fields will be available.
item GenericSObject Wraps the SObject that was assigned. Flow does not currently handle SObjects very well so this wraps an SObject in a Flow-friendly interface.
previouslyAssignedTo User The User the item was previously assigned to. Only the Id, Email, Name, Alias fields will be available.
queue String The Queue that was used to perform the assignment. This will either be an Id or name depending on how the Queue was specified by the action that produced this result. For Assignments that result from Assign: Directly assign item to user this value will be null.

ConvertLeadRequest

API Name: GradientWorks__ConvertLeadRequest

Properties

Name Type Description
account Account
contact Contact
convertedStatus String
createOpportunity Boolean
lead Lead
leadConvert Database.LeadConvert
opportunity Opportunity
opportunityName String
owner User

ConvertLeadResult

API Name: GradientWorks__ConvertLeadResult

Properties

Name Type Description
account Account
contact Contact
errorMessage String
lead Lead
opportunity Opportunity
success Boolean

GenericSObject

API Name: GradientWorks__GenericSObject

A convenient wrapper around an SObject of any type (e.g a User, Account, Lead, etc). This makes it easy to write generic actions that access information about the object regardless of type. For example, you can use name or detailUrl to write an email that you send via Notifications: Send Single Assignment Email without having to know anything about the actual SObject.

Properties

Name Type Description
detailUrl String The Salesforce URL to visit to see the object.
id Id The Id of the SObject
name String A friendly name for the SObject. This is usually the Name field but may be different for other objects like Case which don't have defined Name field.
realSObject SObject The actual SObject
typeName String The name of the SObjectType (e.g. Account, User, etc)

LeadToAccountMatch

API Name: GradientWorks__LeadToAccountMatch

Provides information about Accounts that match a Lead as a result of executing Matching: Match Lead to Account.

Properties

Name Type Description
bestMatch Account The Account (if any) that best matches the lead
count Integer The number of matches. This will be 0 if there are no matches.
lead Lead The Lead that was matched
matches List<AccountMatchResult> All the matching accounts in order of relevance. The first item in this list will correspond to bestMatch.

LeadToContactMatch

API Name: GradientWorks__LeadToContactMatch

Properties

Name Type Description
bestMatch Contact
count Integer
lead Lead
matches List<Contact>

LeadToLeadMatch

API Name: GradientWorks__LeadToLeadMatch

Properties

Name Type Description
bestMatch Lead
count Integer
lead Lead
matches List<Lead>

QueueUserWeight

API Name: GradientWorks__QueueUserWeight

Provides information about the weight specified for a User as a result of executing Users: Update Weight.

Properties

Name Type Description
queue String The Queue for which weights were updated. This will be either an Id or name depending on how the Queue was identified in the action.
userId Id The Id of a User that was updated
weight Long The new weight assigned to the User

RecordMap

API Name: GradientWorks__RecordMap

A RecordMap provides a fast way to look up records based on a key using Collections: Get Record from Record Map. This allows you to create efficient "bulk" flows that let you fetch a large number of related records in one query that you can access in a loop without requiring multiple Get Records actions.

To create a RecordMap, see Collections: Build Record Map from Field and Collections: Build Record Map from Lookup.

Properties

Name Type Description
size Integer The number of records contained in the record map

Gradient Works Cloud

These API endpoints provided for the Gradient Works Cloud (GWC) are for internal use only. Trying to use them outside of the Gradient Works package will result in error.

Authorization

Oauth with Gradient Works's AWS Cognito User Pool to grant permission to GWC to process telemetry events.

Usage: This endpoint is used by the 'Authorize' button for Gradient Works Cloud in the Gradient Works Admin tab.

URL: https://auth.gradient.works/oauth2/authorize

Method: GET

URL Params:

Name Type Description
client_id String Gradient Works AWS Cognito User Pool client_id
response_type String code
redirect_uri URI URI to redirect to after authorization with AWS Cognito
scope String Permissions to request access to, separate each scope with a space
code_challenge_method String Method used to generate PKCE challenge code
code_challenge String Base64 encoded PKCE challenge code
state URL Base64 encoded starting point URL (salesforce instance URL)

Telemetry Processing

Requires GWC Authorization

Send telemetry events to GWC for processing. Currently the only telemetry events being tracked are for Closed Opportunities.

Usage: This endpoint is used when the Gradient Works Process Telemetry scheduled job is run.

URL: https://api.gradient.works/v0/telemetry/experiences

Method: POST

Body Params: Expects a List of objects with the following params

Name Type Description
id String Gradient Works generated id to represent telemetry record
timestamp Datetime Timestamp of telemetry event
action String What triggered the telemetry event (ex. - an Opp was closed)
value Double If applicable, monetary value of object
startTime Datetime Created date of the object
endTime Datetime If applicable, close date of the object
actor GradientWorksCloudActor Custom object representing the owner of the object
r_object GradientWorksCloudEnvObject Custom object representing the type of salesforce object the telemetry event is for
target GradientWorksCloudEnvObject Custom object representing the target of the telemetry event
agent String The salesforce account the telemetry event is for

Changelog

1.33 (2021-07-29)

We wanted to get this release out last week but Salesforce had other plans. Now that they've solved their deployment issues, we're ready to send this one out. It's only a couple of bug fixes, but it's important to us that we deploy new versions on a regular basis so our apologies for not getting this one out sooner.

Lead matching with special characters

We found some edge cases where attempting to match a Lead with special characters in the email address would cause our Matching flow actions to error. We believe in character equality here at Gradient Works and this release fixes these errors. We apologize to the special character community and promise that we will do our best to keep this from happening in the future.

DML watchguards

Some of our background jobs and processes generate objects that don't need to live around forever so we periodically clean them up. We recently found a couple of these cleanup areas where we weren't guarding against potential DML limits, so we've added checks to keep us from hitting those limits.

1.32 (2021-07-16)

We're still recovering from the F9 release but we did manage to get some work done. An astute reader will note that it's been a minute since our last release - today you find out why.

Logging cleanup

We've standardized logging throughout the installed package. Consistent logging levels across all of our features will make it easier to filter and debug things like flow actions. We've also moved most of our internal logging to a lower log level (FINE, fo those that are curious) which is going to help reduce some log noise that isn't necessary for day-to-day logs.

Bulk lead conversion fix up

We've got a small batch size update in our bulk lead conversion action to help reduce potential DML errors (VERY large bulk updates would trigger DML limits).

Calendaring/Scheduling

We're cooking up some really cool calendaring integrations. Even though they're not completely done, we're putting out the initial setup and authentiation components out so that everyone can be ready to go for the next release.

1.31 (2021-06-24)

I never thought this day would come. I mean, I'd hoped and hoped but sometimes it can feel like hope as abandoned these lands, but it's here - F9 is OUT TODAY! HAN'S BACK! AND MAYBE SEAN!

Oh and we had a pretty great release this week too :)

Bulk lead conversion

Converting muliple leads at once is now easier and more efficient. Handling them in bulk allows us to avoid hitting built-in Salesforce limits and makes them execute faster.

Automation scheduling

You can now schedule active autolaunch flows to run on a schedule! Head over to the Automations tab and check out the details menu on the right of the Gradient Works Flows table - from there you can manage the schedules for your individual automations.

1.30 (2021-06-17)

No release last week - it was too hot for us to package anything up. Well, joke's on us because this week was even hotter. We somehow managed to stay cool enough to make some really good progress with Flows and a new surprise Tab!

Flows on Flows on Flows

We did A LOT of work with Flows this release:

New Settings Tab

Surprise! It's Settings!

We've removed the Admin tab and replaced it with Settings. It's a bit empty at the moment, but we'll be adding things directly.

1.29 (2021-06-02)

This has been a fun week! As more and more customers use our software, we learn more and more about how we can best provide value. Also, we learn about where we may have made some mistakes in our initial implementation (not me I'm just a Changelog) so this week we've spent our focus on smoothing over some rough edges.

Bug fixes galore

We've made a small tweak to the Automations table where the label now links to the Active version of the flow (or latest version if the flow isn't active) instead of the flow detail screen which no one wants to see.

We also fixed a couple of small issues with our Convert Lead action that were causing some headaches, mostly around some edge case behavior. If you've had problems with the Convert Lead action in past please give it another shot.

1.28 (2021-05-27)

LAST WEEK OF SCHOOL! LAST WEEK OF SCHOOL! I know this isn't at all related to the product but I'm really proud of all the Gradient Works kids and how they've managed the last year and a half. It's been hard for me personally and I'm just a Changelog.

Way to go, kiddos. We're all super proud and rooting for you and we're always in your corner. Stay cool and have a great summer!

INFINITE SCROLLING

That's right! Our Assignments table on the Dashboard now has infinite power I mean scrolling.

What's that? This just in - I'm being told that it's not technically infinite by our attorneys. But between you and me, it's pretty close. When you get to the bottom of the table keep scrolling to quickly load up the next set of Assignments (and keep scrolling!).

Monitoring and Observability

We've improved our ability to see and visualize the effects of automations within your org and we're using that information to monitor more effectively as well as better understand how we can best provide value.

1.27 (2021-05-20)

It's been a rainy week in Austin, but we've got a lot of happy kiddos ready for the school year to be over and some slightly anxious parents who are nevertheless excited for summer.

New docs

We've got a brand new heckin' spiffy website and it just wouldn't be right if our docs didn't get the same UI love. Our documentation is like manners - a way of showing other people we care about them.

Dashboard improvements

Building on top of the dashboard work across the past few releases, we added some addtional detail to the Assignment History detail page. You can expect to see continuous incremental improvements to the dashboard as we focus on ways to better capture and display Assignment information.

1.26 (2021-05-13)

This was another one of those behind-the-scenes releases, but we did have one quick fix that couldn't wait to get out.

Dashboard fix

We hit a permission snag with the last release of our new Dashboard which has been resolved with this issue. Our thanks go out to those that pointed out the issue and helped us test the fix.

1.25 (2021-05-06)

We're really excited about this release. The behind-the-scenes work is fun, but what we really love is getting stuff out in front of people and getting feedback on what's working, what's not working, and what we can do to help YOU.

NEW DASHBOARD

This is the big one, friends. It's like the Millenium Falcon you always hoped to find under the Christmas tree, only it's actually here!

Here's a little preview:

Dashboard

Currently, we're focusing on Assignments (as you can see) but expect to see this area grow in future releases. Observability is important to us and we want to make it really easy to see what Gradient Works is doing for you.

Custom Action Editors

We've customized the Flows: Start, Flows: Resume, Flows: Finish, and Flows: Failed action editors. They're smarter and require less upfront configuration, making it easier to incorporate them into your flows.

Gradient Works flow action updates

Our existing flow actions got a little bit of love in this release. They've all been updated to take advantage of the framework that powers Flows: Start, Flows: Resume, Flows: Finish, and Flows: Failed, so moving forward things like logging and basic behavior should be a little more standard.

1.24 (2021-04-29)

We're working hard towards additional flow and reporting functionality, but it wasn't quite to our liking yet so it's not making it in this release. Instead, we've got a small bug fix that limits how many Gradient Works Log Entries we try to purge at once.

1.23 (2021-04-15)

We were slightly distracted by the new F9: The Fast Saga trailer this week but we managed to pull it together familia-style and ship some more monitoring and observability building blocks.

First, we've added two more tracing actions: Flows: Resume and Flows: Failed.

When a Flow contains a Screen Flow action, the Flow transaction can change making it difficult to track the full Flow execution. Adding a Flows: Resume action directly after any Screen Flow action ensures that the transaction change is tracked properly and the full Flow execution is tracked from start to finish.

Faults in a Flow can also make it difficult to see the full execution from the start of the Flow all the way to the failure point. Adding a Flows: Failed action in fault paths preserves the full Flow execution even in the event of an error.

Our Flows: Failed action also gives us the ability to send an email notification when a Flow fails. To enable Flow error notifications, set the Error Email Address (Gradient Works Settings under Custom Settings) field to whatever email address you wish notified and add a Flows: Failed action in your Flow fault path.

Much like with assignment notifications, you'll want to use an org-wide email address to ensure that your error notification emails conform to your organization's email policies.

1.22 (2021-04-08)

This one has a lot going on behind the scenes, but not so much... in front of (?) the scenes.

So what are these mysterious goings-on? I'm glad you asked.

One of the things we care about a lot is what we call "monitoring and observability". Basically, it's the whether or not you can figure out why an automation did what it did. That's where we've been focusing our time.

Since you've no doubt been following this changelog like a hawk, you'll recall that last week we added a new Automation section. This week we're building on that with some new functionality to help you track your Flows from start to finish (or failure, if something goes wrong). We call this the "Flow Lifecycle".

To get started, we've added two new actions: Flows: Start and Flows: Finish. If you add these to your Flows at the start and the finish (see what we did there), we'll be able trace the Flows and keep a record about each execution. This release lets us start keeping track of this stuff behind the scenes. A release in the very near future will make it visible to you.

Stay tuned.

1.21 (2021-04-01)

Unlike the rest of the internet we're not playing any dumb April Fools jokes. Brands, if you're reading this... it was cute back in 2005 or whatever but now it's just super annoying.

Automation

Ok, so we like Flows... a lot. So much so that we use them for all the routing workflows in Gradient Works. However, things can get a little confusing when you want to find and manage your Flows that specifically deal with Gradient Works. Behold, the new Automation tab. It provides a super convenient place to find all your Gradient Works Flows and to put them on a custom schedule that's not possible through regular Flow (e.g. run every minute).

Stay tuned to this tab because we have a lot of very cool stuff coming soon in this part of the application.

Cleaning up our CRUD (permissions)

If there's one thing that's simple and straightforward in Salesforce it's managing permissions for objects, fields and records across roles, profiles and permission sets. Haha, just kidding! It's actually a complete nightmare.

Anyway, we've done a lot of cleanup on how Gradient Works interacts with the permissions and restrictions in your org. We've updated our Gradient Works Admin and Gradient Works User permission sets to fix a few bugs and be more clear about how can do what. We've also made sure that the assignment actions happen irrespective of security constraints. This is a tradeoff but it makes it much easier to implement assignment automation when you don't know what user it'll execute under. This often happens with automation that kicks of via trigger or a UI quick action.

1.20 (2021-03-22)

This one is all about increasing observability.

Improved logging

Our previous logs were... serviceable at best. Now they're well on their way to being really usable. Each log entry includes a Request Id (aka a particular transaction in Salesforce) so you can see what executed together. Assignment History records now have that same Request Id so you can track them back to the related logs. We've removed a lot of extraneous logging, reduced the noise in the log messages themselves and made them more consistent. Finally, our most used Flow actions log consistently and even include durations so you can determine if particular actions are taking a long time to execute.

Usage Data

We now send limited usage data back to the Gradient Works Cloud when the Gradient Works managed package performs assignments. This does not include any private or personally identifiable data, only an indication that an assignment was performed. This will help us better understand customer usage and identify areas for improvement.

1.19 (2021-03-09)

We improved error handling for scheduled Flow jobs. We also made it possible to run Flows as a particular user using the GradientWorks.ScheduledJobs Apex class. Look for a comprehensive UI for scheduling coming soon.

1.18 (2021-03-04)

We're busy laying the groundwork for some new observability features coming in the next few weeks so this release is small but mighty.

Skip a rep, any rep

Sometimes you want to make sure a rep gets skipped during the next round robin assignment. Sometimes it's to even out some other inequity, sometimes it's related to performance. Who are we to judge? Anyway, it's now super easy to do. Just go to the Queue User edit screen and set the "Skip Next Times" field to the number of times you want to skip the user. Save and you're all set.

Bug fix for disappearing fields when using RecordMaps

A couple weeks back we added some super handy functionality to do fast lookups. It turns out that if you use the action to build a record map from a field and you specify a field from the related object that has a null value, Flow doesn't just act like that field has a null value, it acts like that field doesn't exist at all. If that sounds very convoluted, it's because it is. Long story short, it was super annoying and we fixed it.

Documentation enhancements

We're continuing to expand and update these docs to make them as helpful as possible. Specifically we reorganized the topics on the left nav and expanded the queues section.

1.17 (2021-02-25)

Last week was incredibly cold in Austin and most of our team spent most of their time without power or usable water. Sadly, that made it hard to ship a release.

The good news? We're back with electricity, potable water and a deeper appreciation for the hardships endured by our ancestors!

All your assignment history in one place

Many routing workflows end up being a combination of Queue-based assignments and direct assignments. That created a little bit of a problem because Queue-based assignment history was stored in QueueItems and we didn't keep a long-term record of direct assignments.

That's all changed. Every assignment you make through Gradient Works is now recorded in AssignmentHistory. These are a permanent, reportable record for auditing purposes. They're all available to you in the "Gradient Works Assignment History" tab in the Gradient Works App.

We expect to build on this functionality in the coming weeks to give you significantly more insight into all your routing and assignment processes.

Add SOQL superpowers to your Flows

Every so often you need to retrieve some data and Get Records just doesn't cut it. Perhaps you want use IN or do a relationship query.

For those rare occasions, we've introduced a super-advanced Execute SOQL action that allows you to execute any SOQL query you want. Just remember that with great power comes great responsibility, so make sure to keep your queries focused and lean.

Admin beautification

We'll be the first to admit that the Gradient Works Admin tab isn't the most attractive UI. However, this ugly duckling is getting a multi-release makeover. We've started with the "cards" for setting up workflows and logging into the Gradient Works Cloud. They're now much more in tune with the Lightning Design System (aka more Salesforce-y) and much more self-explanatory.

1.16 (2021-02-11)

🧡🧡🧡 We've got an early Valentine's Day present for you in the form of some slick new Flow utilities along with some much-requested improvements to viewing and managing Queue round-robin slots.

Build Flows that run faster, faster

It's not always easy to make your Flows fast, efficient and compact. We're always looking for ways to make Flows work better so this week we added some new extensions to make building high performance Flows easier.

A very common task in Flow involves looping over a bunch of records and either grabbing a related record using a Lookup field or getting a value from a another field. We've introduced something called a RecordMap that makes efficient lookups like this super easy. Take a look at the docs for building a record map from a field, building a record map from a lookup and getting a value from a record map. Using this pattern will make your flows run faster and keep you within the Salesforce governor limits.

Add logging to your Flows

Add messages to the Gradient Works logs and the system debug logs directly from your Flow using Log Message. This can be very helpful in debugging and monitoring your Flow's performance. Try adding it to your Fault paths for a handy record if things go wrong.

Better queue slot management

We added clean new way of displaying the Queue round-robin slots and the ability to skip the next assignment with one click. Go click into a Queue in the Gradient Works Admin and look down the bottom left. Go ahead, we'll wait.

Just FYI, this will display up to the next 10 assignments (if you have that many slots). If you need to see the entire list of Queue slots, just click "View All".

1.15 (2021-02-04)

Hey, we're on a 3 week update streak. Not only do we have AppExchange news, we continued sanding off rough edges to make Queue admin even easier.

We're official!

We've officially completed Salesforce's review process so we're now "AppExchange Ready". What does this mean for you?

More Queue Users, fewer clicks, better info

We're continuing to make it faster to get up and running with your Queues. This week we've made it easy to find and add several users at once. Just go to the Queue record page and click "Add Users" in the Queue Users module. Select some users in the dialog that pops up and you're good to go.

We've also changed the layout of the Queue Users module to be more informative. Now you can see the Queue User status and last assignment time without having to click through to the related listing page.

1.14 (2021-01-28)

We're back with after just 1 week with some much requested features to make your life easier.

Duplicate Queues

There's now a handy "Duplicate" button in the top right on the Gradient Works Queue record detail page. Several folks asked for this to streamline workflow setups.

Click "Duplicate" to see your queue, queue users and round robin slots get magically cloned to a new queue for easy configuration. Note that the new queue will be reset to point to the first round-robin slot.

If you don't see the button, go to the Gradient Works Queue in the object manager and assign the v1.14 Gradient Works Queue Layout as your page layout. One day Salesforce will let us automatically update layouts from packages but today is not that day.

Direct assignment

Not every routing workflow needs to do assignment through a Queue. Often you need to set ownership directly for a user. That was previously a multi-step process involving Flow Assignment and Update Records elements. Now you can do it in one step with the direct assignment action. This action outputs an Assignment object that you can use later in the flow (to send notifications for example).

Queue Item reporting

For reasons unknown to Gradient Works historians, we hadn't enabled reporting on Gradient Works Queue Items. Reporting is now enabled so you can easily run reports to see what's being assigned. We regret the error.

1.13 (2021-01-21)

Smaller release this week. We've added a new layout for Gradient Works Queue Users but it primarily contains a few more minor changes needed for the Salesforce review.

Layouts

We made some changes to the Gradient Works Queue User layout that existing customers can take advantage of by changing the Page Layout Assignment to the layout titled v1.13 Gradient Works Queue User Layout. Anyone that installs Gradient Works after this release will see the new layout automatically.

Internal

We mentioned in preview release notes that we are preparing for a Salesforce review as part of our plan to move out of private beta in the coming months. We had a few additional minor changes to make prior to submitting for review that are included in this release. Please reach out if you would like to know more about the results of the security scans or the changes we made as a result of it.

1.12 (2021-01-07)

We're back from the holidays with some new functionality.

Working hours

People don't work 24/7 (we don't have the technology — yet) and you may not want to assign things to them when they're not there. Good news! We've added working hours settings to your Queue Users. To access it, go to the Gradient Works app, find the Queue User you want to change and update the Working Hours Start and Working Hours End fields. See Queues for more about how to configure availability.

Lead matching

Internal

We're preparing for a Salesforce review as part of our plan to move out of private beta in the coming months. We're pleased to report that a Salesforce code scan showed no issues with meaningful business impact. However, this release includes some updates to address a handful of items that were identified. We take quality, security and transparency extremely seriously so please reach out to us if you would like to see the results of our most recent scan. We'll be happy to share it confidentially.

1.11 (2020-12-17)

This is a big one folks. Lots of good stuff in here.

Lead Matching v1

You can now use Gradient Work to implement lead matching workflows prior to doing rep assignment. This has been by far our most requested functionality and boy is there a lot here.

Gradient Works Cloud (GWC)

We started laying the groundwork for cloud-enabled functionality that will come in future releases. No data is being sent to GWC automatically but we're putting the plumbing in. As you'll notice we care a lot about your data security so much of the plumbing is related to that.

Other Things

Bug Fixes

1.10 (2020-12-02)

This release didn't have much in the way of user-facing changes; it was all about the lead matching backend.

1.9 (2020-11-12)

1.8 (2020-10-29)

Pre-1.8

Prior to 1.8, we shipped the basic assignment engine with flows to support assignment, capacity management and weighting.