Salesforce is the world's most widely used CRM — and one of the highest-leverage systems to connect your AI agents to. An agent with Salesforce access can qualify leads, update records, trigger workflows, and surface insights across your entire revenue pipeline without a human touching a keyboard.
This guide walks through every integration approach, from no-code platforms to Python frameworks, with working code examples and security best practices.
What AI Agents Can Do With Salesforce Access#
Before setting up the integration, it's worth mapping out what becomes possible once an agent can read from and write to Salesforce:
Reading data
- Pull lead and contact records for enrichment or analysis
- Query opportunity pipeline for forecasting or risk identification
- Read activity history to understand account engagement
Writing data
- Create and update lead/contact records from inbound sources
- Log call notes, email summaries, and meeting outcomes automatically
- Update opportunity stages based on external signals
Triggering workflows
- Fire Salesforce flows based on external events (new inbound lead, support ticket, etc.)
- Create tasks and assign them to reps based on agent decisions
- Send alerts through Salesforce when conditions are met
Real-time monitoring
- Watch for new leads via Streaming API and process them immediately
- Monitor opportunity close dates and trigger outreach when dates approach
- Alert managers when high-value opportunities go quiet
Option 1: No-Code Integration with Lindy AI#
Best for: Non-technical teams, rapid deployment, standard use cases
Lindy AI provides a native Salesforce connector that requires only OAuth authentication. No code needed.
Step 1: Connect Lindy to Salesforce#
- In Lindy, go to Integrations → CRM → Salesforce
- Click Connect with Salesforce — you'll be redirected to the Salesforce OAuth flow
- Authorize Lindy with the permissions it requests (read/write access to your chosen objects)
- Name the connection (e.g., "Salesforce Production") and save
Step 2: Define Your Agent's Salesforce Capabilities#
In your Lindy agent configuration, add Salesforce as a tool source. Define which actions the agent can take:
- Read Leads: Agent can query leads by email, phone, company
- Update Records: Agent can modify specific fields (e.g., lead status, notes)
- Create Tasks: Agent can add follow-up tasks to contact records
Step 3: Write the Agent Prompt#
You are a sales development agent. When you receive a new lead notification:
1. Look up the lead's company in Salesforce to check for existing accounts
2. Search the web for recent news about their company
3. Score the lead (1-10) based on ICP criteria: [list your ICP attributes]
4. Update the lead record in Salesforce with the score and research notes
5. If score >= 7, create a task for the assigned rep to follow up within 24 hours
6. Send a Slack message to #sales-qualified-leads with a summary
Step 4: Test in Sandbox#
Connect to a Salesforce sandbox environment first. Lindy lets you specify which Salesforce environment to use — select your sandbox before running any tests.
Option 2: LangChain with Python#
Best for: Engineering teams, custom logic, complex multi-step workflows
Setup#
Install the required packages:
pip install langchain langchain-openai simple-salesforce python-dotenv
Create a .env file with your Salesforce credentials:
SF_USERNAME=your@email.com
SF_PASSWORD=yourpassword
SF_SECURITY_TOKEN=yoursecuritytoken
SF_DOMAIN=login # or 'test' for sandbox
OPENAI_API_KEY=sk-...
Create Salesforce Tools#
from simple_salesforce import Salesforce
from langchain.tools import tool
from dotenv import load_dotenv
import os
load_dotenv()
sf = Salesforce(
username=os.getenv("SF_USERNAME"),
password=os.getenv("SF_PASSWORD"),
security_token=os.getenv("SF_SECURITY_TOKEN"),
domain=os.getenv("SF_DOMAIN", "login")
)
@tool
def get_lead_by_email(email: str) -> str:
"""Look up a Salesforce lead by email address."""
result = sf.query(f"SELECT Id, Name, Company, Status, LeadSource FROM Lead WHERE Email = '{email}' LIMIT 1")
if result["totalSize"] == 0:
return f"No lead found with email {email}"
record = result["records"][0]
return f"Lead found: {record['Name']} at {record['Company']}, Status: {record['Status']}"
@tool
def update_lead_score(lead_id: str, score: int, notes: str) -> str:
"""Update a lead's score and add research notes to their Salesforce record."""
sf.Lead.update(lead_id, {
"Lead_Score__c": score, # Custom field — adjust to your Salesforce schema
"Research_Notes__c": notes, # Custom field — adjust to your Salesforce schema
})
return f"Lead {lead_id} updated with score {score}"
@tool
def create_follow_up_task(lead_id: str, subject: str, due_date: str) -> str:
"""Create a follow-up task for a lead in Salesforce."""
sf.Task.create({
"WhoId": lead_id,
"Subject": subject,
"ActivityDate": due_date,
"Status": "Not Started",
"Priority": "High"
})
return f"Task created for lead {lead_id}: {subject}"
Build the Agent#
from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [get_lead_by_email, update_lead_score, create_follow_up_task]
prompt = ChatPromptTemplate.from_messages([
("system", """You are a lead qualification agent. For each new lead:
1. Look them up in Salesforce to check for existing records
2. Score them 1-10 based on these ICP criteria: [your ICP criteria]
3. Update their Salesforce record with the score and your reasoning
4. If score >= 7, create a high-priority follow-up task due tomorrow
Always explain your scoring reasoning in the notes."""),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# Run the agent on a new lead
result = executor.invoke({
"input": "New lead: Jane Smith, jane@acme.com, VP of Engineering at Acme Corp (500 employees, SaaS company)"
})
print(result["output"])
Option 3: CrewAI for Multi-Agent Sales Workflows#
Best for: Complex workflows requiring multiple specialized agents working together
CrewAI lets you define a crew of specialized agents — each with a distinct role — that collaborate to complete a workflow.
from crewai import Agent, Task, Crew
from crewai.tools import tool
# Define the same Salesforce tools (same @tool functions as above)
# Plus add a web research tool:
@tool
def search_company_news(company_name: str) -> str:
"""Search for recent news about a company."""
# Use your preferred search API (Tavily, Serper, etc.)
# Return recent news headlines and summaries
pass
# Define specialized agents
lead_researcher = Agent(
role="Lead Researcher",
goal="Research and enrich lead information",
backstory="Expert at gathering company intelligence from public sources",
tools=[search_company_news, get_lead_by_email],
llm="gpt-4o"
)
lead_qualifier = Agent(
role="Lead Qualifier",
goal="Score and qualify leads against ICP criteria",
backstory="Expert at evaluating sales opportunities using structured criteria",
tools=[update_lead_score, create_follow_up_task],
llm="gpt-4o"
)
# Define tasks
research_task = Task(
description="Research the lead {lead_info}. Check Salesforce for existing records and search for recent company news.",
agent=lead_researcher,
expected_output="Summary of lead research including company context and Salesforce status"
)
qualify_task = Task(
description="Based on the research, score this lead 1-10 against our ICP. Update Salesforce with the score and reasoning. Create a follow-up task if score >= 7.",
agent=lead_qualifier,
expected_output="Lead score, reasoning, and confirmation of Salesforce updates"
)
# Assemble and run the crew
crew = Crew(
agents=[lead_researcher, lead_qualifier],
tasks=[research_task, qualify_task],
verbose=True
)
result = crew.kickoff(inputs={"lead_info": "Jane Smith, jane@acme.com, VP Engineering at Acme Corp"})
Security Best Practices#
Giving an AI agent access to your Salesforce is a significant decision. Follow these practices:
Use a Dedicated Connected App#
Never use your personal Salesforce credentials in production. Create a dedicated Connected App:
- In Salesforce Setup, go to App Manager → New Connected App
- Enable OAuth, set callback URL
- Grant only the OAuth scopes your agent needs (e.g.,
api,refresh_token— avoidfull) - Create a dedicated integration user with a Permission Set that grants only the objects and fields the agent needs
Scope Permissions to Minimum Necessary#
| Action | Objects | Fields | |--------|---------|--------| | Lead qualification | Lead | Read: all; Write: status, custom score field, notes | | Activity logging | Task | Write: subject, due date, WhoId | | Opportunity monitoring | Opportunity | Read only |
Build Human Approval for High-Stakes Actions#
For any action that modifies financial data (opportunity amounts, account ownership), require a human approval step before the agent executes. In Lindy, this is a built-in option. In LangChain, implement a confirmation step using input() or a Slack approval workflow.
Test in Sandbox First#
Always configure your agent to use a Salesforce sandbox environment during development. Salesforce Developer Edition is free and gives you a full environment with no risk to production data.
Troubleshooting Common Issues#
Authentication errors: Ensure your security token is appended to your password when using username/password auth. If you've recently reset your password, your security token resets too.
API limits: Salesforce enforces daily API call limits based on your edition. Monitor usage in Setup → System Overview → API Usage. Implement caching for frequently-read records.
SOQL injection: Never construct SOQL queries by string concatenation with user input. Use parameterized queries or the simple-salesforce query() method which handles escaping.
Rate limits: Add retry logic with exponential backoff for API calls. The simple-salesforce library raises SalesforceError on rate limit responses (HTTP 429).
Next Steps#
Once your Salesforce integration is working, explore these related resources:
- AI Agent Sales Automation Examples — Real implementations with outcome metrics
- Lead Qualification Workflow Blueprint — Pre-built workflow template
- CrewAI Tutorial — Deeper dive into multi-agent coordination
- AI Agents + HubSpot Integration — For HubSpot CRM users