

How to Track Newsletter Performance from Gmail to Google Sheets with N8n
Automatically log outgoing newsletter sends and capture replies/bounces in Google Sheets to track engagement without expensive email marketing tools.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Technical teams who send newsletters and want detailed engagement tracking without paying for enterprise email tools.
Not ideal for
Non-technical users who need simple send/open tracking or teams already using dedicated email marketing platforms.
Sync type
pollingUse case type
trackingReal-World Example
A 12-person B2B software company sends a weekly product update newsletter to 2,000 subscribers using Gmail. Before automation, they manually checked replies once per day and had no bounce tracking, missing urgent customer feedback for 8-12 hours. Now they see engagement within 15 minutes and automatically categorize technical questions versus unsubscribe requests.
What Will This Cost?
Drag the slider to your expected monthly volume.
Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.





Prices shown for annual billing. Based on published pricing as of April 2026.
Estimated ROI
1000
min saved/mo
$583
labor value/mo
Free
no platform cost
Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.
Implementation
Import this workflow directly into n8n
Copy the pre-built n8n blueprint and paste it straight into n8n. All modules, filters, and field mappings are already configured — you just need to connect your accounts.
Before You Start
Make sure you have everything ready.
Optional
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Email Date | internalDate | |
| Subject Line | subject | |
| Direction | direction | |
| Response Type | response_type | |
| Sender/Recipient | from/to | |
1 optional field▸ show
| Message ID | id |
Step-by-Step Setup
Workflow > Add Node > Gmail > Message Received
Set up Gmail trigger node
Add a Gmail trigger to monitor your newsletter sending account. This watches for new sent emails and any incoming replies or bounces.
- 1Click the + button to add a new node
- 2Select 'Gmail' from the app list
- 3Choose 'Message Received' as the trigger type
- 4Click 'OAuth2 API' authentication method
- 5Click 'Create New Credential' and authenticate with your newsletter Gmail account
Gmail Node > Options > Filters
Configure message filtering
Set up filters to catch both outgoing newsletter sends and incoming replies/bounces. This prevents logging every random email.
- 1In the Gmail node, click 'Add Filter'
- 2Select 'Subject' from the dropdown
- 3Enter your newsletter subject pattern like 'Weekly Update' or 'Newsletter'
- 4Click 'Add Filter' again
- 5Select 'Label' and choose your newsletter label if you use one
Add Node > Function > Code Editor
Add email direction detection
Create a function node to identify whether the email is an outgoing send or incoming reply/bounce. This determines how we log it.
- 1Add a new node after Gmail and select 'Function'
- 2Name it 'Detect Email Direction'
- 3Paste this code: if($json.labelIds?.includes('SENT')) { return {direction: 'sent', type: 'newsletter_send'}; } else { return {direction: 'received', type: 'reply_or_bounce'}; }
- 4Click 'Execute Node' to test
Function Node > Code Editor
Create bounce detection logic
Add another function node to identify bounces versus legitimate replies based on sender and content patterns.
- 1Add a Function node after the direction detector
- 2Name it 'Classify Response Type'
- 3Add this logic: const sender = $json.from; const subject = $json.subject; if(sender.includes('mailer-daemon') || subject.toLowerCase().includes('undelivered')) { return {...$json, response_type: 'bounce'}; } else { return {...$json, response_type: 'reply'}; }
- 4Test with a sample bounce email
Add Node > Google Sheets > Append
Connect to Google Sheets
Add a Google Sheets node to write the tracking data. This creates your newsletter performance log.
- 1Add a Google Sheets node
- 2Select 'Append' operation
- 3Choose 'OAuth2' authentication
- 4Click 'Create New Credential' and authenticate with Google
- 5Enter your tracking spreadsheet ID
- 6Set the sheet name to 'Newsletter Tracking'
Google Sheets Node > Values > Manual
Map tracking fields
Configure which email data gets logged to your spreadsheet columns. This captures the metrics you need for performance analysis.
- 1In the Google Sheets node, set 'Values' to 'Manual'
- 2Map Column A to
={{ $json.date }} - 3Map Column B to
={{ $json.subject }} - 4Map Column C to
={{ $json.direction }} - 5Map Column D to
={{ $json.response_type }} - 6Map Column E to
={{ $json.from }}for sent emails or={{ $json.to }}for replies
Function Node > Code Editor
Add timestamp formatting
Format the email timestamp for better readability in your tracking sheet. Gmail's raw timestamps are hard to parse.
- 1Add a Function node before Google Sheets
- 2Name it 'Format Timestamp'
- 3Add this code: const date = new Date($json.internalDate * 1000); return {...$json, formatted_date: date.toISOString().slice(0, 16).replace('T', ' ')};
- 4Update the Sheets mapping to use
formatted_dateinstead ofdate
Workflow Settings > Error Handling
Set up error handling
Configure error handling to prevent the workflow from breaking when Gmail API hits rate limits or temporary failures.
- 1Click the workflow settings gear icon
- 2Go to 'Error Workflow'
- 3Select 'Continue On Fail' for all nodes
- 4Add a Set node after each main node
- 5Set it to capture error details:
={{ $json.error?.message || 'Success' }}
Workflow > Settings > Activate
Configure execution schedule
Set the workflow to run every 15 minutes to catch new emails and responses promptly without overwhelming the Gmail API.
- 1Click the workflow name at the top
- 2Toggle 'Active' to ON
- 3Click 'Add Trigger' > 'Schedule Trigger'
- 4Set interval to 'Minutes' and value to '15'
- 5Click 'Save' to activate the schedule
Google Sheets > Newsletter Tracking tab
Test with real newsletter
Send a test newsletter and verify the workflow captures it correctly in your tracking spreadsheet.
- 1Send a newsletter from your connected Gmail account
- 2Wait 15 minutes for the next scheduled run
- 3Check your Google Sheet for the new row
- 4Verify all fields populated correctly
- 5Reply to the newsletter from another account and confirm it logs as a reply
Drop this into an n8n Code node.
JavaScript — Code Node// Enhanced bounce detection with common ESP patterns▸ Show code
// Enhanced bounce detection with common ESP patterns const bouncePatterns = [ /mailer.daemon/i,
... expand to see full code
// Enhanced bounce detection with common ESP patterns
const bouncePatterns = [
/mailer.daemon/i,
/postmaster/i,
/undelivered/i,
/delivery.*fail/i,
/returned.*mail/i
];
const sender = $json.from?.toLowerCase() || '';
const subject = $json.subject?.toLowerCase() || '';
const isBounce = bouncePatterns.some(pattern =>
pattern.test(sender) || pattern.test(subject)
);
return {
...$json,
response_type: isBounce ? 'bounce' : 'reply'
};Scaling Beyond 50+ emails per execution+ Records
If your volume exceeds 50+ emails per execution records, apply these adjustments.
Batch processing with loops
Gmail API returns 100 messages max per call. Add Iterator and Loop nodes to process large email batches without hitting pagination limits.
Rate limit management
Space out API calls with Wait nodes between Gmail requests. Use 2-3 second delays to stay under the 250 requests per 100 seconds limit consistently.
Going live
Production Checklist
Before you turn this on for real, confirm each item.
Troubleshooting
Common errors and how to fix them.
Frequently Asked Questions
Common questions about this workflow.
Analysis
Use N8n for this if you're already comfortable with code and want full control over your tracking logic. The function nodes let you build sophisticated bounce detection and response classification that basic automation tools can't match. Gmail's API gives you access to internal message IDs and threading data that Zapier strips out. Skip N8n if you need this running in 20 minutes with zero coding - Zapier handles the basic version faster.
This workflow uses about 4 executions per newsletter (send capture + 3 response checks). At 4 newsletters/month with 50 responses, that's 216 executions monthly. N8n's self-hosted version costs you nothing except server time. Their cloud starter at $20/month handles 5,000 executions easily. Zapier would cost $49/month for the multi-step logic you need here, and Make charges $10.59 for the same execution volume.
Zapier's Gmail integration catches more bounce types out of the box - their filters recognize 15+ common bounce patterns versus the 3-4 you'll manually code in N8n. Make's visual debugger shows you exactly which emails triggered which logic branches, while N8n's execution view requires more clicking to trace data flow. But N8n wins because you can build custom engagement scoring, track reply sentiment, and add complex recipient segmentation that the other platforms can't touch without expensive add-ons.
Gmail's API paginates at 100 messages, so high-volume newsletters need loop nodes to fetch everything. The authentication tokens expire every hour during active polling - N8n handles refresh automatically but failed refreshes will gap your tracking data. Gmail's rate limit is 250 requests per user per 100 seconds, which sounds generous until you're checking 4 different label combinations every 15 minutes. You'll hit it around 200 emails/hour and need retry logic with exponential backoff.
Ideas for what to build next
- →Add subscriber engagement scoring — Create a follow-up workflow that calculates engagement scores based on reply frequency and bounce rates per subscriber email address.
- →Set up newsletter performance alerts — Build a daily summary workflow that emails you engagement metrics and flags unusual bounce rates or low reply volumes.
- →Connect to customer database — Sync the engagement data back to your CRM or customer database to flag highly engaged subscribers for sales outreach opportunities.
Related guides
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup