Intermediate~20 min setupEmail & ProductivityVerified April 2026
Gmail logo
Google Sheets logo

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

polling

Use case type

tracking

Real-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.

1 op per trigger eventEach time this workflow runs counts as one operation toward your monthly limit.
/mo
505005K50K

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

Skip the setup

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.

Gmail account with newsletters already being sent
Google Sheets spreadsheet with headers: Date, Subject, Direction, Type, From/To
N8n self-hosted instance or cloud account

Optional

Gmail labels or consistent subject lines for your newsletters

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Email DateinternalDate
Subject Linesubject
Directiondirection
Response Typeresponse_type
Sender/Recipientfrom/to
1 optional field▸ show
Message IDid

Step-by-Step Setup

1

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.

  1. 1Click the + button to add a new node
  2. 2Select 'Gmail' from the app list
  3. 3Choose 'Message Received' as the trigger type
  4. 4Click 'OAuth2 API' authentication method
  5. 5Click 'Create New Credential' and authenticate with your newsletter Gmail account
What you should see: You should see a green 'Connected' status and the Gmail node should show 'Trigger: Message Received'.
Common mistake — Make sure you authenticate with the Gmail account that sends newsletters, not your personal account.
n8n
+
click +
search apps
Gmail
GM
Gmail
Set up Gmail trigger node
Gmail
GM
module added
2

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.

  1. 1In the Gmail node, click 'Add Filter'
  2. 2Select 'Subject' from the dropdown
  3. 3Enter your newsletter subject pattern like 'Weekly Update' or 'Newsletter'
  4. 4Click 'Add Filter' again
  5. 5Select 'Label' and choose your newsletter label if you use one
What you should see: The filter section should show your subject pattern and any label filters you've added.
Common mistake — Don't use overly broad subject filters or you'll capture unrelated emails that happen to match.
Gmail
GM
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Google Sheets
GO
notified
3

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.

  1. 1Add a new node after Gmail and select 'Function'
  2. 2Name it 'Detect Email Direction'
  3. 3Paste this code: if($json.labelIds?.includes('SENT')) { return {direction: 'sent', type: 'newsletter_send'}; } else { return {direction: 'received', type: 'reply_or_bounce'}; }
  4. 4Click 'Execute Node' to test
What you should see: The function output should show either 'sent' or 'received' with the appropriate type classification.
4

Function Node > Code Editor

Create bounce detection logic

Add another function node to identify bounces versus legitimate replies based on sender and content patterns.

  1. 1Add a Function node after the direction detector
  2. 2Name it 'Classify Response Type'
  3. 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'}; }
  4. 4Test with a sample bounce email
What you should see: Output should show 'bounce' for delivery failures and 'reply' for actual subscriber responses.
Common mistake — This catches common bounce patterns but won't identify every ESP's bounce format.
5

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.

  1. 1Add a Google Sheets node
  2. 2Select 'Append' operation
  3. 3Choose 'OAuth2' authentication
  4. 4Click 'Create New Credential' and authenticate with Google
  5. 5Enter your tracking spreadsheet ID
  6. 6Set the sheet name to 'Newsletter Tracking'
What you should see: Green connection status and the spreadsheet/sheet names should populate in the dropdowns.
Common mistake — The spreadsheet must exist first - N8n won't create it for you.
6

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.

  1. 1In the Google Sheets node, set 'Values' to 'Manual'
  2. 2Map Column A to ={{ $json.date }}
  3. 3Map Column B to ={{ $json.subject }}
  4. 4Map Column C to ={{ $json.direction }}
  5. 5Map Column D to ={{ $json.response_type }}
  6. 6Map Column E to ={{ $json.from }} for sent emails or ={{ $json.to }} for replies
What you should see: The mapping should show 5 columns with the email data expressions properly formatted.
Common mistake — Use the expression editor (=) to reference $json fields, don't type them as plain text.
Gmail fields
from
subject
snippet
body
date
available as variables:
1.props.from
1.props.subject
1.props.snippet
1.props.body
1.props.date
7

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.

  1. 1Add a Function node before Google Sheets
  2. 2Name it 'Format Timestamp'
  3. 3Add this code: const date = new Date($json.internalDate * 1000); return {...$json, formatted_date: date.toISOString().slice(0, 16).replace('T', ' ')};
  4. 4Update the Sheets mapping to use formatted_date instead of date
What you should see: Timestamps should display as 'YYYY-MM-DD HH:MM' format instead of Unix timestamps.
Common mistake — Gmail timestamps are in milliseconds - multiply by 1000 or your dates will be wrong.
8

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.

  1. 1Click the workflow settings gear icon
  2. 2Go to 'Error Workflow'
  3. 3Select 'Continue On Fail' for all nodes
  4. 4Add a Set node after each main node
  5. 5Set it to capture error details: ={{ $json.error?.message || 'Success' }}
What you should see: Each node should show a small error handling icon and continue processing even if one step fails.
Common mistake — Without error handling, one failed email will stop the entire tracking workflow.
9

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.

  1. 1Click the workflow name at the top
  2. 2Toggle 'Active' to ON
  3. 3Click 'Add Trigger' > 'Schedule Trigger'
  4. 4Set interval to 'Minutes' and value to '15'
  5. 5Click 'Save' to activate the schedule
What you should see: You should see 'Active' with a green dot and the next execution time displayed.
Common mistake — Don't set it shorter than 10 minutes or you'll hit Gmail's rate limits quickly.
10

Google Sheets > Newsletter Tracking tab

Test with real newsletter

Send a test newsletter and verify the workflow captures it correctly in your tracking spreadsheet.

  1. 1Send a newsletter from your connected Gmail account
  2. 2Wait 15 minutes for the next scheduled run
  3. 3Check your Google Sheet for the new row
  4. 4Verify all fields populated correctly
  5. 5Reply to the newsletter from another account and confirm it logs as a reply
What you should see: Your spreadsheet should show the sent newsletter and any replies with correct direction and type classification.
Common mistake — If nothing appears, check the workflow execution history for errors in the workflow panel.

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'
};
n8n
▶ Run once
executed
Gmail
Google Sheets
Google Sheets
🔔 notification
received

Scaling Beyond 50+ emails per execution+ Records

If your volume exceeds 50+ emails per execution records, apply these adjustments.

1

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.

2

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

VerdictWhy n8n for this workflow

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.

Cost

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.

Tradeoffs

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 scoringCreate a follow-up workflow that calculates engagement scores based on reply frequency and bounce rates per subscriber email address.
  • Set up newsletter performance alertsBuild a daily summary workflow that emails you engagement metrics and flags unusual bounce rates or low reply volumes.
  • Connect to customer databaseSync the engagement data back to your CRM or customer database to flag highly engaged subscribers for sales outreach opportunities.

Related guides

Was this guide helpful?
Gmail + Google Sheets overviewn8n profile →