B2B Lead Generation with Social Media Data
Your sales team needs qualified leads. Not just names and emails—real decision-makers with buying intent.
Social media data is the key. LinkedIn profiles reveal job titles, company size, and tech stacks. Twitter shows what problems people are talking about. Reddit discussions expose pain points in your target market.
Here's how to build a B2B lead generation engine using social media APIs.
Need social media data for lead gen? Get started at sociavault.com/free/social-media-api.
Why Social Media Data for B2B?
Traditional lead sources give you:
- Contact databases: Often outdated, expensive
- Website forms: Low volume, self-selected
- Events: Time-consuming, limited reach
Social media data gives you:
- Real-time signals: Job changes, company news, pain points
- Verified information: Public profiles with current data
- Intent signals: What people are actually discussing
- Scale: Thousands of prospects, automated
The Data Sources
LinkedIn: Decision Maker Profiles
LinkedIn is the goldmine for B2B:
- Job titles and seniority
- Company information
- Work history
- Skills and endorsements
- Connection count (influence indicator)
async function getLinkedInProfile(profileUrl) {
const response = await fetch(
`https://api.sociavault.com/v1/scrape/linkedin/profile?url=${encodeURIComponent(profileUrl)}`,
{ headers: { 'Authorization': `Bearer ${API_KEY}` } }
);
const { data } = await response.json();
return {
name: data.name,
title: data.headline,
company: data.current_company?.name,
location: data.location,
connections: data.connections,
skills: data.skills
};
}
Twitter: Intent Signals
Twitter reveals what people are thinking about:
- Complaints about current tools
- Questions about solutions
- Industry discussions
- Engagement with competitors
async function findBuyingSignals(keywords) {
const response = await fetch(
`https://api.sociavault.com/v1/scrape/twitter/search?query=${encodeURIComponent(keywords)}&count=100`,
{ headers: { 'Authorization': `Bearer ${API_KEY}` } }
);
const { data } = await response.json();
// Filter for buying intent
const buyingSignals = data.tweets.filter(tweet => {
const text = tweet.text.toLowerCase();
return text.includes('looking for') ||
text.includes('anyone recommend') ||
text.includes('switching from') ||
text.includes('frustrated with');
});
return buyingSignals;
}
Reddit: Pain Points
Reddit is where people complain honestly:
- Unfiltered opinions on tools
- Detailed problem descriptions
- Community recommendations
async function findPainPoints(subreddit, topic) {
const response = await fetch(
`https://api.sociavault.com/v1/scrape/reddit/search?subreddit=${subreddit}&query=${topic}&count=50`,
{ headers: { 'Authorization': `Bearer ${API_KEY}` } }
);
const { data } = await response.json();
return data.posts.map(post => ({
title: post.title,
content: post.selftext,
score: post.score,
comments: post.num_comments,
author: post.author
}));
}
Building Your Lead List
Step 1: Define Your ICP
const idealCustomerProfile = {
titles: ['VP of Marketing', 'CMO', 'Head of Growth', 'Marketing Director'],
companySize: { min: 50, max: 500 },
industries: ['SaaS', 'Technology', 'E-commerce'],
signals: ['hiring marketers', 'raised funding', 'launching new product']
};
Step 2: Find Companies
async function findTargetCompanies(industry, size) {
// Search LinkedIn for companies
const response = await fetch(
`https://api.sociavault.com/v1/scrape/linkedin/company/search?industry=${industry}&size=${size}`,
{ headers: { 'Authorization': `Bearer ${API_KEY}` } }
);
return response.json();
}
Step 3: Find Decision Makers
async function findDecisionMakers(companyName, titles) {
const leads = [];
for (const title of titles) {
const searchQuery = `${title} ${companyName}`;
// Search LinkedIn for people with this title at this company
const response = await fetch(
`https://api.sociavault.com/v1/scrape/linkedin/search/people?query=${encodeURIComponent(searchQuery)}`,
{ headers: { 'Authorization': `Bearer ${API_KEY}` } }
);
const { data } = await response.json();
leads.push(...data.profiles);
}
return leads;
}
Step 4: Enrich with Intent Data
async function enrichWithIntent(lead) {
// Check their Twitter for recent activity
const twitterSearch = await fetch(
`https://api.sociavault.com/v1/scrape/twitter/search?query=from:${lead.twitterHandle}&count=50`,
{ headers: { 'Authorization': `Bearer ${API_KEY}` } }
);
const tweets = await twitterSearch.json();
// Analyze for buying signals
const signals = analyzeBuyingIntent(tweets.data.tweets);
return {
...lead,
intentScore: signals.score,
recentTopics: signals.topics,
lastActive: signals.lastActivity
};
}
Lead Scoring Model
function scoreLeads(leads) {
return leads.map(lead => {
let score = 0;
// Title match (+30)
if (idealCustomerProfile.titles.includes(lead.title)) {
score += 30;
}
// Company size fit (+20)
if (lead.companySize >= idealCustomerProfile.companySize.min &&
lead.companySize <= idealCustomerProfile.companySize.max) {
score += 20;
}
// Recent engagement (+25)
if (lead.lastActive && daysSince(lead.lastActive) < 7) {
score += 25;
}
// Buying intent signals (+25)
score += lead.intentScore * 25;
return { ...lead, score };
}).sort((a, b) => b.score - a.score);
}
Automation Pipeline
// Run daily to find new leads
async function dailyLeadGeneration() {
const newCompanies = await findNewCompanies();
const leads = [];
for (const company of newCompanies) {
const decisionMakers = await findDecisionMakers(
company.name,
idealCustomerProfile.titles
);
for (const dm of decisionMakers) {
const enriched = await enrichWithIntent(dm);
leads.push(enriched);
}
await sleep(1000); // Rate limiting
}
const scored = scoreLeads(leads);
const qualified = scored.filter(l => l.score >= 50);
await saveToCRM(qualified);
await notifySalesTeam(qualified);
}
Integration with Sales Tools
Export to HubSpot
async function exportToHubspot(leads) {
for (const lead of leads) {
await hubspot.crm.contacts.basicApi.create({
properties: {
firstname: lead.firstName,
lastname: lead.lastName,
jobtitle: lead.title,
company: lead.company,
linkedin_url: lead.linkedinUrl,
lead_score: lead.score,
intent_signals: lead.recentTopics.join(', ')
}
});
}
}
Send to Outreach
async function addToOutreachSequence(leads, sequenceId) {
for (const lead of leads) {
await outreach.prospects.create({
email: lead.email,
firstName: lead.firstName,
lastName: lead.lastName,
company: lead.company,
customFields: {
painPoints: lead.recentTopics,
intentScore: lead.score
}
});
await outreach.sequenceStates.create({
prospect: lead.id,
sequence: sequenceId
});
}
}
Best Practices
1. Respect Privacy
- Only use publicly available data
- Comply with GDPR/CCPA
- Honor opt-out requests
2. Quality Over Quantity
- Better to have 100 qualified leads than 10,000 unqualified
- Focus on intent signals
- Verify data before outreach
3. Keep Data Fresh
- Social profiles change
- Re-verify before campaigns
- Track job changes
4. Personalize Outreach
- Reference their recent activity
- Mention specific pain points
- Show you've done research
Results You Can Expect
Companies using social media data for B2B lead gen typically see:
- 3-5x better response rates (personalized outreach)
- 50% reduction in research time
- 2x more qualified leads per rep
Ready to build your lead generation engine?
Start with 50 free API credits and extract your first leads today.
Related guides:
Found this helpful?
Share it with others who might benefit
Ready to Try SociaVault?
Start extracting social media data with our powerful API. No credit card required.