Skip to main content

Contacts Table

The contacts table contains individual person records with professional contact information and email verification data. This is the primary table for building prospect lists, outbound campaigns, and enrichment workflows.

Quick stats

MetricValue
Total recordsTODO
Verified emailsTODO
Update frequencyTODO
Primary keycontact_id
Main foreign keycompany_id → companies.company_id

Data dictionary & fill rates

Identifiers

FieldTypeFill rateDescription
contact_idVARCHAR100%Unique RevenueBase identifier for this contact
company_idVARCHARTODO%Foreign key to companies table
linkedin_urlVARCHARTODO%Personal LinkedIn profile URL

Name & demographics

FieldTypeFill rateDescription
first_nameVARCHARTODO%First name
last_nameVARCHARTODO%Last name
full_nameVARCHARTODO%Combined full name
genderVARCHARTODO%Inferred gender: male, female, unknown
location_cityVARCHARTODO%Contact’s city (may differ from company HQ)
location_stateVARCHARTODO%Contact’s state/province
location_countryVARCHARTODO%Contact’s country (ISO 2-letter code)

Professional info

FieldTypeFill rateDescription
titleVARCHARTODO%Current job title
seniority_levelVARCHARTODO%Normalized seniority: c_suite, vp, director, manager, senior, entry, other
departmentVARCHARTODO%Functional department: engineering, sales, marketing, finance, hr, operations, legal, other
title_roleVARCHARTODO%Normalized role from title (e.g., ceo, cto, vp_sales, sdr)

Contact information

FieldTypeFill rateDescription
emailVARCHARTODO%Primary professional email address
email_verifiedBOOLEANTODO%Whether the email has passed verification
verification_statusVARCHARTODO%Detailed status: valid, invalid, catch_all, unknown, disposable
last_verified_atTIMESTAMPTODO%When the email was most recently verified
bounce_riskVARCHARTODO%Deliverability risk: low, medium, high
direct_phoneVARCHARTODO%Direct dial phone number
mobile_phoneVARCHARTODO%Mobile phone number

Company context (denormalized)

These fields are copied from the companies table for convenience. For the full set of company attributes, join to companies on company_id — or use the People + Companies pre-joined table.
FieldTypeFill rateDescription
company_nameVARCHARTODO%Company name (from companies table)
company_domainVARCHARTODO%Company primary domain
company_industryVARCHARTODO%Company industry
company_employee_countINTEGERTODO%Company employee count

Metadata

FieldTypeFill rateDescription
created_atTIMESTAMP100%When this record was first added
updated_atTIMESTAMP100%When this record was last modified
data_sourceVARCHARTODO%Primary data source for this record
Fill rates are approximate and vary by segment. Contacts at larger, US-based companies tend to have higher fill rates for direct dials, seniority, and department. International and SMB records may have lower fill rates on some fields.

Understanding verification fields

verification_statusWhat it meansSafe to send?
validEmail confirmed deliverable via SMTP verification✅ Yes
invalidEmail confirmed undeliverable❌ No
catch_allDomain accepts all emails — specific address unverifiable⚠️ Proceed with caution
unknownVerification inconclusive (server timeout, etc.)⚠️ Proceed with caution
disposableTemporary / throwaway email address❌ No
For the safest outbound sends, filter on verification_status = 'valid' AND last_verified_at >= DATEADD(day, -30, CURRENT_DATE()). This gives you recently verified, confirmed-deliverable addresses.

Example queries

Build a prospect list

SELECT
    first_name,
    last_name,
    email,
    title,
    seniority_level,
    company_name,
    company_employee_count
FROM contacts
WHERE email_verified = TRUE
  AND seniority_level IN ('c_suite', 'vp', 'director')
  AND department IN ('engineering', 'sales')
  AND company_industry = 'Software'
  AND company_employee_count BETWEEN 100 AND 1000
ORDER BY last_verified_at DESC
LIMIT 500;

Check fill rates yourself

SELECT
    COUNT(*) as total_records,
    ROUND(COUNT(email) * 100.0 / COUNT(*), 1) as email_fill_pct,
    ROUND(COUNT(CASE WHEN email_verified THEN 1 END) * 100.0 / COUNT(*), 1) as verified_pct,
    ROUND(COUNT(direct_phone) * 100.0 / COUNT(*), 1) as phone_fill_pct,
    ROUND(COUNT(title) * 100.0 / COUNT(*), 1) as title_fill_pct,
    ROUND(COUNT(seniority_level) * 100.0 / COUNT(*), 1) as seniority_fill_pct,
    ROUND(COUNT(department) * 100.0 / COUNT(*), 1) as department_fill_pct
FROM contacts;