Article content and detailed guides remain in English. The selected language applies to controls and quick instructions.

Back to articles

Using Airtable for Email List Management and Campaign Tracking

On this page

Why Airtable for Email Management

Airtable sits between spreadsheets and full CRM platforms. It combines the flexibility of a spreadsheet with relational database features, making it useful for teams that need structured contact management without CRM complexity:

Strength Limitation
Relational tables link contacts, companies and campaigns No built-in email sending or sequences
Multiple views (grid, kanban, calendar, gallery, form) Free tier limited to 1,000 records per base
Built-in automations (triggers and actions) Automations limited by plan (25 per base on free tier)
Scripting extension for custom logic Scripting requires JavaScript knowledge
Interface Designer for custom dashboards Performance can slow above 50,000 records
Native integrations with Zapier, Make, n8n API rate limit of 5 requests per second
Forms for collecting contacts directly No native email verification
Rich field types (attachments, checkboxes, linked records) More expensive than Notion for larger teams
Sync tables across bases Data stays in Airtable; no offline access

Base Design

Contacts table

Field Field type Purpose Example values
Full Name Single line text (primary) Contact's name "Jane Smith"
Email Email Primary email address "jane@example.com"
Company Link to another record (Companies table) Associated company "Example Corp"
Job Title Single line text Current role "Director of Marketing"
Source Single select How you found them "LinkedIn", "Conference", "Website", "Referral"
Status Single select Pipeline stage "New", "Contacted", "Replied", "Meeting Set", "Won", "Lost"
Priority Single select Outreach priority "High", "Medium", "Low"
Last Contacted Date Most recent outreach date 2026-10-01
Next Follow-up Date Scheduled follow-up 2026-10-15
Email Verified Checkbox Whether the email has been verified Checked / unchecked
Tags Multiple select Categories and segments "Decision Maker", "Champion", "Blocker"
LinkedIn URL LinkedIn profile linkedin.com/in/janesmith
Phone Phone number Direct phone +1 555 0100
Notes Long text Conversation notes and context "Met at SaaStr. Budget approved for Q1."
Campaigns Link to another record (Campaigns table) Campaign membership "Q4 Enterprise Push"
Attachments Attachment Relevant files Business cards, proposals

Companies table

Field Field type Purpose Example values
Company Name Single line text (primary) Organisation name "Example Corp"
Domain URL Website example.com
Industry Single select Vertical "SaaS", "Healthcare", "Finance"
Employee Count Single select Company size range "1-50", "51-200", "201-1000", "1000+"
Annual Revenue Currency Estimated revenue $5,000,000
Contacts Link to another record (Contacts table) People at this company Linked contact records
ICP Score Rating (1-5) Ideal customer fit 4 out of 5
Location Single line text Headquarters "Austin, TX"
Notes Long text Company research "Series C; using competitor product"
Tech Stack Multiple select Known technologies "Salesforce", "Slack", "AWS"

Campaigns table

Field Field type Purpose Example values
Campaign Name Single line text (primary) Campaign identifier "Q4 SaaS VP Outreach"
Status Single select Campaign state "Draft", "Active", "Paused", "Complete"
Start Date Date Launch date 2026-10-01
End Date Date End date 2026-12-15
Contacts Link to another record (Contacts table) Enrolled contacts Linked records
Total Contacts Count (of Contacts link) Auto-counted 150
Contacted Count Count (filtered rollup) Contacts with status beyond "New" 80
Reply Rate Formula Replied / Contacted "15%"
Sequence Template Long text Email copy Template text
Channel Single select Outreach channel "Email", "LinkedIn", "Phone", "Multi-channel"
Owner Collaborator Team member responsible Team member

Email Log table (optional, for detailed tracking)

Field Field type Purpose Example values
Subject Single line text (primary) Email subject line "Quick question about [topic]"
Contact Link to another record (Contacts table) Who received this email "Jane Smith"
Campaign Link to another record (Campaigns table) Which campaign "Q4 SaaS VP Outreach"
Sent Date Date with time When the email was sent 2026-10-01 10:30 AM
Step Number Sequence step number 1, 2, 3
Status Single select Email outcome "Sent", "Opened", "Replied", "Bounced"
Reply Summary Long text Summary of their reply "Interested; wants demo next week"

