A
ApiOne
/Docs

How to build a GTM workflow with ApiOne

This guide shows sales and marketing teams how to use company enrichment and signal detection to qualify inbound leads, score accounts by intent, and trigger outreach at the right moment. The result is a fully automated lead enrichment and routing pipeline that runs on every new form submission.

The GTM enrichment pipeline

  1. Capture the lead — a prospect fills in your demo request or sign-up form
  2. Enrich the company — get industry, headcount, and tech stack from the email domain
  3. Check buying signals — get the intent score and recent signals for the account
  4. Score and route — high-intent leads go directly to sales; low-intent leads enter nurture

Step 1 — Capture the lead and extract the domain

// In your form submission webhook handler (Express example)
app.post('/webhooks/form-submission', async (req, res) => {
  res.sendStatus(200);

  const { email, company, name } = req.body;
  const domain = email.split('@')[1];

  // Skip personal email domains
  const personalDomains = ['gmail.com', 'yahoo.com', 'hotmail.com', 'outlook.com'];
  if (personalDomains.includes(domain)) {
    await addToNurture({ email, name, reason: 'personal_email' });
    return;
  }

  await processLead({ email, name, domain });
});

Step 2 — Enrich the company

async function enrichCompany(domain) {
  const response = await fetch('https://apione.store/api/v1/companies/enrich', {
    method: 'POST',
    headers: {
      'X-API-Key': process.env.APIONE_API_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ domain }),
  });
  const result = await response.json();
  return result.status === 'success' ? result.data : null;
}

Step 3 — Check buying signals

async function getSignals(domain) {
  const response = await fetch('https://apione.store/api/v1/signals/news', {
    method: 'POST',
    headers: {
      'X-API-Key': process.env.APIONE_API_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ domain }),
  });
  const result = await response.json();
  return result.status === 'success' ? result.data : null;
}

Step 4 — Score and route the lead

async function processLead({ email, name, domain }) {
  // Run enrichment and signals in parallel
  const [company, signals] = await Promise.all([
    enrichCompany(domain),
    getSignals(domain),
  ]);

  if (!company) {
    await addToNurture({ email, name, reason: 'no_company_data' });
    return;
  }

  // Build lead score
  let score = 0;

  // Company size scoring
  const headcount = parseInt(company.employee_count?.split('-')[0] || '0');
  if (headcount >= 500) score += 30;
  else if (headcount >= 100) score += 20;
  else if (headcount >= 10) score += 10;

  // Industry fit scoring (adjust for your ICP)
  const highFitIndustries = ['Financial Technology', 'SaaS', 'E-commerce', 'Healthcare Technology'];
  if (highFitIndustries.includes(company.industry)) score += 25;

  // Intent score
  if (signals?.intent_score >= 70) score += 30;
  else if (signals?.intent_score >= 40) score += 15;

  // Hiring trend
  if (signals?.hiring_trend === 'growing') score += 15;

  console.log(`Lead score for ${domain}: ${score}`);

  // Route based on score
  if (score >= 60) {
    await routeToSales({ email, name, company, signals, score });
  } else {
    await addToNurture({ email, name, company, score });
  }
}

Step 5 — Route high-intent leads to sales

async function routeToSales({ email, name, company, signals, score }) {
  // Create lead in Salesforce/HubSpot
  await createCRMLead({
    email,
    name,
    company: company.company_name,
    industry: company.industry,
    headcount: company.employee_count,
    techStack: company.tech_stack?.join(', '),
    intentScore: signals?.intent_score,
    leadScore: score,
    assignTo: '[email protected]',
  });

  // Send Slack notification to sales
  await sendSlackAlert({
    channel: '#hot-leads',
    text: `🔥 High-intent lead: ${name} from ${company.company_name} (score: ${score})`,
  });
}
Credit estimate: Each lead processed costs 5 (company enrichment) + 4 (signal detection) = 9 credits. A Growth plan (25,000 credits/month) supports enriching approximately 2,700 leads per month.

Adding tech stack filtering to your ICP

If your product integrates with specific tools, use the tech stack detection endpoint to filter leads by technology:

async function checkTechFit(domain, requiredTech) {
  const response = await fetch('https://apione.store/api/v1/tech/detect', {
    method: 'POST',
    headers: { 'X-API-Key': process.env.APIONE_API_KEY, 'Content-Type': 'application/json' },
    body: JSON.stringify({ domain }),
  });
  const result = await response.json();
  if (result.status !== 'success') return false;

  const techNames = result.data.technologies.map(t => t.name.toLowerCase());
  return requiredTech.some(t => techNames.includes(t.toLowerCase()));
}

// Only route to sales if they use Salesforce
const usesSalesforce = await checkTechFit(domain, ['Salesforce']);
if (usesSalesforce) score += 20;

Related