Tracking Cold Email Engagement Metrics using Smartlead and Google Sheets
Workflow: Track Email Campaign Engagement Analytics with Smartlead and Google Sheets
Automatically fetch lead-level email engagement analytics (opens, clicks, replies, unsubscribes, bounces) from Smartlead and update them in Google Sheets.
Use this to keep a single, always-fresh source of truth for campaign performance and sequence effectiveness.
Summary
Pull Smartlead campaign analytics on a schedule and write them to a Google Sheet (append or update).
Works with pagination, avoids duplicates via a stable key, and is ready for dashboards, pivots, or BI tools.
What This Workflow Does
Collects campaign stats from Smartlead (per-lead, per-sequence). Handles pagination safely (offset/limit). Writes to Google Sheets using appendOrUpdate with a matching column to prevent duplicates. Can run on a schedule for near real-time analytics.
Node Structure Overview
| Step | Node | Purpose | |---|---|---| | 1️⃣ | Schedule Trigger | Starts the workflow on a cadence (e.g., hourly) | | 2️⃣ | Code (Pagination Generator) | Emits {offset, limit} pairs (e.g., 0..9900, step 100) | | 3️⃣ | Split in Batches | Sends each pagination pair to the API sequentially | | 4️⃣ | HTTP Request (Smartlead) | GET /campaigns/{campaign_id}/statistics with offset/limit | | 5️⃣ | Split Out | Turns the API data[] array into one item per lead record | | 6️⃣ | Google Sheets (appendOrUpdate) | Upserts rows by stats_id into EngagedLeads tab | | 7️⃣ | Loop Back | Continues until all batches have been processed |
Step-by-Step Setup
Prerequisites Smartlead account + API key with access to campaign statistics. Google account + Google Sheets OAuth connected in n8n.
Create the Google Sheet Spreadsheet name: Email Analytics (can be anything). Tab name: EngagedLeads. Add these exact headers (first row): lead_name, lead_email, lead_category, sequence_number, stats_id, email_subject, sent_time, open_time, click_time, reply_time, open_count, click_count, is_unsubscribed, is_bounced
Configure the Schedule Trigger
Choose a frequency (e.g., every 2 hours).
If you’re testing, set a single run or a short cadence.
Configure the Code Node (Pagination) Emit N items like: { "offset": 0, "limit": 100 } { "offset": 100, "limit": 100 } ... 100 is a good default limit. For up to 10,000 records, generate 100 offsets.
Configure the Smartlead API Node
Method: GET
URL:
https://server.smartlead.ai/api/v1/campaigns/{campaign_id}/statistics
Query parameters:
api_key = <YOUR_SMARTLEAD_API_KEY>
offset = {{ $json.offset }}
limit = {{ $json.limit }}
Map response to JSON.
Split Out the Response Use a Split Out (or similar) to iterate over data[] so each lead record is one item.
Google Sheets Node (Append or Update) Operation: appendOrUpdate. Document: Your Email Analytics sheet. Sheet/Tab: EngagedLeads. Matching Column: stats_id. Map fields from Smartlead response to sheet columns: lead_name ← lead name (or composed from first/last if provided) lead_email ← email lead_category ← category/type if available sequence_number ← sequence step number stats_id ← stable identifier (e.g., Smartlead stats_id or message id) email_subject ← subject sent_time, open_time, click_time, reply_time ← timestamps open_count, click_count ← integers is_unsubscribed, is_bounced ← booleans If the same stats_id arrives again, the row is updated, not appended.
Test and Activate Run once manually to verify API and sheet mapping. Check the sheet for new/updated rows. Activate the workflow to run automatically.
Smartlead API Reference (Used by This Workflow)
Endpoint** GET https://server.smartlead.ai/api/v1/campaigns/{campaign_id}/statistics Required query parameters** api_key (string) offset (number) limit (number) Typical response (trimmed example)** { "data": [ { "lead_name": "Jane Doe", "lead_email": "jane@example.com", "sequence_number": 2, "stats_id": "15b6ff3a-...-b2b9f343c2e1", "email_subject": "Quick intro", "sent_time": "2025-10-08T10:18:55.496Z", "open_time": "2025-10-08T10:20:10.000Z", "click_time": null, "reply_time": null, "open_count": 1, "click_count": 0, "is_unsubscribed": false, "is_bounced": false } ], "total": 1234 } Google Sheets Structure (Recommended)
Spreadsheet: Email Analytics
Tab: EngagedLeads
Columns:lead_name, lead_email, lead_category, sequence_number, stats_id, email_subject, sent_time, open_time, click_time, reply_time, open_count, click_count, is_unsubscribed, is_bounced
Matching Column: stats_id (prevents duplicates and allows updates)
Customization Tips
Multiple Campaigns**
Duplicate the workflow and set a different {campaign_id} and/or write results to a separate tab in your Google Sheet.
Batch Size**
Increase or decrease the limit value (e.g., 200) in your Code node if you want fewer or more API calls.
Filtering**
Add a Code or IF node to skip rows where is_bounced = true or is_unsubscribed = true.
Dashboards**
Create a new tab named Dashboard in Google Sheets and visualize your data using built-in charts or connect it to Looker Studio for advanced visualization.
Enrichment**
Join this dataset with your CRM data (e.g., HubSpot or Salesforce) using lead_email as a key to gain deeper customer insights.
Security and Publishing Notes
Do not hardcode** your Smartlead API key in the workflow export.
Use n8n credentials or environment variables instead.
When sharing the template publicly, replace sensitive values with placeholders like:
<YOUR_SMARTLEAD_API_KEY> and <YOUR_GOOGLE_SHEET_ID>.
Keep your Google Sheet private unless you intentionally want to share it publicly.
Troubleshooting
No rows in Sheets**
Verify that the API response includes data[], confirm that the Split Out node is configured correctly, and check field mappings.
Duplicates**
Ensure the Google Sheets node has its matching column set to stats_id.
Rate Limits**
Increase the schedule interval, add a short Wait node between batches, or reduce the limit size.
Mapping Errors**
Ensure that column names in Sheets exactly match your field mappings — they are case-sensitive.
Timezone Differences**
Smartlead timestamps are in UTC. Convert them downstream if your local timezone is different.
Example Use Case
Run this workflow hourly to maintain a live, company-wide Email Engagement Sheet.
Sales teams** can monitor replies and active leads.
Marketing teams** can track open and click rates by sequence.
Operations** can export monthly summaries — no Smartlead login required.
Tags
Smartlead EmailMarketing Automation GoogleSheets Analytics CRM MarketingOps
Related Templates
Automate Customer Support & Calendar Bookings with OpenAI GPT and Google Calendar
Website AI Agent with Calendar Integration Categories: AI Agents, Website Integration, Calendar Automation This workfl...
Capture Gumroad sales, add buyer to MailerLite group, log to Google Sheets CRM
Turn Gumroad buyers into loyal email subscribers and keep your CRM up‑to‑date. When someone makes a purchase on your Gu...
Automate Lead Capture with AI Personalized WhatsApp Messages via Unipile & Google Sheets CRM
Inquiry Form to Personalised WhatsApp Message Overview This workflow creates a smart, automated system for capturing le...
🔒 Please log in to import templates to n8n and favorite templates
Workflow Visualization
Loading...
Preparing workflow renderer
Comments (0)
Login to post comments