Leo LogoHelloLeo
IntegrationsTemplatesPricingCommunity
Book a demoSign InGet Started
Leo LogoHelloLeo

The AI developer that builds the apps your ERP doesn't have — internal tools, portals and dashboards, running in production on top of NetSuite, Odoo, Salesforce and more.

Applications

  • HelloLeo for NetSuite
  • HelloLeo for Odoo
  • HR & Employees
  • Inventory
  • Accounting & Procurement

Integrations

  • Shopify integration
  • HubSpot integration
  • WhatsApp Business integration
  • Salesforce integration
  • Stripe integration
  • Google Sheets integration
  • Outlook integration
  • QuickBooks integration
  • All integrations

Product

  • Pricing
  • Templates
  • vs AI coding tools

Company

  • Contact

Resources

  • Documentation
  • Help Center
  • Community

Legal

  • Trust Center
  • Security
  • Status
  • Privacy Policy
  • Terms of Service
  • DPA
Salesforce logo
Integration

Connect Salesforce to your ERP

Cloud-based customer relationship management (CRM) platform that helps businesses manage sales, marketing, customer support, and other business activities, ultimately aiming to improve customer relationships and streamline operations.

CRM
Browse all integrations

What Leo can do with Salesforce

61 actions Leo can use in the apps and agents it builds for you: 24 that read Salesforce data, 37 that create or update it.

reads data writes data deletes data

