Salesforce
Discover Salesforce CRM data including accounts, contacts, opportunities, leads, and cases.
- Entities: Accounts, Contacts, Opportunities, Leads, Cases
- Relationships: Links CRM data across entities and to external systems
- Discovery: Automated polling-based discovery via OAuth
- MCP Support: Query Salesforce data via Model Context Protocol
Organizations and companies in your CRM.
Spec fields:
id: Account ID (18-character Salesforce ID)name: Account nametype: Account type (Customer, Prospect, Partner, etc.)industry: Industry verticalannual_revenue: Annual revenuewebsite: Company websitebilling_city: Billing citybilling_country: Billing countrycreated_date: Account creation date
Labels:
name: Account nametype: Account typeindustry: Industry
People associated with accounts.
Spec fields:
id: Contact IDfirst_name: First namelast_name: Last nameemail: Email addressphone: Phone numbertitle: Job titleaccount_id: Associated accountcreated_date: Contact creation date
Labels:
name: Full nameemail: Email addresstitle: Job title
Sales opportunities in your pipeline.
Spec fields:
id: Opportunity IDname: Opportunity nameamount: Deal valuestage_name: Current stageclose_date: Expected close dateaccount_id: Associated accountprobability: Win probability (0-100)type: Opportunity typecreated_date: Opportunity creation date
Labels:
name: Opportunity namestage: Current stageamount: Deal value
Unqualified sales prospects.
Spec fields:
id: Lead IDfirst_name: First namelast_name: Last nameemail: Email addresscompany: Company namestatus: Lead status (Open, Contacted, Qualified, etc.)lead_source: Lead sourceindustry: Industrycreated_date: Lead creation date
Labels:
name: Full namestatus: Lead statuscompany: Company name
Customer support cases.
Spec fields:
id: Case IDcase_number: Case numbersubject: Case subjectstatus: Case status (New, Working, Escalated, Closed)priority: Priority (Low, Medium, High, Critical)origin: Case origin (Web, Email, Phone, Chat)account_id: Associated accountcontact_id: Associated contactcreated_date: Case creation date
Labels:
status: Case statuspriority: Priorityorigin: Origin
| Source | Relation | Target | Description |
|---|---|---|---|
SalesforceContact | WORKS_AT | SalesforceAccount | Contact's account |
SalesforceOpportunity | FOR_ACCOUNT | SalesforceAccount | Opportunity's account |
SalesforceCase | ABOUT_ACCOUNT | SalesforceAccount | Case's account |
SalesforceCase | FROM_CONTACT | SalesforceContact | Case requester |
| Source | Relation | Target | Description |
|---|---|---|---|
SalesforceAccount | LINKED_TO | HubSpotCompany | Cross-CRM sync |
SalesforceAccount | USES_SERVICE | K8sService | Customer product usage |
SalesforceOpportunity | AFFECTED_BY | PagerDutyIncident | Deal impact |
SalesforceCase | REPORTS_ERROR | SentryError | Error tracking |
SalesforceAccount | LINKED_TO | ZendeskOrganization | Support integration |
discovery:
enabled: true
settings:
client_id: "YOUR_CONNECTED_APP_CLIENT_ID"
client_secret: "YOUR_CONNECTED_APP_CLIENT_SECRET"
password: "YOUR_PASSWORD"
security_token: "YOUR_SECURITY_TOKEN" # Optional for trusted IPs
instance_url: "https://login.salesforce.com" # Use test.salesforce.com for sandbox
# Optional settings
include_accounts: true
include_contacts: true
include_opportunities: true
include_leads: true
include_cases: true
max_accounts: 1000 # 0 = unlimited
max_contacts: 1000 # 0 = unlimited
mcp:
enabled: true
settings:
client_id: "YOUR_CONNECTED_APP_CLIENT_ID"
client_secret: "YOUR_CONNECTED_APP_CLIENT_SECRET"
password: "YOUR_PASSWORD"
security_token: "YOUR_SECURITY_TOKEN"
instance_url: "https://login.salesforce.com"
-
Go to Setup → Apps → App Manager
-
Click "New Connected App"
-
Name it "SixDegree Integration"
-
Enable OAuth Settings
-
Set Callback URL to
https://login.salesforce.com/services/oauth2/callback -
Selected OAuth Scopes:
- Full access (full)
- Perform requests on your behalf at any time (refresh_token, offline_access)
-
Save and copy Consumer Key (Client ID) and Consumer Secret (Client Secret)
-
Go to Settings → Reset My Security Token
-
Check your email for the security token
-
Append it to your password when authenticating (or omit if using trusted IP ranges)
The user account needs:
- Read access to Accounts, Contacts, Opportunities, Leads, Cases
- API Enabled permission
degree discovery run [email protected] --config salesforce-config.yaml
Query: "Show me the full journey from lead to customer with support history"
SalesforceLead → [converted] → SalesforceContact → WORKS_AT → SalesforceAccount ← FOR_ACCOUNT ← SalesforceOpportunity
↓
ABOUT_ACCOUNT
↓
SalesforceCase
Query: "What's the revenue impact of this production incident?"
PagerDutyIncident → SalesforceAccount (affected) → SalesforceOpportunity (at risk) → SUM(amount)
Query: "Which opportunities are in negotiation stage with no open support cases?" (healthy deals)
SalesforceOpportunity[stage_name="Negotiation"] → FOR_ACCOUNT → SalesforceAccount - (no SalesforceCase[status="Open"])
Query: "High-value accounts with increasing case volume" (churn risk)
SalesforceAccount[annual_revenue>1000000] ← ABOUT_ACCOUNT ← SalesforceCase (count increasing)
Query: "Which lead sources convert to closed-won opportunities?"
SalesforceLead[lead_source=X] → [converted] → SalesforceOpportunity[stage_name="Closed Won"]
Query: "Open opportunities with critical support cases"
SalesforceOpportunity[stage_name != "Closed Won"] → FOR_ACCOUNT → SalesforceAccount ← ABOUT_ACCOUNT ← SalesforceCase[priority="Critical", status="Open"]
Salesforce API rate limits (by edition):
- Enterprise: 1,000 API calls per user per 24 hours
- Unlimited: 5,000 API calls per user per 24 hours
- Performance: 10,000 API calls per user per 24 hours
The molecule implements:
- Efficient SOQL queries to minimize API calls
- Automatic pagination handling
- Bulk query optimization
MATCH (a:SalesforceAccount {type: "Customer"})
RETURN a
MATCH (o:SalesforceOpportunity)
RETURN o.stage_name, COUNT(o) AS count, SUM(toFloat(o.amount)) AS total_value
ORDER BY total_value DESC
MATCH (c:SalesforceContact)-[:WORKS_AT]->(a:SalesforceAccount)
MATCH (a)<-[:FOR_ACCOUNT]-(o:SalesforceOpportunity)
WHERE c.email = "[email protected]"
RETURN c, a, o
MATCH (o:SalesforceOpportunity)
WHERE toFloat(o.amount) > 100000 AND o.stage_name = "Negotiation"
MATCH (o)-[:FOR_ACCOUNT]->(a:SalesforceAccount)
MATCH (a)<-[:ABOUT_ACCOUNT]-(c:SalesforceCase {status: "Open"})
RETURN o, a, COUNT(c) AS open_cases
ORDER BY open_cases DESC
Match by domain:
MATCH (sf:SalesforceAccount)
MATCH (zd:ZendeskOrganization)
WHERE sf.website CONTAINS zd.domain
CREATE (sf)-[:LINKED_TO]->(zd)
Match by company name:
MATCH (sf:SalesforceAccount)
MATCH (hs:HubSpotCompany)
WHERE toLower(sf.name) = toLower(hs.name)
CREATE (sf)-[:SYNCS_WITH]->(hs)
-
Verify Connected App credentials are correct
-
Check username and password are valid
-
Ensure security token is appended to password (if required)
-
For sandbox, use
test.salesforce.comas instance URL -
Check
include_*settings are enabled -
Verify user has read permissions for object types
-
Ensure objects exist in your Salesforce org
-
Reduce discovery frequency
-
Use
max_accountsandmax_contactslimits -
Consider incremental sync for large datasets
-
Upgrade Salesforce edition for higher API limits
-
Ensure custom fields are accessible
-
Check field-level security settings
-
Verify object permissions
┌──────────────────┐
│ Salesforce API │
│ (REST + SOAP) │
└────────┬─────────┘
│
│ HTTPS
│ OAuth 2.0
│
┌────────▼─────────┐
│ Salesforce │
│ Molecule │
│ - SOQL Queries │
│ - Bulk API │
│ - Relationships │
└────────┬─────────┘
│
│ gRPC
│
┌────────▼─────────┐
│ SixDegree │
│ Knowledge Graph │
└──────────────────┘
- Link to HubSpot: Sync CRM data across platforms
- Connect to Zendesk: Unified customer support view
- Integrate with PagerDuty: Revenue impact of incidents
- Link to K8s: Track customer product usage
- Add Custom Objects: Extend with Salesforce custom objects
If you have 100K+ records:
-
Set
max_accountsandmax_contactsto reasonable limits -
Use SOQL filters to fetch only recent or active records
-
Run discovery during off-peak hours
-
Consider Salesforce Bulk API for very large datasets
-
Disable entity types you don't need
-
Use incremental sync for recurring discoveries
-
Optimize SOQL queries with indexes
-
hubspot: Alternative/complementary CRM
-
zendesk: Support ticket tracking
-
kubernetes: Product usage tracking
-
pagerduty: Incident impact on deals
-
sentry: Error tracking linked to cases