Saltar al contenido

CrawlForge TeamEquipo de Ingeniería

10 min de lecturaActualizado

Construye un motor de lead enrichment con CrawlForge

Tu equipo de ventas recibe 200 leads nuevos por semana. Cada lead llega como un nombre, un correo y quizá un nombre de empresa. Antes de que un comercial pueda hacer un contacto con sentido, necesita investigar el tamaño de la empresa, su stack tecnológico, sus noticias recientes y su posible encaje. Esa investigación lleva de 10 a 15 minutos por lead: más de 30 horas a la semana dedicadas a Google y LinkedIn en lugar de a vender.

El lead enrichment automatiza esta investigación. CrawlForge hace scraping de datos públicos de negocio desde sitios web de empresas, perfiles sociales y fuentes de noticias para construir un perfil completo del lead en segundos. Esta guía te muestra cómo construir un motor de lead enrichment que procesa más de 200 leads por hora.

Tabla de contenidos

Qué es el lead enrichment

El lead enrichment es el proceso de complementar los datos básicos de un lead (nombre, correo, empresa) con información adicional que ayuda a los equipos de ventas a cualificar y priorizar prospectos. Los datos enriquecidos suelen incluir:

DatoFuenteValor para ventas
Tamaño de la empresaPágina "Quiénes somos"/equipoCualificación
SectorContenido del sitio webSegmentación
Stack tecnológicoAnálisis del código fuenteEncaje de producto
Noticias recientesResultados de búsquedaTemas para iniciar conversación
Estado de financiaciónNotas de prensaSeñales de presupuesto
Temas de contenidoAnálisis del blogMapeo de puntos de dolor

¿Qué es el lead enrichment? Es el proceso automatizado de añadir datos de inteligencia de negocio a los registros de leads en bruto, transformando una simple dirección de correo en un perfil completo de prospecto sobre el que los equipos de ventas pueden actuar de inmediato.

CrawlForge es ideal para equipos de lead enrichment que necesitan datos en tiempo real de los sitios web de las empresas, porque, a diferencia de los proveedores de bases de datos (ZoomInfo, Clearbit) que pueden estar desactualizados por semanas, CrawlForge hace scraping de páginas en vivo para obtener información actual.

Visión general de la arquitectura

El motor de enriquecimiento usa cinco herramientas de CrawlForge:

ComponenteHerramientaCreditsPropósito
Contenido del sitio webextract_content2Descripción y posicionamiento de la empresa
Metadatosextract_metadata1Título, descripción, perfiles sociales
Código fuente de la páginafetch_url1Detectar tecnologías a partir del HTML
Investigación de la empresasearch_web5Noticias recientes, financiación, redes sociales
Análisisanalyze_content3Clasificación de sector y temas

Paso 1: Análisis del sitio web de la empresa

Empieza extrayendo la información principal de la empresa desde su sitio web.

Typescript
import { Client } from '@modelcontextprotocol/sdk/client/index.js';

const client = new Client({
  name: 'lead-enrichment',
  version: '1.0.0',
});

interface CompanyProfile {
  domain: string;
  name: string;
  description: string;
  industry: string;
  topics: string[];
  socialLinks: {
    twitter?: string;
    linkedin?: string;
    github?: string;
  };
  estimatedSize: string;
}

