make
data-enrichment
beginner

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.

40 minutes to implement Updated 11/4/2025

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