This workflow corresponds to n8n.io template #6300 — 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": "c6250c78-41e1-4977-8f3b-d34a76a24f82",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
140,
-340
],
"parameters": {
"height": 1480,
"content": "## This workflow processes emails received in Gmail and adds the sender's **name** and **email address** to a MySQL database.\n\n## Use Cases:\n- A sales or marketing agency can use this to automatically save client contact info to a database to build a list of leads\n- Companies can use this to automatically save contacts to a database in case of Gmail data loss / losing access to their Gmail account\n- Companies can build mailing lists to automatically send promotions to all of the clients who have contacted them in a given time period\n\n## Before using, you need to have:\n- Gmail credential\n- MySQL database credential\n- A Table in the MySQL database to store your contacts\n- The table should have a \"name\" column, which allows NULL values\n- The table should have an \"email\" column, which should be UNIQUE\n\n## How it works:\n- The Gmail Trigger will listen for a new email every minute\n- For each email, the code node will extract the name and email address of the sender. If there is no name, it will return null\n- The MySQL node will insert the new contact into a table in your database\n- If the contact email already exists in your database, the MySQL node will update the contact name\n\n\n## How to use:\n- Please set up the MySQL node by selecting the correct table to store contacts in\n- Please choose your \"email\" column to match on\n- Please choose your \"name\" column to store names\n"
},
"typeVersion": 1
},
{
"id": "3688fcda-44ad-47c1-bc76-3f3fa04ca436",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
960,
-80
],
"parameters": {
"width": 300,
"height": 680,
"content": "## Please setup this node first\n- Create a table in your MySQL database to store your contacts.\n- The table should include the following fields\n - Name column (should allow null values)\n - Email column (should be set to unique)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## How to use:\n- Please set up the MySQL node by selecting the correct table to store contacts in\n- Please choose your \"email\" column to match on\n- Please choose your \"name\" column to store names"
},
"typeVersion": 1
},
{
"id": "1cbe3946-6b48-483e-9983-2f0c3f243c40",
"name": "Insert New Client in MySQL",
"type": "n8n-nodes-base.mySql",
"onError": "continueRegularOutput",
"position": [
1040,
200
],
"parameters": {
"table": {
"__rl": true,
"mode": "list",
"value": "contacts",
"cachedResultName": "contacts"
},
"options": {},
"dataMode": "defineBelow",
"operation": "upsert",
"valuesToSend": {
"values": [
{
"value": "={{ $json.name }}",
"column": "name"
}
]
},
"valueToMatchOn": "={{ $json.email }}",
"columnToMatchOn": "email"
},
"credentials": {
"mySql": {
"name": "<your credential>"
}
},
"typeVersion": 2.4,
"alwaysOutputData": true
},
{
"id": "ff005111-3172-4022-92b1-9280458d6741",
"name": "Receive Email",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
500,
200
],
"parameters": {
"filters": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "5a266f76-1c4d-48ed-a50b-65998cfe135c",
"name": "Extract Client Name and Email",
"type": "n8n-nodes-base.code",
"position": [
760,
200
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "let email = $json.From.trim();\nlet name = null;\n\nif (email.includes('<')) {\n name = email.split('<')[0].trim();\n email = email.split('<')[1].replace('>', '').trim();\n}\n\nreturn {\n \"name\": name,\n \"email\": email\n}"
},
"typeVersion": 2
},
{
"id": "0b4cf2a9-e890-4561-a6c5-e0c85838a777",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
440,
-80
],
"parameters": {
"color": 5,
"height": 460,
"content": "## Customize this to your liking\n\nYou can add filters to this node to only save certain contact emails\n\n**Example:** You can add a \"Label\" filter to only add emails with a specific label"
},
"typeVersion": 1
},
{
"id": "58e5e9bd-3bf7-4c3a-80be-c4ac2ff0f370",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1280,
-20
],
"parameters": {
"color": 5,
"height": 420,
"content": "## Customizing this Workflow:\n- You can customize this workflow to save more data to MySQL. Here are some examples:\n- In the MySQL node, click \"Add Value\", and choose one of the fields from the Gmail node to save in your database column. You can try saving the following items:\n - Subject line\n - MessageID\n - ThreadID\n - Snippet\n - Recipient Info"
},
"typeVersion": 1
}
],
"connections": {
"Receive Email": {
"main": [
[
{
"node": "Extract Client Name and Email",
"type": "main",
"index": 0
}
]
]
},
"Extract Client Name and Email": {
"main": [
[
{
"node": "Insert New Client in MySQL",
"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.
gmailOAuth2mySql
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
A sales or marketing agency can use this to automatically save client contact info to a database to build a list of leads Companies can use this to automatically save contacts to a database in case of Gmail data loss / losing access to their Gmail account Companies can build…
Source: https://n8n.io/workflows/6300/ — 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.
Gmail credentials MySQL database credentials A table in your database with the following columns: messageId (Gmail message ID) threadId snippet sender_name (nullable) sender_email recipient_name (null
2025-12-03 fix JS code in node
Receive any business document via email. The attachment is automatically classified (Invoice, Contract, or Purchase Order) using easybits Extractor, then routed down the correct path where a second Ex
The goal is to reduce inbox noise and automatically organize repetitive types of emails so that imprtant messages remain visible while unsolicited or promotional emails are handled automatically. When
This template is built to be customized for your specific needs. This template has the core logic and n8n node specific references sorted to work with dynamic file names throughout the workflow. Store