async function analyzeCompanyWebsite(
  domain: string
): Promise<CompanyProfile> {
  // Extract main page content
  const contentResult = await client.callTool({
    name: 'extract_content',
    arguments: { url: `https://${domain}` },
  });

  const content = JSON.parse(contentResult.content[0].text);

  // Get metadata including social links
  const metaResult = await client.callTool({
    name: 'extract_metadata',
    arguments: { url: `https://${domain}` },
  });

  const meta = JSON.parse(metaResult.content[0].text);

  // Analyze content for industry and topics
  const analysis = await client.callTool({
    name: 'analyze_content',
    arguments: { text: content.content },
  });

  const analyzed = JSON.parse(analysis.content[0].text);

  // Try to get team page for company size estimation
  let estimatedSize = 'Unknown';
  try {
    const teamPage = await client.callTool({
      name: 'extract_content',
      arguments: { url: `https://${domain}/about` },
    });
    const teamContent = JSON.parse(teamPage.content[0].text);
    // Simple heuristic: count mentions of team-related terms
    const teamMentions = (teamContent.content.match(/team|employee|people|staff/gi) || []).length;
    if (teamMentions > 20) estimatedSize = '100+';
    else if (teamMentions > 10) estimatedSize = '50-100';
    else if (teamMentions > 5) estimatedSize = '10-50';
    else estimatedSize = '1-10';
  } catch {
    // About page might not exist; that is fine
  }

  return {
    domain,
    name: meta.title?.split(/[|\-]/)[0]?.trim() || domain,
    description: meta.description || analyzed.summary || '',
    industry: analyzed.topics?.[0] || 'Unknown',
    topics: analyzed.topics || [],
    socialLinks: {
      twitter: meta.twitterHandle,
      linkedin: meta.linkedinUrl,
      github: meta.githubUrl,
    },
    estimatedSize,
  };
}

Paso 2: Detección del stack tecnológico

Detecta las tecnologías que usa una empresa analizando el código fuente HTML y las cabeceras de su sitio web.

Typescript
interface TechStack {
  frontend: string[];
  analytics: string[];
  marketing: string[];
  infrastructure: string[];
  cms: string[];
}

async function detectTechStack(domain: string): Promise<TechStack> {
  const result = await client.callTool({
    name: 'fetch_url',
    arguments: {
      url: `https://${domain}`,
      timeout: 10000,
    },
  });

  const page = JSON.parse(result.content[0].text);
  const html = page.body || '';
  const headers = page.headers || {};

  const stack: TechStack = {
    frontend: [],
    analytics: [],
    marketing: [],
    infrastructure: [],
    cms: [],
  };

  // Frontend framework detection
  if (html.includes('__next') || html.includes('_next/static')) {
    stack.frontend.push('Next.js');
  }
  if (html.includes('__nuxt')) stack.frontend.push('Nuxt.js');
  if (html.includes('react')) stack.frontend.push('React');
  if (html.includes('vue')) stack.frontend.push('Vue.js');
  if (html.includes('tailwindcss') || html.includes('tailwind')) {
    stack.frontend.push('Tailwind CSS');
  }

  // Analytics detection
  if (html.includes('gtag') || html.includes('google-analytics')) {
    stack.analytics.push('Google Analytics');
  }
  if (html.includes('segment.com') || html.includes('analytics.js')) {
    stack.analytics.push('Segment');
  }
  if (html.includes('mixpanel')) stack.analytics.push('Mixpanel');
  if (html.includes('hotjar')) stack.analytics.push('Hotjar');

  // Marketing tools
  if (html.includes('hubspot')) stack.marketing.push('HubSpot');
  if (html.includes('intercom')) stack.marketing.push('Intercom');
  if (html.includes('drift')) stack.marketing.push('Drift');
  if (html.includes('mailchimp')) stack.marketing.push('Mailchimp');

  // Infrastructure
  const server = headers['server'] || headers['x-powered-by'] || '';
  if (server.includes('Vercel') || html.includes('vercel')) {
    stack.infrastructure.push('Vercel');
  }
  if (server.includes('cloudflare') || headers['cf-ray']) {
    stack.infrastructure.push('Cloudflare');
  }
  if (html.includes('amazonaws')) stack.infrastructure.push('AWS');

  // CMS
  if (html.includes('wp-content')) stack.cms.push('WordPress');
  if (html.includes('shopify')) stack.cms.push('Shopify');
  if (html.includes('webflow')) stack.cms.push('Webflow');

  return stack;
}

Esta detección se ejecuta con una sola llamada a fetch_url (1 credit), lo que la hace extremadamente rentable para el lead enrichment masivo.