Views for Email Workflows

Contact views

View name View type Filters and groups Use case
All Contacts Grid None Master data view
Follow-up Today Grid Next Follow-up = today Daily task list
Overdue Grid Next Follow-up is before today, Status is not "Won" or "Lost" Missed follow-ups
Pipeline Board Kanban (by Status) Exclude "Lost" Visual pipeline tracking
By Company Grid, grouped by Company None Account-based view
New Leads Grid Status = "New" Contacts needing first outreach
High Priority Grid Priority = "High" Focus on top targets
By Source Kanban (by Source) None Channel performance view
Needs Verification Grid Email Verified = unchecked Contacts to verify
Calendar Calendar (by Next Follow-up) Status not "Won" or "Lost" Schedule view

Campaign views

View name View type Use case
Active Campaigns Grid, filtered Status = "Active" Current campaigns
Campaign Board Kanban (by Status) Campaign pipeline
Timeline Timeline (Start to End Date) Campaign schedule

Automations

Built-in Airtable automations

Automation Trigger Action Use case
Follow-up reminder When Next Follow-up = today Send Slack message or email notification Never miss a follow-up
New lead notification When record created in Contacts Send Slack message to sales channel Instant awareness of new leads
Status change alert When Status changes to "Replied" Send notification to contact owner Know when prospects respond
Overdue escalation When Next Follow-up is 3+ days past Send email to manager Escalate stale leads
Campaign assignment When Contact tags include "Enterprise" Add to "Enterprise Campaign" link Auto-segment contacts
Welcome sequence trigger When record created via form Send welcome email via SendGrid or Mailchimp integration Automated first touch

Scripting extension examples

// Script: Flag contacts not contacted in 30+ days
const contactsTable = base.getTable('Contacts');
const query = await contactsTable.selectRecordsAsync({
    fields: [
        'Full Name',
        'Last Contacted',
        'Status',
        'Tags'
    ]
});

const thirtyDaysAgo = new Date();
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);

const staleContacts = query.records.filter(record => {
    const lastContacted = record.getCellValue(
        'Last Contacted'
    );
    const status = record.getCellValue('Status');
    return (
        lastContacted &&
        new Date(lastContacted) < thirtyDaysAgo &&
        status &&
        status.name !== 'Won' &&
        status.name !== 'Lost'
    );
});

output.markdown(
    `## Stale Contacts (30+ days)\n` +
    `Found ${staleContacts.length} contacts.\n\n`
);

for (const record of staleContacts) {
    const name = record.getCellValueAsString('Full Name');
    const lastDate = record.getCellValueAsString(
        'Last Contacted'
    );
    output.markdown(`- **${name}** -- last contacted ${lastDate}`);
}
// Script: Extract email domains and count by domain
const contactsTable = base.getTable('Contacts');
const query = await contactsTable.selectRecordsAsync({
    fields: ['Email']
});

const domainCounts = {};
for (const record of query.records) {
    const email = record.getCellValue('Email');
    if (email) {
        const domain = email.split('@')[1];
        if (domain) {
            domainCounts[domain] =
                (domainCounts[domain] || 0) + 1;
        }
    }
}

const sorted = Object.entries(domainCounts)
    .sort((a, b) => b[1] - a[1])
    .slice(0, 20);

output.markdown('## Top 20 Email Domains\n');
output.table(
    sorted.map(([domain, count]) => ({
        Domain: domain,
        Count: count
    }))
);

Integrations with Email Tools

Direct integrations

Integration What it does How to connect
Mailchimp Sync contacts to Mailchimp audiences Airtable Mailchimp integration (built-in)
SendGrid Trigger transactional emails from automations Airtable SendGrid integration
Gmail / Outlook Log sent emails; auto-create contact records Via Zapier or Make
Slack Notifications for pipeline changes Airtable Slack integration (built-in)

Via Zapier / Make / n8n