Read from Salesforce · 24

  • Text Search

    Search Salesforce records by keyword across multiple object types simultaneously. Use for free-text search when the user mentions a name, term, or keyword without specifying an object type. Use SOQL Query instead for structured queries on a single object type with specific conditions. Results are grouped by object type.

    Docs ↗
  • SOSL Search (Object Search)

    Run a SOSL text search with guided prompts. Prefer Text Search for agent and API use - it takes a plain keyword and searches several object types at once. SOSL matches indexed text fields, so it finds partial words but will not filter on numeric or date criteria.

    Docs ↗
  • SOQL Query (Object Query)

    Run a SOQL query with guided prompts for the object, fields and filter. Prefer SOQL Query for agent and API use - it accepts a complete query string and pages through every result, while this action returns only the first batch. SOQL filters on exact field values; use Text Search for keyword search.

    Docs ↗
  • SOQL Query

    Execute a SOQL query against Salesforce. This is the primary tool for querying Salesforce data — use for all structured queries. For free-text search across multiple objects, use Text Search instead. When the user uses first-person language ('my', 'I', 'me'), filter by OwnerId using the userId from Get User Info. Use Describe Object to discover field names and picklist values before querying non-obvious fields. SOQL syntax reference: - Basic: SELECT Id, Name, Email FROM Contact WHERE AccountId = '001xxx' - Operators: =, !=, >, <, >=, <=, LIKE '%text%', IN ('a','b'), NOT IN - Date literals: TODAY, THIS_MONTH, LAST_N_DAYS:30, THIS_QUARTER, LAST_QUARTER, THIS_YEAR - NULL checks: WHERE Email != null - Aggregates: SELECT StageName, COUNT(Id) c, SUM(Amount) s FROM Opportunity GROUP BY StageName - SOQL does NOT support the `AS` keyword — write COUNT(Id) c, not COUNT(Id) AS c - Reserved words cannot be aliases — count, sum, avg are reserved. Use short aliases like c, s, a - Cannot ORDER BY alias — repeat the aggregate: ORDER BY COUNT(Id) DESC, not ORDER BY c DESC - Parent relationship: SELECT Name, Account.Name FROM Contact - Child subquery: SELECT Name, (SELECT Name FROM Contacts) FROM Account - Sorting/limits: ORDER BY CreatedDate DESC LIMIT 10 Always include `Id` in SELECT. Include a clickable Salesforce link for every record using the format {instanceUrl}/lightning/r/{objectType}/{Id}/view (get instanceUrl from Get User Info).

    Docs ↗
  • Search Object Records

    Search for records of one object type using a parameterized SOSL search. Use Text Search to search across several object types at once, or SOQL Query for exact field filters. SOSL matches indexed text fields, so it finds partial words but will not filter on numeric or date criteria.

    Docs ↗
  • List Objects

    List available Salesforce object types (SObjects) in the org. Use when the user references an object type you're not sure about, or to discover custom objects. Custom objects end in __c. Standard CRM objects: Account, Contact, Lead, Opportunity, Case, Task, Event, Campaign, User. Use Describe Object to get field details for a specific object type.

    Docs ↗
  • List Object Fields

    List the field names for a Salesforce object type. Use this to discover valid field names before calling Find Records, SOQL Query or any create/update action. Use Describe Object instead when you also need field types, required flags and picklist values.

    Docs ↗
  • List Knowledge Articles

    List Salesforce Knowledge articles, newest first. Returns the article container records (KnowledgeArticle), not the published article bodies - use Get Knowledge Articles to read article content, and List Knowledge Data Category Groups to discover the categories articles are filed under. This can return a lot of records on a mature org, so set Limit.

    Docs ↗
  • List Email Templates

    List Salesforce email templates, newest first. Use this to find a template and its ID before sending with Send Email, or before editing with Update Email Template. For example, run with Limit 50, then pass the Id of the template you want to Send Email.

    Docs ↗
  • List Email Messages

    List Salesforce email messages, newest first, optionally scoped to one case. Returns the full email records including subject and body - use List Case Feed Items instead if you only need to know that an email happened. Find the case ID with List Cases first. Omit Case ID to list the most recent emails across the org, which can be large - set Limit.

    Docs ↗
  • List Cases

    List Salesforce support cases, newest first. Use this to find a case and its ID. Every filter is optional and they combine with AND - call with no filters to see the most recent cases. For example, Status New with Limit 10 returns the ten newest open cases. Status values are org-configurable.

    Docs ↗
  • List Case Feed Items

    List the feed (Chatter) entries on a case, newest first. Use this to read a case's activity trail - text posts, status changes, logged calls, email events and case comment events - in one call. The case feed only exists when feed tracking is enabled for Cases in the Salesforce org, so an org without it returns no records.

    Docs ↗
  • List Case Comments

    List the comments on a Salesforce case, newest first. Use this for the case's comment thread only - use List Case Feed Items for the full activity trail (status changes, logged calls, emails) or List Email Messages for emails on the case. Find the case ID with List Cases first. For example, case ID 5005g00001ABCDeAAI with Limit 20 returns that case's twenty most recent comments.

    Docs ↗
  • Get User

    Retrieve one Salesforce user by their record ID. Use Get Current User for the authenticated user instead of looking up an ID. Record owner fields such as OwnerId hold user IDs - pass one here to resolve it to a name and email.

    Docs ↗
  • Get User Info

    Get the current authenticated Salesforce user's identity, including user ID, email, org ID, and instance URL. Must be called before any query that uses first-person language ('my', 'I', 'me'). The userId can be used as an OwnerId filter in SOQL queries (e.g. WHERE OwnerId = '{userId}'). The instanceUrl is needed to construct clickable links to Salesforce records: {instanceUrl}/lightning/r/{objectType}/{recordId}/view.

    Docs ↗
  • Get Related Records

    Get child records related to a parent Salesforce record via a relationship. Use to traverse relationships without writing SOQL joins. Common relationships: Account → Contacts, Opportunities, Cases, Tasks; Contact → Cases, Opportunities, Tasks; Opportunity → OpportunityLineItems, Tasks. Use Describe Object to discover available relationship names if unsure (look for relationshipName on reference fields).

    Docs ↗
  • Get Record by ID

    Retrieve one Salesforce record of any object type by its record ID. Use Find Records to look up records by criteria, or SOQL Query when you need related fields or a filtered set. Use List Objects to discover object types if you are unsure of the type name.

    Docs ↗
  • Get Knowledge Data Category Groups

    List the Knowledge data category groups visible to the current user. Call this before Get Knowledge Articles to discover the valid category group and category names to filter by. Returns only categories the authenticated user can see, so results vary per user.

    Docs ↗
  • Get Knowledge Articles

    Retrieve a page of online Knowledge articles for a language and data category, by search or query. Use List Knowledge Data Category Groups to discover valid category values first, and List Knowledge Articles to browse article records instead. Returns published article content, so responses can be large - narrow by category or search term.

    Docs ↗
  • Get Current User

    Returns the authenticated Salesforce user's ID, name, email, and organization ID. Call this first when the user says 'my leads', 'my opportunities', 'my cases', or any first-person query. Use user_id as the OwnerId filter in SOQL Search (e.g. WHERE OwnerId = '{user_id}') and organization_id to construct Salesforce UI URLs.

    Docs ↗
  • Get Case

    Retrieve one Salesforce case by its record ID. Use List Cases to find the ID first, or when you want to search cases rather than fetch a known one. Use List Case Feed Items and List Case Comments to read the case's activity and comment thread.

    Docs ↗
  • Find Records

    Retrieve selected fields for records of any Salesforce object, either specific records by ID or the most recent ones. Use this as the general-purpose record reader when no object-specific action fits - prefer List Cases for cases or Get Record by ID for a single known record. Use List Objects to discover object types and List Object Fields to discover field names. For example, SObject Type Account with Fields to Obtain Id, Name and Limit 25 returns the 25 most recently created accounts. Leaving Record ID(s) empty returns recent records, not every record - Salesforce sends one batch, so set Limit and use SOQL Query when you need everything. Newest-first ordering needs CreatedDate, so results are unordered on the few object types that lack it.

    Docs ↗
  • Describe Object

    Get field metadata for a Salesforce object type, including field names, types, required status, and picklist values. Use before Create Record or Update Record to discover available fields and valid picklist values. For picklist fields (like StageName on Opportunity, Status on Case), this returns all valid values — use the API value, not the display label. Use the fieldsFilter parameter to narrow results — full object descriptions can be very large (100+ fields). Use List Objects if you're unsure of the object's API name.

    Docs ↗
  • Convert SOAP XML Object to JSON

    Convert a SOAP XML payload received from Salesforce into JSON. Use this on the raw body delivered by an outbound-message trigger; it makes no API call. Every other Salesforce action already returns JSON, so this is only needed for outbound-message workflows.

    Docs ↗

