Salesforce already has your accounts, contacts, and pipeline. What it doesn’t have is the 97% of website visitors who never filled out a form. Leadpipe fixes that by identifying anonymous visitors and sending their data directly into Salesforce as leads, contacts, or tasks - automatically, in real time.
This guide walks you through the complete integration: webhook setup, field mapping, deduplication, workflow rules for high-intent visitors, and lead assignment. Whether you’re connecting through the API or using Zapier, you’ll have identified visitors flowing into Salesforce within 30 minutes.
Why Connect Leadpipe to Salesforce
Your sales team lives in Salesforce. If visitor data doesn’t show up there, it doesn’t exist to them.
Here’s what changes when you connect Leadpipe’s visitor identification to Salesforce:
| Before Leadpipe | After Leadpipe |
|---|---|
| 97% of visitors are anonymous sessions in GA | 30-40% of visitors are identified with name, email, company |
| Reps only work inbound form fills | Reps get warm leads who browsed pricing but didn’t convert |
| No attribution for “dark funnel” pipeline | Every identified visitor tied to source, pages, and duration |
| Manual lead entry from spreadsheets | Automatic lead creation with full context |
The speed advantage: Leads created from webhook triggers hit Salesforce within seconds of identification. Your reps can respond while the visitor is still thinking about your product.
What You’ll Need
Before starting, make sure you have:
- Leadpipe account - Start free with 500 leads
- Salesforce edition with API access (Professional+ or Enterprise)
- Salesforce admin access to create fields and workflow rules
- ~30 minutes for initial setup
Not using Salesforce? We also have a Zoho CRM integration guide.
You have two integration paths:
| Path | Best For | Difficulty |
|---|---|---|
| Webhook + Zapier | Non-technical teams, quick setup | Easy |
| Webhook + Custom Middleware | High-volume teams, custom logic | Moderate |
We’ll cover both. Start with Zapier if you want to be live in 15 minutes.
Step 1: Configure Leadpipe Webhooks
Leadpipe webhooks send visitor data to any endpoint the moment a visitor is identified. You’ll point this at either Zapier or your own middleware.
In Leadpipe:
- Go to Settings > Integrations > Webhooks
- Click Add Webhook
- Enter your destination URL (Zapier catch hook or custom endpoint)
- Select trigger type:
- First Match - fires once per visitor on first identification (recommended for CRM)
- Every Update - fires on every page view from identified visitors
- Save and send a test event
Use First Match for Salesforce. You want one clean lead record per visitor, not a new record for every page view. If you need behavioral data, use Every Update to update existing records (more on deduplication below).
Webhook Payload
Every webhook sends this data. These are the fields you’ll map to Salesforce:
{
"email": "sarah.chen@acmecorp.com",
"first_name": "Sarah",
"last_name": "Chen",
"company_name": "Acme Corp",
"company_domain": "acmecorp.com",
"job_title": "VP of Marketing",
"linkedin_url": "linkedin.com/in/sarahchen",
"page_url": "/pricing",
"visit_duration": 245,
"pages_viewed": ["/", "/features", "/pricing"],
"city": "San Francisco",
"state": "California",
"country": "US"
}
For the full field reference, see the webhook payload guide.
Step 2: Map Leadpipe Fields to Salesforce Lead Fields
Here’s the complete field mapping from Leadpipe webhook data to Salesforce Lead object fields:
| Leadpipe Field | Salesforce Lead Field | Field Type | Notes |
|---|---|---|---|
email | Standard | Primary dedup key | |
first_name | FirstName | Standard | |
last_name | LastName | Standard | Required in Salesforce |
company_name | Company | Standard | Required in Salesforce |
company_domain | Website | Standard | Use for account matching |
job_title | Title | Standard | Critical for ICP filtering |
linkedin_url | LinkedIn_URL__c | Custom | Create custom field |
page_url | Last_Page_Viewed__c | Custom | Create custom field |
visit_duration | Visit_Duration__c | Custom (Number) | Seconds on page |
pages_viewed | Pages_Viewed__c | Custom (Long Text) | Join array as comma-separated |
city | City | Standard | |
state | State | Standard | |
country | Country | Standard |
Custom Fields to Create in Salesforce
Before connecting, create these custom fields on the Lead object:
- LinkedIn_URL__c (URL) - stores the visitor’s LinkedIn profile
- Last_Page_Viewed__c (Text, 255) - the page that triggered identification
- Visit_Duration__c (Number) - seconds spent on site
- Pages_Viewed__c (Long Text Area) - full page journey
- Lead_Source_Detail__c (Text, 255) - set to “Leadpipe Visitor ID”
- Intent_Level__c (Picklist) - High / Medium / Low (set via workflow)
To create custom fields: Setup > Object Manager > Lead > Fields & Relationships > New
Step 3: The Zapier Path (Recommended for Most Teams)
This is the fastest way to get Leadpipe data into Salesforce. No code required.
Create the Zap
Trigger: Webhooks by Zapier (Catch Hook)
- In Zapier, create a new Zap
- Select Webhooks by Zapier as the trigger
- Choose Catch Hook
- Copy the webhook URL
- Paste it into Leadpipe’s webhook settings (Step 1)
- Send a test event from Leadpipe
- Zapier will capture the test payload and show you the available fields
Filter: Only High-Quality Leads (Optional but Recommended)
Add a Filter step to prevent low-quality visitors from cluttering Salesforce:
Only continue if:
email - Does not contain - gmail.com, yahoo.com, hotmail.com
AND
company_name - Exists
AND
visit_duration - Greater than - 30
This ensures you’re only creating leads for visitors with business emails who spent meaningful time on your site. You can adjust thresholds based on your traffic patterns.
Action: Salesforce - Find or Create Lead
- Select Salesforce as the action app
- Choose Find or Create Record
- Object Type: Lead
- Search by: Email (this handles deduplication)
- Map fields using the table from Step 2
- Set Lead Source to “Website Visitor - Leadpipe”
- Set Lead Status to “New” (or your equivalent)
Why “Find or Create”? If a visitor is already in Salesforce (existing customer, previous form fill), you don’t want duplicates. The Find step checks for an existing record by email first. If found, you can update it instead of creating a duplicate.
Handling Duplicates with Every Update Triggers
If you’re using Every Update webhooks to track return visits, add a second Zap:
- Trigger: Catch Hook (same webhook, or a separate one)
- Action: Salesforce - Find Record (by email)
- Action: Salesforce - Update Record
- Update
Last_Page_Viewed__cwith new page - Update
Visit_Duration__cwith cumulative time - Add a Task: “Return visit - viewed [page_url]”
- Update
This gives your reps a running log of engagement without creating duplicate leads.
Step 4: Workflow Rules for High-Intent Visitors
Not all visitors deserve the same response. Someone who read a blog post is different from someone who spent 4 minutes on your pricing page. Salesforce workflow rules let you automate the right response based on intent signals.
Rule 1: Pricing Page Visitor - Create Task
When: Lead created with Last_Page_Viewed__c contains “/pricing”
Then:
- Create Task: “Hot lead - visited pricing page”
- Priority: High
- Due Date: Today
- Assigned To: Lead owner
- Send email alert to lead owner
Workflow Rule Setup:
Object: Lead
Rule Criteria: Last_Page_Viewed__c CONTAINS "/pricing"
Immediate Actions:
- New Task (Subject: "Pricing page visitor - respond within 1 hour")
- Email Alert (to Lead Owner)
This ensures high-intent visitors don’t sit in a queue. Your rep gets a task and an email the moment someone browsing pricing is identified.
Rule 2: Long Session Duration - Set Priority
When: Lead created with Visit_Duration__c greater than 120
Then:
- Set
Intent_Level__cto “High” - Set
Ratingto “Hot”
Visitors who spend 2+ minutes on your site are actively researching, not casually browsing.
Rule 3: Return Visitor - Escalate
When: Lead updated with new task containing “Return visit”
Then:
- Set
Intent_Level__cto “High” - Create Task: “Return visitor - follow up immediately”
- Send Slack notification (via Salesforce-Slack integration)
Return visitors have 3-5x higher conversion rates than first-time visitors. They’re comparing you to alternatives. Speed matters here.
Rule 4: Target Account Match - Fast Track
When: Lead created with Company matching your target account list
Then:
- Assign to named account owner (not round-robin)
- Create Task with Priority: Urgent
- Set Lead Status to “Working”
If you maintain a target account list in Salesforce, this rule ensures identified visitors from those accounts get VIP treatment.
Step 5: Lead Assignment Rules
Default round-robin assignment works, but you can get smarter with Leadpipe data.
Assignment Based on Visitor Data
| Signal | Assignment Logic |
|---|---|
page_url contains “/enterprise” | Assign to enterprise sales team |
company_name matches target account | Assign to named account owner |
country = “US” | Assign to US team |
country = “UK” or “DE” | Assign to EMEA team |
job_title contains “VP” or “Director” | Assign to senior AE |
visit_duration > 180 | Assign to top-performing rep |
Setup in Salesforce
Setup > Lead Assignment Rules > New Rule
Create criteria-based entries in priority order. The first matching rule wins, so put your most specific rules (target accounts, enterprise pages) at the top.
Example rule entries:
- Target account match → Named account owner
- Enterprise page + VP/Director title → Enterprise AE
- Pricing page + US → US sales team (round-robin)
- Pricing page + EMEA → EMEA sales team (round-robin)
- All others → General SDR queue
Step 6: The Direct API Path (Advanced)
For teams with developer resources or high webhook volume, you can skip Zapier and push leads directly to Salesforce via its REST API.
Architecture
Leadpipe Webhook → Your Middleware (Node.js/Python) → Salesforce REST API
Sample Node.js Middleware
const express = require('express');
const jsforce = require('jsforce');
const app = express();
app.use(express.json());
// Salesforce connection
const conn = new jsforce.Connection({
loginUrl: 'https://login.salesforce.com'
});
app.post('/leadpipe-webhook', async (req, res) => {
const visitor = req.body;
// Skip personal emails
const personalDomains = ['gmail.com', 'yahoo.com', 'hotmail.com'];
const emailDomain = visitor.email?.split('@')[1];
if (personalDomains.includes(emailDomain)) {
return res.status(200).json({ skipped: true, reason: 'personal email' });
}
try {
await conn.login(SF_USERNAME, SF_PASSWORD + SF_TOKEN);
// Check for existing lead
const existing = await conn.query(
`SELECT Id FROM Lead WHERE Email = '${visitor.email}' LIMIT 1`
);
if (existing.records.length > 0) {
// Update existing lead
await conn.sobject('Lead').update({
Id: existing.records[0].Id,
Last_Page_Viewed__c: visitor.page_url,
Visit_Duration__c: visitor.visit_duration
});
} else {
// Create new lead
await conn.sobject('Lead').create({
Email: visitor.email,
FirstName: visitor.first_name,
LastName: visitor.last_name || 'Unknown',
Company: visitor.company_name || visitor.company_domain || 'Unknown',
Title: visitor.job_title,
Website: visitor.company_domain,
City: visitor.city,
State: visitor.state,
Country: visitor.country,
LinkedIn_URL__c: visitor.linkedin_url,
Last_Page_Viewed__c: visitor.page_url,
Visit_Duration__c: visitor.visit_duration,
Pages_Viewed__c: visitor.pages_viewed?.join(', '),
LeadSource: 'Website Visitor - Leadpipe',
Lead_Source_Detail__c: 'Leadpipe Webhook'
});
}
res.status(200).json({ success: true });
} catch (err) {
console.error('Salesforce error:', err);
res.status(500).json({ error: err.message });
}
});
app.listen(3000);
This gives you full control over deduplication logic, field mapping, and filtering. You can also add enrichment steps (like calling the Leadpipe API for additional data) before pushing to Salesforce.
Deduplication Strategy
Duplicates are the biggest risk when pushing external data into Salesforce. Here’s a layered approach:
Layer 1: Leadpipe Trigger Selection
Use First Match webhooks. This sends one payload per visitor, eliminating webhook-level duplicates.
Layer 2: Email-Based Lookup
Always search Salesforce for an existing Lead or Contact by email before creating a new record. This catches:
- Existing customers (already in Salesforce as Contacts)
- Previous form fills (already Leads)
- Visitors identified on previous sessions
Layer 3: Salesforce Duplicate Rules
As a safety net, configure Salesforce’s native duplicate detection:
Setup > Duplicate Management > Duplicate Rules
Create a rule on the Lead object:
- Match on Email (exact match)
- Action: Block or Alert (depending on your preference)
Layer 4: Domain-Level Dedup (Optional)
For account-based teams, you may want to prevent multiple leads from the same company:
IF company_domain matches existing Account.Website
→ Link to existing Account instead of creating new Lead
This is especially useful if you’re using Salesforce’s Account-Contact-Opportunity model and want visitors attached to existing accounts.
Reporting: Track Pipeline from Identified Visitors
Once leads are flowing in, build these reports to measure ROI:
Report 1: Identified Visitor Pipeline
Type: Leads with Lead Source = “Website Visitor - Leadpipe”
Columns:
- Lead Name, Company, Title
- Intent Level, Last Page Viewed
- Status, Converted (Y/N)
- Created Date
This shows your total pipeline generated from visitor identification.
Report 2: Conversion by Intent Level
Type: Summary report grouped by Intent_Level__c
Track conversion rates (Lead to Opportunity) by intent level. You should see high-intent visitors (pricing page, long duration) converting at 3-5x the rate of low-intent visitors.
Report 3: Speed to Response
Type: Leads with task completion time
Measure the gap between lead creation and first rep activity. Teams that respond within 1 hour see 7x higher qualification rates.
Dashboard
Create a Salesforce dashboard with:
- Leads created this week (by Leadpipe)
- Intent level breakdown (pie chart)
- Top pages driving leads (bar chart by Last_Page_Viewed__c)
- Conversion rate vs. form fills (comparison)
- Average response time (gauge)
Common Mistakes to Avoid
Sending every visitor to Salesforce. Not every identified visitor is a lead. Filter out personal emails, bot traffic, and visitors with less than 15 seconds on site. Your reps will ignore a noisy queue.
Skipping deduplication. Without email-based lookup, you’ll create duplicate leads for return visitors and existing contacts. Always search before creating. If your Salesforce is already suffering from data quality issues, see our guide on why your Salesforce is full of bad data and how to fix it.
Using Every Update without logic. Every Update webhooks fire on every page view. Without logic to update existing records (not create new ones), you’ll flood Salesforce with duplicates.
Not setting Lead Source. If you don’t tag leads as “Website Visitor - Leadpipe,” you can’t measure ROI or compare to other channels.
Round-robin for target accounts. If a visitor from your #1 target account is identified, it should go to the named account owner, not the next rep in the queue.
What’s Next
Once you have visitors flowing into Salesforce, consider these extensions:
- Add Clay enrichment between Leadpipe and Salesforce for additional data points (revenue, employee count, tech stack)
- Set up Slack alerts in parallel so reps get instant notifications alongside the Salesforce record
- Build an AI SDR workflow that drafts personalized outreach based on the visitor’s page journey
- Connect to your ad platforms to measure which campaigns generate the highest-intent identified visitors
Related Articles
- Webhook Payload Reference: Every Visitor Data Field
- Leadpipe + Clay + HubSpot Integration Guide
- Visitor Identification API: Complete Developer Guide
- The AI SDR Data Stack: Visitor to Booked Meeting
- How to Identify Anonymous Website Visitors
- Visitor ID + Slack: Real-Time Lead Alerts That Work
- Leadpipe + Zoho CRM Integration
- Your Salesforce Is Full of Bad Data