This workflow corresponds to n8n.io template #9623 — 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "7d50aea5-d58c-4a01-9964-92da5fe5031d",
"name": "Jotform \u2014 New Feedback Submission",
"type": "n8n-nodes-base.jotFormTrigger",
"position": [
-128,
0
],
"parameters": {
"form": "251411842823048",
"onlyAnswers": false
},
"credentials": {
"jotFormApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "1df86418-1292-43b4-a144-1282d700f51d",
"name": "Extract Key Fields (Normalize Input)",
"type": "n8n-nodes-base.set",
"position": [
160,
0
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "1b8cefc9-25fd-4603-88ef-787b5582660e",
"name": "submissionId",
"type": "string",
"value": "={{ $json.submissionID }}"
},
{
"id": "a4f8f6b0-9eea-422a-a02c-8db49cfbb026",
"name": "fullName",
"type": "string",
"value": "={{ $json.rawRequest[\"Full Name\"] }}"
},
{
"id": "804e4a6e-fbae-449a-a0dd-95b3c9a1cc60",
"name": "email",
"type": "string",
"value": "={{ $json.rawRequest.Email }}"
},
{
"id": "59e72537-9635-473b-9d7c-9755497cbc1f",
"name": "whatsappNumber",
"type": "string",
"value": "={{ $json.rawRequest[\"Whatsapp Number\"] }}"
},
{
"id": "ddaddc42-b043-4643-a6c7-d46bdbb3665f",
"name": "orderId",
"type": "string",
"value": "={{ $json.rawRequest[\"Order Id\"] }}"
},
{
"id": "26a71509-4fe2-4111-b206-b990c1669d54",
"name": "ratings",
"type": "string",
"value": "={{ $json.rawRequest.Ratings }}"
},
{
"id": "73ecd764-ba3b-49f4-98f4-1d0aad049c16",
"name": "experienceFeedback",
"type": "string",
"value": "={{ $json.rawRequest[\"Please describe your experience in detail.\"] }}"
},
{
"id": "1badf182-58df-4832-8153-9b7e89fe928d",
"name": "recommendUs",
"type": "string",
"value": "={{ $json.rawRequest[\"Would you recommend us to others?\"] }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "ba3d2aca-2377-4cad-8aac-e75f7cac07bb",
"name": "AI Analysis \u2014 Sentiment & Root Cause",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
464,
0
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini",
"cachedResultName": "GPT-4.1-MINI"
},
"options": {
"temperature": 0.7
},
"messages": {
"values": [
{
"content": "=You are a Customer Feedback Analysis AI.\nYour job is to analyze raw customer feedback and produce structured, machine-readable insights.\n\nReturn a valid JSON object only, in the following exact format:\n\n{\n \"Sentiment\": \"Positive | Neutral | Negative\",\n \"RootCause\": \"short, human-readable explanation of the main reason behind the feedback\",\n \"RecoveryDirection\": \"concise, internal note suggesting what the company should do next\",\n \"RecoveryMessage\": \"optional draft message suggestion for the support team to consider (not to be sent automatically)\"\n}\n\nSubmission:\nRating: {{ $json.ratings }}\nExperience: {{ $json.experienceFeedback }}\nRecommendUs: {{ $json.recommendUs }}\n\nGuidelines:\n1. Be objective \u2014 classify based on sentiment and tone, not rating alone.\n2. Use \"RootCause\" to summarize the issue (e.g., \u201clate delivery\u201d, \u201crude support\u201d, \u201cconfusing checkout\u201d).\n3. Keep \"RecoveryDirection\" actionable (e.g., \u201coffer compensation\u201d, \u201cescalate to ops\u201d, \u201csend apology email\u201d).\n4. Keep \"RecoveryMessage\" short and generic (internal use only).\n5. Never include markdown, explanations, or extra text outside the JSON object."
}
]
},
"jsonOutput": true
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "9d427e02-2337-44eb-b074-29492fb6f5ff",
"name": "Check if Feedback is Negative or Rating \u2264 3",
"type": "n8n-nodes-base.if",
"position": [
864,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "or",
"conditions": [
{
"id": "d0911e13-fee7-44ec-9c7a-dc14285d0d6b",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.message.content.Sentiment }}",
"rightValue": "=Negative"
},
{
"id": "f82433a5-15ee-46e2-bb2e-e6aaf527d2c4",
"operator": {
"type": "number",
"operation": "lte"
},
"leftValue": "={{ $('Extract Key Fields (Normalize Input)').item.json.ratings }}",
"rightValue": 3
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "61bad5e0-5b4c-463f-96de-688302bb62ea",
"name": "AI Generator \u2014 Personalized Recovery Message",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
1168,
-112
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini",
"cachedResultName": "GPT-4.1-MINI"
},
"options": {
"temperature": 0.7
},
"messages": {
"values": [
{
"content": "=You are an AI Customer Experience Writer. \nYour job is to compose personalized, empathetic recovery messages for customers based on their feedback and AI analysis results for email and whatsapp both channels.\n\nReturn a valid JSON object only, in this exact format:\n\n{\n \"Email Body\": \"string (the full customer-facing message)\",\n \"Subject\": \"string (applicable only for email),\n \"Tone\": \"Friendly | Professional | Empathetic\"\n}\n\nContext:\n- Customer Name: {{ $('Extract Key Fields (Normalize Input)').item.json.fullName }}\n- Brand Name: Your Brand Name\n- Sentiment: {{ $json.message.content.Sentiment }}\n- Root Cause: {{ $json.message.content.RootCause }}\n- Feedback Text: {{ $('Extract Key Fields (Normalize Input)').item.json.experienceFeedback }}\n- Recovery Direction: {{ $json.message.content.RecoveryDirection }}\n- Previous Recovery Message: {{$json[\"RecoveryMessage\"] || \"\"}}\n- Order ID: {{$json[\"order_id\"] || \"N/A\"}}\n- Rating: {{ $('Extract Key Fields (Normalize Input)').item.json.ratings }}\n- Recommend Us: {{ $('Extract Key Fields (Normalize Input)').item.json.recommendUs }}\n\nGuidelines:\n1. Be concise (60\u2013100 words).\n2. Always start with the customer\u2019s name and acknowledge their experience.\n3. Use empathy but maintain professionalism \u2014 no exaggerated apologies.\n4. Don\u2019t overpromise \u2014 avoid mentioning refunds, compensation, or guarantees unless implied by context.\n5. End on a reassuring note and represent the brand positively.\n6. Return JSON only. No markdown or extra text."
}
]
},
"jsonOutput": true
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "c43ead64-eec7-4178-875f-eff6f389a769",
"name": "Send Recovery Email (Negative Path)",
"type": "n8n-nodes-base.emailSend",
"position": [
2000,
-48
],
"parameters": {
"html": "={{ $json.message.content[\"Email Body\"] }}",
"options": {},
"subject": "={{ $json.message.content.Subject }}",
"toEmail": "={{ $('Extract Key Fields (Normalize Input)').item.json.email }}",
"fromEmail": "user@example.com"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "2029a509-776a-439e-976b-e435511d9ac1",
"name": "Notify CX Team on Slack",
"type": "n8n-nodes-base.slack",
"position": [
1824,
48
],
"parameters": {
"text": "=\ud83d\udea8 *Negative Feedback Alert*\n*Name:* {{ $json[\"Full Name\"] }}\n*Rating:* {{ $json.Ratings }}\n*Root Cause:* {{ $json[\"Root Cause\"] }}\n*Order ID:* {{ $json[\"Order Id\"] }}\n*Recovery Msg Sent:* \u2705",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "name",
"value": "#customer_feedback"
},
"otherOptions": {}
},
"typeVersion": 2.3
},
{
"id": "cf844ac0-b5fa-4051-bc26-98b6c27f6d4e",
"name": "Mark Recovery Message Sent",
"type": "n8n-nodes-base.googleSheets",
"position": [
2256,
-32
],
"parameters": {
"columns": {
"value": {
"Submission Id": "={{ $('Prepare Data for Sheet & Notifications (Negative Path)').item.json[\"Submission Id\"] }}",
"Recovery Message Sent": "Yes"
},
"schema": [
{
"id": "Submission Id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Submission Id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Full Name",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Full Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Whatsapp Number",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Whatsapp Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Order Id",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Order Id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ratings",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Ratings",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Experience Feedback",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Experience Feedback",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recommend Us",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Recommend Us",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sentiment",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Sentiment",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Root Cause",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Root Cause",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Direction",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Recovery Direction",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Message",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Recovery Message",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Subject",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Email Subject",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Body",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Email Body",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Tone",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Recovery Tone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Message Sent",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Recovery Message Sent",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "createdAt",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "createdAt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Submission Id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "id",
"value": "=gid=0"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ your_google_sheet_document }}"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "3dae2739-cefe-44fa-962b-ea47c297d201",
"name": "Send Appreciation Email (Positive Path)",
"type": "n8n-nodes-base.emailSend",
"position": [
1472,
432
],
"parameters": {
"html": "=<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f8fafc;padding:32px 0;font-family:Helvetica,Arial,sans-serif;\">\n <tr>\n <td align=\"center\">\n <table role=\"presentation\" width=\"600\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#ffffff;border-radius:10px;overflow:hidden;box-shadow:0 4px 10px rgba(0,0,0,0.05);\">\n \n <!-- Header -->\n <tr>\n <td style=\"background:#0b4a82;padding:20px 24px;color:#ffffff;font-size:20px;font-weight:600;\">\n Your Brand Name Team\n </td>\n </tr>\n\n <!-- Body -->\n <tr>\n <td style=\"padding:32px 40px;color:#0f172a;\">\n <h2 style=\"margin:0 0 16px 0;font-size:22px;font-weight:600;color:#111827;\">Thank you, {{$json[\"Full Name\"]}}!</h2>\n\n <p style=\"margin:0 0 16px 0;line-height:1.6;color:#334155;font-size:15px;\">\n We\u2019re so glad you enjoyed your experience with us. Your feedback keeps our team motivated to do better every day.\n </p>\n\n <p style=\"margin:0 0 20px 0;font-size:15px;color:#334155;\">\n Would you mind sharing your experience publicly? It helps other customers discover us and keeps our small team growing!\n </p>\n\n <!-- CTA -->\n <table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:24px 0;\">\n <tr>\n <td>\n <a href=\"Your review Page link\" style=\"background:#0b4a82;color:#ffffff;padding:12px 22px;text-decoration:none;border-radius:6px;font-size:15px;font-weight:600;display:inline-block;\">\n Leave a Review\n </a>\n </td>\n </tr>\n </table>\n\n <p style=\"margin:16px 0 0 0;font-size:13px;color:#64748b;\">\n Thanks again for being part of the Your Brand Name community \ud83d\udc99 \n <br><strong>\u2014 The Customer Experience Team</strong>\n </p>\n </td>\n </tr>\n\n <!-- Footer -->\n <tr>\n <td style=\"padding:16px 40px;background:#f9fafb;border-top:1px solid #e2e8f0;font-size:13px;color:#64748b;text-align:center;\">\n \u00a9 2025 Your Brand Name \u2022 <a href=\"Unsubscribe Link\" style=\"color:#94a3b8;text-decoration:none;\">Unsubscribe</a>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n</table>\n",
"options": {},
"subject": "A small favor? Share your happy experience with others!",
"toEmail": "={{ $json[\"Email\"] }}",
"fromEmail": "user@example.com"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "6199baa6-140d-45f4-a786-e81f9c022771",
"name": "Log Feedback in Google Sheet (Negative Path)",
"type": "n8n-nodes-base.googleSheets",
"position": [
1840,
-192
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "Submission Id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Submission Id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Full Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Full Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Whatsapp Number",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Whatsapp Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Order Id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Order Id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ratings",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Ratings",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Experience Feedback",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Experience Feedback",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recommend Us",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Recommend Us",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sentiment",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Sentiment",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Root Cause",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Root Cause",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Direction",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Recovery Direction",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Message",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Recovery Message",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Subject",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email Subject",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Body",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email Body",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Tone",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Recovery Tone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Message Sent",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Recovery Message Sent",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "createdAt",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "createdAt",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "id",
"value": "=gid=0"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{your_google_sheet_document}}"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "fd15071e-5b5e-4ce1-9494-9df8623950fc",
"name": "Prepare Data for Sheet & Notifications (Negative Path)",
"type": "n8n-nodes-base.set",
"position": [
1520,
-112
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "d0ecfce6-a795-4899-b8ca-61930ca608b1",
"name": "Submission Id",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.submissionId }}"
},
{
"id": "48eb542c-26eb-4bcf-99a8-b89da94b09e6",
"name": "Full Name",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.fullName }}"
},
{
"id": "0ba76f73-c547-4878-ae0d-88082ae41ffc",
"name": "Email",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.email }}"
},
{
"id": "5cb71cf8-b6ba-4b5e-a023-77572baf7f2d",
"name": "Whatsapp Number",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.whatsappNumber }}"
},
{
"id": "dbf840c6-6c5c-4ccc-945d-c9bf2666e614",
"name": "Order Id",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.orderId }}"
},
{
"id": "e801c1b2-793b-474a-91c0-be92f3474a70",
"name": "Ratings",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.ratings }}"
},
{
"id": "4ec10cde-0678-4928-a278-d71b3f9bbe8a",
"name": "Experience Feedback",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.experienceFeedback }}"
},
{
"id": "c100a63a-0971-4a00-af92-e5b735fa1682",
"name": "Recommend Us",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.recommendUs }}"
},
{
"id": "02ff8101-ddf0-4d2e-9639-ea67e6088143",
"name": "Sentiment",
"type": "string",
"value": "={{ $('AI Analysis \u2014 Sentiment & Root Cause').item.json.message.content.Sentiment }}"
},
{
"id": "ff1e1c61-57f0-4877-be1d-499ad223fbf0",
"name": "Root Cause",
"type": "string",
"value": "={{ $('AI Analysis \u2014 Sentiment & Root Cause').item.json.message.content.RootCause }}"
},
{
"id": "829756fc-5b76-4dbb-aaba-ee7fde17eaa0",
"name": "Recovery Direction",
"type": "string",
"value": "={{ $('AI Analysis \u2014 Sentiment & Root Cause').item.json.message.content.RecoveryDirection }}"
},
{
"id": "f767550e-66ba-44c0-9182-7379f12e5488",
"name": "Recovery Message",
"type": "string",
"value": "={{ $('AI Analysis \u2014 Sentiment & Root Cause').item.json.message.content.RecoveryMessage }}"
},
{
"id": "f83ac8b4-02d2-494d-a066-5c96a5ffe9ec",
"name": "Email Subject",
"type": "string",
"value": "={{ $json.message.content.Subject }}"
},
{
"id": "1f142e06-ca48-4fe6-92ac-f27e871e2721",
"name": "Email Body",
"type": "string",
"value": "={{ $json.message.content[\"Email Body\"] }}"
},
{
"id": "17c39abf-9a2d-4d1a-91fd-afa1240678c1",
"name": "Recovery Tone",
"type": "string",
"value": "={{ $json.message.content.Tone }}"
},
{
"id": "6cf5fcab-5469-4583-877b-4b801835d530",
"name": "Recovery Message Sent",
"type": "string",
"value": ""
},
{
"id": "56b12b3c-2804-4956-98d9-4ea2e42c2e21",
"name": "createdAt",
"type": "string",
"value": "={{ $now.toLocal().toMillis() }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "bdcd7bb0-8d61-4bdd-b0f3-e4ff61efb4d7",
"name": "Prepare Data for Sheet & Notifications (Positive Path)",
"type": "n8n-nodes-base.set",
"position": [
1248,
352
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "d0ecfce6-a795-4899-b8ca-61930ca608b1",
"name": "Submission Id",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.submissionId }}"
},
{
"id": "48eb542c-26eb-4bcf-99a8-b89da94b09e6",
"name": "Full Name",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.fullName }}"
},
{
"id": "0ba76f73-c547-4878-ae0d-88082ae41ffc",
"name": "Email",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.email }}"
},
{
"id": "5cb71cf8-b6ba-4b5e-a023-77572baf7f2d",
"name": "Whatsapp Number",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.whatsappNumber }}"
},
{
"id": "dbf840c6-6c5c-4ccc-945d-c9bf2666e614",
"name": "Order Id",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.orderId }}"
},
{
"id": "e801c1b2-793b-474a-91c0-be92f3474a70",
"name": "Ratings",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.ratings }}"
},
{
"id": "4ec10cde-0678-4928-a278-d71b3f9bbe8a",
"name": "Experience Feedback",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.experienceFeedback }}"
},
{
"id": "c100a63a-0971-4a00-af92-e5b735fa1682",
"name": "Recommend Us",
"type": "string",
"value": "={{ $('Extract Key Fields (Normalize Input)').item.json.recommendUs }}"
},
{
"id": "02ff8101-ddf0-4d2e-9639-ea67e6088143",
"name": "Sentiment",
"type": "string",
"value": "={{ $('AI Analysis \u2014 Sentiment & Root Cause').item.json.message.content.Sentiment }}"
},
{
"id": "ff1e1c61-57f0-4877-be1d-499ad223fbf0",
"name": "Root Cause",
"type": "string",
"value": "={{ $('AI Analysis \u2014 Sentiment & Root Cause').item.json.message.content.RootCause }}"
},
{
"id": "829756fc-5b76-4dbb-aaba-ee7fde17eaa0",
"name": "Recovery Direction",
"type": "string",
"value": "={{ $('AI Analysis \u2014 Sentiment & Root Cause').item.json.message.content.RecoveryDirection }}"
},
{
"id": "f767550e-66ba-44c0-9182-7379f12e5488",
"name": "Recovery Message",
"type": "string",
"value": "={{ $('AI Analysis \u2014 Sentiment & Root Cause').item.json.message.content.RecoveryMessage }}"
},
{
"id": "56b12b3c-2804-4956-98d9-4ea2e42c2e21",
"name": "createdAt",
"type": "string",
"value": "={{ $now.toLocal().toMillis() }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "4e18d0fb-c762-433a-9ddf-1ab13204e872",
"name": "Log Feedback in Google Sheet (Positive Path)",
"type": "n8n-nodes-base.googleSheets",
"position": [
1456,
240
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "Submission Id",
"type": "string",
"display": true,
"required": false,
"displayName": "Submission Id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Full Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Full Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Whatsapp Number",
"type": "string",
"display": true,
"required": false,
"displayName": "Whatsapp Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Order Id",
"type": "string",
"display": true,
"required": false,
"displayName": "Order Id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ratings",
"type": "string",
"display": true,
"required": false,
"displayName": "Ratings",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Experience Feedback",
"type": "string",
"display": true,
"required": false,
"displayName": "Experience Feedback",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recommend Us",
"type": "string",
"display": true,
"required": false,
"displayName": "Recommend Us",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sentiment",
"type": "string",
"display": true,
"required": false,
"displayName": "Sentiment",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Root Cause",
"type": "string",
"display": true,
"required": false,
"displayName": "Root Cause",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Direction",
"type": "string",
"display": true,
"required": false,
"displayName": "Recovery Direction",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Message",
"type": "string",
"display": true,
"required": false,
"displayName": "Recovery Message",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Subject",
"type": "string",
"display": true,
"required": false,
"displayName": "Email Subject",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Body",
"type": "string",
"display": true,
"required": false,
"displayName": "Email Body",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Tone",
"type": "string",
"display": true,
"required": false,
"displayName": "Recovery Tone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Recovery Message Sent",
"type": "string",
"display": true,
"required": false,
"displayName": "Recovery Message Sent",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "createdAt",
"type": "string",
"display": true,
"required": false,
"displayName": "createdAt",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1YYmyQNTGSdBQcoHuUI1tnd081Nq-5FVcN8KWGLf0iK8/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "=1YYmyQNTGSdBQcoHuUI1tnd081Nq-5FVcN8KWGLf0iK8"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "e6f586ea-130e-46a6-aedd-cf9154f7f401",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-384,
-880
],
"parameters": {
"width": 400,
"height": 368,
"content": "## \ud83e\udde0 Workflow Summary\n\nAI-driven automation that transforms every Jotform feedback submission into actionable customer engagement.\n\n\ud83d\udfe2 Captures Feedback \u2192 \ud83e\udde0 Analyzes with GPT \u2192 \u2696\ufe0f Routes Path \u2192 \n\ud83d\udce7 Sends Email \u2192 \ud83d\udcca Logs Data \u2192 \ud83d\udd14 Notifies Team\n\n**Built using:** \nJotform + n8n + GPT-4.1 + Google Sheets + Slack + SMTP\n\nGet sample google sheet format: https://docs.google.com/spreadsheets/u/2/d/1YYmyQNTGSdBQcoHuUI1tnd081Nq-5FVcN8KWGLf0iK8/copy"
},
"typeVersion": 1
},
{
"id": "fb284404-2e7a-4316-a323-5309afd80e93",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
32,
-416
],
"parameters": {
"color": 4,
"width": 352,
"height": 608,
"content": "## Clean Incoming Data\n\nNormalizes raw Jotform fields into structured variables:\n\n- Full Name \n- Email \n- WhatsApp Number \n- Order ID \n- Rating (1\u20135 scale) \n- Experience Feedback Text \n- Recommendation Response\n\nEnsures consistent naming for downstream AI and routing nodes.\n"
},
"typeVersion": 1
},
{
"id": "8a3a00f8-9844-49c2-ab38-567b40e64e31",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
-416
],
"parameters": {
"color": 6,
"width": 320,
"height": 608,
"content": "## AI Sentiment & Root Cause Detection\n\nGPT analyzes the customer feedback and returns structured insight:\n\n- **Sentiment:** Positive | Neutral | Negative \n- **Root Cause:** Short explanation of the main issue \n- **Recovery Direction:** Actionable next step for the business \n- **Recovery Message:** Optional internal note for CX team\n\n**Output:** JSON-only (no markdown, no extra text)"
},
"typeVersion": 1
},
{
"id": "3cea0b32-e8af-463e-8846-3015815f0e9a",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
736,
-416
],
"parameters": {
"color": 5,
"width": 352,
"height": 608,
"content": "## Path Routing Logic\n\nDecision Node Logic:\n- If **Sentiment = Negative** OR **Rating \u2264 3**\n \u2192 Route to *Recovery Path*\n- Else\n \u2192 Route to *Appreciation Path*\n\nThis ensures negative experiences are handled immediately, \nwhile positive customers are nurtured for reviews."
},
"typeVersion": 1
},
{
"id": "0f039f93-f1db-42f6-836d-2172daeb01d7",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1104,
-848
],
"parameters": {
"color": 3,
"width": 1360,
"height": 1040,
"content": "## AI Recovery Message Composer\n\nThe AI crafts a personalized, empathetic message using the customer\u2019s data.\n\n**Context Used:**\n- Name, Rating, Feedback, Root Cause, Recovery Direction \n\n**Output Format:**\n```json\n{\n \"Email Body\": \"...\",\n \"Subject\": \"...\",\n \"Tone\": \"Friendly | Professional | Empathetic\"\n}\n```\nKeeps tone consistent with your brand and avoids overpromising.\n\n\n---\n\n### \ud83d\udea8 **Negative Path (Steps 6\u201310)**\n```markdown\n## \ud83d\udea8 Recovery Path Flow\n\nTriggered for **Negative Sentiment** or **Rating \u2264 3**.\n\n1\ufe0f\u20e3 Log feedback in Google Sheets \n2\ufe0f\u20e3 Send AI-crafted Recovery Email \n3\ufe0f\u20e3 Notify CX Team via Slack \n4\ufe0f\u20e3 Update Google Sheet \u2014 \u201cRecovery Message Sent: Yes\u201d \n\n**Goal:** \nAcknowledge and recover customer trust quickly, while logging all actions for visibility.\n"
},
"typeVersion": 1
},
{
"id": "82cd08d7-0913-42ea-8a4f-1aaa7a5a652f",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1120,
208
],
"parameters": {
"width": 576,
"height": 656,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## \ud83c\udf1f Appreciation Path Flow\n\nTriggered for **Positive** or **Neutral** feedback.\n\n\u2705 Sends personalized **Thank-you Email** \n\u2705 Includes CTA to leave a **public review** \n\u2705 Logs all data in Google Sheets \n\n**Objective:** \nReinforce loyalty and convert satisfied customers into public advocates."
},
"typeVersion": 1
},
{
"id": "19b6d6fc-4ef5-421b-9048-1c8504134e1e",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-384,
-496
],
"parameters": {
"width": 400,
"height": 400,
"content": "## \ud83d\udd10 How to Get Your Jotform API Credentials\n\n1. Visit [Jotform](https://www.jotform.com/?partner=aayushmansharma) and **sign up** (if you\u2019re new) or **log in** to your existing account. \n2. Click your **profile icon (top-right)** \u2192 go to **Settings**. \n3. In the left sidebar, open the **API** section. \n4. Click **Create New Key**. \n5. Set permission to **Full Access** (recommended for full workflow functionality). \n6. Copy the generated API key. \n7. In **n8n**, open **Credentials \u2192 Create New \u2192 JotForm API**. \n8. Paste your API key and save it as `JotForm account`. \n9. Test the connection by running your **Jotform Trigger** node."
},
"typeVersion": 1
},
{
"id": "dd336412-bf91-45fd-92db-63869ff96040",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
32,
-880
],
"parameters": {
"width": 512,
"height": 448,
"content": "## \u2699\ufe0f Jotform Configuration Guide (for n8n Feedback Workflow)\n\nFollow these steps to connect your Jotform to n8n:\n\n### 1\ufe0f\u20e3 Create the Feedback Form\nBuild a form in Jotform with the following exact fields:\n- Field Label - Field Type - Example Input\n- Full Name - Short Text - Customer Name\n- Email - Email - test@gmail.com\n- Whatsapp Number - Short Text- 91xxxxxxxxxx\n- Order Id - Short Text - #2321\n- Ratings - Ratings - 3\n- Please describe your experience in detail. - Long Text - \u201cFeedback\u201d\n- Would you recommend us to others? - Single Choice (Yes/No) - No\n\n\ud83d\udca1 **Tip:** Keep field labels identical \u2014 n8n uses these exact keys for data mapping.\n\n"
},
"typeVersion": 1
}
],
"connections": {
"Jotform \u2014 New Feedback Submission": {
"main": [
[
{
"node": "Extract Key Fields (Normalize Input)",
"type": "main",
"index": 0
}
]
]
},
"Send Recovery Email (Negative Path)": {
"main": [
[
{
"node": "Mark Recovery Message Sent",
"type": "main",
"index": 0
}
]
]
},
"Extract Key Fields (Normalize Input)": {
"main": [
[
{
"node": "AI Analysis \u2014 Sentiment & Root Cause",
"type": "main",
"index": 0
}
]
]
},
"AI Analysis \u2014 Sentiment & Root Cause": {
"main": [
[
{
"node": "Check if Feedback is Negative or Rating \u2264 3",
"type": "main",
"index": 0
}
]
]
},
"Send Appreciation Email (Positive Path)": {
"main": [
[]
]
},
"Check if Feedback is Negative or Rating \u2264 3": {
"main": [
[
{
"node": "AI Generator \u2014 Personalized Recovery Message",
"type": "main",
"index": 0
}
],
[
{
"node": "Prepare Data for Sheet & Notifications (Positive Path)",
"type": "main",
"index": 0
}
]
]
},
"AI Generator \u2014 Personalized Recovery Message": {
"main": [
[
{
"node": "Prepare Data for Sheet & Notifications (Negative Path)",
"type": "main",
"index": 0
}
]
]
},
"Prepare Data for Sheet & Notifications (Negative Path)": {
"main": [
[
{
"node": "Log Feedback in Google Sheet (Negative Path)",
"type": "main",
"index": 0
},
{
"node": "Send Recovery Email (Negative Path)",
"type": "main",
"index": 0
},
{
"node": "Notify CX Team on Slack",
"type": "main",
"index": 0
}
]
]
},
"Prepare Data for Sheet & Notifications (Positive Path)": {
"main": [
[
{
"node": "Log Feedback in Google Sheet (Positive Path)",
"type": "main",
"index": 0
},
{
"node": "Send Appreciation Email (Positive Path)",
"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.
googleApijotFormApiopenAiApismtp
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Businesses using Jotform to collect customer feedback who want to automate sentiment analysis, email responses, and internal reporting — especially eCommerce, support, or CX teams looking to scale without hiring more agents.
Source: https://n8n.io/workflows/9623/ — 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.
Description This workflow automates a personalized pre-arrival guest experience for hotels by combining Google Sheets, OpenAI, Email, and Slack. It detects upcoming check-ins, maintains unified guest
Grain Real Estate Land Showcase v1. Uses formTrigger, httpRequest, openAi, emailSend. Event-driven trigger; 13 nodes.
Complete AI-powered sales system Automates lead capture, qualification, and follow-up from multiple channels. AI INTELLIGENCE:
Imagine a relentless, intelligent sales assistant working for you 24/7. That's exactly what this system is. It takes the grueling, manual work of outreach and transforms it into a precision-guided, au
Overview