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

Back to articles

Using Notion for Email List Management and Outreach Tracking

On this page

Why Notion for Email Management

Notion databases offer a flexible middle ground between spreadsheets and full CRM platforms. For small teams, founders and solo operators who need more structure than a spreadsheet but less complexity than Salesforce or HubSpot, Notion provides:

Strength Limitation
Flexible database structure; easy to customise No built-in email sending
Multiple views (table, board, calendar, gallery) No native email verification
Built-in templates for repeatable workflows API rate limits on large datasets
Free tier generous for small teams Performance can slow above 10,000 records
Relation properties link contacts to campaigns and companies No built-in reporting dashboard
Rich text notes within each record CSV import can be slow for large files
Collaboration with comments and assignments No native mail merge or personalisation
API and integrations (Zapier, Make, n8n) Less structured than purpose-built CRM

Database Design

Contact database

Property Type Purpose Example values
Name Title Contact's full name "Jane Smith"
Email Email Primary email address "jane@example.com"
Company Relation (to Companies DB) Linked company "Example Corp"
Title Text Job title "VP Marketing"
Source Select How you found them "LinkedIn", "Conference", "Referral", "Website"
Status Select Current status in your pipeline "New", "Contacted", "Replied", "Meeting booked", "Not interested"
Last contacted Date Date of last outreach 2026-10-01
Next follow-up Date When to follow up next 2026-10-15
Tags Multi-select Categories and segments "Decision maker", "Technical", "Enterprise"
Email verified Checkbox Whether the email has been verified Checked / unchecked
Notes Rich text Freeform notes, conversation history "Met at SaaStr. Interested in Q1."
LinkedIn URL URL LinkedIn profile link linkedin.com/in/janesmith
Campaigns Relation (to Campaigns DB) Which campaigns they are part of "Q4 Outreach", "Event Follow-up"
Priority Select Outreach priority "High", "Medium", "Low"

Company database

Property Type Purpose Example values
Company name Title Organisation name "Example Corp"
Domain URL Company website example.com
Industry Select Industry vertical "SaaS", "E-commerce", "Healthcare"
Size Select Company size "1-10", "11-50", "51-200", "201-1000", "1000+"
Contacts Relation (to Contacts DB) People at this company Links to contact records
ICP fit Select How well they match your ideal customer "Strong fit", "Moderate fit", "Weak fit"
Notes Rich text Company research and context "Series B; using competitor X"
Location Text Headquarters location "San Francisco, CA"

Campaign database

Property Type Purpose Example values
Campaign name Title Name of the outreach campaign "Q4 SaaS Outreach"
Status Select Campaign status "Planning", "Active", "Paused", "Completed"
Start date Date When the campaign started 2026-10-01
End date Date When the campaign ends 2026-12-31
Contacts Relation (to Contacts DB) Contacts in this campaign Links to contact records
Total contacts Rollup (count of Contacts) Number of contacts 150
Contacted Rollup (contacts with status "Contacted" or later) Number contacted 80
Replied Rollup (contacts with status "Replied" or later) Number who replied 12
Template Rich text Email template used Template text
Notes Rich text Campaign strategy and results Performance notes

Views for Email Management

Contact views

View name View type Filters Sort Use case
All contacts Table None Created date (newest first) Master view; data entry
Follow-up today Table Next follow-up = Today Priority (High first) Daily outreach tasks
Overdue follow-ups Table Next follow-up < Today Next follow-up (oldest first) Catch up on missed follow-ups
By status Board None (grouped by Status) Last contacted Pipeline view; see distribution
By company Table None Company name (A-Z) Account-based view
New contacts Table Status = "New" Created date (newest first) Contacts that need first outreach
High priority Table Priority = "High" Next follow-up Focus on top targets
Recently contacted Table Last contacted = This week Last contacted (newest first) Track recent activity
Unverified emails Table Email verified = unchecked Name (A-Z) Contacts needing verification
By source Board None (grouped by Source) Created date See where contacts come from

Campaign views

View name View type Filters Use case
Active campaigns Table Status = "Active" See current campaigns
Campaign board Board None (grouped by Status) Campaign pipeline view
Campaign calendar Calendar (by Start date) None Timeline view of campaigns

Notion Formulas for Email Data

Useful formulas