Workflow Trigger Action Platform
New form submission to Airtable Typeform / Google Form / Tally submission Create Airtable record Zapier, Make
Airtable to cold email tool New Airtable record with tag "Outreach" Add to Instantly / Lemlist / Smartlead sequence Zapier, Make
Email reply to Airtable Reply received in Gmail / cold email tool Update Airtable Status to "Replied" Zapier, Make
Calendar booking to Airtable Calendly / Cal.com booking Update Airtable Status to "Meeting Set" Zapier, Make
CRM sync Airtable record reaches "Won" status Create deal in HubSpot / Pipedrive Zapier, Make

Airtable API for bulk operations

import requests
import time

AIRTABLE_TOKEN = 'YOUR_PERSONAL_ACCESS_TOKEN'
BASE_ID = 'YOUR_BASE_ID'
TABLE_NAME = 'Contacts'

HEADERS = {
    'Authorization': f'Bearer {AIRTABLE_TOKEN}',
    'Content-Type': 'application/json'
}

def create_contacts(contacts):
    """Create multiple contacts in Airtable.

    Airtable accepts up to 10 records per request.
    """
    url = (
        f'https://api.airtable.com/v0/'
        f'{BASE_ID}/{TABLE_NAME}'
    )
    results = []

    # Batch into groups of 10
    for i in range(0, len(contacts), 10):
        batch = contacts[i:i + 10]
        records = []
        for contact in batch:
            records.append({
                'fields': {
                    'Full Name': contact['name'],
                    'Email': contact['email'],
                    'Source': contact.get('source', 'Import'),
                    'Status': 'New',
                    'Email Verified': False
                }
            })

        response = requests.post(
            url,
            headers=HEADERS,
            json={'records': records},
            timeout=30
        )
        results.extend(
            response.json().get('records', [])
        )
        time.sleep(0.25)  # Rate limit: 5 req/sec

    return results

Airtable vs Alternatives for Email Management

Feature Airtable Notion Google Sheets HubSpot Free CRM
Relational data Yes (linked records) Yes (relations) No (VLOOKUP workarounds) Yes (associations)
Views Grid, kanban, calendar, gallery, form, timeline Table, board, calendar, gallery Sheet only (filter views) Table, board, list
Automations Yes (25+ on free) Limited No (needs Apps Script) Yes (workflows)
Forms Yes (built-in) No (needs integration) Yes (Google Forms) Yes (built-in)
API Yes (REST API) Yes (REST API) Yes (Sheets API) Yes (REST API)
Free tier records 1,000 per base Unlimited blocks Unlimited rows 1,000,000 contacts
Paid pricing $20/user/month (Team) $12/user/month (Plus) Free (Google Workspace from $7/user) Free; paid from $20/month
Best for Structured workflows; mid-complexity Flexible docs + databases Simple lists; formulas Actual CRM features

When to Upgrade from Airtable

Signal Upgrade to
More than 50,000 contacts CRM (HubSpot, Salesforce) or dedicated database
Need built-in email sending and tracking Sales engagement (Outreach, Salesloft) or cold email (Instantly, Smartlead)
Need automated multi-step sequences Cold email platform or marketing automation
Complex reporting and forecasting CRM with built-in analytics
Team exceeds 10 people on outreach CRM with territory management and permissions
Need phone dialling integration Sales engagement platform

Importing Contacts into Airtable

Before importing contacts into Airtable, consolidate and clean your source data. Upload contact files from various sources (CSV exports from other tools, HTML pages from directories, XLSX files from event registrations, PDF attendee lists) to Email Extractor to extract and deduplicate email addresses. Download the cleaned list as CSV, then import into Airtable (Add or import data > CSV file). Deduplicating before import prevents creating duplicate records in your base, which is especially important given Airtable's record limits on lower-tier plans.

Extract emails

Explore tools

Verify emails

Check address validity before using your list.

ZeroBounce

Email Verification

Verifies email lists and provides tools for monitoring deliverability.

Useful when list cleaning and sender health belong in one workflow.

Explore ZeroBounce (opens in a new tab)