Write to Salesforce · 37

  • Upsert Record

    Create a Salesforce record, or update it if a matching one already exists, matched on an external ID field. The object must have an external ID field defined - use Describe Object to find one before calling. Use Create CRM Record or Update CRM Record when you already know whether the record exists.

    Docs ↗
  • Update Record

    Update a Salesforce record of any object type. Only the fields you supply change; everything else is left as-is.

    Docs ↗
  • Update Opportunity

    Update fields on an existing Salesforce opportunity, such as moving it to a new stage. Use Describe Object on Opportunity to list the valid StageName values for your org. Only the fields you supply change; everything else is left as-is.

    Docs ↗
  • Update Opportunities (Batch)

    Update many Salesforce opportunities in one job using Bulk API 2.0. Use this instead of Update Opportunity when updating more than roughly 200 records - it is asynchronous and returns a job ID, not the updated records. Every row must include the record Id of the opportunity to update. Input is a CSV file - supply a path under /tmp or a URL to download it from, with a header row of Salesforce field API names. Poll the job in Salesforce to confirm completion; a successful response means the job was accepted, not that every row loaded.

    Docs ↗
  • Update Note

    Update a classic Salesforce note (up to 32 KB of plain text). Use Update Content Note instead for enhanced rich-text notes - the two are different objects. Supplying Body replaces the note text outright rather than appending to it.

    Docs ↗
  • Update Email Template

    Update an existing Salesforce email template. Use List Email Templates to find the template ID first. Only the fields you supply change; everything else is left as-is.

    Docs ↗
  • Update CRM Record

    Update an existing Salesforce record. Only pass fields you want to change — unspecified fields remain unchanged. Use Describe Object for valid field names and picklist values. Use SOQL Query to find the record ID if you only have the name.

    Docs ↗
  • Update Content Note

    Update an enhanced Salesforce content note (rich text, stored in Salesforce Files). Use Update Note instead for classic plain-text notes - the two are different objects. Supplying Content replaces the note body outright rather than appending to it. Notes must be enabled in the org first - see Set Up Notes.

    Docs ↗
  • Update Contact

    Update fields on an existing Salesforce contact. Only the fields you supply change; everything else is left as-is. Use Find Records on Contact to get the record ID first.

    Docs ↗
  • Update Accounts (Batch)

    Update many Salesforce accounts in one job using Bulk API 2.0. Use this instead of Update Account when updating more than roughly 200 records - it is asynchronous and returns a job ID, not the updated records. Every row must include the record Id of the account to update. Input is a CSV file - supply a path under /tmp or a URL to download it from, with a header row of Salesforce field API names. Poll the job in Salesforce to confirm completion; a successful response means the job was accepted, not that every row loaded.

    Docs ↗
  • Update Account

    Update fields on an existing Salesforce account. Only the fields you supply change; everything else is left as-is. Use Find Records on Account to get the record ID first.

    Docs ↗
  • Send Email

    Send an email through Salesforce. Use List Email Templates to find a template ID first when sending templated mail. Sent mail is logged against the related record - use List Email Messages to read it back.

    Docs ↗
  • Post a Message to Chatter Feed

    Post a Chatter message to a Salesforce record's feed. Use List Case Feed Items to read a case feed, or Create Case Comment to add a case comment instead of a Chatter post. The message is built from segments - a plain string becomes text, and { "type": "Mention", "username": "jsmith" } mentions a user.

    Docs ↗
  • Insert Blob Data

    Upload binary file data to a Salesforce object such as ContentVersion or Attachment. Use this for Salesforce Files (ContentVersion); use Create Attachment only for the legacy attachment object. The file content must be supplied as a file path or URL, not as raw bytes in the request.

    Docs ↗
  • Delete Record

    Delete a Salesforce record of any object type. This moves the record to the Recycle Bin, where it stays recoverable for up to 15 days - storage limits can purge it sooner. Use Find Records or SOQL Query to confirm you have the right record ID before deleting.

    Docs ↗
  • Delete Opportunity

    Delete a Salesforce opportunity. This moves the record to the Recycle Bin, where it stays recoverable for up to 15 days - storage limits can purge it sooner. Use Find Records on Opportunity to get the ID first, and prefer Update Opportunity to set a Closed Lost stage when you want to keep the history.

    Docs ↗
  • Delete Note Or Content Note

    Delete a note or content note from a Salesforce record. This moves the note to the Recycle Bin, where it stays recoverable for up to 15 days - storage limits can purge it sooner. Use Find Records on Note or ContentNote to get the ID first.

    Docs ↗
  • Delete CRM Record

    Delete a Salesforce record. This moves it to the Recycle Bin, where it stays recoverable for up to 15 days - storage limits can purge it sooner. Use SOQL Query to find the record ID if you only have the record name.

    Docs ↗
  • Create User

    Create a Salesforce user (a login for a person in your org). Requires an available user license and a unique Username in email form; the Username must be globally unique across all Salesforce orgs. Use Get User or Find Records on User to check whether the person already has an account.

    Docs ↗
  • Create Task

    Create a Salesforce task (a to-do item with a due date, no specific time). Use Create Event instead for scheduled meetings with a start and end time. Use Find Records to get the WhoId (contact or lead) and WhatId (related record) to link the task to.

    Docs ↗
  • Create Record

    Create a Salesforce record of any object type. Use List Objects to discover object types and Describe Object to discover fields.

    Docs ↗
  • Create Opportunity

    Create a Salesforce opportunity (a potential deal with an amount and close date). Requires Name, StageName and CloseDate - use Describe Object on Opportunity to list the valid StageName values for your org. Use Find Records on Account to get the AccountId to attach the deal to.

    Docs ↗
  • Create Opportunities (Batch)

    Create many Salesforce opportunities in one job using Bulk API 2.0. Use this instead of Create Opportunity when inserting more than roughly 200 records - it is asynchronous and returns a job ID, not the created records. Every row needs Name, StageName and CloseDate. Input is a CSV file - supply a path under /tmp or a URL to download it from, with a header row of Salesforce field API names. Poll the job in Salesforce to confirm completion; a successful response means the job was accepted, not that every row loaded.

    Docs ↗
  • Create Note

    Create a classic Salesforce note (up to 32 KB of plain text) attached to a parent record. Prefer Create Content Note on modern orgs - classic notes are legacy and do not support rich text. Use Find Records to get the parent record ID first.

    Docs ↗
  • Create Lead

    Create a Salesforce lead (an unqualified prospect not yet linked to an account). Use Create Contact instead when the person already belongs to a known account. Use Add Lead to Campaign afterwards to attribute the lead to a campaign.

    Docs ↗
  • Create Event

    Create a Salesforce calendar event (a meeting or appointment with a start and end time). Use Create Task instead for to-do items with no scheduled time. Use Find Records to get the WhoId (contact or lead) and WhatId (related record) you want to link.

    Docs ↗
  • Create CRM Record

    Create a new Salesforce record of any object type. Use Describe Object first if you're unsure what fields are available or required. For picklist fields, use the API value from Describe Object, not the display label. Common required fields: - Account: Name - Contact: LastName - Lead: LastName, Company - Opportunity: Name, StageName, CloseDate - Case: Subject - Task: Subject - Event: Subject, StartDateTime, EndDateTime To add a Contact/Lead to a Campaign, create a CampaignMember: {"CampaignId": "701xxx", "ContactId": "003xxx"} or {"CampaignId": "701xxx", "LeadId": "00Qxxx"}.

    Docs ↗
  • Create Content Note

    Create an enhanced Salesforce content note (rich text, stored in Salesforce Files). Use this rather than Create Note on modern orgs; Create Note writes the classic plain-text note object. Use Update Content Note to edit one afterwards. Notes must be enabled in the org first - see Set Up Notes.

    Docs ↗
  • Create Contact

    Create a Salesforce contact (a person associated with an account). Use Find Records on Account to get the AccountId that links this contact to a company. Use Describe Object on Contact to discover which fields your org requires.

    Docs ↗
  • Create Case Comment

    Add a comment to an existing Salesforce case. Use List Cases to find the case ID, and List Case Comments to read the existing thread first. Comments are visible in the case feed - List Case Feed Items shows them as CaseCommentPost entries.

    Docs ↗
  • Create Case

    Create a Salesforce support case (a customer issue or request). Use List Cases to check whether a matching case already exists before creating a duplicate. After creating, use Create Case Comment to add notes or List Case Feed Items to read its activity.

    Docs ↗
  • Create Campaign

    Create a Salesforce marketing campaign. Use Add Contact to Campaign or Add Lead to Campaign afterwards to populate its members. For example, Name: "Summer 2026 Webinar" creates the campaign and returns its ID.

    Docs ↗
  • Create Attachment

    Attach a file to an existing Salesforce record (classic Attachment object). Use Find Records to get the parent record ID first. For newer orgs prefer Salesforce Files - use Insert Blob Data with ContentVersion instead.

    Docs ↗
  • Create Accounts (Batch)

    Create many Salesforce accounts in one job using Bulk API 2.0. Use this instead of Create Account when inserting more than roughly 200 records - it is asynchronous and returns a job ID, not the created records. Poll the job in Salesforce to confirm completion; a successful response means the job was accepted, not that every row loaded. Input is a CSV file - supply a path under /tmp or a URL to download it from, with a header row of Salesforce field API names.

    Docs ↗
  • Create Account

    Create a Salesforce account (a company or organization record). Use Describe Object on Account to discover which fields your org requires before calling. For example, Name Acme Corp creates a minimal account and returns its new record ID.

    Docs ↗
  • Add Lead to Campaign

    Add an existing lead to an existing campaign as a campaign member. Use Find Records on Lead and on Campaign to look up the two IDs first. The lead must already exist - use Create Lead if it does not.

    Docs ↗
  • Add Contact to Campaign

    Add an existing contact to an existing campaign as a campaign member. Use Find Records on Contact and on Campaign to look up the two IDs first. The contact must already exist - use Create Contact if it does not.

    Docs ↗

