This workflow corresponds to n8n.io template #7404 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "dd0fb46b-c0ce-4499-a000-8a16fe234969",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-3088,
1232
],
"parameters": {},
"typeVersion": 1
},
{
"id": "67ca251f-bd65-4707-b807-9353033e205c",
"name": "Get Google Sheets Data",
"type": "n8n-nodes-base.googleSheets",
"position": [
-2848,
1264
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 365710158,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/19aUQYZq02qHsCelO4eeV4sx_MTJJupC5qe0gDLQBtRA/edit#gid=365710158",
"cachedResultName": "Data"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "19aUQYZq02qHsCelO4eeV4sx_MTJJupC5qe0gDLQBtRA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/19aUQYZq02qHsCelO4eeV4sx_MTJJupC5qe0gDLQBtRA/edit?usp=drivesdk",
"cachedResultName": "Sample Marketing Data"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "363322ba-a8f0-4269-afa2-6cc13f7f36b3",
"name": "Count Unique Customers",
"type": "n8n-nodes-base.summarize",
"position": [
-2144,
688
],
"parameters": {
"options": {},
"fieldsToSummarize": {
"values": [
{
"field": "Customer ID",
"aggregation": "countUnique"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "d8d0162f-305a-4359-bdd6-ebf917202265",
"name": "Count Unique Campaigns",
"type": "n8n-nodes-base.summarize",
"position": [
-2144,
864
],
"parameters": {
"options": {},
"fieldsToSummarize": {
"values": [
{
"field": "Campaign",
"aggregation": "countUnique"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "de8c8386-8fd7-49ed-bf90-88980ceb90f2",
"name": "Sum Total Clicks",
"type": "n8n-nodes-base.summarize",
"position": [
-2144,
1072
],
"parameters": {
"options": {},
"fieldsToSummarize": {
"values": [
{
"field": "Clicks",
"aggregation": "sum"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "6618e8fb-8eb2-43b8-bd5f-b00b7306c8c5",
"name": "Sum Total Conversions",
"type": "n8n-nodes-base.summarize",
"position": [
-2144,
1232
],
"parameters": {
"options": {},
"fieldsToSummarize": {
"values": [
{
"field": "Conversions",
"aggregation": "sum"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "c9a81add-1ec5-4db5-8f55-076cdc1db97a",
"name": "Sum Total Spend",
"type": "n8n-nodes-base.summarize",
"position": [
-2128,
1408
],
"parameters": {
"options": {},
"fieldsToSummarize": {
"values": [
{
"field": "Spend ($)",
"aggregation": "sum"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "cf7b8d92-15fa-46fd-a63f-0d1b2792f282",
"name": "Send Email Report1",
"type": "n8n-nodes-base.microsoftOutlook",
"position": [
-1472,
1328
],
"parameters": {
"subject": "Daily Marketing Performance",
"bodyContent": "=<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Marketing Campaign Performance Report</title>\n <style>\n body {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n line-height: 1.6;\n color: #1a1a1a;\n max-width: 650px;\n margin: 0 auto;\n padding: 30px 20px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n min-height: 100vh;\n }\n .container {\n background: rgba(255, 255, 255, 0.95);\n backdrop-filter: blur(20px);\n padding: 40px;\n border-radius: 24px;\n box-shadow: \n 0 20px 40px rgba(0, 0, 0, 0.1),\n 0 8px 32px rgba(0, 0, 0, 0.08),\n inset 0 1px 0 rgba(255, 255, 255, 0.4);\n border: 1px solid rgba(255, 255, 255, 0.2);\n position: relative;\n overflow: hidden;\n }\n .container::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n background: linear-gradient(90deg, #667eea, #764ba2, #f093fb, #f5576c);\n background-size: 400% 400%;\n animation: gradient 8s ease infinite;\n }\n @keyframes gradient {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n h1 {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n font-size: 32px;\n font-weight: 800;\n margin-bottom: 40px;\n text-align: center;\n letter-spacing: -0.02em;\n }\n h2 {\n color: #2d3748;\n margin-bottom: 30px;\n font-size: 24px;\n font-weight: 700;\n text-align: center;\n position: relative;\n }\n h2::after {\n content: '';\n position: absolute;\n bottom: -8px;\n left: 50%;\n transform: translateX(-50%);\n width: 60px;\n height: 3px;\n background: linear-gradient(90deg, #667eea, #764ba2);\n border-radius: 2px;\n }\n .summary-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 24px;\n margin-bottom: 40px;\n }\n .metric-card {\n background: linear-gradient(145deg, #ffffff 0%, #f8fafc 100%);\n padding: 28px 24px;\n border-radius: 16px;\n border: 1px solid rgba(226, 232, 240, 0.8);\n box-shadow: \n 0 4px 16px rgba(0, 0, 0, 0.08),\n 0 1px 4px rgba(0, 0, 0, 0.04);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n overflow: hidden;\n }\n .metric-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 3px;\n background: linear-gradient(90deg, #667eea, #764ba2);\n opacity: 0;\n transition: opacity 0.3s ease;\n }\n .metric-card:hover {\n transform: translateY(-4px);\n box-shadow: \n 0 12px 32px rgba(0, 0, 0, 0.12),\n 0 4px 16px rgba(0, 0, 0, 0.08);\n }\n .metric-card:hover::before {\n opacity: 1;\n }\n .metric-label {\n font-weight: 600;\n color: #64748b;\n font-size: 13px;\n margin-bottom: 8px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n .metric-value {\n font-size: 28px;\n font-weight: 800;\n background: linear-gradient(135deg, #1e293b 0%, #475569 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n letter-spacing: -0.02em;\n }\n .footer {\n margin-top: 50px;\n padding-top: 30px;\n border-top: 1px solid rgba(226, 232, 240, 0.6);\n text-align: center;\n color: #64748b;\n font-size: 13px;\n font-weight: 500;\n }\n .footer p {\n margin: 6px 0;\n }\n .footer p:first-child {\n font-weight: 600;\n color: #475569;\n }\n @media (max-width: 600px) {\n body {\n padding: 20px 15px;\n }\n .container {\n padding: 30px 24px;\n border-radius: 20px;\n }\n .summary-grid {\n grid-template-columns: 1fr;\n gap: 20px;\n }\n h1 {\n font-size: 28px;\n margin-bottom: 30px;\n }\n .metric-value {\n font-size: 24px;\n }\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Marketing Campaign Performance Report</h1>\n \n <h2>Campaign Summary</h2>\n <div class=\"summary-grid\">\n <div class=\"metric-card\">\n <div class=\"metric-label\">Total Campaigns</div>\n <div class=\"metric-value\">{{ $json.unique_count_Campaign }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Total Customers Reached</div>\n <div class=\"metric-value\">{{ $json.unique_count_Customer_ID }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Total Clicks</div>\n <div class=\"metric-value\">{{ $json.sum_Clicks }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Total Conversions</div>\n <div class=\"metric-value\">{{ $json.sum_Conversions }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Total Spend</div>\n <div class=\"metric-value\">{{ $json['sum_Spend_($)'] }}</div>\n </div>\n </div>\n <div class=\"footer\">\n <p>Report generated automatically via n8n automation</p>\n <p>Last updated: {{ $json.lastUpdated }}</p>\n </div>\n </div>\n</body>\n</html>",
"toRecipients": "user@example.com",
"additionalFields": {
"bodyContentType": "html"
}
},
"credentials": {
"microsoftOutlookOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "d9d8fce2-da0f-4ba4-be18-445f5c71a466",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
-1776,
1296
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition",
"numberInputs": 5
},
"typeVersion": 3.2
},
{
"id": "446a50f7-8d42-40f9-9323-790ea93a4aa5",
"name": "Sticky Note17",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3136,
480
],
"parameters": {
"width": 1984,
"height": 128,
"content": "## \ud83d\udcec Need Help or Want to Customize This?\n\ud83d\udce7 [robert@ynteractive.com](mailto:robert@ynteractive.com) \n\ud83d\udd17 [LinkedIn](https://www.linkedin.com/in/robert-breen-29429625/)"
},
"typeVersion": 1
},
{
"id": "08007788-b10a-45c2-8d8e-44b31d0679cc",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3136,
624
],
"parameters": {
"color": 4,
"width": 480,
"height": 928,
"content": "### Step 1: Set Up Your Google Sheets Data Source\n\n**Copy the Sample Data Template:**\n1. Access the template: [Marketing Performance Data Template](https://docs.google.com/spreadsheets/d/19aUQYZq02qHsCelO4eeV4sx_MTJJupC5qe0gDLQBtRA/edit?usp=sharing)\n2. Click \"File\" \u2192 \"Make a copy\" to create your own version\n3. Rename it (e.g., \"My Marketing Performance Data\")\n\n**Set Up Your Data Structure:**\nYour Google Sheet should have a \"Data\" tab with these columns:\n- **Customer ID** - Unique identifier for each customer\n- **Campaign** - Name of the marketing campaign\n- **Clicks** - Number of clicks generated\n- **Conversions** - Number of conversions achieved \n- **Spend ($)** - Amount spent on the campaign\n\n**Configure Google Sheets API Access:**\n- Go to [Google Cloud Console](https://console.cloud.google.com/)\n- Create a project or select existing one\n- Enable \"Google Sheets API\"\n- Create OAuth2 credentials or use service account\n- Share your sheet with the service account email (if using service account)\n"
},
"typeVersion": 1
},
{
"id": "6020cd74-f930-4e34-bcf4-8bb51caaffcf",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1920,
624
],
"parameters": {
"color": 3,
"width": 768,
"height": 928,
"content": "\n#### Node 8: \"Merge\"\n- **Purpose**: Combines all calculated metrics into one data object\n- **Configuration**: Pre-configured to merge by position\n- **No setup required**\n\n#### Node 9: \"Send Email Report\" (Microsoft Outlook)\n- **Purpose**: Sends the formatted HTML email report\n- **Setup Required**:\n 1. Click on the node\n 2. Set up Microsoft Outlook OAuth2 credentials:\n - Click \"Create New Credential\"\n - Follow OAuth2 setup for your Microsoft account\n - Grant necessary email permissions\n 3. **Configure Email Settings**:\n - **To Recipients**: Change from \"rbreen@ynteractive.com\" to your recipient email(s)\n - **Subject**: Modify \"Daily Marketing Performance\" as needed\n - **Body Content**: Pre-configured with professional HTML template\n 4. **Email Template Features**:\n - Modern glassmorphic design\n - Responsive layout for mobile devices\n - Animated gradient accents\n - Hover effects on metric cards\n - Professional typography\n\n*Specializing in AI-powered workflow automation, business process optimization, and custom integration solutions.*"
},
"typeVersion": 1
},
{
"id": "babb9445-8793-4b44-8447-0ed788ca53a0",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2624,
624
],
"parameters": {
"color": 5,
"width": 672,
"height": 928,
"content": " #### Node 3-7: Data Analysis Nodes\n\n**\"Count Unique Customers\"**\n- **Purpose**: Counts how many unique customers were reached\n- **Configuration**: Pre-configured to count unique \"Customer ID\" values\n- **No setup required**\n\n**\"Count Unique Campaigns\"**\n- **Purpose**: Counts total number of campaigns run\n- **Configuration**: Pre-configured to count unique \"Campaign\" values\n- **No setup required**\n\n**\"Sum Total Clicks\"**\n- **Purpose**: Adds up all clicks across campaigns\n- **Configuration**: Pre-configured to sum \"Clicks\" column\n- **No setup required**\n\n**\"Sum Total Conversions\"**\n- **Purpose**: Totals all conversions achieved\n- **Configuration**: Pre-configured to sum \"Conversions\" column\n- **No setup required**\n\n**\"Sum Total Spend\"**\n- **Purpose**: Calculates total marketing spend\n- **Configuration**: Pre-configured to sum \"Spend ($)\" column\n- **No setup required**\n\n"
},
"typeVersion": 1
}
],
"connections": {
"Merge": {
"main": [
[
{
"node": "Send Email Report1",
"type": "main",
"index": 0
}
]
]
},
"Sum Total Spend": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 4
}
]
]
},
"Sum Total Clicks": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 2
}
]
]
},
"Send Email Report1": {
"main": [
[]
]
},
"Sum Total Conversions": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 3
}
]
]
},
"Count Unique Campaigns": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Count Unique Customers": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Get Google Sheets Data": {
"main": [
[
{
"node": "Count Unique Customers",
"type": "main",
"index": 0
},
{
"node": "Count Unique Campaigns",
"type": "main",
"index": 0
},
{
"node": "Sum Total Clicks",
"type": "main",
"index": 0
},
{
"node": "Sum Total Conversions",
"type": "main",
"index": 0
},
{
"node": "Sum Total Spend",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Get Google Sheets Data",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleSheetsOAuth2ApimicrosoftOutlookOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This n8n workflow template automatically pulls marketing data from Google Sheets, calculates key performance metrics, and sends beautifully formatted HTML email reports. Perfect for marketing teams, agencies, or businesses that need regular performance reporting without manual…
Source: https://n8n.io/workflows/7404/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Run professional email campaigns with A/B testing, Google Sheets tracking, and Slack analytics. FEATURES:
This workflow allows you to send multi-step email campaigns using n8n, Gmail and Google Sheets.
Enrich And Veryify Leads. Uses httpRequest, googleSheets, googleSheetsTrigger. Event-driven trigger; 32 nodes.
Google Maps Lead Generation with Email Discovery. Uses @hasdata/n8n-nodes-hasdata, googleSheets, formTrigger. Event-driven trigger; 25 nodes.
This workflow automates sales contact follow-ups and engagement tracking by integrating HighLevel CRM, Gmail, Slack, and Google Sheets. It fetches all contacts from HighLevel, filters inactive contact