Salesforce Integration Setup
Connect Parsley to Salesforce. Approve the connected app, sync Leads, buyer intent, and chatbot conversations to your org - with a least-privilege permission set your admin controls.
Connect Parsley to Salesforce for automatic Lead and conversation sync. This guide is written for the Salesforce admin: it covers approving the connected app (required in most orgs since Salesforce's September 2025 security change), the least-privilege permissions Parsley needs, and exactly what Parsley writes to your org.
Quick Setup
- Confirm your org is on an API-enabled edition (Enterprise, Unlimited, Performance, or Developer - or Professional with the API add-on)
- In Parsley, go to Hub > Integrations and click Connect on the Salesforce card
- Authorize Parsley in the Salesforce OAuth screen
- If your org blocks unapproved connected apps, pre-authorize the Parsley app (see Step 2)
- Verify the card shows "Connected" with your instance URL
What Parsley does and doesn't do
Parsley's Salesforce integration is a one-way push (Parsley to Salesforce). It is deliberately conservative so it is safe to run in an agency-managed org:
- Creates Leads. Never blind-creates Contacts. Net-new people become Leads. If a matching Contact already exists, Parsley logs against it and leaves Lead conversion to your own automation.
- Matches by email before writing - so it updates existing records instead of creating duplicates.
- Never overwrites a populated name with a placeholder. If a return conversation captures only an email, Parsley leaves the existing name untouched.
- Logs each conversation as a completed Task on the activity timeline - not a Note - so it shows up in Activity reports.
- Uses standard fields only. Buyer intent maps to the native
Ratingfield andLeadSourceis stampedParsley. It does not create custom fields or objects.
Prerequisites
- An API-enabled Salesforce edition - Enterprise, Unlimited, Performance, or Developer. Professional Edition works only with the API access add-on enabled. (Essentials and Starter do not expose the REST API.)
- Admin access to your Salesforce org - to authorize the connection and, if needed, approve the connected app.
- A paid Parsley account - CRM integrations require a paid plan or conversation balance. View pricing if you're on Free.
Step 1: Connect to Salesforce
From your Parsley dashboard:
- Go to Hub in the left sidebar
- Click Integrations
- Find the Salesforce card
- Click Connect
This opens Salesforce's OAuth screen. Parsley requests two OAuth scopes:
api- to read and write records through the REST APIrefresh_token- to keep the connection alive without re-authorizing
The connection is authorized as the Salesforce user who clicks through - so records Parsley creates are owned by that user unless your assignment rules reassign them. For a clean audit trail, connect as a dedicated integration user rather than a rep's personal login.
Parsley stores the resulting tokens encrypted (AES-256-GCM) and never sees your Salesforce password.
Step 2: Approve the Connected App
Since Salesforce's September 2025 security change, most orgs block connected apps that an admin hasn't explicitly approved, and the older "Use Any API Client" self-authorization workaround was removed in December 2025. If the OAuth screen returns an error like OAUTH_APP_BLOCKED or "this app is blocked," your admin needs to approve Parsley once:
- In Salesforce, go to Setup
- Search for Connected Apps OAuth Usage (under Identity)
- Find Parsley in the list and click Install / Manage
- Set Permitted Users to Admin approved users are pre-authorized
- Under the app's Profiles or Permission Sets, assign the profile or permission set of the user(s) who will connect Parsley
- Save, then retry Connect in Parsley
Once approved, the connection completes and stays connected. You only do this once per org.
Recommended: a dedicated integration user
Best practice in managed orgs is to connect Parsley as a dedicated integration user (an API-only or minimal-license user named e.g. "Parsley Integration") rather than a person. This keeps Parsley's writes attributable, survives staff changes, and lets you scope permissions tightly. Assign that user a permission set with only what Parsley needs:
| Object / Permission | Access | Why |
|---|---|---|
| API Enabled (system permission) | Enabled | REST API access |
| Leads | Read, Create, Edit | Create net-new Leads; update matched Leads |
| Contacts | Read | Match existing Contacts by email; attach the conversation Task |
| Tasks / Activities | Create ("Edit Tasks") | Log each conversation as a completed Task |
Parsley does not need access to Accounts, Opportunities, Campaigns, or any custom object. If your org publishes a static IP allowlist, note that Parsley calls Salesforce from Vercel's infrastructure; contact us for current egress ranges if you range-restrict API logins.
Step 3: Lead Sync
Lead sync (the "Auto-sync leads" toggle) is on by default. When Parsley captures a lead, it looks the person up by email, then:
- Existing Lead - updates the mutable fields below (name is only touched if a name was captured)
- Existing Contact, no Lead - leaves the Contact's fields alone and skips Lead creation; the conversation Task still attaches to the Contact
- Neither - creates a new Lead with the full field map
Field mapping (standard fields, fixed)
| Parsley data | Salesforce Lead field | Notes |
|---|---|---|
Email | Also the match key | |
| Name | FirstName + LastName | LastName is required by Salesforce; falls back to "Visitor" only on create |
| Company | Company | Required by Salesforce; falls back to "Unknown" |
| Job title | Title | Written when captured |
| Phone | Phone | Written when captured |
| Buyer intent | Rating = Hot / Warm / Cold | Native Rating picklist |
| (constant) | LeadSource = Parsley | Set once, on create |
| Buyer intelligence | Description | Set once, on create - see below |
Field mapping is fixed in this release (no per-field mapping UI). If your org uses restricted picklists on Rating or LeadSource, Parsley automatically retries the write without those values so the Lead still lands.
Where buyer intent and MEDDIC show up
On create, Parsley writes a plain-text intelligence block to the Lead's Description:
Parsley buyer intelligence
Intent: High Intent
Qualification: 4 of 6 - Metrics, Champion, Decision Criteria, Identify Pain
Topics: pricing, security, integrations
Questions asked: 7
Profile: peter
Lines only appear when Parsley captured the underlying data, so a quieter conversation writes a shorter block.
Because the MEDDIC scorecard and topics are text in Description (not custom fields), you can read them on the record, but you cannot yet build report filters or list views on them. What you can report and filter on today:
Rating(Hot / Warm / Cold) - build a "Parsley Hot Leads" list view or report by filteringRating = HotLeadSource = Parsley- attribute pipeline and conversions back to Parsley
First-class custom fields for intent and MEDDIC (so you can filter, roll up, and trigger Flows on them) are on the roadmap.
Step 4: Conversation Sync
When a prospect has a chatbot conversation and shares their email, Parsley logs the full context as a completed Task on the matched Lead or Contact (the "Sync conversations" toggle).
Task fields:
- Subject -
Parsley Conversation - <top topics> - Status -
Completed - ActivityDate - the day of the conversation
- Related to - the matched Lead or Contact (
WhoId) - Description - the conversation summary, buyer intent, MEDDIC evidence with quotes, engagement metrics, and any unanswered questions
Tasks land in the record's Activity timeline, so they roll into standard Activity reports and show your rep exactly what the prospect asked before the first call.
Anonymous conversations
Conversation sync requires a captured email - it's how Parsley finds the record to attach the Task to. Conversations where the visitor never shares an email do not sync to Salesforce. They remain visible in your Parsley dashboard.
Step 5: Verify the Connection
- Check status - the Salesforce card shows "Connected" with your instance URL
- Capture a test lead - fill out your own profile's contact form with a test email
- Check Salesforce - within a few seconds a new Lead should appear (or an existing record update) with
LeadSource = Parsleyand aRating - Have a chatbot conversation and share the same test email
- Check the Lead's Activity timeline - the conversation should appear as a completed Task
Troubleshooting
"Connection Failed" or the app is blocked
- The most common cause is the connected app not being approved - see Step 2. Set Permitted Users to "Admin approved users are pre-authorized" and assign the connecting user's profile/permission set.
- Confirm your edition exposes the API (Enterprise/Unlimited/Performance/Developer, or Professional with the API add-on).
- Confirm you authorized against production - the integration connects to production orgs, not sandboxes, in this release.
Leads not syncing
- Verify the card shows "Connected" and "Auto-sync leads" is on.
- Ensure the lead has a valid email (required for matching and Lead creation).
- Check the connecting user has Create on Leads.
- If your org has duplicate rules that block saves, Parsley surfaces a duplicate error rather than forcing the record in - adjust the rule or let it update the existing record.
Conversations not appearing as Tasks
- Conversation sync only fires once the visitor shares their email - anonymous conversations can't be attached to a record.
- Confirm "Sync conversations" is toggled on.
- Check the connecting user can create Tasks (Edit Tasks permission).
- Tasks appear in the record's Activity timeline, not a separate view.
Rating or LeadSource not set
- If your org restricts the
RatingorLeadSourcepicklist to values that don't include Hot/Warm/Cold or "Parsley", Salesforce rejects them. Parsley retries without those fields so the record still saves - add the values to the picklist (or a mapped equivalent) if you want them populated.
API limit errors
Salesforce enforces a daily API request allocation per org. Parsley makes only ~2-3 calls per lead and syncs on conversation events (no polling), so its footprint is small - but if you see REQUEST_LIMIT_EXCEEDED, another integration is likely consuming the budget. Review Setup > System Overview > API Usage to see which app is responsible.
What's Next
Questions? Contact us or email peter@parsley.id.