Pair Salesforce with your ERP

Leo connects Salesforce to the ERP your business already runs on: the records it reads in Salesforce land in your ERP, and what changes in the ERP flows back.

Odoo logo
Salesforce + Odoo
See Odoo →
NetSuite logo
Salesforce + NetSuite
See NetSuite →

How it works

  1. 01
    Connect Salesforce

    Authorize Salesforce once, in a couple of clicks. Leo only gets the permissions you grant.

  2. 02
    Describe what you need

    In plain language: the dashboard, portal or agent you want across Salesforce and your ERP. No code, no mapping spreadsheets.

  3. 03
    Run it

    Leo builds it, you review, it goes live. Agents run on a schedule or on events, under the guardrails you set.

Salesforce integration: questions

What can Leo do in Salesforce?
Leo has 61 Salesforce actions available: 24 read data and 37 create or update it. Any of them can be combined with your ERP data in an app or an agent.
Which ERPs does the Salesforce integration work with?
Odoo and NetSuite today, through connectors we build and maintain ourselves. Salesforce connects through our connector network, so the same app or agent can use both sides.
Is my data safe?
You authorize Salesforce yourself and choose the permissions. Leo acts within them, every action is logged, and you can revoke the connection at any time.

More crm integrations

  • HubSpot logoHubSpot
  • Zoho CRM logoZoho CRM
  • Pipedrive logoPipedrive