Jitterbit CRM Contact Agent
Overview
Jitterbit provides the CRM Contact Agent to customers through Jitterbit Marketplace. This agent uses AI to manage contact records for CRM systems such as Salesforce through a conversational interface, helping sales teams find, create, and update contacts more efficiently. This agent uses the Retrieval-Augmented Generation (RAG) technique, which combines LLM reasoning with access to external tools and data sources.
The agent receives natural language requests through Slack and determines user intent using Azure OpenAI. Based on each request, the agent searches Salesforce for existing contacts, retrieves contact data from ZoomInfo, and carries out create or update operations in Salesforce upon user approval. The agent maintains conversation history in Jitterbit Cloud Datastore to provide contextually aware responses across a session.
The agent performs the following tasks:
- Receives natural language requests from users through Slack.
- Uses Azure OpenAI to extract the account name and determine the intent of each request.
- Searches Salesforce for existing contacts associated with the specified account.
- Queries ZoomInfo for contact data not yet in Salesforce, including job titles, phone numbers, and email addresses.
- Compares Salesforce contact records against ZoomInfo data to identify outdated or missing information.
- Presents contact lists and update recommendations to the user in Slack for approval before making any changes in Salesforce.
- Creates or updates contact records in Salesforce upon user approval.
- Stores conversation history in Cloud Datastore to maintain context across messages within a 30-minute session window.
- Sends Slack notifications to a configured sales alerts channel when a contact is identified as no longer with the company.
This document explains how to set up and operate this AI agent. It covers architecture and prerequisites, guidance on prompting the agent, and steps to install, configure, and operate the AI agent.
AI agent architecture
This AI agent manages Salesforce contacts through a conversational Slack interface. A typical interaction follows these steps:
- A user sends a natural language message to the CRM Contact Agent through Slack.
- The agent retrieves conversation history from Cloud Datastore to maintain session context, then calls Azure OpenAI to extract the account name from the request.
- The agent queries Salesforce to validate the account name and retrieve the Salesforce account ID.
- The agent calls Azure OpenAI a second time, with available tools, to determine the user's intent and select the appropriate tool to run.
- The selected tool queries Salesforce and ZoomInfo as needed to gather contact data.
- For operations that create or update contacts, the agent presents a summary to the user in Slack and waits for approval before taking action in Salesforce.
- The agent calls Azure OpenAI without tools to format the final response using a context-specific prompt, then posts the response back to the user in Slack.
- Conversation history is saved to Cloud Datastore for use in subsequent messages within the same session.
Workflow diagram
The following diagram shows the main request-handling workflow for the CRM Contact Agent.
Jitterbit
CRM Contact Agent" } SLK[fab:fa-slack
Slack] SF[fab:fa-salesforce
Salesforce] ZI[ZoomInfo API] AZR[Azure OpenAI REST call] AZM@{ shape: hex, label: "Azure OpenAI model" } CD@{ shape: hex, label: "fas:fa-database
Cloud Datastore" } SLK -->|1. User request| JSP JSP <-->|2. Session history| CD JSP <-->|3. Account lookup| SF JSP -->|4. Conversation and prompt| AZR AZR --> AZM AZM --> AZR AZR -->|5. Intent + tool selection| JSP JSP <-->|6. Contact data| SF JSP <-->|7. Contact data| ZI JSP -->|8. Response| SLK
Prerequisites
You need the following components to use this AI agent.
Harmony components
You must have a Jitterbit Harmony license with access to the following components:
- Jitterbit Studio.
- Jitterbit Cloud Datastore to store conversation history and contact staging data.
- Jitterbit CRM Contact Agent purchased as a license add-on.
Supported endpoints
The AI agent connects to the following endpoints. You can accommodate other systems by modifying the project's endpoint configurations and workflows.
Large language model (LLM)
The AI agent uses Azure OpenAI as the LLM provider. To use Azure OpenAI, you must have a Microsoft Azure subscription with permissions to create an Azure OpenAI resource with a deployed model.
Tip
For pricing information, see the Azure OpenAI pricing page.
CRM system
The agent queries and updates contact records in Salesforce. To use Salesforce, you must have a Salesforce account with API access and permissions to read and write contact records.
Contact data provider
The agent retrieves contact data from ZoomInfo to supplement existing Salesforce records. To use ZoomInfo, you must have a ZoomInfo account with API access credentials.
Messaging platform
The agent uses Slack as its conversational interface and notification channel. To use Slack, you must have a Slack workspace with a configured Slack app to receive and respond to messages. For detailed instructions on creating a Slack app, see Create a Slack app.
Agent prompts
The CRM Contact Agent receives all requests as natural language messages sent to the Slack app. This section describes the rules for effective prompts and provides example prompts.
Prompt guidelines
Follow these guidelines when sending messages to the agent:
-
Include the account name in every prompt. The LLM attempts to infer the account name from conversation history (cleared every 30 minutes), but including it explicitly in every message produces more reliable results.
-
To create new contacts, you must first ask the agent to find them using a New contacts prompt. The agent presents a list of contacts for approval before creating records in Salesforce.
-
To update existing contacts, you must first run an update check using a Data hygiene and updates prompt. The agent presents update recommendations for your approval before writing changes to Salesforce.
Example prompts
The following example prompts show the types of prompts the agent can handle. Replace {Account Name} with the name of the Salesforce account, and {list of roles} with a comma-separated list of relevant job titles.
New contacts
Use these prompts to find and create new contacts for an account using ZoomInfo data:
Prompts
Find New Contacts for Account - {Account Name}Find New Contacts for Account - {Account Name}, only include contacts with roles related to {list of roles}Create new contacts for account - {Account Name}
Data hygiene and updates
Use these prompts to identify outdated or missing contact data and apply updates:
Prompts
Run a hygiene check for Account - {Account Name}Run an update for existing contacts for account - {Account Name}
Existing contacts
Use these prompts to search for and report on contacts already in Salesforce:
Prompts
Find Existing Contacts for Account - {Account Name}Find last 3 contacts created for Account - {Account Name}When was the last time we spoke with a contact from {Account Name}Flag contacts with no activity in Salesforce for account {Account Name}Find any duplicate contacts for account - {Account Name}Find contacts missing titles, emails, phone numbers for account - {Account Name}Compare Salesforce contacts against ZoomInfo for account - {Account Name}Locate a contact for account {Account Name} that we usually reach out to
Special access prompts
The following prompts require administrator-level access, as configured in the set.user.roles script. These operations consume ZoomInfo credits from your account allowance:
Prompts
Run an enriched hygiene check for Account - {Account Name}Enrich missing phone numbers for account - {Account Name}
Installation, configuration, and operation
Follow these steps to install, configure, and operate this AI agent:
- Download and install the project
- Create Microsoft Azure resources
- Create the Slack app
- Configure Cloud Datastore
- Configure project variables
- Test connections
- Deploy the project
- Review project workflows
- Trigger the project workflows
For troubleshooting guidance, see Troubleshooting.
Download and install the project
Follow these steps to install the Studio project for the AI agent:
-
Log in to the Harmony portal at https://login.jitterbit.com and open Marketplace.
-
Locate the AI agent named Jitterbit CRM Contact Agent. To locate the agent, use the search bar or, in the Filters pane under Type, select AI Agent to limit the display to AI agents.
-
Click the agent's Documentation link to open its documentation in a separate tab. Keep the tab open to refer back to after starting the project.
-
Click Start Project to open a two-step configuration dialog.
Note
If you have not yet purchased the AI agent, Get this agent is displayed instead. Click it to open an informational dialog, then click Submit to have a representative contact you about purchasing the AI agent.
-
In configuration step 1, Download Customizations, download any provided configuration files.
-
Click Next.
-
In configuration step 2, Create a New Project, select an environment where the Studio project will be created, then click Create Project.
-
After the progress dialog indicates the project is created, use the dialog link Go to Studio or open the project directly from the Studio Projects page.
Create Microsoft Azure resources
Create the following Microsoft Azure resources and note the information for configuring the AI agent. To create and manage these resources, you must have a Microsoft Azure subscription with the appropriate permissions.
You must create an Azure OpenAI resource and deploy a model through the Azure AI Foundry portal.
Note the deployment name, endpoint URL, and API key. Enter these values when you configure project variables.
To find these values, follow these steps:
-
In the Azure AI Foundry portal, open the specific OpenAI resource.
-
On the resource landing page, copy the endpoint URL (for the
Openai.tokenproject variable) and API key. -
In the navigation menu under Shared resources, select Deployments. Copy the deployment name (for the
Openai.modelproject variable).
Create the Slack app
To enable the agent's Slack interface, follow these steps:
-
Create a Slack app and install it to your Slack workspace.
-
Obtain the bot token and retain it for the
Slack.tokenproject variable. -
Identify the Slack channel where the agent will respond to user messages and retain it for the
Slack.channelproject variable. -
Identify the Slack channel designated to receive account executive notifications and retain it for the
salesforce.sales.alerts.channelproject variable.
Configure Cloud Datastore
The agent uses three Cloud Datastore key storages to manage conversation history and contact staging data:
| Key storage | Purpose |
|---|---|
| Slack agent AI | Stores conversation history for each Slack user. |
| Contact cache | Stages contact data when a user approves a create or update action. |
| LLM token cost | Records token usage for each Azure OpenAI API call. |
For each key storage, follow these steps:
- Create the key storage with the name and custom fields specified below.
- In the Studio project's Components tab under Endpoints, locate each Cloud Datastore activity associated with that storage. Each activity is prefixed with the key storage name (for example,
CONTACT CACHE - Delete Items Cache CDS). Double-click to open it, assign the storage name, and save.
Slack agent AI
Create a key storage named Slack agent AI and add the following custom fields:
system_content_big(big text)created_on(text)slack_channel_id(text)user_content(text)
Use this storage for all Cloud Datastore activities prefixed with SLACK AGENT AI.
Contact cache
Create a key storage named Contact cache and add the following custom fields:
create_or_update(text)jsonbody(big text)contactbody(big text)
Use this storage for all Cloud Datastore activities prefixed with CONTACT CACHE.
LLM token cost
Create a key storage named LLM token cost and add the following custom fields:
total_tokens(text)prompt_tokens(text)completion_tokens(text)createdDate(text)content(big text)
Use this storage for all Cloud Datastore activities prefixed with LLM TOKEN COST.
Configure project variables
In the Studio project installed from Marketplace, set values for the following project variables.
To configure project variables, use the project's actions menu and select Project Variables to open the configuration drawer.
ZoomInfo
| Variable name | Description |
|---|---|
zoom.username |
Username for the ZoomInfo API account. |
zoom.password |
Password for the ZoomInfo API account. |
Salesforce
| Variable name | Description |
|---|---|
salesforce.username |
Username for the Salesforce instance. |
salesforce.url |
URL for the Salesforce instance. |
salesforce.token |
Security token for the Salesforce account. |
salesforce.password |
Password for the Salesforce instance. |
salesforce.sales.alerts.channel |
Slack channel that receives notifications when a contact tied to a Salesforce account is no longer with the company. |
Slack
| Variable name | Description |
|---|---|
slack.token |
The Slack bot token obtained after creating the Slack app, used for the Slack connection's Bot User OAuth Token field. |
slack.channel |
Slack channel where the agent listens for and responds to user messages. |
slack.bot.userId |
The user ID of your Slack bot. Used to filter out the bot's own API calls from Slack event logs. |
Azure OpenAI
| Variable name | Description |
|---|---|
openai.token |
API key used to authenticate requests to the Azure OpenAI service. |
openai.temperature |
Controls the randomness of model output. Set to 1 when using the o4-mini model. Otherwise, use a value of 0.5 or lower for more consistent responses. |
openai.model |
Deployment name of the Azure OpenAI model to use. |
Cloud Datastore
| Variable name | Description |
|---|---|
clouddatastore.token |
Cloud Datastore authentication token, obtained from the Management Console Access Tokens page. |
Conversation settings
| Variable name | Description |
|---|---|
cleanup.historytime |
Duration in seconds that conversation history is retained before cleanup. Default is 1800 (30 minutes). Longer values send more context to the LLM per request. |
Test connections
Test the endpoint configurations to verify connectivity using the defined project variable values.
To test connections, go to the design component palette's Project endpoints and connectors tab, hover over each endpoint, and click Test.
Deploy the project
Deploy the Studio project.
To deploy the project, use the project's actions menu and select Deploy.
Create the Jitterbit custom API
Create a custom API using the Publish as an API option for the Receiver - Slack API request handler operation in the Main Entry - Slack API Request Handler workflow.
Configure these settings for the service:
| Setting | Value |
|---|---|
| Service name | slackApiRequestHandler |
| Operation | Receiver - Slack API request handler |
| Path | /slackApiRequestHandler |
| Method | POST |
| Response Type | System Variable |
After you configure the service, publish the custom API.
Copy the API service URL. To find the service URL, go to the API details drawer on the Services tab, hover over the service's Actions column, and click Copy API service URL.
In your Slack app's configuration, navigate to Features > Event Subscriptions and enable events. Then paste the API service URL into the Request URL field. Slack will send a request with a challenge parameter. Once Slack confirms the URL is valid, click Save Changes.
Tip
You can also add a security profile for authentication.
Review project workflows
The Studio project contains 18 workflows that implement the CRM Contact Agent functionality, organized into five functional groups.
Entry point
| Workflow | Description |
|---|---|
| Main Entry - Slack API Request Handler | Receives incoming Slack messages and initiates the main controller script. |
Main Entry - Slack API Request Handler
This workflow receives Slack messages and runs the main controller script (controller.receiver.async). The controller orchestrates the full request-handling process: it retrieves conversation history from Cloud Datastore, calls Azure OpenAI to extract the account name and determine intent, routes the request to the appropriate tool, formats the LLM response, and posts the result back to the Slack user.
API integrations
| Workflow | Description |
|---|---|
| API - Slack Handler | Handles all Slack API interactions, including posting messages and deleting typing indicators. |
| API - Azure Open AI | Contains both types of Azure OpenAI API calls: with tools for intent detection and without tools for response formatting. |
| API - Zoom Info | Houses ZoomInfo API operations for contact search, authentication, and contact data retrieval. |
API - Slack Handler
This workflow contains all Slack API operations used by the agent, including querying the user's Slack profile, posting a "typing..." indicator, posting the final response, and deleting the typing indicator after the response is sent.
API - Azure Open AI
This workflow contains two types of Azure OpenAI API calls:
- Open AI - Prompt HTTP With Tools: Sends a request to Azure OpenAI with a list of available tools. This call is used to extract the account name from the user's message and to determine the intent of the request.
- Open AI - Prompt HTTP No Tools: Sends a request to Azure OpenAI without tools, after the selected tool has gathered all required data. This call generates the final Slack-ready response using a context-specific prompt.
The two calls use separate conversation histories. The intent determination call uses account-specific history, while the account name extraction call uses full conversation history. This separation keeps the context sent to the LLM focused and reduces unnecessary token usage.
API - Zoom Info
This workflow houses all ZoomInfo API operations. Operations are organized by data type rather than by tool, making them reusable across multiple tools. All ZoomInfo operations require you to set the core.zoom.resource project variable to a valid value. Valid values as of March 2026 are contact, authenticate, enrich_contact, and scoop.
The core. Load Zoom API Resource script centralizes all API base URLs and web objects, making it straightforward to switch to a different contact data provider if needed. All contact data calls share the standard ZoomInfo POST activity. The authentication call uses a separate activity.
Memory and state
| Workflow | Description |
|---|---|
| Memory - Cloud Datastore | Manages Cloud Datastore read and write operations for conversation history and contact staging data. |
| Conversation Cleanup Controller | Removes conversation history older than the configured cleanup.historytime threshold. |
| Scheduler Task Manager | Manages operations configured to run on a schedule. |
Memory - Cloud Datastore
This workflow manages four types of Cloud Datastore operations distributed across three Cloud Datastore storages:
- Get Account Specific Slack History: Retrieves conversation history for a specific Salesforce account, providing the LLM with focused context relevant to the current request.
- Get Master Slack History: Retrieves the full conversation history for the Slack user. The agent uses this only when calling the LLM to extract the account name.
- Cache Last Message Controller: Stores contact data just before a create or update action is approved. The agent keys data by a combination of the Slack user ID and Salesforce account ID, ensuring that the correct contact list is referenced when the user approves an action. If the key stored in the cache does not match the account currently being referenced, the agent reports a mismatch and does not proceed.
- Store Token Costs to Cache: Records token usage from each Azure OpenAI API call for client review and cost reporting.
Conversation Cleanup Controller
This workflow removes conversation history that exceeds the cleanup.historytime threshold. When the LLM receives more conversational data than it can effectively process, it may be unable to determine the intent of the current request. In this case, the agent reduces the history window to 10 minutes and asks the user to resubmit the prompt.
Scheduler Task Manager
This workflow manages any operations configured to run on operation schedules.
Two operations have specific scheduling requirements:
-
Conversation Cleanup Controller: Schedule to run at least every 5 minutes. This controls how closely actual retention matches the
cleanup.historytimethreshold. The less frequently it runs, the longer history can linger beyond the configured limit. -
Account Executive Notifications: Schedule to run once per day. The default query is scoped to that day's data, so running it more than once returns duplicates.
To configure a schedule, open the operation's actions menu and select Settings > Schedules.
Utilities
| Workflow | Description |
|---|---|
| Utility Tools | Contains reusable utility scripts for Salesforce account lookups and email communication checks. |
| Tools Supervisor | Routes requests to the appropriate tool workflow based on the intent returned by Azure OpenAI. |
Utility Tools
This workflow contains reusable utility scripts that can be called across multiple tool workflows:
Utility- Get Account id from Salesforce: Looks up a Salesforce account ID by account name.Utility- Check for Email COMs by Name: Searches Salesforce for email conversations by contact name and domain. Requires a contact name and domain to be set as arguments before the script is called.Utility- Get Number of Contacts for SF Account: Returns the number of contacts associated with a Salesforce account. This utility is not currently in use.Utility- Check Empty Email Contacts: Iterates through a dictionary of contacts that have no email address in Salesforce and calls the email communications check for each, searching for any related email activity.
Tools Supervisor
This workflow reads the intent value returned by Azure OpenAI (stored in the openai.response.route project variable) and uses a case statement to route the request to the appropriate tool workflow. If an account name is found but no route can be determined (typically due to a long conversation history), the agent cleans the history and asks the user to resubmit the prompt.
Agent tools
| Workflow | Description |
|---|---|
| Search Existing Contact | Retrieves all contacts for a specified Salesforce account. |
| Search New Contacts | Queries ZoomInfo for contacts not yet in Salesforce and cross-references results against existing records. |
| Confirm Contact Creation | Presents a list of new contacts to the user in Slack for approval before creating records in Salesforce. |
| Execute Contact Creation | Creates approved contact records in Salesforce using an upsert operation keyed on email address. |
| Hygiene Check | Compares Salesforce contact records against ZoomInfo data to identify title mismatches and missing information. |
| Enriched Hygiene Check | Performs a detailed comparison of Salesforce and ZoomInfo contact records for administrators. This workflow consumes ZoomInfo credits. |
| Account Executives Notifications | Sends Slack notifications to the sales alerts channel when a contact is identified as no longer with the company. |
| Confirm Contact Update | Presents contact update recommendations to the user in Slack for approval before applying changes in Salesforce. |
| Execute Contact Update | Applies approved contact updates in Salesforce and reports success or failure back to the user. |
Search Existing Contact
This workflow retrieves all contacts for a specified account from Salesforce. The script name is search_existing_contact - controller. The workflow stores contact data in salesforce.response.body, writes it to $tool.response for LLM processing, and sets the response check to master_prompt.
Search New Contacts
This workflow retrieves contact data from ZoomInfo for a specified account. The script name is search_new_contact Controller. The workflow makes one ZoomInfo API call per job title configured in the $zoom.query_jobTitle project variable. Limit this variable to four or five roles to keep response times acceptable.
The workflow first runs an open search without role filters to retrieve an unrestricted contact list, then makes role-specific calls. The workflow maps results to a shared JSON schema (contactdata.json) used across other tools. The workflow cross-references each new contact against Salesforce to check whether it already exists for the account. The tool also checks for email activity for contacts found through ZoomInfo using the Utility- Check Empty Email Contacts utility.
Confirm Contact Creation
This workflow retrieves the contact list stored by the Search New Contacts workflow from the Contact cache Cloud Datastore key storage and sends it to Azure OpenAI with a confirm_create_contact prompt. The LLM infers email addresses from available Salesforce data and presents a structured contact list to the user in Slack, requesting approval before creating records. The workflow stores the approved contact data back to the Contact cache for use in the Execute Contact Creation workflow.
Execute Contact Creation
This workflow retrieves the approved contact list from the Contact cache Cloud Datastore key storage and compares the Salesforce account ID in the cache key against the account currently being referenced in the conversation. If the IDs match, the workflow creates contact records in Salesforce using an upsert operation keyed on email address. If there is a mismatch, the agent notifies the user and does not proceed with creation.
Hygiene Check
This workflow retrieves all contacts for a Salesforce account, then queries ZoomInfo for each contact to identify title mismatches or missing information. The workflow adds contacts without an email address in Salesforce to a dictionary and checks them for email activity using the Utility- Check Empty Email Contacts utility. The workflow stores data from both Salesforce and ZoomInfo in $tool.response and sets the response check to hygiene_check.
Enriched Hygiene Check
This workflow operates similarly to the Hygiene Check workflow but is restricted to administrators, as configured in the set.user.roles script. This workflow consumes ZoomInfo credits from your account allowance. This workflow sets the response check to enriched_hygiene_check.
Account Executives Notifications
This workflow sends a Slack notification to the channel configured in salesforce.sales.alerts.channel when the agent identifies a contact associated with a known Salesforce account as no longer with that company.
Confirm Contact Update
This workflow retrieves all contacts for the specified Salesforce account and queries ZoomInfo for each contact to check whether the title has changed. It also checks Salesforce for email activity associated with each contact. Based on these checks, a transformation assigns each contact one of three recommended actions: recommend_update, recommend_donotupdate, or recommend_delete. The agent presents these recommendations to the user for approval before taking any action. Note that the CRM Contact Agent does not delete contacts from Salesforce; the recommend_delete action indicates to the user that a contact may need to be removed.
Execute Contact Update
This workflow retrieves approved update data from the Contact cache Cloud Datastore key storage, verifies that the account being referenced matches the account ID stored in the cache key, then applies the approved updates to Salesforce contact records. The workflow reports the success or failure of each update back to the user in Slack.
Trigger the project workflows
The CRM Contact Agent is triggered by incoming messages from the Slack app connected to the Main Entry - Slack API Request Handler workflow. You don't need to manually run an operation to start the agent; the Slack app handles triggering automatically when users send messages.
The Scheduler Task Manager workflow supports operation schedules for any operations you choose to run on a recurring basis. To configure a schedule, open the operation's actions menu and select Settings > Schedules.
Troubleshooting
If you encounter issues, review the following logs for detailed troubleshooting information:
For additional assistance, contact Jitterbit support.