Paso 3: Recopilación de inteligencia sobre la empresa

Usa search_web para encontrar noticias recientes, anuncios de financiación y contexto de mercado.

Typescript
interface CompanyIntel {
  recentNews: Array<{ title: string; url: string; snippet: string }>;
  fundingInfo: string;
  competitorMentions: string[];
}

async function gatherIntelligence(
  companyName: string,
  domain: string
): Promise<CompanyIntel> {
  // Search for recent company news
  const newsResult = await client.callTool({
    name: 'search_web',
    arguments: {
      query: `"${companyName}" OR "${domain}" news funding`,
      limit: 10,
      time_range: 'month',
    },
  });

  const news = JSON.parse(newsResult.content[0].text);

  return {
    recentNews: (news.results || []).slice(0, 5).map(
      (r: { title: string; url: string; snippet: string }) => ({
        title: r.title,
        url: r.url,
        snippet: r.snippet,
      })
    ),
    fundingInfo: news.results?.find(
      (r: { title: string }) =>
        r.title.toLowerCase().includes('funding') ||
        r.title.toLowerCase().includes('raises') ||
        r.title.toLowerCase().includes('series')
    )?.snippet || 'No recent funding news found',
    competitorMentions: news.results
      ?.filter((r: { title: string }) =>
        r.title.toLowerCase().includes('vs') ||
        r.title.toLowerCase().includes('alternative')
      )
      .map((r: { title: string }) => r.title) || [],
  };
}

Paso 4: Construir el pipeline de enriquecimiento

Combina todos los pasos de enriquecimiento en un único pipeline que procesa leads en masa.

Typescript
interface Lead {
  email: string;
  name: string;
  company?: string;
}

interface EnrichedLead extends Lead {
  companyProfile: CompanyProfile;
  techStack: TechStack;
  intelligence: CompanyIntel;
  enrichedAt: string;
  qualityScore: number;
}

function extractDomain(email: string): string {
  return email.split('@')[1];
}

function calculateLeadScore(enriched: Omit<EnrichedLead, 'qualityScore'>): number {
  let score = 0;

  // Company has a real website with content
  if (enriched.companyProfile.description.length > 50) score += 20;

  // Company uses modern tech stack (potential product fit)
  if (enriched.techStack.frontend.length > 0) score += 15;

  // Company uses analytics/marketing tools (signals budget)
  if (enriched.techStack.analytics.length > 0) score += 10;
  if (enriched.techStack.marketing.length > 0) score += 15;

  // Recent news/activity
  if (enriched.intelligence.recentNews.length > 0) score += 10;

  // Funding signals
  if (!enriched.intelligence.fundingInfo.includes('No recent')) score += 20;

  // Company size signals
  const size = enriched.companyProfile.estimatedSize;
  if (size === '50-100' || size === '100+') score += 10;

  return Math.min(score, 100);
}

async function enrichLeads(leads: Lead[]): Promise<EnrichedLead[]> {
  const enriched: EnrichedLead[] = [];

  for (const lead of leads) {
    const domain = lead.company
      ? lead.company.toLowerCase().replace(/\s+/g, '') + '.com'
      : extractDomain(lead.email);

    // Skip free email providers
    if (['gmail.com', 'yahoo.com', 'hotmail.com', 'outlook.com'].includes(domain)) {
      continue;
    }

    try {
      console.log(`Enriching ${lead.email} (${domain})...`);

      const companyProfile = await analyzeCompanyWebsite(domain);
      const techStack = await detectTechStack(domain);
      const intelligence = await gatherIntelligence(
        companyProfile.name,
        domain
      );

      const partial = {
        ...lead,
        companyProfile,
        techStack,
        intelligence,
        enrichedAt: new Date().toISOString(),
      };

      enriched.push({
        ...partial,
        qualityScore: calculateLeadScore(partial),
      });
    } catch (error) {
      console.error(`Failed to enrich ${lead.email}:`, error);
    }
  }

  // Sort by quality score (highest first)
  return enriched.sort((a, b) => b.qualityScore - a.qualityScore);
}

