This workflow corresponds to n8n.io template #6705 — we link there as the canonical source.
This workflow follows the Emailsend → Google Sheets recipe pattern — see all workflows that pair these two integrations.
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 →
{
"id": "uWv6ijZPkfz6ayIP",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Automated QuickBooks New Customer Welcome Emails with Google Sheets Tracking",
"tags": [],
"nodes": [
{
"id": "b49dda17-46e1-48f3-bc0b-7b97d3af1c12",
"name": "Get many customers",
"type": "n8n-nodes-base.quickbooks",
"position": [
400,
-64
],
"parameters": {
"limit": 1000,
"filters": {},
"operation": "getAll"
},
"credentials": {
"quickBooksOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "c8b9d669-e0a5-4419-a756-d0e750e18be4",
"name": "Start Both Branches",
"type": "n8n-nodes-base.noOp",
"position": [
-64,
160
],
"parameters": {},
"typeVersion": 1
},
{
"id": "fc1ffeb4-2126-493d-80ac-a2ae848f744b",
"name": "Read Old Customers",
"type": "n8n-nodes-base.googleSheets",
"position": [
400,
336
],
"parameters": {
"options": {
"dataLocationOnSheet": {
"values": {
"range": "A:A",
"rangeDefinition": "specifyRangeA1"
}
}
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1M4AoRTj6XuBiNC1O901ctC5k1b2w0vxwh-nO5WOS7zM/edit#gid=0",
"cachedResultName": "Processed IDs"
},
"documentId": {
"__rl": true,
"mode": "",
"value": "1M4AoRTj6XuBiNC1O901ctC5k1b2w0vxwh-nO5WOS7zM"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "83a2cc67-11c9-46c8-b71a-3aa545ddbc4a",
"name": "Scheduler",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-368,
160
],
"parameters": {
"rule": {
"interval": [
{}
]
}
},
"typeVersion": 1.1
},
{
"id": "dec9b8cc-c192-45eb-a992-737a161927d9",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-496,
-48
],
"parameters": {
"color": 5,
"width": 358,
"height": 368,
"content": "## Set Your Schedule Node\n**This node is the trigger. Set how often you want to check for new customers.**\n\n- **Mode:** Choose your interval (e.g., Every Hour, Every Day).\n- **Hour/Minute:** Set the specific time.\nOnce set, this workflow will run automatically.\n"
},
"typeVersion": 1
},
{
"id": "1b5d3b55-68fa-49aa-9e28-9243a79b6c21",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1696,
-880
],
"parameters": {
"color": 5,
"width": 992,
"height": 1952,
"content": "# Automated QuickBooks New Customer Welcome Emails\n\nThis workflow provides a robust solution for QuickBooks users looking to automate their new customer onboarding process. It solves the time-consuming and error-prone task of manually sending welcome emails by creating a fully automated system that ensures every new customer receives a timely, personalized, and professional welcome.\n\nThe workflow periodically checks your QuickBooks Online account for new entries. To prevent sending duplicate emails to existing customers, it cleverly uses a Google Sheet as a simple database, tracking every customer who has already been contacted. This makes the process reliable and safe to run on an automated schedule.\n\nThis template was crafted with care by the team at **Elegant Biztech** to help you build stronger customer relationships through smart automation.\n\n## How the Workflow Operates\n\n1. **Scheduled Trigger:** The workflow initiates on a customizable schedule (e.g., every hour).\n2. **Fetch Data:** It simultaneously fetches all customer data from your QuickBooks account and the list of already-processed customer IDs from your Google Sheet.\n3. **Find New Customers:** It compares the two lists to isolate only the new customers who have not yet been processed.\n4. **Log New Customers:** For each new customer found, the workflow performs two logging actions:\n * It appends their full details (Name, Company, Email, etc.) to a \"log\" sheet for your records.\n * It adds their unique Customer ID to the \"tracking\" sheet to ensure they are not emailed again in the future.\n5. **Craft Personalized Email:** A `Email Template` node dynamically generates a beautiful, responsive HTML email, personalized with the customer's name, company, and location details.\n6. **Send Welcome Email:** The final node sends the uniquely crafted email to the new customer.\n\n## Prerequisites\n\nBefore you begin, please ensure you have the following:\n* An active n8n instance.\n* A QuickBooks Online account with API access.\n* A Google account.\n* An email service (e.g., SMTP, Gmail, Outlook) connected to n8n as credentials.\n\n## Step-by-Step Setup Guide\n\nFollow these instructions carefully to configure the workflow for your use.\n\n### 1. Create the Google Sheet\nThis workflow requires a Google Sheet with two specific tabs to function as its database.\n\n1. Create a new Google Sheet.\n2. Rename the first tab to **`Processed IDs`**. In cell **A1**, create the header: `CustomerIds`.\n3. Create a second tab and name it **`New Customer Logs`**. In row 1, create the following headers: `Customer_Name`, `Company_Name`, `Email_ID`, `Phone_No`, `Customer_ID`.\n\n### 2. Connect Your Accounts\nYou must authenticate your accounts in the designated nodes.\n\n* **`Get many Customers` node:** Select this node and connect your QuickBooks Online credentials.\n* **`Read Old Customers` node:** Connect your Google Sheets account credentials here. This will be automatically used by the other Google Sheets nodes.\n* **`Send Personalized Welcome Email` node:** Connect the credentials for the email account you wish to send from.\n\n### 3. Configure the Google Sheets Nodes\nPoint the workflow to the correct sheet and tabs you just created.\n\n* **`Read Old Customers` node:**\n * In the **Document ID** field, select your new Google Sheet.\n * In the **Sheet Name** field, select the **`Processed IDs`** tab.\n* **`Log New Customer Details` node:**\n * Verify the **Document ID** field is correctly set to your Google Sheet.\n * In the **Sheet Name** field, select the **`New Customer Logs`** tab.\n* **`Log New Customer ID for Tracking` node:**\n * Verify the **Document ID** is correct.\n * In the **Sheet Name** field, select the **`Processed IDs`** tab.\n\n### 4. Customize the Email Template\nPersonalize the welcome email to match your brand.\n\n1. Open the **`Code`** node.\n2. Inside the code editor, find and replace these four placeholder values:\n * **Your Logo URL:** Replace the placeholder link with a public URL to your company's logo.\n * **Your Website Link:** Replace the placeholder with a link to your website's dashboard or homepage.\n * **Your Support Email:** Replace the `mailto:` link with your company's support email.\n * **Your Company Name:** Update the company name in the copyright footer.\n3. Next, select the **`Send Personalized Welcome Email`** node and update the **Subject** field with your company's name.\n\n### 5. Activate the Workflow\n1. Open the **`Cron`** node to set the schedule for how often you want the workflow to run.\n2. **Save** the workflow.\n3. Click the **Active** toggle at the top right of the screen.\n\nYour automated welcome email system is now live! For questions or to explore more custom solutions, visit us at [elegantbiztech.com](https://www.elegantbiztech.com).\n"
},
"typeVersion": 1
},
{
"id": "bb12eadd-a78d-4006-a719-61e71869a508",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
272,
-288
],
"parameters": {
"color": 5,
"width": 352,
"height": 384,
"content": "## Get many customers Node\n### Connect to QuickBooks\n**This node fetches all your customers from QuickBooks Online.**\n\n- **Credentials:** Select your QuickBooks account or create a new connection.\nNo other settings need to be changed.\n"
},
"typeVersion": 1
},
{
"id": "bd8a6285-05f0-4e95-a46c-a49d20116b4f",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
272,
320
],
"parameters": {
"color": 5,
"width": 352,
"height": 432,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n## Read Old Customers Node\n### Connect to Your Database Sheet\n**This node reads the list of customers you've already emailed.**\n\n- **Credentials:** Connect your Google account.\n- **Document ID:** Select the Google Sheet you created for this workflow.\n- **Sheet Name:** Choose the sheet named **Processed IDs**."
},
"typeVersion": 1
},
{
"id": "a7c263f3-8ac8-4a17-b6ac-4e1abf6313e7",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
784,
-144
],
"parameters": {
"color": 5,
"width": 352,
"height": 432,
"content": "## Find New Customers Node\n### Finds New Customers (No Setup Needed)\n**This node is the \"brain.\" It compares the full customer list from QuickBooks (Input 1) with your list of already-processed customers (Input 2).\n\nThe output (main) contains only the new customers. No setup is required here!**\n"
},
"typeVersion": 1
},
{
"id": "6384837d-a8b1-4921-938a-d8791097962e",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1312,
-176
],
"parameters": {
"color": 5,
"width": 400,
"height": 432,
"content": "## Log New Customer Details Node\n### Log Customer Details\n**This node saves the details of each new customer into your Google Sheet for logging purposes.**\n\n- **Credentials:** Should already be set.\n- **Document ID:** Select the same Google Sheet.\n- **Sheet Name:** Choose the sheet named New Customer Logs.\n"
},
"typeVersion": 1
},
{
"id": "8dec0230-fcf7-4991-884d-d84bccc5003a",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1328,
304
],
"parameters": {
"color": 5,
"width": 384,
"height": 512,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Log New Customer ID for Tracking Node\n### Update Your Database\n**This node adds the new customer's ID to your \"processed\" list. This is crucial to prevent sending them emails again.**\n\n- **Credentials:** Should already be set.\n- **Document ID:** Select the same Google Sheet.\n- **Sheet Name:** Choose the sheet named **Processed IDs**."
},
"typeVersion": 1
},
{
"id": "a741a432-1c7a-4ddd-bef8-17eb6d673f8e",
"name": "Email Template",
"type": "n8n-nodes-base.code",
"position": [
1984,
64
],
"parameters": {
"jsCode": "// This code works when \"Execute Once\" is ON.\n// 'items' is an array of all customers from the previous node.\n\nfor (const item of items) {\n const customer = item.json;\n\n // --- 1. Dynamic Personalization Logic ---\n const greeting = customer.GivenName ? `Hello ${customer.GivenName},` : `Hello ${customer.DisplayName},`;\n let openingLine = `We are absolutely thrilled to welcome you to our family!`;\n if (customer.CompanyName) {\n openingLine = `We are absolutely thrilled to welcome <strong>${customer.CompanyName}</strong> to our family!`;\n }\n const detailsConfirmation = `\n <div style=\"background-color: #f8f9fa; padding: 15px; border-radius: 5px; margin-top: 15px; border: 1px solid #dee2e6;\">\n <strong>Display Name:</strong> ${customer.DisplayName}<br>\n <strong>Email:</strong> ${customer.PrimaryEmailAddr.Address}\n ${customer.BillAddr && customer.BillAddr.City ? `<br><strong>Location:</strong> ${customer.BillAddr.City}, ${customer.BillAddr.CountrySubDivisionCode}` : ''}\n </div>\n `;\n\n // --- 2. Construct the HTML Email Body ---\n const emailHtml = `\n <!DOCTYPE html>\n <html>\n <head>\n <title>A Warm Welcome!</title>\n </head>\n <body style=\"margin: 0; padding: 0; background-color: #f4f4f4; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\">\n <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n <tr>\n <td style=\"padding: 20px 0;\">\n <table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"600\" style=\"border-collapse: collapse; background-color: #ffffff; max-width: 600px;\">\n <tr>\n <td align=\"center\" style=\"padding: 30px; background-color: #00466a;\">\n <img src=\"https://yourdomain.com/images/logo.png\" alt=\"Company Logo\" style=\"display: block; width: 150px;\">\n </td>\n </tr>\n <tr>\n <td style=\"padding: 40px 30px;\">\n <h1 style=\"font-size: 24px; font-weight: bold; color: #153643;\">${greeting}</h1>\n <p style=\"font-size: 16px; line-height: 1.5; color: #333333;\">${openingLine}</p>\n <p style=\"font-size: 16px; line-height: 1.5; color: #333333;\">\n To ensure everything is perfect from the start, we've listed the primary details we have on file for you:\n </p>\n ${detailsConfirmation}\n <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n <tr>\n <td align=\"center\" style=\"padding: 20px 0;\">\n <a href=\"https://yourdomain.com/\" style=\"background-color: #ff7f50; color: #ffffff; padding: 15px 25px; text-decoration: none; border-radius: 5px; font-size: 16px; display: inline-block;\">Explore Your Dashboard</a>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n <tr>\n <td style=\"padding: 30px; background-color: #eeeeee; color: #555555; font-size: 14px; text-align: center;\">\n <p style=\"margin: 0;\">Questions? Just reply to this email or <a href=\"mailto:user@example.com\" style=\"color: #00466a;\">contact our support team</a>.</p>\n <p style=\"margin: 10px 0 0 0;\">\u00a9 2025 [Your Company Name], All rights reserved.</p>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n </body>\n </html>\n `;\n\n // --- 3. Add the generated HTML to the current item ---\n item.json.emailHtml = emailHtml;\n}\n\n// --- 4. Return all the modified items for the next node ---\nreturn items;"
},
"typeVersion": 2
},
{
"id": "6c08ace4-0df2-46c2-af96-53b0c54ad8df",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1824,
-224
],
"parameters": {
"color": 5,
"width": 400,
"height": 432,
"content": "## Email Template Node\n### Personalize Your Email Template\n**This node builds the beautiful HTML email. This is the most important step for customization.**\n\n- **Edit the Code:** Click in the code and replace the placeholders with your company's info:\n 1. Your company logo URL.\n 2. The \"Explore Your Dashboard\" link.\n 3. Your support email address.\n 4. Your company name in the footer.\n"
},
"typeVersion": 1
},
{
"id": "fc810d73-c33f-4489-8de9-116dab8470f9",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
2304,
-224
],
"parameters": {
"color": 5,
"width": 400,
"height": 480,
"content": "## Send Personalized Welcome Email Node\n### Set Up Your Email Sender\n**This final node sends the email.**\n\n- **Credentials:** Connect the email account you want to send from (e.g., SMTP or Gmail).\n- **From Email:** Enter your sending email address.\n- **Subject:** Change [Your Company Name] in the subject line to your actual company name.\n"
},
"typeVersion": 1
},
{
"id": "881a2221-432d-4a6e-896d-4233f4f6b9cc",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1696,
1120
],
"parameters": {
"color": 2,
"width": 976,
"height": 240,
"content": "# Need more help \n\n**We hope this workflow saves you valuable time and helps you delight your customers. Should you have any questions or wish to explore more custom automation solutions, we would be delighted to connect.**\n\n### Email: info@elegantbiztech.com\n### Website: https://www.elegantbiztech.com"
},
"typeVersion": 1
},
{
"id": "6f53a5d6-982b-4f15-9496-b4ce1c744496",
"name": "Find New Customers",
"type": "n8n-nodes-base.compareDatasets",
"position": [
880,
80
],
"parameters": {
"options": {},
"mergeByFields": {
"values": [
{
"field1": "Id",
"field2": "CustomerIds"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "de5d511e-25c2-4672-9994-8080815de004",
"name": "Log New Customer Details",
"type": "n8n-nodes-base.googleSheets",
"position": [
1456,
64
],
"parameters": {
"options": {},
"fieldsUi": {
"fieldValues": [
{
"fieldId": "Customer_Name",
"fieldValue": "={{ $json.GivenName }}"
},
{
"fieldId": "Company_Name",
"fieldValue": "={{ $json.CompanyName }}"
},
{
"fieldId": "Email_ID",
"fieldValue": "={{ $json.PrimaryEmailAddr.Address }}"
},
{
"fieldId": "Phone_No",
"fieldValue": "={{ $json.PrimaryPhone.FreeFormNumber }}"
},
{
"fieldId": "Customer_ID",
"fieldValue": "={{ $json.Id }}"
}
]
},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1652724254,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1M4AoRTj6XuBiNC1O901ctC5k1b2w0vxwh-nO5WOS7zM/edit#gid=1652724254",
"cachedResultName": "New Customer Logs"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1M4AoRTj6XuBiNC1O901ctC5k1b2w0vxwh-nO5WOS7zM"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "4b757337-eebd-407f-aad8-abaa6823337d",
"name": "Log New Customer ID for Tracking",
"type": "n8n-nodes-base.googleSheets",
"position": [
1456,
336
],
"parameters": {
"options": {},
"fieldsUi": {
"fieldValues": [
{
"fieldId": "CustomerIds",
"fieldValue": "={{ $json.Id }}"
}
]
},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1M4AoRTj6XuBiNC1O901ctC5k1b2w0vxwh-nO5WOS7zM/edit#gid=0",
"cachedResultName": "Processed IDs"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1M4AoRTj6XuBiNC1O901ctC5k1b2w0vxwh-nO5WOS7zM"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "8b348312-b1b8-4e87-96a8-9657e002d6e1",
"name": "Send Personalized Welcome Email",
"type": "n8n-nodes-base.emailSend",
"position": [
2448,
64
],
"parameters": {
"html": "={{ $json.emailHtml }}",
"options": {},
"subject": "=A Warm Welcome to [Your Company Name], {{$json.DisplayName}}!",
"toEmail": "={{ $json.PrimaryEmailAddr.Address }}",
"fromEmail": "user@example.com"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "d881dde4-93e3-44db-b6a3-c11ccd7bdcec",
"connections": {
"Scheduler": {
"main": [
[
{
"node": "Start Both Branches",
"type": "main",
"index": 0
}
]
]
},
"Email Template": {
"main": [
[
{
"node": "Send Personalized Welcome Email",
"type": "main",
"index": 0
}
]
]
},
"Find New Customers": {
"main": [
[
{
"node": "Log New Customer Details",
"type": "main",
"index": 0
},
{
"node": "Log New Customer ID for Tracking",
"type": "main",
"index": 0
}
]
]
},
"Get many customers": {
"main": [
[
{
"node": "Find New Customers",
"type": "main",
"index": 0
}
]
]
},
"Read Old Customers": {
"main": [
[
{
"node": "Find New Customers",
"type": "main",
"index": 1
}
]
]
},
"Start Both Branches": {
"main": [
[
{
"node": "Get many customers",
"type": "main",
"index": 0
},
{
"node": "Read Old Customers",
"type": "main",
"index": 0
}
]
]
},
"Log New Customer Details": {
"main": [
[
{
"node": "Email Template",
"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.
googleSheetsOAuth2ApiquickBooksOAuth2Apismtp
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow provides a robust solution for QuickBooks users looking to automate their new customer onboarding process. It solves the time-consuming and error-prone task of manually sending welcome emails by creating a fully automated system that ensures every new customer…
Source: https://n8n.io/workflows/6705/ — 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.
Security teams, DevOps engineers, vulnerability analysts, and automation builders who want to eliminate repetitive Nessus scan parsing, AI-based risk triage, and manual reporting. Designed for orgs fo
This workflow fully automates the reconciliation process between your Local Database transactions and Payment Gateway transactions. It compares both data sources, identifies mismatches, categorizes di
This n8n workflow automatically finds apartments for rent in Germany, filters them by your city, rent budget, and number of rooms, and applies to them via email. Each application includes: A personali
👤 Who it’s for Blue Team leads, CISOs, and SOC managers who want automated visibility into threat metrics, endpoint alerts, and response actions — without needing a full SIEM or BI platform.
Workflow Overview Zoom Attendance Evaluator with Follow-up is an n8n automation workflow that automatically evaluates Zoom meeting attendance and sends follow-up emails to no-shows and early leavers w