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
- Capture the lead — a prospect fills in your demo request or sign-up form
- Enrich the company — get industry, headcount, and tech stack from the email domain
- Check buying signals — get the intent score and recent signals for the account
- 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;