Budget-Friendly Data Enrichment with Make.com
Build cost-effective data enrichment workflows using free and low-cost APIs, web scraping, and intelligent caching to minimize expensive API calls.
Budget-Friendly Data Enrichment with Make.com
When I started my first SaaS job, the VP of Sales asked me to “enrich all our leads.” I fired up Clearbit, enriched 10,000 contacts, and proudly announced completion. Three days later, the CFO called me into her office holding a $18,000 invoice.
Turns out, enriching every person who ever downloaded an ebook—including students, job seekers, and competitors—wasn’t a brilliant use of budget. I learned the hard way that smart enrichment isn’t about getting data for everyone; it’s about getting the right data for the right leads at the right price.
Make.com is perfect for building budget-conscious enrichment workflows that deliver 80% of the data quality at 20% of the cost.
Why Enrichment Costs Spiral Out of Control
The Premium API First Approach Many teams default to expensive providers (Clearbit at $1.50/lead, ZoomInfo at $2+/contact) for all enrichment. But these premium APIs overlap significantly with free data sources.
The Lack of Deduplication Enriching the same domain multiple times is pure waste. Yet I’ve seen teams pay to enrich john@company.com, jane@company.com, and bob@company.com separately, when one domain-level lookup could populate all three.
The No-Filter Problem Enriching every lead regardless of quality means spending $2 to learn that student@gmail.com is… a student. Not exactly ROI positive.
The Budget Enrichment Framework
Tier 0: Pre-Qualification (Free) Filter out low-value leads before spending anything on enrichment.
Tier 1: Free Sources (Free) Company websites, LinkedIn public profiles, DNS records, social media.
Tier 2: Low-Cost APIs ($0.01-0.10/lookup) Hunter.io, FullContact, Voila Norbert, Pipl.
Tier 3: Premium APIs ($0.50-2.00/lookup) Reserve for high-value leads only: Clearbit, ZoomInfo, Apollo.
Tier 4: Manual Research ($5-15/lead) Human SDR research for enterprise opportunities only.
Building Budget Enrichment in Make.com
Scenario Structure
Webhook Trigger (New Lead)
↓
Filter: Valid Corporate Email
↓
Google Sheets: Check Enrichment Cache
↓
Router:
├─ Cache Hit → Use Cached Data → Update CRM
└─ Cache Miss → Continue to Enrichment
↓
Filter: Lead Score > 30 (qualify for enrichment)
↓
Router:
├─ Score 30-50 → Free Sources Only
├─ Score 51-75 → Free + Budget APIs
└─ Score 76-100 → Free + Budget + Premium
Module 1: Email Validation (Free)
Filter out bad emails before enrichment:
Email Validation Module (HTTP Request):
URL: https://api.eva.pingutil.com/email
Method: GET
Query String:
email={{trigger.email}}
Response:
{
"status": "success",
"data": {
"valid_syntax": true,
"deliverable": true,
"disposable": false,
"domain_type": "corporate" // or "personal", "disposable"
}
}
Filter: Skip Personal Emails
Condition:
data.domain_type EQUALS "corporate"
AND
data.deliverable EQUALS true
AND
data.disposable EQUALS false
This filter alone can save 40% of enrichment costs by skipping gmail/yahoo addresses.
Module 2: Cache Check (Free)
Use Google Sheets as a free enrichment cache:
Google Sheets Structure:
Column A: Domain
Column B: Company Name
Column C: Employee Count
Column D: Industry
Column E: Technologies
Column F: Last Enriched Date
Column G: Enrichment Tier Used
Make Module: Search Rows in Google Sheets
Search Column: A (Domain)
Search Value: {{emailDomain}}
Max Results: 1
Router After Cache Check:
Route 1: Cache Hit (Row Found)
AND Cache_Age < 90 days
→ Use cached data, skip enrichment
Route 2: Cache Miss or Stale
→ Proceed to enrichment
Cost Savings: If you have 5 contacts per company on average, caching reduces enrichment by 80%.
Module 3: Company Website Scraping (Free)
Extract data from company websites:
HTTP Module: Fetch Homepage
URL: https://{{emailDomain}}
Method: GET
Follow Redirects: Yes
Timeout: 10 seconds
Text Parser: Extract Company Name
Pattern: <title>(.*?)</title>
Text: {{html}}
→ Captures: "Acme Corp - Best SaaS Platform"
Then Text Parser: Split
Separator: "-"
Take First Element
Text Parser: Extract Employee Count Hint
Pattern: (\d+)\+?\s*(employees|team members|people)
Text: {{html}}
→ Captures: "150 employees" or "500+ team members"
Text Parser: Extract Industry Keywords
Pattern: <meta name="description" content="(.*?)"
→ Captures meta description for keyword extraction
Tools List Detection:
// Code Module
const html = input.html.toLowerCase();
const tools = [];
// Check for common tools
if (html.includes('hubspot.js')) tools.push('HubSpot');
if (html.includes('google-analytics.com')) tools.push('Google Analytics');
if (html.includes('segment.com')) tools.push('Segment');
if (html.includes('shopify.com')) tools.push('Shopify');
if (html.includes('wordpress')) tools.push('WordPress');
if (html.includes('intercom')) tools.push('Intercom');
return { technologies: tools.join(', ') };
Cost: $0 per lookup Coverage: 60-70% of companies Accuracy: Medium (depends on website quality)
Module 4: Hunter.io Domain Search (Budget API)
Hunter.io provides email patterns and company info affordably:
HTTP Request to Hunter.io:
URL: https://api.hunter.io/v2/domain-search
Method: GET
Query String:
domain={{emailDomain}}
api_key={{hunterApiKey}}
limit=10
Pricing: $0.04 per domain search
Response Extract:
{
"data": {
"organization": "Acme Corporation",
"pattern": "{first}.{last}",
"emails": [
{
"value": "john.smith@acme.com",
"type": "personal",
"confidence": 95,
"position": "VP Sales"
}
],
"domain": "acme.com",
"country": "US"
}
}
When to Use:
- Lead score 40-75
- After free sources don’t provide enough data
- Need email pattern validation
Module 5: FullContact Company API (Budget API)
FullContact enriches company data cheaply:
HTTP Request:
URL: https://api.fullcontact.com/v3/company.enrich
Method: POST
Headers:
Authorization: Bearer {{fullContactKey}}
Body:
{
"domain": "{{emailDomain}}"
}
Pricing: $0.10 per lookup
Response:
{
"name": "Acme Corp",
"employees": 245,
"founded": 2015,
"industry": "Computer Software",
"location": "San Francisco, CA",
"logo": "https://logo.clearbit.com/acme.com",
"linkedin": {
"handle": "acme-corp"
}
}
When to Use:
- Lead score 50-75
- Hunter.io didn’t provide employee count
- Need company metadata
Module 6: Clearbit Enrichment (Premium API)
Reserve for high-value leads only:
HTTP Request:
URL: https://company-stream.clearbit.com/v2/companies/find
Method: GET
Query String:
domain={{emailDomain}}
Headers:
Authorization: Bearer {{clearbitKey}}
Pricing: $1.50 per lookup
Filter Before Clearbit:
Only call if:
Lead Score >= 75
AND
Previous enrichment tiers incomplete
AND
Monthly Clearbit spend < $500 budget
Module 7: Aggregate and Update CRM
Combine data from all sources:
Data Aggregator Module:
// Code Module: Merge All Sources
const enrichedData = {
company_name: clearbit?.name || fullContact?.name || websiteScrape?.name || emailDomain,
employee_count: clearbit?.metrics?.employees ||
fullContact?.employees ||
websiteScrape?.employeeHint ||
null,
industry: clearbit?.category?.industry ||
fullContact?.industry ||
websiteScrape?.industryKeyword ||
null,
technologies: [
...(clearbit?.tech || []),
...(websiteScrape?.technologies || [])
].filter((v, i, a) => a.indexOf(v) === i), // deduplicate
revenue_range: clearbit?.metrics?.estimatedAnnualRevenue || null,
location: clearbit?.location ||
fullContact?.location ||
null,
enrichment_tier: clearbit ? 'premium' :
fullContact ? 'budget' :
'free',
enrichment_cost: clearbit ? 1.50 :
fullContact ? 0.10 :
hunter ? 0.04 :
0.00,
enrichment_date: new Date().toISOString()
};
return enrichedData;
Update Google Sheets Cache:
Action: Add/Update Row
Sheet: Enrichment Cache
Lookup Column: A (Domain)
Lookup Value: {{emailDomain}}
Values:
Domain: {{emailDomain}}
Company Name: {{enrichedData.company_name}}
Employee Count: {{enrichedData.employee_count}}
Industry: {{enrichedData.industry}}
Technologies: {{enrichedData.technologies}}
Last Enriched: {{enrichedData.enrichment_date}}
Tier: {{enrichedData.enrichment_tier}}
Update HubSpot/Salesforce:
Module: HubSpot - Update Contact
Email: {{trigger.email}}
Properties:
company: {{enrichedData.company_name}}
num_employees: {{enrichedData.employee_count}}
industry: {{enrichedData.industry}}
technologies: {{enrichedData.technologies}}
enrichment_date: {{enrichedData.enrichment_date}}
enrichment_cost: {{enrichedData.enrichment_cost}}
Cost Optimization Strategies
Strategy 1: Batch Processing
Accumulate leads, enrich in batches:
Trigger: Schedule (every 30 minutes)
↓
Get Pending Leads from Database (max 25)
↓
For Each Lead:
Run Enrichment
↓
Aggregate: Total Cost This Batch
↓
If Total Cost > $50/day limit:
→ Pause scenario
→ Send alert
Strategy 2: Smart Lead Scoring
Only enrich high-potential leads:
// Lead Scoring Formula
let score = 0;
// Source quality
if (source === 'demo-request') score += 40;
else if (source === 'pricing-page') score += 30;
else if (source === 'webinar') score += 20;
else if (source === 'content') score += 10;
// Behavioral signals
if (pageViews > 5) score += 15;
if (timeOnSite > 180) score += 10;
// Company size indicators (from email domain lookup)
const employeeEstimate = await getEmployeeCountFromLinkedIn(domain);
if (employeeEstimate > 100) score += 20;
else if (employeeEstimate > 50) score += 10;
// Enrichment decision
if (score >= 75) tier = 'premium'; // Use Clearbit
else if (score >= 50) tier = 'budget'; // Use FullContact/Hunter
else if (score >= 30) tier = 'free'; // Web scraping only
else tier = 'skip'; // Don't enrich
return { score, tier };
Strategy 3: Progressive Enrichment
Enrich in stages based on engagement:
Stage 1: Initial Lead Capture
→ Free enrichment only (website scrape)
Stage 2: Email Opened (engagement signal)
→ Budget enrichment (Hunter.io)
Stage 3: Demo Requested
→ Premium enrichment (Clearbit)
Stage 4: Meeting Booked
→ Manual research by SDR
Strategy 4: Domain-Level Caching
Never enrich the same domain twice:
Before Any Enrichment:
↓
Check Cache:
SELECT * FROM enrichment_cache
WHERE domain = :domain
AND enriched_at > NOW() - INTERVAL 90 DAY
↓
If Cache Hit:
→ Apply cached data to all contacts at domain
→ Skip API calls entirely
Savings Example:
- 1000 leads/month
- Average 5 contacts per company (200 unique domains)
- Without caching: 1000 × $0.50 = $500
- With caching: 200 × $0.50 = $100
- Savings: 80%
Free Data Sources to Leverage
LinkedIn Company Pages (Public Data)
HTTP Request:
URL: https://www.linkedin.com/company/{{companySlug}}
Method: GET
Parse HTML for:
- Company size range ("51-200 employees")
- Industry
- Follower count
- Recent posts/activity
DNS/WHOIS Lookups (Free)
// DNS Module
const dns = require('dns');
const mxRecords = await dns.resolveMx(domain);
// Determine email provider
const emailProvider =
mxRecords.some(r => r.exchange.includes('google')) ? 'Google Workspace' :
mxRecords.some(r => r.exchange.includes('outlook')) ? 'Microsoft 365' :
'Other';
// Get nameservers (indicates tech sophistication)
const nsRecords = await dns.resolveNs(domain);
return { emailProvider, nameservers: nsRecords };
BuiltWith Alternative (Free Scraping)
// Detect technologies from website HTML
const techSignatures = {
'HubSpot': /_hsq.push|hs-analytics/,
'Salesforce': /sfdc.js|force.com/,
'Shopify': /cdn.shopify.com|Shopify.theme/,
'WordPress': /wp-content|wp-includes/,
'Google Analytics': /google-analytics.com\/analytics.js/,
'Segment': /cdn.segment.com|analytics.js/,
'Intercom': /widget.intercom.io/,
'Stripe': /js.stripe.com/,
'Mixpanel': /cdn.mxpnl.com/
};
const detectedTech = [];
for (const [tech, pattern] of Object.entries(techSignatures)) {
if (pattern.test(html)) {
detectedTech.push(tech);
}
}
return { technologies: detectedTech };
Google Maps/Places (Free with limits)
HTTP Request:
URL: https://maps.googleapis.com/maps/api/place/findplacefromtext/json
Query String:
input={{companyName}}
inputtype=textquery
fields=name,formatted_address,rating,user_ratings_total
key={{googleApiKey}}
Free Tier: 100,000 requests/month
Monitoring and Budget Controls
Daily Cost Tracking
// Make Data Store: Track Daily Spend
const today = new Date().toISOString().split('T')[0];
const currentSpend = await dataStore.get(`enrichment_cost_${today}`) || 0;
const newSpend = currentSpend + enrichmentCost;
await dataStore.set(`enrichment_cost_${today}`, newSpend);
// Check budget limit
if (newSpend > 100) { // $100 daily limit
await slack.post({
channel: '#revops-alerts',
text: `⚠️ Enrichment budget limit reached: $${newSpend}/$100`
});
// Pause scenario
await makeApi.pauseScenario(scenarioId);
}
return { dailySpend: newSpend, budgetRemaining: 100 - newSpend };
Cost Per Lead Tracking
Aggregator Module:
Track over 30 days:
- Total enrichment cost
- Total leads enriched
- Leads converted to SQL
- Revenue from enriched leads
Metrics:
- Cost per enriched lead
- Cost per SQL
- ROI (revenue / enrichment cost)
FAQ
Q: How can I enrich data without any budget? A: Focus on free sources: website scraping, DNS lookups, LinkedIn public data, and Google searches. You can get company name, rough employee count, industry, and tech stack for $0. Accuracy will be 70-80% vs. 95%+ with paid APIs, but it’s enough for initial qualification.
Q: Which budget API gives the best value? A: Hunter.io ($0.04/lookup) for B2B leads—great email patterns and org data. FullContact ($0.10) for consumer leads—better social profile coverage. Both offer 90%+ of what Clearbit provides at 5-10% of the cost.
Q: How often should I refresh enriched data? A: Consumer data: 180 days. SMB companies: 90 days. Enterprise: 60 days (they change faster). Only re-enrich if the contact re-engages or becomes an opportunity. Stale data is better than paying to refresh inactive leads.
Q: Should I enrich all contacts at a company or just the first one? A: Enrich once at the domain level, then apply firmographic data (company name, size, industry, tech stack) to all contacts. Only do person-level enrichment (title, seniority, department) for contacts who engage.
Q: How do I calculate ROI of enrichment? A: Track: (Revenue from enriched leads - Enrichment cost) / Enrichment cost. Good enrichment should show 10-20x ROI. If enriching $1000/month of leads drives $10K+ in pipeline, you’re profitable.
Q: What if free sources don’t provide enough data? A: Use progressive enrichment. Start with free sources for all leads. When a lead shows engagement (email open, website visit, demo request), escalate to budget APIs. Reserve premium enrichment for SQLs and opportunities only.
Q: How can I reduce enrichment costs without sacrificing quality? A: 1) Implement domain-level caching (80% savings), 2) Filter out personal emails before enrichment (40% savings), 3) Use lead scoring to skip low-value prospects (30% savings), 4) Start with free sources and only escalate when needed. Combined, these can reduce costs 90%+.
Budget-friendly enrichment in Make.com is about being strategic, not cheap. By combining free sources, caching, smart filtering, and progressive enrichment, you can build a data enrichment engine that delivers enterprise-quality data at startup-friendly prices.
Need Implementation Help?
Our team can build this integration for you in 48 hours. From strategy to deployment.
Get Started