Play 1 n8n Workflow Export (Downloadable JSON)
Pre-built n8n workflow JSON files for email logging, calendar logging, and daily digest. Import directly.
Play 1 n8n Workflow Export (Downloadable JSON)
What You're Getting
Three production-ready n8n workflows that eliminate CRM
Email Logging Workflow: Captures every client email in Airtable. Extracts sender, subject, body, and attachments. Creates contact records automatically if they don't exist.
Calendar Logging Workflow: Logs every meeting from Google Calendar into Airtable. Links attendees to existing contacts. Tracks meeting duration, location, and notes.
Daily Digest Workflow: Sends you a 7am email with new contacts from yesterday, today's meetings, and overdue tasks. One email, zero manual checking.
These workflows assume you're using Gmail, Google Calendar, and Airtable. If you're on Outlook or another CRM
Before You Start
n8n Instance: Self-hosted or n8n.cloud. The free tier works fine for testing. For production use with multiple team members, expect to pay $20-50/month for n8n.cloud or run it on a $10/month DigitalOcean droplet.
Airtable Base Structure: Create a base with three tables:
- Contacts: Fields for Name (single line text), Email (email), Company (single line text), Last Contact Date (date), Contact Owner (single select)
- Emails: Fields for Subject (single line text), Body (long text), Sender Email (email), Date Received (date), Contact (linked record to Contacts table)
- Meetings: Fields for Title (single line text), Start Time (date with time), End Time (date with time), Attendees (linked record to Contacts table, allow multiple), Meeting Notes (long text)
API Credentials Ready:
- Google Calendar: Same OAuth credentials work for both Gmail and Calendar
- Airtable: Generate a personal access token with read/write permissions for your base
Workflow 1: Email Logging
Import and Configure
- Download
email-logging.jsonfrom the resource library - In n8n, click the three-dot menu (top right) → Import from File → select the JSON
- The workflow opens with red error nodes. This is normal. You need to reconnect your credentials.
Connect Gmail
- Click the Gmail Trigger node (the first blue box)
- Under "Credential to connect with", click "Create New"
- Select "OAuth2" authentication method
- Enter your Google OAuth Client ID and Client Secret from Google Cloud Console
- Click "Connect my account" and authorize n8n to access Gmail
- Set "Event" to "Message Received"
- Under "Filters", add:
from:(*@clientdomain.com OR *@anotherclient.com)to only log emails from specific domains
Connect Airtable
- Click the "Check if Contact Exists" node
- Under "Credential to connect with", click "Create New"
- Paste your Airtable Personal Access Token
- Select your Base from the dropdown
- Select "Contacts" as the Table
- In "Search Field", select "Email"
- In "Search Value", click "Add Expression" and enter:
{{ $json.from.address }}
Map the Email Fields
- Click the "Create Email Record" node
- Verify the Base and Table are correct (should auto-populate)
- Map fields:
- Subject:
{{ $json.subject }} - Body:
{{ $json.text }}(plain text) or{{ $json.html }}(HTML version) - Sender Email:
{{ $json.from.address }} - Date Received:
{{ $json.date }} - Contact:
{{ $json.contactId }}(this comes from the previous node)
Test It
- Click "Execute Workflow" (bottom left)
- Send yourself a test email from a client address
- Wait 30 seconds, then check the Execution Log
- Verify a new record appears in your Airtable Emails table
- Activate the workflow (toggle switch at top)
Common Issues:
- "Invalid credentials": Regenerate your Airtable token and re-enter it
- "Contact not found": The workflow creates contacts automatically, but check that your Contacts table has an Email field
- Emails not triggering: Gmail APIcan take 2-3 minutes to register new messages. Be patient.APIClick to read the full definition in our AI & Automation Glossary.
Workflow 2: Calendar Logging
Import and Configure
- Download
calendar-logging.jsonand import it the same way - The workflow has a Google Calendar Trigger node and several Airtable nodes
Connect Google Calendar
- Click the Google Calendar Trigger node
- Use the same OAuth credentials you created for Gmail (or create new ones)
- Set "Trigger On" to "Event Created"
- Select your primary calendar from the dropdown
- Under "Options", enable "Watch for Updates" so edited meetings also sync
Connect Airtable
- Click the "Check if Attendees Exist" node
- Use your existing Airtable credential
- Select your Base and "Contacts" table
- This node loops through all meeting attendees and checks if they're in your CRMCRMClick to read the full definition in our AI & Automation Glossary.
Map the Meeting Fields
- Click the "Create Meeting Record" node
- Map fields:
- Title:
{{ $json.summary }} - Start Time:
{{ $json.start.dateTime }} - End Time:
{{ $json.end.dateTime }} - Attendees:
{{ $json.attendeeIds }}(array of contact IDs from previous node) - Meeting Notes:
{{ $json.description }}
Handle External Attendees
The workflow includes a "Create Missing Contacts" node. If a meeting attendee isn't in your Contacts table, this node creates them automatically using their email address from the calendar invite.
To customize this:
- Click the "Create Missing Contacts" node
- Add default values for new contacts:
- Contact Owner: Set to your name or leave blank
- Company: Extract from email domain using:
{{ $json.email.split('@')[1].split('.')[0] }}
Test It
- Execute the workflow manually
- Create a test calendar event with 2-3 attendees
- Check your Airtable Meetings table for the new record
- Verify attendees are linked correctly
- Activate the workflow
Workflow 3: Daily Digest
Import and Configure
- Download
daily-digest.jsonand import it - This workflow runs on a schedule, not a trigger
Set the Schedule
- Click the Cron node (first node in the workflow)
- Set "Mode" to "Every Day"
- Set "Hour" to 7 (for 7am delivery)
- Set "Minute" to 0
- Timezone: Select your local timezone
Connect Data Sources
The workflow pulls from three Airtable tables:
New Contacts (Last 24 Hours):
- Click the "Get New Contacts" node
- Select your Base and "Contacts" table
- Add a Filter:
Created Time is within the last 1 days
Today's Meetings:
- Click the "Get Today's Meetings" node
- Select your Base and "Meetings" table
- Add a Filter:
Start Time is today - Sort by "Start Time" ascending
Overdue Tasks (if you have a Tasks table):
- Click the "Get Overdue Tasks" node
- Select your Base and "Tasks" table
- Add a Filter:
Due Date is before today AND Status is not Completed
Customize the Email Template
- Click the "Format Digest Email" node
- This is a Function node with HTML/CSS. The template looks like this:
const newContacts = $input.first().json.records || [];
const meetings = $input.all()[1].json.records || [];
const tasks = $input.all()[2].json.records || [];
let html = `
<h2>Daily CRM Digest - ${new Date().toLocaleDateString()}</h2>
<h3>New Contacts (${newContacts.length})</h3>
<ul>
${newContacts.map(c => `<li><strong>${c.fields.Name}</strong> - ${c.fields.Email}</li>`).join('')}
</ul>
<h3>Today's Meetings (${meetings.length})</h3>
<ul>
${meetings.map(m => `<li>${m.fields['Start Time']} - <strong>${m.fields.Title}</strong></li>`).join('')}
</ul>
<h3>Overdue Tasks (${tasks.length})</h3>
<ul>
${tasks.map(t => `<li><strong>${t.fields.Title}</strong> - Due ${t.fields['Due Date']}</li>`).join('')}
</ul>
`;
return [{ json: { html } }];
Edit the HTML to match your preferences. Add your firm's logo, change colors, or add additional sections.
Send the Email
- Click the "Send Digest Email" node
- Use your Gmail credential
- Set "To" to your email address (or a team distribution list)
- Set "Subject" to:
CRM Digest - {{ $now.format('MMM D, YYYY') }} - Set "Email Type" to "HTML"
- Set "Message" to:
{{ $json.html }}
Test It
- Click "Execute Workflow" to run it immediately (don't wait for 7am)
- Check your inbox for the digest email
- Verify all sections populate correctly
- If a section is empty, the workflow still sends (it just shows "0 items")
- Activate the workflow
Adapting for Other Tools
Using Outlook Instead of Gmail:
- Replace Gmail nodes with Microsoft Outlook nodes
- Authentication uses Microsoft OAuth instead of Google OAuth
- Field names are identical (
subject,body,from.address)
Using HubSpot Instead of Airtable:
- Replace Airtable nodes with HubSpot nodes
- Map to HubSpot properties:
email,firstname,lastname,company - HubSpot automatically deduplicates contacts by email
Using Salesforce:
- Replace Airtable nodes with Salesforce nodes
- Map to standard objects: Contact, Task, Event
- Requires Salesforce APIaccess (Professional tier or higher)APIClick to read the full definition in our AI & Automation Glossary.
Troubleshooting
Workflow executes but nothing happens: Check the Execution Log. Look for red error nodes. Click them to see the exact error message.
"Rate limit exceeded": Gmail API
Duplicate records in Airtable: The "Check if Contact Exists" node should prevent this. Verify the search field is set to "Email" and the search value is {{ $json.from.address }}.
Daily digest doesn't send: Check the Cron node timezone. If you're in EST but the node is set to UTC, your 7am email arrives at 2am.
Missing attachments: The email logging workflow doesn't save attachments by default. To add this, insert a "Download Attachments" node after the Gmail Trigger and upload them to Google Drive or Dropbox.
Bottom Line
These three workflows handle 90% of CRM
If you need the workflows to do something different (log Slack messages, sync with Clio, filter by practice area), duplicate a workflow and modify the nodes. n8n's visual editor makes this straightforward even if you've never written code.

Reviewed by Revenue Institute
This guide is actively maintained and reviewed by the implementation experts at Revenue Institute. As the creators of The AI Workforce Playbook, we test and deploy these exact frameworks for professional services firms scaling without new headcount.
Revenue Institute
Need help turning this guide into reality? Revenue Institute builds and implements the AI workforce for professional services firms.