VendorStacks
← All posts
GTM8 min read

Tech Stack Lookup API: Layering Vendor Signals with Firmographic Data for Better Lead Scoring

How to combine tech stack data from VendorStacks with firmographic attributes to build multi-dimensional lead scoring models that outperform single-signal approaches.

Stax
VendorStacks research desk

The Problem with Single-Signal Lead Scoring

Most B2B lead scoring models rely on a single data dimension: firmographics (employee count, industry, revenue) OR technographics (vendor usage) OR engagement signals (email opens, site visits). This creates brittle models that miss critical context.

A 500-person fintech company looks identical to a 500-person logistics company in a firmographic-only model, even though their buying behavior and technology needs differ completely. Similarly, knowing a company uses Stripe tells you nothing about whether they're the right size or industry for your product.

The highest-performing lead scoring models layer multiple signals: firmographic attributes (size, industry, funding) combined with technographic data (vendor stack composition) to create compound qualification rules that reflect real buying patterns.

This guide shows how to build these multi-dimensional models using VendorStacks' tech stack lookup API combined with standard firmographic data sources.

Why Tech Stack + Firmographics Outperforms Either Alone

Tech stack data answers "what tools do they use?" Firmographic data answers "who are they?" The combination answers "are they a qualified buyer?"

Consider three companies that all use Stripe (one of 169 companies in our index using Stripe):

  • Company A: 15 employees, pre-seed, uses Stripe + generic shared hosting
  • Company B: 200 employees, Series B, uses Stripe + AWS + Snowflake + Salesforce
  • Company C: 1,200 employees, public, uses Stripe + custom infrastructure + enterprise tools

A tech-stack-only model scores all three identically ("uses Stripe = qualified"). A firmographic-only model might score Company C highest based purely on size. But if you sell developer tools for mid-market payment companies, Company B is your ideal customer profile.

Layering the signals lets you write rules like: "200-500 employees AND Series A/B AND uses (Stripe OR payment vendor) AND uses (AWS OR GCP) AND does NOT use enterprise sales tools" — which isolates growth-stage companies building their own payment infrastructure.

Building a Layered Scoring Model: Implementation Pattern

Here's a practical implementation using VendorStacks for tech stack detection combined with a firmographic data source:

import requests

def score_lead(domain, firmographic_data):
    """
    firmographic_data expected shape:
    {
      'employees': int,
      'funding_stage': str,  # 'seed', 'series_a', 'series_b', etc.
      'industry': str,
      'founded_year': int
    }
    """
    score = 0
    signals = {}
    
    # Fetch tech stack
    headers = {'Authorization': 'Bearer vr_live_your_key_here'}
    response = requests.get(
        f'https://api.vendorstacks.com/v1/check?url={domain}',
        headers=headers
    )
    
    if response.status_code != 200:
        return {'score': 0, 'signals': {}, 'error': 'tech_stack_lookup_failed'}
    
    data = response.json()
    
    if not data.get('found'):
        # No tech stack evidence found - still score on firmographics
        signals['tech_stack_status'] = 'no_public_evidence'
    else:
        vendor_stack = data.get('vendor_stack', {})
        
        # Signal 1: Cloud infrastructure maturity
        cloud_vendors = vendor_stack.get('cloud_infra', [])
        if 'AWS' in cloud_vendors or 'Google Cloud' in cloud_vendors:
            score += 20
            signals['cloud_infra'] = 'modern'
        
        # Signal 2: Data infrastructure sophistication
        data_vendors = vendor_stack.get('analytics_data', [])
        db_vendors = vendor_stack.get('database_infra', [])
        if 'Snowflake' in data_vendors or len(db_vendors) > 0:
            score += 15
            signals['data_infra'] = 'advanced'
        
        # Signal 3: Payment processing (for fintech ICP)
        payment_vendors = vendor_stack.get('payments', [])
        if 'Stripe' in payment_vendors:
            score += 25
            signals['payments'] = 'stripe'
        
        # Signal 4: Modern sales stack
        crm_vendors = vendor_stack.get('crm_sales', [])
        if 'Salesforce' in crm_vendors:
            score += 10
            signals['crm'] = 'salesforce'
        elif 'HubSpot' in crm_vendors:
            score += 5
            signals['crm'] = 'hubspot'
        
        # Signal 5: AI/ML adoption (emerging tech indicator)
        ai_vendors = vendor_stack.get('ai_ml', [])
        if 'OpenAI' in ai_vendors:
            score += 15
            signals['ai_adoption'] = 'openai'
    
    # Firmographic scoring
    employees = firmographic_data.get('employees', 0)
    
    # Size scoring (targeting 100-500 employee range)
    if 100 <= employees <= 500:
        score += 30
        signals['size_fit'] = 'ideal'
    elif 50 <= employees < 100 or 500 < employees <= 1000:
        score += 15
        signals['size_fit'] = 'acceptable'
    else:
        signals['size_fit'] = 'outside_range'
    
    # Funding stage (targeting growth-stage)
    funding_stage = firmographic_data.get('funding_stage', '').lower()
    if funding_stage in ['series_a', 'series_b']:
        score += 20
        signals['funding_fit'] = 'ideal'
    elif funding_stage in ['series_c', 'seed']:
        score += 10
        signals['funding_fit'] = 'acceptable'
    
    # Industry fit
    industry = firmographic_data.get('industry', '').lower()
    target_industries = ['fintech', 'financial services', 'payments', 'saas']
    if any(t in industry for t in target_industries):
        score += 15
        signals['industry_fit'] = 'target'
    
    return {
        'score': score,
        'signals': signals,
        'max_score': 150,
        'grade': 'A' if score >= 100 else 'B' if score >= 70 else 'C' if score >= 40 else 'D'
    }

