Real Case Study: B2B SaaS Sales Team
Before N8N CRM Automation:
- • Manual lead entry from 5+ sources
- • 20 hours/week on data entry
- • Inconsistent follow-up timing
- • Leads slipping through cracks
- • No lead scoring system
- • Manual email sequences
- • Average 48-hour response time
After N8N CRM Automation:
- • Auto-capture from all 5 sources
- • Only 5 hours/week on management
- • Instant automated follow-ups
- • 45% more leads captured
- • AI-powered lead scoring
- • Fully automated email sequences
- • Average <5 minute response time
Result: 15 hours/week saved + 28% higher close rate + $45K additional monthly revenue
📊 CRM Platform Comparison: N8N Integration
| Feature | Pipedrive | HubSpot | Salesforce |
|---|---|---|---|
| N8N Native Node | ✓ Yes | ✓ Yes | ✓ Yes |
| Setup Difficulty | Easy | Medium | Hard |
| API Rate Limits | 1,000/day (free) 100,000/day (paid) | 10,000/day (free) 500,000/day (pro) | 5,000/day (varies) |
| Webhook Support | Excellent | Excellent | Good |
| Custom Fields | Unlimited | Unlimited | Unlimited |
| Best For | SMBs, Sales teams | Marketing + Sales | Enterprise |
| Starting Price | $14/user/mo | Free (limited) $45/mo (pro) | $25/user/mo |
| N8N Integration Ease | ★★★★★ | ★★★★☆ | ★★★☆☆ |
💡 Recommendation Based on Business Type
Choose Pipedrive if:
- • SMB or startup
- • Sales-focused team
- • Need simple pipeline management
- • Budget under $50/user
Choose HubSpot if:
- • Marketing + Sales alignment
- • Need email marketing
- • Want free tier to start
- • Content-driven business
Choose Salesforce if:
- • Enterprise organization
- • Complex sales processes
- • Need deep customization
- • Budget for implementation
🎯 Workflow 1: Multi-Source Lead Capture
What This Workflow Does
Automatically captures leads from website forms, landing pages, social media, email, and chat - then creates CRM contacts with enriched data, assigns to sales reps, and triggers welcome sequences.
Lead Capture Architecture
Multiple Lead Sources:
├── Website Form (Webhook)
├── Landing Page (Typeform/Google Forms)
├── Facebook/Instagram Lead Ads
├── LinkedIn Lead Gen Forms
└── Live Chat (Intercom/Drift)
↓
Merge & Deduplicate
↓
Enrich with Clearbit/Hunter
(Company, Job Title, Social Profiles)
↓
Lead Scoring Algorithm
(Industry, Company Size, Role, Engagement)
↓
Create/Update in CRM
(Pipedrive/HubSpot/Salesforce)
↓
Route Based on Score:
├── High Score (80-100) → Senior Sales Rep + Immediate Notification
├── Medium Score (50-79) → Junior Sales Rep + 24h Follow-up
└── Low Score (0-49) → Marketing Nurture Sequence
↓
Send Welcome Email
↓
Log to Analytics DashboardStep 1: Lead Enrichment & Scoring
Clearbit Enrichment Node:
HTTP Request to Clearbit API:
GET https://person.clearbit.com/v2/combined/find?email={{$json["email"]}}
Returns:
- Full Name
- Job Title
- Seniority Level (C-Level, VP, Director, Manager, Individual Contributor)
- Company Name
- Company Domain
- Company Size (employees)
- Company Industry
- Company Revenue
- Social Media Profiles (LinkedIn, Twitter)
- Location
Use this data for:
✓ Lead scoring
✓ CRM field population
✓ Personalized email sequences
✓ Sales rep assignmentLead Scoring Function Node:
const lead = $input.first().json;
let score = 0;
// Job Seniority (max 30 points)
const seniorityScores = {
'C-Level': 30,
'VP': 25,
'Director': 20,
'Manager': 15,
'Individual Contributor': 5
};
score += seniorityScores[lead.seniority] || 0;
// Company Size (max 25 points)
const employees = lead.company?.employees || 0;
if (employees > 1000) score += 25;
else if (employees > 500) score += 20;
else if (employees > 100) score += 15;
else if (employees > 50) score += 10;
else score += 5;
// Industry Match (max 20 points)
const targetIndustries = ['Software', 'Technology', 'SaaS', 'E-commerce'];
if (targetIndustries.some(ind => lead.company?.industry?.includes(ind))) {
score += 20;
}
// Email Domain Quality (max 15 points)
const domain = lead.email.split('@')[1];
if (!['gmail.com', 'yahoo.com', 'hotmail.com', 'outlook.com'].includes(domain)) {
score += 15; // Business email
}
// Form Completion Quality (max 10 points)
const fieldsCompleted = Object.keys(lead).filter(k => lead[k]).length;
if (fieldsCompleted > 8) score += 10;
else if (fieldsCompleted > 5) score += 5;
// Lead Quality Category
let quality = 'Low';
if (score >= 80) quality = 'High';
else if (score >= 50) quality = 'Medium';
return [{
json: {
...lead,
leadScore: score,
leadQuality: quality,
scoringDetails: {
seniority: seniorityScores[lead.seniority] || 0,
companySize: Math.min(25, Math.ceil(employees / 50) * 5),
industryMatch: targetIndustries.some(ind => lead.company?.industry?.includes(ind)) ? 20 : 0,
emailQuality: 15,
completeness: fieldsCompleted > 8 ? 10 : 5
}
}
}];Step 2: Create Lead in CRM
Pipedrive
Node: Pipedrive Operation: Create Person Fields: - Name - Email - Phone - Organization - Custom: Lead Score - Custom: Lead Source - Custom: Job Title - Label: New Lead Then Create Deal: - Title: [Company] - [Product] - Stage: Lead In - Value: $0 (estimated) - Owner: Auto-assigned
HubSpot
Node: HubSpot Operation: Create Contact Fields: - Email (required) - First/Last Name - Company - Job Title - Phone - Lifecycle Stage: Lead - Lead Status: New - HS Score: [calculated] Create Deal if High Score
Salesforce
Node: Salesforce Operation: Create Lead Fields: - First/Last Name - Email (required) - Company (required) - Title - Phone - Status: New - Rating: Hot/Warm/Cold - Lead Source - Score__c: [custom] Convert to Contact if score > 80
⚠️ Deduplication Strategy:
Before creating, always check if contact exists:
1. Search by email first (most reliable) 2. If found: Update existing record, don't create duplicate 3. If not found: Search by phone as backup 4. Track "Last Updated" timestamp 5. Merge duplicate records weekly (separate workflow)
Step 3: Smart Sales Rep Assignment
Assignment Algorithm:
const lead = $input.first().json;
// Sales team configuration
const salesTeam = {
senior: [
{ id: 'rep1', name: 'Sarah Chen', capacity: 20, current: 15, specialty: 'Enterprise' },
{ id: 'rep2', name: 'Mike Johnson', capacity: 20, current: 18, specialty: 'Mid-Market' }
],
junior: [
{ id: 'rep3', name: 'Emily Davis', capacity: 35, current: 28, specialty: 'SMB' },
{ id: 'rep4', name: 'Tom Wilson', capacity: 35, current: 22, specialty: 'SMB' }
]
};
let assignedRep = null;
if (lead.leadQuality === 'High') {
// Assign to senior rep with capacity, matching specialty if possible
const availableSenior = salesTeam.senior
.filter(rep => rep.current < rep.capacity)
.sort((a, b) => a.current - b.current);
if (lead.company?.employees > 500) {
assignedRep = availableSenior.find(rep => rep.specialty === 'Enterprise') || availableSenior[0];
} else {
assignedRep = availableSenior[0];
}
} else if (lead.leadQuality === 'Medium') {
// Assign to junior rep with most capacity
assignedRep = salesTeam.junior
.filter(rep => rep.current < rep.capacity)
.sort((a, b) => a.current - b.current)[0];
} else {
// Low quality leads go to marketing automation
assignedRep = { id: 'marketing', name: 'Marketing Automation' };
}
return [{
json: {
...lead,
assignedTo: assignedRep.id,
assignedToName: assignedRep.name,
assignmentReason: lead.leadQuality,
assignedAt: new Date().toISOString()
}
}];💡 Round-Robin Alternative:
Simple round-robin assignment: Track last assigned rep in workflow variable, assign to next in rotation. Update after each assignment. Good for teams with equal capacity.
Step 4: Instant Notifications
Slack Notification (High-Value Leads):
Channel: #hot-leads
Message:
🔥 NEW HIGH-VALUE LEAD 🔥
Name: {{$json["firstName"]}} {{$json["lastName"]}}
Company: {{$json["company"]["name"]}}
Title: {{$json["jobTitle"]}}
Email: {{$json["email"]}}
Phone: {{$json["phone"]}}
━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 LEAD INTELLIGENCE
━━━━━━━━━━━━━━━━━━━━━━━━━━
Lead Score: {{$json["leadScore"]}}/100 ⭐
Quality: {{$json["leadQuality"]}}
Source: {{$json["leadSource"]}}
Company Size: {{$json["company"]["employees"]}} employees
Industry: {{$json["company"]["industry"]}}
Revenue: ${{$json["company"]["revenue"]}}M
━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 ACTION REQUIRED
━━━━━━━━━━━━━━━━━━━━━━━━━━
Assigned to: @{{$json["assignedToName"]}}
Expected Response: Within 15 minutes
CRM Link: {{$json["crmUrl"]}}
🔗 LinkedIn: {{$json["socialProfiles"]["linkedin"]}}
CALL NOW: {{$json["phone"]}}Email to Assigned Rep:
Subject: 🔥 High-Value Lead Assigned: {{$json["company"]["name"]}}
Hi {{$json["assignedToName"]}},
You have a new high-priority lead!
CONTACT INFO:
Name: {{$json["firstName"]}} {{$json["lastName"]}}
Title: {{$json["jobTitle"]}}
Company: {{$json["company"]["name"]}}
Email: {{$json["email"]}}
Phone: {{$json["phone"]}}
QUALIFICATION:
• Lead Score: {{$json["leadScore"]}}/100
• Company Size: {{$json["company"]["employees"]}} employees
• Industry: {{$json["company"]["industry"]}}
• Source: {{$json["leadSource"]}}
NEXT STEPS:
1. Review their company website: {{$json["company"]["domain"]}}
2. Check their LinkedIn: {{$json["socialProfiles"]["linkedin"]}}
3. Call within 15 minutes for best conversion rate
4. Reference their interest in [product/service mentioned]
View in CRM: {{$json["crmUrl"]}}
Good luck!⭐ Workflow 2: Dynamic Lead Scoring & Re-scoring
What This Workflow Does
Continuously monitors lead behavior (email opens, link clicks, website visits, content downloads) and updates lead scores in real-time. Automatically promotes hot leads and alerts sales team.
Behavioral Scoring Triggers
| Action | Points Added | Trigger Source | Urgency |
|---|---|---|---|
| Email Opened | +2 points | Email service webhook | Low |
| Email Link Clicked | +5 points | Email service webhook | Medium |
| Visited Pricing Page | +15 points | Google Analytics webhook | High |
| Downloaded Case Study | +10 points | Website form submission | Medium |
| Requested Demo | +30 points | Calendly webhook | Urgent |
| Watched Product Video | +8 points | Wistia/Vimeo webhook | Medium |
| Returned to Site (7 days) | +5 points | Google Analytics | Medium |
| No Activity (30 days) | -10 points | Scheduled check | Decay |
Real-Time Score Update Flow
Webhook Receives Event (email click, page visit, etc.)
↓
Identify Contact by Email/Cookie ID
↓
Fetch Current Lead Score from CRM
↓
Calculate Points to Add (based on action)
↓
Update Score in CRM
↓
Check if Score Crossed Threshold:
├── Crossed 50 (Cold → Warm) → Add to nurture sequence
├── Crossed 80 (Warm → Hot) → Alert sales rep + move stage
└── Crossed 95 (Hot → Ultra-Hot) → Immediate call required
↓
Log Activity to Timeline
↓
Update "Last Engaged" timestampImplementation Example
Function Node - Update Score:
const event = $input.first().json;
// Point values by action type
const pointValues = {
'email_open': 2,
'email_click': 5,
'page_view_pricing': 15,
'page_view_features': 8,
'download_resource': 10,
'demo_request': 30,
'video_watched': 8,
'return_visit': 5
};
// Get current lead from CRM (previous node)
const currentLead = $('CRM - Get Lead').first().json;
const currentScore = currentLead.leadScore || 0;
const actionPoints = pointValues[event.action] || 0;
// Calculate new score (max 100)
const newScore = Math.min(100, currentScore + actionPoints);
// Determine if threshold crossed
const oldCategory =
currentScore >= 80 ? 'Hot' :
currentScore >= 50 ? 'Warm' :
'Cold';
const newCategory =
newScore >= 80 ? 'Hot' :
newScore >= 50 ? 'Warm' :
'Cold';
const thresholdCrossed = oldCategory !== newCategory;
// Build activity description
const activityDescriptions: Record<string, string> = {
'email_open': 'Opened email: [email subject]',
'email_click': 'Clicked link in email: [link url]',
'page_view_pricing': 'Visited pricing page',
'demo_request': '🔥 REQUESTED DEMO! (Calendly)'
};
return [{
json: {
leadId: currentLead.id,
email: currentLead.email,
oldScore: currentScore,
newScore: newScore,
pointsAdded: actionPoints,
oldCategory,
newCategory,
thresholdCrossed,
actionType: event.action,
activityDescription: activityDescriptions[event.action] || event.action,
timestamp: new Date().toISOString(),
shouldNotifySales: newScore >= 80 && currentScore < 80 // Just became hot
}
}];📧 Workflow 3: Automated Email Sequences
What This Workflow Does
Sends personalized email sequences triggered by CRM events (new lead, deal stage change, no activity). Includes A/B testing, optimal send time calculation, and automatic pause on reply.
Standard Email Sequences
Cold Lead Nurture (7 emails, 14 days)
- Day 0: Welcome + value proposition
- Day 2: Customer success story
- Day 4: Educational content (blog/guide)
- Day 7: Feature highlight + demo offer
- Day 10: Social proof (testimonials)
- Day 12: Special offer (time-limited)
- Day 14: Break-up email (last attempt)
Warm Lead Fast Track (5 emails, 7 days)
- Day 0: Personal intro from sales rep
- Day 1: Detailed product demo video
- Day 2: ROI calculator + case study
- Day 4: Demo invitation (specific time slots)
- Day 7: Direct call to action + urgency
Post-Demo Follow-up (4 emails, 10 days)
- Day 0: Thank you + demo recap
- Day 2: Answer questions from demo
- Day 5: Proposal/pricing sent
- Day 10: Follow-up on proposal
Re-engagement (Cold Leads) (3 emails, 21 days)
- Day 0: "Noticed you haven't been active"
- Day 7: New feature announcement
- Day 21: Final offer + discount
Email Sequence Automation Flow
CRM Event Trigger (New Lead Created, Deal Stage Changed)
↓
Determine Sequence Type (based on lead score, source, stage)
↓
Create Sequence Entry in Database
(Track: sequence_id, lead_id, current_step, next_send_time)
↓
Schedule Trigger (Checks every hour for due emails)
↓
Query Database for Emails Due to Send
↓
For Each Email:
├── Check if lead replied (if yes, pause sequence)
├── Check if lead unsubscribed (if yes, stop sequence)
├── Personalize email with lead data
├── Calculate optimal send time (based on past engagement)
├── Send email via SendGrid/Mailgun/SES
├── Track send in CRM activity timeline
├── Update sequence step
└── Schedule next email
↓
Monitor Email Events (opens, clicks, replies)
↓
If Reply Detected:
├── Pause sequence
├── Notify assigned sales rep
└── Update lead status to "Engaged"Optimal Send Time Calculation
Function Node - Calculate Best Send Time:
const lead = $input.first().json;
// Get historical engagement data (from previous node)
const engagementHistory = $('Get Engagement History').all().map(item => item.json);
// Analyze past open times
const openTimes = engagementHistory
.filter(e => e.action === 'email_open')
.map(e => {
const date = new Date(e.timestamp);
return {
hour: date.getHours(),
dayOfWeek: date.getDay(),
opened: true
};
});
// Find most common open hour and day
const hourCounts = {};
const dayCounts = {};
openTimes.forEach(ot => {
hourCounts[ot.hour] = (hourCounts[ot.hour] || 0) + 1;
dayCounts[ot.dayOfWeek] = (dayCounts[ot.dayOfWeek] || 0) + 1;
});
// Determine optimal send time
let optimalHour = 10; // Default: 10 AM
let optimalDay = 2; // Default: Tuesday
if (Object.keys(hourCounts).length > 0) {
optimalHour = parseInt(Object.keys(hourCounts).reduce((a, b) =>
hourCounts[a] > hourCounts[b] ? a : b
));
}
if (Object.keys(dayCounts).length > 0) {
optimalDay = parseInt(Object.keys(dayCounts).reduce((a, b) =>
dayCounts[a] > dayCounts[b] ? a : b
));
}
// If no history, use industry best practices
if (openTimes.length === 0) {
// B2B: Tuesday-Thursday, 10 AM or 2 PM
const industryDefaults = {
'B2B': { hour: 10, day: 2 }, // Tuesday 10 AM
'B2C': { hour: 19, day: 0 }, // Sunday 7 PM
'SaaS': { hour: 14, day: 3 } // Wednesday 2 PM
};
const defaults = industryDefaults[lead.industry] || industryDefaults['B2B'];
optimalHour = defaults.hour;
optimalDay = defaults.day;
}
// Calculate next occurrence of optimal day/time
const now = new Date();
const nextSend = new Date();
nextSend.setHours(optimalHour, 0, 0, 0);
// Advance to next optimal day
while (nextSend.getDay() !== optimalDay || nextSend <= now) {
nextSend.setDate(nextSend.getDate() + 1);
}
return [{
json: {
leadId: lead.id,
optimalHour,
optimalDay,
nextSendTime: nextSend.toISOString(),
confidence: openTimes.length > 5 ? 'High' : openTimes.length > 0 ? 'Medium' : 'Low',
basedOnData: openTimes.length > 0
}
}];💡 Send Time Best Practices:
- • B2B: Tuesday-Thursday, 10 AM - 11 AM or 2 PM - 3 PM local time
- • B2C: Evenings (7 PM - 9 PM) and weekends perform well
- • Avoid Mondays (inbox overload) and Fridays (mental checkout)
- • Respect recipient's timezone - use lead's location data
- • Test and iterate - A/B test send times for your audience
💼 Workflow 4: Deal Pipeline Automation
What This Workflow Does
Automatically moves deals through pipeline stages based on actions, sends stage-specific emails, creates tasks for sales reps, forecasts deal close probability, and alerts on stuck deals.
Automated Pipeline Stage Progression
| Stage | Auto-Advance Trigger | Actions | Typical Duration |
|---|---|---|---|
| 1. Lead In | Initial contact made (call logged or email reply) | • Send intro email • Create "Discovery Call" task • Schedule follow-up in 2 days | 1-3 days |
| 2. Qualified | Discovery call completed (calendar event ends) | • Send post-call summary email • Request decision criteria • Create "Send Proposal" task | 3-7 days |
| 3. Demo Scheduled | Demo booked on Calendly | • Send demo prep email (48h before) • Create "Prepare Demo" task • Add demo notes template to CRM | 1-5 days |
| 4. Proposal Sent | Proposal document sent (email sent or DocuSign created) | • Track proposal opens • Follow-up email after 2 days if not opened • Create "Negotiate" task | 5-10 days |
| 5. Negotiation | Price discussion activity logged | • Alert sales manager for approval • Prepare contract • Create "Close Deal" task | 3-14 days |
| 6. Closed Won | Contract signed (DocuSign completed) | • Send welcome/onboarding email • Create customer record • Notify success team • Update revenue forecast | Deal closed! |
| 7. Closed Lost | Manual or "No response for 30 days" | • Request loss reason • Add to re-engagement sequence (6 months) • Analyze loss patterns | - |
Stage Transition Automation
Webhook Trigger + Function Node:
// Webhook receives event from CRM (deal updated, activity logged, etc.)
const event = $input.first().json;
// Fetch current deal data
const deal = event.deal;
const currentStage = deal.stage;
// Define stage progression logic
const stageTransitions = {
'Lead In': {
advanceOn: ['call_logged', 'email_reply_received'],
nextStage: 'Qualified',
actions: ['send_discovery_email', 'create_discovery_task']
},
'Qualified': {
advanceOn: ['discovery_call_completed'],
nextStage: 'Demo Scheduled',
actions: ['send_post_call_summary', 'request_decision_criteria']
},
'Demo Scheduled': {
advanceOn: ['demo_completed'],
nextStage: 'Proposal Sent',
actions: ['send_thank_you_email', 'create_proposal_task']
},
'Proposal Sent': {
advanceOn: ['proposal_opened_3_times', 'pricing_discussion_logged'],
nextStage: 'Negotiation',
actions: ['alert_sales_manager', 'prepare_contract']
},
'Negotiation': {
advanceOn: ['contract_sent'],
nextStage: 'Closed Won',
actions: ['send_contract', 'schedule_signature_follow_up']
}
};
const currentStageConfig = stageTransitions[currentStage];
// Check if event triggers stage advance
let shouldAdvance = false;
if (currentStageConfig && currentStageConfig.advanceOn.includes(event.action)) {
shouldAdvance = true;
}
// Build response
return [{
json: {
dealId: deal.id,
currentStage,
nextStage: shouldAdvance ? currentStageConfig.nextStage : currentStage,
shouldAdvance,
actionsToTake: shouldAdvance ? currentStageConfig.actions : [],
eventType: event.action,
timestamp: new Date().toISOString()
}
}];Stuck Deal Detection & Alerts
Schedule Trigger (Daily) - Check for Stuck Deals:
// Query CRM for all open deals
const openDeals = $('CRM - Get Open Deals').all();
// Define "stuck" thresholds by stage (in days)
const stuckThresholds = {
'Lead In': 5,
'Qualified': 10,
'Demo Scheduled': 7,
'Proposal Sent': 14,
'Negotiation': 21
};
const now = new Date();
const stuckDeals = [];
openDeals.forEach(item => {
const deal = item.json;
const stageEnteredDate = new Date(deal.stage_entered_at);
const daysInStage = Math.floor((now - stageEnteredDate) / (1000 * 60 * 60 * 24));
const threshold = stuckThresholds[deal.stage] || 30;
if (daysInStage > threshold) {
stuckDeals.push({
dealId: deal.id,
dealName: deal.name,
stage: deal.stage,
daysInStage,
threshold,
assignedTo: deal.owner_name,
value: deal.value,
lastActivityDate: deal.last_activity_date,
daysSinceActivity: Math.floor((now - new Date(deal.last_activity_date)) / (1000 * 60 * 60 * 24))
});
}
});
return stuckDeals.map(deal => ({ json: deal }));Slack Alert for Stuck Deals:
Channel: #sales-alerts
Message:
⚠️ STUCK DEALS REPORT - {{$now.format('MMM DD, YYYY')}}
Found {{$input.all().length}} deals stuck in pipeline!
{{#each $input.all()}}
━━━━━━━━━━━━━━━━━━━━━━━━━━
Deal: {{this.json.dealName}}
Value: ${{this.json.value}}
Stage: {{this.json.stage}} ({{this.json.daysInStage}} days - threshold: {{this.json.threshold}})
Owner: @{{this.json.assignedTo}}
Last Activity: {{this.json.daysSinceActivity}} days ago
🎯 ACTION REQUIRED:
- Contact prospect today
- Update deal status
- Move forward or mark as lost
CRM Link: [link]
━━━━━━━━━━━━━━━━━━━━━━━━━━
{{/each}}
@sales-team - Please review and take action!AI-Powered Win Probability Prediction
Function Node - Calculate Win Probability:
const deal = $input.first().json;
// Base probability by stage
const baseProbabilities = {
'Lead In': 10,
'Qualified': 25,
'Demo Scheduled': 40,
'Proposal Sent': 60,
'Negotiation': 80
};
let probability = baseProbabilities[deal.stage] || 0;
// Positive factors (increase probability)
if (deal.lead_score > 80) probability += 15;
if (deal.engagement_score > 70) probability += 10;
if (deal.decision_maker_identified) probability += 5;
if (deal.budget_confirmed) probability += 10;
if (deal.timeline_defined) probability += 5;
if (deal.champion_identified) probability += 10;
if (deal.multiple_touchpoints > 5) probability += 5;
if (deal.proposal_viewed_multiple_times) probability += 10;
// Negative factors (decrease probability)
if (deal.days_in_stage > stageThresholds[deal.stage]) probability -= 15;
if (deal.days_since_last_activity > 7) probability -= 10;
if (deal.competitor_mentioned) probability -= 10;
if (deal.price_objection_logged) probability -= 5;
if (deal.decision_delayed) probability -= 10;
// Ensure probability stays within 0-100
probability = Math.max(0, Math.min(100, probability));
// Risk level
let riskLevel = 'Low';
if (probability < 30) riskLevel = 'High';
else if (probability < 60) riskLevel = 'Medium';
return [{
json: {
dealId: deal.id,
winProbability: probability,
riskLevel,
recommendedActions: probability < 50 ? [
'Schedule call with decision maker',
'Address objections proactively',
'Offer additional value/discount'
] : [
'Continue current approach',
'Maintain regular touchpoints',
'Prepare for close'
],
forecastCategory: probability > 70 ? 'Commit' : probability > 40 ? 'Best Case' : 'Pipeline'
}
}];🎯 3 Complete CRM Workflows for Different Business Types
1. E-commerce/DTC Business CRM Workflow
Workflow Overview:
Shopify Order Webhook → Create Customer in HubSpot
↓
Tag by Product Category + Purchase Value
↓
Add to Post-Purchase Email Sequence:
- Day 0: Thank you + shipping info
- Day 3: Product usage tips
- Day 7: Request review
- Day 14: Upsell/cross-sell based on purchase
- Day 30: Loyalty program invite
↓
Track Customer Lifetime Value (CLV)
↓
High CLV (>$500)? → Tag as VIP → Special offers
Low Engagement? → Win-back campaignKey Automations:
- • Abandoned cart recovery (3 emails)
- • Post-purchase cross-sell
- • VIP customer identification
- • Review request automation
- • Win-back campaigns for inactive
Expected Results:
- • 15-20% cart recovery rate
- • 25% increase in repeat purchases
- • 40% more reviews
- • 30% higher CLV for VIPs
2. B2B SaaS Sales CRM Workflow
Workflow Overview:
Free Trial Signup → Create Deal in Pipedrive
↓
Track Product Usage (via API)
- Features used
- Login frequency
- Team members invited
↓
Calculate Product Qualified Lead (PQL) Score
↓
High Usage (PQL > 70)?
→ Notify sales rep → Book demo call
Low Usage (PQL < 30)?
→ Automated onboarding emails + in-app tutorials
↓
Trial Day 7: Automatic check-in email
Trial Day 14: Demo offer (if not booked)
Trial Day 25: Upgrade offer (time-limited discount)
↓
Trial Expires without Conversion?
→ Extended trial offer (7 more days)
→ If still no conversion → Nurture sequenceKey Automations:
- • Usage-based lead scoring (PQL)
- • Automated onboarding sequence
- • Sales handoff triggers
- • Churn risk detection
- • Upsell opportunity identification
Expected Results:
- • 30% trial-to-paid conversion
- • 50% reduction in sales time
- • 3x more qualified demos
- • 20% faster deal velocity
3. Service Business (Agency/Consulting) CRM Workflow
Workflow Overview:
Contact Form Submission → Create Lead in Salesforce
↓
Enrich with LinkedIn Data (company size, industry, funding)
↓
Route to Specialist:
- Enterprise (>500 employees) → Senior Account Exec
- Mid-Market (50-500) → Account Exec
- SMB (<50) → Inside Sales
↓
Qualification Call Scheduled (Calendly)
↓
Post-Call: Send Proposal + Case Studies
↓
Track Proposal Engagement:
- Opened? → Follow-up email
- Not opened after 48h? → Call reminder
- Opened 3+ times? → Hot lead alert
↓
Proposal Accepted → Create Project + Onboarding
↓
During Project:
- Weekly status update emails
- Milestone completion notifications
- Upsell opportunities flagged
↓
Project Completion:
- Request testimonial/review
- Ask for referrals
- Add to monthly newsletter
- Identify renewal/expansion opportunitiesKey Automations:
- • Intelligent lead routing
- • Proposal tracking & follow-up
- • Project milestone automation
- • Referral request workflows
- • Renewal opportunity detection
Expected Results:
- • 40% faster proposal response
- • 25% higher close rate
- • 50% more referrals
- • 35% increase in upsells
❓ Frequently Asked Questions
Which CRM is easiest to integrate with N8N?
Pipedrive is the easiest - setup takes 5 minutes. HubSpot is close second. Salesforce requires more configuration but offers the most power for enterprise needs. All three have excellent N8N native nodes.
Can N8N replace my marketing automation tool?
For basic email sequences, yes. For advanced marketing automation (landing pages, A/B testing, complex segmentation), use N8N alongside tools like HubSpot or ActiveCampaign. N8N excels at connecting systems together.
How do I prevent duplicate leads in my CRM?
Always search by email before creating. Use N8N's "Merge" node to deduplicate. Implement a weekly cleanup workflow that finds and merges duplicates based on email, phone, or company name matching.
What's the best way to score leads?
Combine demographic scoring (job title, company size, industry) with behavioral scoring (email opens, page visits, content downloads). Update scores in real-time based on actions. Aim for 0-100 scale.
Can N8N handle large sales teams?
Yes! N8N scales to enterprise. For teams 10+, consider self-hosting for unlimited executions. Use load balancing for high-volume webhooks. Several companies automate CRM for 50+ sales reps with N8N.
How do I track ROI of my CRM automation?
Track: 1) Time saved (hours/week), 2) Lead response speed improvement, 3) Conversion rate increases, 4) Additional revenue from better follow-up, 5) Reduced lead leakage. Build a dashboard in Google Sheets tracking these metrics.
Want to master AI Automations Reimagined? Get it + 3 more complete courses
Complete Creator Academy - All Courses
Master Instagram growth, AI influencers, n8n automation, and digital products for just $99/month. Cancel anytime.
All 4 premium courses (Instagram, AI Influencers, Automation, Digital Products)
100+ hours of training content
Exclusive templates and workflows
Weekly live Q&A sessions
Private community access
New courses and updates included
Cancel anytime - no long-term commitment
✨ Includes: Instagram Ignited • AI Influencers Academy • AI Automations • Digital Products Empire