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 →
{
"nodes": [
{
"id": "ec43f0df-338b-462f-9195-b20024e83ba1",
"name": "When clicking \"Execute Workflow\"",
"type": "n8n-nodes-base.manualTrigger",
"position": [
720,
500
],
"parameters": {},
"typeVersion": 1
},
{
"id": "e9fd1af3-dcf8-4442-958d-cb8390c85263",
"name": "Compare Datasets",
"type": "n8n-nodes-base.compareDatasets",
"position": [
1380,
380
],
"parameters": {
"options": {
"skipFields": "record_created,record_updated,id"
},
"mergeByFields": {
"values": [
{
"field1": "timestamp",
"field2": "timestamp"
},
{
"field1": "source_name",
"field2": "source_name"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "5b14d739-9037-48a8-9990-5b8ac3318b1c",
"name": "Send Notifications",
"type": "n8n-nodes-base.noOp",
"position": [
1840,
260
],
"parameters": {},
"typeVersion": 1
},
{
"id": "10ff3339-9091-4ea2-be4e-12a91208e27d",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
720,
200
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "*/30 6-22 * * 1-5"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "dcf6838f-0d58-4438-875b-94caac45cb65",
"name": "Google Sheet Data",
"type": "n8n-nodes-base.googleSheets",
"position": [
940,
200
],
"parameters": {
"options": {
"returnAllMatches": "returnAllMatches"
},
"filtersUI": {
"values": [
{
"lookupColumn": "DB Status"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 263642066,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1KCSKt9bKrFSWGRTTfj-JIVl-u7gcLMbFTCSvZbUMiuo/edit#gid=263642066",
"cachedResultName": "Form Responses 1"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "https://docs.google.com/spreadsheets/d/1KCSKt9bKrFSWGRTTfj-JIVl-u7gcLMbFTCSvZbUMiuo"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4
},
{
"id": "6044469f-9000-4e47-a2d9-920371677a82",
"name": "SQL Get inquiries from Google",
"type": "n8n-nodes-base.mySql",
"position": [
940,
500
],
"parameters": {
"table": {
"__rl": true,
"mode": "list",
"value": "ConcertInquiries",
"cachedResultName": "ConcertInquiries"
},
"where": {
"values": [
{
"value": "GoogleForm",
"column": "source_name"
}
]
},
"options": {},
"operation": "select",
"returnAll": true
},
"credentials": {
"mySql": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "f65aad46-93ce-44e6-b7b9-8c177516cf18",
"name": "Add MySQL records",
"type": "n8n-nodes-base.mySql",
"position": [
1620,
80
],
"parameters": {
"table": {
"__rl": true,
"mode": "list",
"value": "ConcertInquiries",
"cachedResultName": "ConcertInquiries"
},
"options": {},
"operation": "upsert",
"columnToMatchOn": "timestamp"
},
"credentials": {
"mySql": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "6b3d9971-f37c-4721-8134-f60bdf1a03da",
"name": "Rename GSheet variables",
"type": "n8n-nodes-base.set",
"position": [
1160,
200
],
"parameters": {
"values": {
"string": [
{
"name": "timestamp",
"value": "={{ $json.Timestamp }}"
},
{
"name": "occasion",
"value": "={{ $json[\"What event are you organizing? \"] }}"
},
{
"name": "email_address",
"value": "={{ $json[\"Email Address\"] }}"
},
{
"name": "event_date",
"value": "={{ DateTime.fromFormat($json[\"When does the event take place? \"], 'M/d/yyyy').toFormat('yyyy-MM-dd') }}"
},
{
"name": "location",
"value": "={{ $json[\"Where does the event take place? \"] }}"
},
{
"name": "event_description",
"value": "={{ $json[\"Please tell us more about the event. \"] }}"
},
{
"name": "source_name",
"value": "GoogleForm"
},
{
"name": "db_status",
"value": "={{ $json[\"DB Status\"] }}"
},
{
"name": "name",
"value": "={{ $json[\"Your name \"] }}"
}
]
},
"options": {},
"keepOnlySet": true
},
"typeVersion": 2
},
{
"id": "04f067be-8d7d-48bd-9a3d-d881d6dd3464",
"name": "No reply too long?",
"type": "n8n-nodes-base.if",
"position": [
1620,
280
],
"parameters": {
"conditions": {
"dateTime": [
{
"value1": "={{ DateTime.fromFormat($json.timestamp, 'MM/d/yyyy HH:mm:ss'); }}",
"value2": "={{ DateTime.now().minus({ hours: 4 }) }}",
"operation": "before"
}
]
}
},
"typeVersion": 1
},
{
"id": "2f287a7b-eda2-4d05-9864-ba66bddaf14d",
"name": "DB Status assigned?",
"type": "n8n-nodes-base.if",
"position": [
1620,
480
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.different.db_status.inputB }}",
"operation": "isNotEmpty"
}
]
}
},
"typeVersion": 1
},
{
"id": "cb10201c-5fcc-41f2-94ac-a52cdbe96e58",
"name": "Update GSheet status",
"type": "n8n-nodes-base.googleSheets",
"position": [
1840,
460
],
"parameters": {
"columns": {
"value": {
"DB Status": "={{ $json.different.db_status.inputB }}",
"Timestamp": "={{ $json.keys.timestamp }}"
},
"schema": [
{
"id": "Timestamp",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Address",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Email Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Your name ",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Your name ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What event are you organizing? ",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What event are you organizing? ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "When does the event take place? ",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "When does the event take place? ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Where does the event take place? ",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Where does the event take place? ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Please tell us more about the event. ",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Please tell us more about the event. ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "DB Status",
"type": "string",
"display": true,
"required": false,
"displayName": "DB Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Timestamp"
]
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 263642066,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1KCSKt9bKrFSWGRTTfj-JIVl-u7gcLMbFTCSvZbUMiuo/edit#gid=263642066",
"cachedResultName": "Form Responses 1"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "https://docs.google.com/spreadsheets/d/1KCSKt9bKrFSWGRTTfj-JIVl-u7gcLMbFTCSvZbUMiuo"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4
},
{
"id": "178fe745-b026-4c7f-9104-6756ba2d7d7d",
"name": "DB Status in sync?",
"type": "n8n-nodes-base.if",
"position": [
1620,
680
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.source_name }}",
"operation": "isNotEmpty"
}
]
}
},
"typeVersion": 1
},
{
"id": "6b92bfaf-65f1-441d-a0fc-51e448380520",
"name": "Sync MySQL data",
"type": "n8n-nodes-base.mySql",
"position": [
1840,
660
],
"parameters": {
"table": {
"__rl": true,
"mode": "list",
"value": "ConcertInquiries",
"cachedResultName": "ConcertInquiries"
},
"options": {},
"dataMode": "defineBelow",
"operation": "update",
"valuesToSend": {
"values": [
{
"value": "={{ $json.source_name }}Sync",
"column": "source_name"
}
]
},
"valueToMatchOn": "={{ $json.id }}",
"columnToMatchOn": "id"
},
"credentials": {
"mySql": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "3c95f764-e91c-4418-98c9-c18939486b01",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
903,
-115.08597285067867
],
"parameters": {
"width": 376.8778280542988,
"height": 474.81900452488685,
"content": "## Create a new Google Form with several variables:\n\n-Email Address\n-Your name \n-What event are you organizing? \n-When does the event take place? \n-Where does the event take place? \n-Please tell us more about the event. \n\n- Timestamp variable is added automatically\n- Add \"DB Status\" manually in the Google Sheet\n"
},
"typeVersion": 1
},
{
"id": "0a5aa6c9-5312-4716-bd63-71534cdccbf1",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
900,
394
],
"parameters": {
"width": 375.6334841628956,
"height": 273.23529411764684,
"content": "### Import this SQL file to create a new table\nhttps://gist.github.com/teds-tech-talks/cf25c60363cba082b9c5a1feca10180f"
},
"typeVersion": 1
}
],
"connections": {
"Compare Datasets": {
"main": [
[
{
"node": "Add MySQL records",
"type": "main",
"index": 0
}
],
[
{
"node": "No reply too long?",
"type": "main",
"index": 0
}
],
[
{
"node": "DB Status assigned?",
"type": "main",
"index": 0
}
],
[
{
"node": "DB Status in sync?",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Google Sheet Data",
"type": "main",
"index": 0
},
{
"node": "SQL Get inquiries from Google",
"type": "main",
"index": 0
}
]
]
},
"Google Sheet Data": {
"main": [
[
{
"node": "Rename GSheet variables",
"type": "main",
"index": 0
}
]
]
},
"DB Status in sync?": {
"main": [
[
{
"node": "Sync MySQL data",
"type": "main",
"index": 0
}
]
]
},
"No reply too long?": {
"main": [
[
{
"node": "Send Notifications",
"type": "main",
"index": 0
}
]
]
},
"DB Status assigned?": {
"main": [
[
{
"node": "Update GSheet status",
"type": "main",
"index": 0
}
]
]
},
"Rename GSheet variables": {
"main": [
[
{
"node": "Compare Datasets",
"type": "main",
"index": 0
}
]
]
},
"SQL Get inquiries from Google": {
"main": [
[
{
"node": "Compare Datasets",
"type": "main",
"index": 1
}
]
]
},
"When clicking \"Execute Workflow\"": {
"main": [
[
{
"node": "Google Sheet Data",
"type": "main",
"index": 0
},
{
"node": "SQL Get inquiries from Google",
"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.
googleSheetsOAuth2ApimySql
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
Effortlessly maintain up-to-date records by syncing data from Google Sheets to MySQL, ensuring your team always works with the latest information without manual imports or errors. This workflow suits businesses or analysts handling dynamic datasets, such as sales leads or inventory lists, where real-time accuracy drives decisions. The key step involves comparing datasets between Google Sheets and MySQL to detect changes, then selectively adding or updating records in MySQL for seamless integration.
Use this workflow when your Google Sheets serve as a collaborative front-end for structured data storage in MySQL, particularly for event-driven updates like after spreadsheet edits. Avoid it for massive datasets exceeding thousands of rows, as it may slow down; opt for bulk ETL tools instead. Common variations include adding email notifications via integrations like Gmail for sync completion alerts or scheduling daily runs for non-real-time needs.
About this workflow
Sync Google Sheets Data With Mysql. Uses manualTrigger, compareDatasets, noOp, scheduleTrigger. Event-driven trigger; 15 nodes.
Source: https://github.com/Zie619/n8n-workflows — 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.
This template demonstrates how to build a low-code, AI-powered data analysis workflow in n8n. It enables you to connect to various data sources (such as MySQL, Google Sheets, or local files), process
This workflow performs several data integration and synchronization tasks between Google Sheets and a MySQL database.
BP_check. Uses googleSheets, @n-octo-n/n8n-nodes-json-database, httpRequest, itemLists. Webhook trigger; 99 nodes.
This workflow acts as a junior finance research analyst for a UK boutique M&A or corporate finance team. It listens for Slack messages, classifies the request, gathers company or market data, and prod
Teams that manage tasks in ClickUp and want those tasks reflected—and kept in sync—in Google Calendar automatically.