This model creates a 150-point scale where tech stack signals contribute up to 85 points and firmographics contribute up to 65 points. The weighting reflects that either dimension alone is insufficient.

Compound Rules: Tech Stack Patterns as ICP Indicators

The most powerful scoring rules look for vendor combinations, not individual tools. Our index includes 1,000 companies across 284 distinct vendors — enough to identify meaningful patterns.

For example, if you sell to growth-stage B2B SaaS companies, you might look for:

def detect_growth_stage_saas_pattern(vendor_stack):
    """Returns True if tech stack suggests growth-stage B2B SaaS company"""
    
    # Must have modern cloud infrastructure
    has_cloud = bool(
        vendor_stack.get('cloud_infra') and 
        any(v in vendor_stack['cloud_infra'] for v in ['AWS', 'Google Cloud'])
    )
    
    # Must have data infrastructure (suggests data-driven operation)
    has_data_infra = bool(
        vendor_stack.get('analytics_data') or 
        vendor_stack.get('database_infra')
    )
    
    # Must have CRM but NOT enterprise-heavy tools (suggests growth, not enterprise)
    has_growth_crm = 'HubSpot' in vendor_stack.get('crm_sales', [])
    has_enterprise_crm = 'Salesforce' in vendor_stack.get('crm_sales', [])
    
    # Observability suggests engineering maturity
    has_observability = bool(vendor_stack.get('observability'))
    
    # Pattern: cloud + data + growth CRM + observability, without heavy enterprise tools
    return (
        has_cloud and 
        has_data_infra and 
        (has_growth_crm or has_enterprise_crm) and 
        has_observability and
        not has_enterprise_crm  # Growth-stage typically not on Salesforce yet
    )

Combine this with firmographic constraints (Series A/B, 50-300 employees) to isolate your exact ICP.

Practical Use Case: Enriching Inbound Leads

When a lead fills out a form on your website, you typically capture email and company domain. Here's how to enrich that minimal input with layered scoring:

def enrich_and_score_inbound_lead(email, domain):
    # Step 1: Fetch tech stack
    tech_stack_response = requests.get(
        f'https://api.vendorstacks.com/v1/check?url={domain}',
        headers={'Authorization': 'Bearer vr_live_your_key_here'}
    )
    
    vendor_stack = {}
    if tech_stack_response.status_code == 200:
        data = tech_stack_response.json()
        if data.get('found'):
            vendor_stack = data.get('vendor_stack', {})
    
    # Step 2: Fetch firmographics from your preferred source
    # (Clearbit, ZoomInfo, your own database, etc.)
    firmographic_data = fetch_firmographics(domain)  # Your implementation
    
    # Step 3: Combined scoring
    lead_score = score_lead(domain, firmographic_data)
    
    # Step 4: Route based on combined score
    if lead_score['grade'] in ['A', 'B']:
        route_to_sales(email, lead_score)
    else:
        route_to_nurture(email, lead_score)
    
    return lead_score