Análisis del coste en credits

Coste de enriquecimiento por lead:

OperaciónHerramientaCredits
Contenido del sitio webextract_content2
Página "Quiénes somos"extract_content2
Metadatosextract_metadata1
Detección de tecnologíasfetch_url1
Análisis de contenidoanalyze_content3
Búsqueda de noticiassearch_web5
Por lead14 credits

Coste mensual a escala:

VolumenCredits/mesPlan recomendado
50 leads/mes700Plan gratuito el primer mes (1.000 credits, una sola vez); después, un pack de 1.000 credits de $3 cada mes
200 leads/mes2.800Hobby ($19/mo, 5.000 credits)
1.000 leads/mes14.000Professional ($99/mo, 100.000 credits)
5.000 leads/mes70.000Professional ($99/mo, 100.000 credits)
25.000+ leads/mes350.000Business ($399/mo, 500.000 credits)

Resultados y beneficios

Un motor de lead enrichment con CrawlForge ofrece:

  • Velocidad: Enriquece un lead en 15-30 segundos en lugar de 10-15 minutos
  • Consistencia: Cada lead recibe la misma profundidad de investigación
  • Priorización: Las puntuaciones de calidad permiten a los comerciales centrarse primero en los leads de mayor valor
  • Eficiencia de costes: $0.07-0.13 por lead frente a $0.50-2.00 de los proveedores de bases de datos

En comparación con proveedores de bases de datos de enriquecimiento como Clearbit ($99/mo por 1.000 búsquedas) o ZoomInfo ($15.000+/año), CrawlForge ofrece datos actuales a una fracción del coste. La contrapartida es que CrawlForge hace scraping de datos en vivo (siempre actuales), mientras que las bases de datos proporcionan campos preestructurados (menos procesamiento necesario).

Preguntas frecuentes

¿Qué precisión tiene la detección del stack tecnológico a partir del HTML?

La detección basada en HTML capta las herramientas más populares con alta precisión (90 %+) para tecnologías del lado del cliente. Las tecnologías del lado del servidor son más difíciles de detectar. Para una detección completa, combina CrawlForge con datos de BuiltWith o Wappalyzer.

¿Puedo enriquecer leads de dominios de correo personales?

Los leads de gmail.com u outlook.com no tienen dominios de empresa que analizar. Para estos, usa search_web para encontrar sus perfiles profesionales a partir del nombre. Esto cuesta 5 credits por búsqueda en lugar del pipeline completo de 14 credits.

¿Cómo manejo el límite de velocidad al enriquecer en masa?

La herramienta batch_scrape de CrawlForge maneja el límite de velocidad automáticamente. Para llamadas individuales, añade un retraso de 500 ms entre solicitudes al mismo dominio. Procesa diferentes dominios en paralelo para obtener el máximo rendimiento.


Enriquece tus primeros 50 leads gratis. Empieza con 1.000 credits, suficientes para enriquecer por completo más de 70 leads sin necesidad de tarjeta de crédito.

Recursos relacionados:

Pruébalo tú mismo — sin necesidad de registrarte

Explora las 31 herramientas de scraping y extracción de CrawlForge en el playground y luego empieza gratis con 1,000 credits.

1,000 credits gratis • Por única vez • No se requiere tarjeta de crédito

Etiquetas

  • lead-enrichment
  • sales
  • web-scraping
  • automation
  • crm
  • b2b
  • mcp

Sobre el autor

CrawlForge Team

Equipo de Ingeniería

Construimos el MCP server de web scraping más completo. Creamos herramientas que ayudan a los desarrolladores a extraer, analizar y transformar datos web para aplicaciones de IA.

Newsletter

Mantente al día con los últimos artículos

Recibe tutoriales, novedades del producto y consejos de web scraping en tu bandeja de entrada.

Sin spam. Cancela tu suscripción cuando quieras.

Sigue leyendo

Artículos relacionados