Formula purpose Notion formula What it returns
Days since last contact dateBetween(now(), prop("Last contacted"), "days") Number of days since last outreach
Is overdue if(prop("Next follow-up") < now(), true, false) True if follow-up is past due
Days until follow-up dateBetween(prop("Next follow-up"), now(), "days") Negative if overdue; positive if upcoming
Contact status label if(prop("Status") == "Replied", "Hot", if(prop("Status") == "Meeting booked", "Active", "Nurture")) Simplified pipeline stage
Email domain replaceAll(prop("Email"), "^.*@", "") Extracts domain from email

Outreach Tracking Workflow

Tracking email sequences in Notion

Step Notion action How
Import contacts CSV import or manual entry Database > Import > CSV
Assign to campaign Set Campaigns relation Link contacts to campaign records
Send first email Update Status to "Contacted"; set Last contacted Manual update after sending
Log email content Add to Notes field Paste or summarise the email sent
Set follow-up Set Next follow-up date Based on your sequence timing
Track reply Update Status to "Replied"; add reply to Notes Log the response
Book meeting Update Status to "Meeting booked" Record meeting date in Notes
Post-meeting Update with outcome "Interested", "Not now", "Closed"

Daily outreach routine

Time Task Notion view to use
Morning Check "Follow-up today" view Follow-up today (filtered view)
Morning Check "Overdue follow-ups" view Overdue follow-ups (filtered view)
Send time Send emails to today's follow-ups One record at a time; update after each send
After sending Update "Last contacted" and "Next follow-up" Inline editing in table view
End of day Check for replies; update statuses All contacts sorted by Last contacted
Weekly Review pipeline in Board view By status (board view)

Automations and Integrations

Zapier / Make / n8n automations

Automation Trigger Action
Auto-create contact from form New Google Form submission or Typeform entry Create new Notion database record
Auto-update status on reply Email reply detected (Gmail / Outlook) Update Notion contact status to "Replied"
Reminder for follow-ups Notion record with Next follow-up = Today Send Slack message or email reminder
Auto-add to campaign New contact with specific tag Set Campaigns relation
CRM sync Notion record created or updated Create or update record in CRM
Email send tracking Email sent from cold email tool Update Last contacted in Notion

Notion API for bulk operations

import requests
import time

NOTION_TOKEN = 'YOUR_NOTION_API_TOKEN'
DATABASE_ID = 'YOUR_DATABASE_ID'
HEADERS = {
    'Authorization': f'Bearer {NOTION_TOKEN}',
    'Content-Type': 'application/json',
    'Notion-Version': '2022-06-28'
}

def add_contact(name, email, company, source, tags):
    """Add a new contact to the Notion database."""
    url = 'https://api.notion.com/v1/pages'
    data = {
        'parent': {'database_id': DATABASE_ID},
        'properties': {
            'Name': {
                'title': [{'text': {'content': name}}]
            },
            'Email': {'email': email},
            'Source': {'select': {'name': source}},
            'Status': {'select': {'name': 'New'}},
            'Tags': {
                'multi_select': [
                    {'name': tag} for tag in tags
                ]
            },
        }
    }

    response = requests.post(
        url, headers=HEADERS, json=data, timeout=30
    )
    return response.json()


def bulk_import_contacts(contacts):
    """Import multiple contacts with rate limiting."""
    results = []
    for contact in contacts:
        result = add_contact(
            name=contact['name'],
            email=contact['email'],
            company=contact.get('company', ''),
            source=contact.get('source', 'Import'),
            tags=contact.get('tags', [])
        )
        results.append(result)
        time.sleep(0.35)  # Notion API rate limit: ~3 req/sec

    return results

Limitations and When to Upgrade

Signal it is time to upgrade From Notion to...
More than 5,000 contacts Purpose-built CRM (HubSpot, Pipedrive)
Need email sending from the same tool Cold email platform (Instantly, Lemlist, Smartlead)
Need automated sequences Sales engagement platform (Outreach, Salesloft)
Need real-time email tracking Cold email or CRM with tracking
Multiple team members managing outreach CRM with role-based permissions
Need pipeline reporting and forecasting CRM with reporting (HubSpot, Salesforce)
Complex automation workflows CRM + marketing automation

Importing Contacts into Notion

Before importing contacts into Notion, consolidate and clean your data. Upload contact files from various sources (CSV exports, HTML pages, XLSX files, PDF documents) to Email Extractor to extract and deduplicate email addresses. Download the cleaned list as CSV, then import into Notion (Database > Import > CSV). This prevents duplicate records in your Notion database and ensures every contact has a valid email address.

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)