The tech stack lookup costs 1 credit only if the company is found in the index or successfully scanned. If the domain is already indexed (check /v1/company/{domain} first), the lookup completes in under 1 second. Unindexed domains trigger a live scan (15-90 seconds).

Handling Missing Tech Stack Data

Not every company will have public tech stack evidence. The VendorStacks API returns "found": false when no evidence is located — this does NOT mean the company uses nothing, only that no public evidence was found.

In your scoring model, treat missing tech stack data as a neutral signal, not a disqualifier:

if not data.get('found'):
    # Don't penalize - just score on firmographics alone
    # A private company with no public vendor evidence might still be qualified
    tech_stack_score = 0
else:
    # Score based on detected vendors
    tech_stack_score = calculate_tech_score(data['vendor_stack'])

total_score = tech_stack_score + firmographic_score

This prevents you from filtering out qualified leads who simply have less public evidence (common in stealth-mode startups or enterprise companies with private infrastructure).

Balancing Credit Usage in Multi-Signal Models

Since VendorStacks charges 1 credit per successful lookup, consider checking your firmographic data first to avoid spending credits on leads that are already disqualified:

def efficient_layered_scoring(domain, firmographic_data):
    # Quick firmographic pre-filter
    if firmographic_data['employees'] < 50 or firmographic_data['employees'] > 1000:
        return {'score': 0, 'reason': 'outside_size_range', 'credits_used': 0}
    
    # Only fetch tech stack if firmographics pass minimum threshold
    tech_stack_data = fetch_tech_stack(domain)  # Costs 1 credit if found
    
    return calculate_combined_score(tech_stack_data, firmographic_data)

This pattern is especially useful when processing large lists where many leads won't meet basic criteria.

Real-World Scoring Thresholds

Based on the 1,000 companies in our index, here are realistic vendor detection rates to inform your scoring expectations:

  • Common vendors (Google Analytics: 305 companies, AWS: 215 companies): Detecting these is less signal-rich because they're widespread. Weight them lower.
  • Category-specific vendors (Stripe: 169 companies, Snowflake: 72 companies): Strong signals for specific ICPs (fintech, data-driven companies). Weight higher.
  • Emerging tech (OpenAI: 98 companies): Indicates early adoption, technical sophistication. Weight higher if targeting innovative companies.

Adjust your scoring thresholds based on what percentage of qualified leads you expect to have tech stack evidence. If 60% of your ICP has no public vendor evidence, set your firmographic scoring high enough that leads can qualify without tech signals.

Implementation Checklist

To build a production-ready layered scoring model:

  1. Define your ICP across both dimensions (firmographic AND technographic)
  2. Identify which vendor combinations correlate with your best customers
  3. Set up efficient data fetching (firmographic pre-filter → tech stack lookup)
  4. Weight signals based on your actual conversion data, not assumptions
  5. Handle missing tech stack data gracefully (neutral, not disqualifying)
  6. Monitor credit usage and optimize for high-value lookups only
  7. A/B test scoring thresholds against actual sales outcomes

The VendorStacks API makes the tech stack dimension trivial to add — the hard work is in tuning the model to your specific ICP and conversion patterns.

Conclusion

Single-signal lead scoring models — whether firmographic-only or technographic-only — leave money on the table. The companies that convert best typically show strong signals across BOTH dimensions.

By layering tech stack data from VendorStacks with firmographic attributes, you build scoring models that reflect the actual complexity of B2B buyer profiles: a growth-stage fintech company on modern infrastructure is fundamentally different from a similar-sized company in a different industry with legacy tools, even if their employee counts match.

The VendorStacks API provides the tech stack dimension at 1 credit per successful lookup, with sub-second response times for indexed companies. Combined with any standard firmographic data source, you can build multi-dimensional models that outperform single-signal approaches — without the complexity of maintaining your own web scraping infrastructure.

Start with GET /v1/check?url=DOMAIN to fetch a company's vendor stack, layer it with your existing firmographic data, and tune the weights based on your conversion data. The result is a scoring model that actually predicts who will buy.

About the author

Stax is the pangolin who fronts the VendorStacks research desk — a fitting mascot for a company that reads layered stacks for a living. Posts under this byline are written by the VendorStacks team.

VendorStacks is the subprocessor disclosure data API — structured vendor stacks with quoted evidence, 25 free credits to start.

Get an API key