The journey from spreadsheet to real contact system happens the same way for every small business. Someone starts a Google Sheet with names and emails. It works for a year. Then there are 800 contacts, half of them duplicated, nobody remembers when they last spoke to person X, and the team has started passing around different copies of the file. That's the cue.
A full CRM is overkill for most of these situations. What you usually need is a clean relational contact list — contacts linked to companies, an activity log, tags that make segmentation possible, and integrations with the email tools you already use. Airtable handles this well and lets you grow into more sophisticated workflows over time.
What This Is Not
This guide is not a CRM build-out. We have a separate tutorial for building a CRM in Airtable that covers deals, pipelines, and revenue forecasting.
This guide is for the more common case: contact management without sales pipeline tracking. Solo consultants who want to remember the last time they spoke to each contact. Agencies that need to know which client a contact works at. Independent operators who need a relationship database, not a deal tracker.
The schema is simpler, the integrations are lighter, and most teams can build the whole thing in an afternoon.
The Schema
Four tables, in order of importance.
Contacts (the heart of the system)
- Name (primary)
- Email (single-line text, unique)
- Phone
- Company (linked → Companies)
- Role / Title
- City, Country
- Tags (multi-select)
- Stage (single-select: Cold / Warm / Active / Inactive)
- Owner (collaborator)
- Source (single-select: Referral / Website / Conference / LinkedIn / Cold / Other)
- Notes (long text)
- LinkedIn URL
- Last Activity Date (rollup from Activities — see below)
- Next Reminder (date, optional)
Companies
- Name (primary)
- Domain (single-line text — useful for matching email addresses to companies)
- Industry (single-select)
- Size (single-select: Solo / 2-10 / 11-50 / 51-200 / 200+)
- Notes
- Contacts (auto-populated from the reverse link)
- Total Contacts (count rollup)
Activities (the communication log)
- Summary (primary)
- Contact (linked → Contacts, can be many)
- Type (single-select: Email / Call / Meeting / Note / DM)
- Direction (single-select: Inbound / Outbound)
- Date
- Content (long text — what was discussed)
- Created By (collaborator)
Tags (optional, only if you have many)
- Name (primary)
- Description
- Color
For the relational patterns, see Linked Records Explained.
The Activities table is the most underused piece in most setups. People model contacts and companies, then forget that the actual value of a contact system is knowing when you last spoke to someone and what about. Activities provide that. Skip it and you're back to a spreadsheet with extra steps.
Why Email Is the Unique Identifier
In a properly set up contact system, email address is the unique identifier. Names duplicate easily (John Smith vs Jon Smith vs J. Smith), phone numbers change, but a person's primary work email is stable enough to use as a key.
Two consequences:
- Every contact should have an email. Records without one are flagged for cleanup.
- New-contact creation always checks email first to prevent duplicates.
Build a formula field called Email Domain to extract the domain from the email address:
RIGHT({Email}, LEN({Email}) - FIND('@', {Email}))
Then a Make scenario can use the domain to auto-link Contacts to Companies — if the domain matches a Company's Domain field, link them automatically.
Setting Up the Activities Log
The Activities table is where the system becomes more than a contact list.
Every meaningful interaction creates an Activity:
- Email sent or received → Activity (Type: Email, Direction set)
- Call had → Activity (Type: Call)
- Meeting → Activity (Type: Meeting)
- Quick note about the person → Activity (Type: Note)
For each Contact, the Activities link gives you a chronological feed. A rollup on the Contact pulls the most recent Activity's date — that's the Last Activity Date field. Sorting your Contacts by Last Activity Date descending shows you who you've engaged with recently and who's gone cold.
The rollup formula on Last Activity Date:
- Aggregation: MAX
- Source field: Activities Date
A second rollup, Activity Count, gives you the number of touches per contact. Combined with Stage and Last Activity, you have everything you need for relationship maintenance.
Email Sync via Make
The cleanest way to keep Activities populated without manual entry: sync your email automatically.
A typical Make scenario:
- Trigger: Gmail — Watch Emails (filter to sent items or specific labels).
- Iterator if the email had multiple recipients.
- Airtable Search Records on Contacts by email address.
- Filter: continue only if a matching contact was found (don't log activities to non-contacts).
- Airtable Create Record on Activities: Type = Email, Direction = Outbound (or Inbound based on trigger), Contact = matched record, Summary = email subject, Content = first 500 chars of body, Date = email date.
For inbound emails, a similar scenario watches the inbox. Filter to only emails from contacts already in your database — otherwise you'll log every cold pitch as an activity.
Two refinements that make this more useful:
Conversation threading. Instead of one Activity per email, group emails by subject thread. Make can check whether an Activity already exists for the same subject + contact in the last 7 days, and append to that one instead of creating new.
BCC to capture. Tools like Streak or PleaseDoNotReply provide a forwarding address you can BCC on emails — only those BCCed are logged. Useful when you don't want to log every single email, just the ones you decide are worth capturing.
Deduplication
Duplicates are the most common quality issue in any contact database. Three layers of defense.
Layer 1: Email-based prevention at intake. Every Make scenario that creates a contact does a Search Records by email first. If found, update. If not, create. This eliminates duplicates from automated sources.
Layer 2: Formula-based detection for manual entries. A flag field on Contacts:
IF(
AND(
{Last Name} != BLANK(),
{Company Domain} != BLANK()
),
{Last Name} & '|' & {Company Domain},
''
)
This creates a deterministic key per contact. Two records with the same Last Name + Company Domain will have the same key. A grouped view on this field surfaces likely duplicates.
Layer 3: Periodic manual cleanup. Once a quarter, open the grouped duplicates view, merge the obvious cases, and decide on edge cases. Airtable doesn't have a built-in merge tool — the manual process is: copy fields from the duplicate into the original, link any Activities from the duplicate to the original, then delete the duplicate.
For larger databases (10,000+ contacts), commercial dedup tools (Dedupely for Airtable) can automate the merge step.
Tags and Segmentation
Tags are how you create cross-cutting categories that don't fit neatly into a stage or status.
Common tag taxonomies for a small business:
| Tag | Meaning |
|---|---|
| Newsletter | Wants to be on the newsletter |
| Customer | Has paid us money |
| Prospect | Could pay us money |
| Past Client | Paid in the past, currently inactive |
| Partner | We work together on projects |
| Influencer | Has a relevant audience |
| Hot | High-priority follow-up needed |
Tags are multi-select — a contact can be both a Customer and a Partner. Stage is single-select — they can only be in one stage.
Build views filtered by tag combinations:
- "Customers we haven't talked to in 90 days" → Tags includes Customer AND Last Activity Date is more than 90 days ago
- "Hot prospects in the SaaS industry" → Tags includes Prospect AND Hot AND Industry = SaaS
- "Newsletter subscribers who are Past Clients" → Tags includes Newsletter AND Past Client
Each view answers a question you'd actually act on.
Connecting to Your Email Tool
When you want to push a segment to an email tool like Mailchimp or ConvertKit, don't try to manage campaigns inside Airtable. Use the right tool for the job.
A typical pattern:
- Trigger: Airtable Schedule (daily).
- Search Records on Contacts matching your segment (e.g., Tags includes Newsletter AND Stage != Inactive).
- Iterator over the records.
- Mailchimp Add Subscriber to a specific list, with merge fields for first name, company, etc.
- Tag the subscriber in Mailchimp with the Airtable tags.
A reverse scenario watches Mailchimp for unsubscribes and updates the Airtable Tags field accordingly. Now your contact database stays in sync with your newsletter without you thinking about it.
Reminders and Follow-Ups
The Next Reminder field is what turns this from a database into a working tool.
Set a reminder on contacts you want to follow up with at a specific time. A Make scenario runs daily:
- Trigger: Schedule (daily, 7am).
- Airtable Search Records on Contacts where Next Reminder is today.
- Iterator.
- Email Send to the contact's owner: "Reminder: follow up with [Contact Name] today. Last activity: [Last Activity Date]."
- Optional: Slack message to the owner instead of email.
The contact's owner gets a daily morning email of who to reach out to. Manual reminders ("follow up with John in March about the renewal") become automatic.
A Useful Dashboard
Build an Interface Designer page with these elements:
- Total Contacts (number)
- Contacts Added This Month (number, from a date filter)
- Contacts By Stage (donut chart, group by Stage)
- Contacts By Source (bar chart)
- Recently Active (filtered list, sorted by Last Activity Date)
- Gone Cold (filtered list, Stage = Active AND Last Activity > 60 days)
- Today's Reminders (filtered list)
- My Contacts (filtered to Owner = Current User)
The Gone Cold list is what most people get the most value from. People you marked Active but haven't touched in months — re-engage or update their stage to Inactive.
When to Upgrade to a Full CRM
Move from contact management to a CRM when:
- You're tracking multiple deals per contact and need to forecast revenue
- You have multiple salespeople and need pipeline reporting
- Deal stages and probabilities are genuinely part of your workflow
- You have a long sales cycle with multiple stakeholders per opportunity
Move from Airtable to a dedicated CRM (HubSpot, Pipedrive, Close) when:
- You need email templates with tracking (open/click rates) at scale
- You're hiring an SDR or BDR who'll work full-time in the tool
- Compliance requirements (GDPR contact tracking, regulated industries) demand specialized features
- Your team is over ~20 people and CRM is the daily working surface
For everyone else, the Airtable contact system in this guide is enough. The teams we've built this for tend to stay on it for 5+ years before needing more.
Where to Go Next
If your workflow needs proper deal/pipeline tracking, see our build a CRM in Airtable tutorial — it builds on the same Contacts table with Companies and Activities, then adds Deals and pipeline stages.
For deeper relationship-tracking patterns, the linked records guide covers many-to-many relationships (one contact at multiple companies, one company with many contacts) in depth.