This workflow corresponds to n8n.io template #8447 — we link there as the canonical source.
This workflow follows the Gmail → 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": "JmH0beZB5ZUgJGor",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Google Forms \u2192 Jira Issue Creator",
"tags": [
{
"id": "MxIJ6vHorSEdfi3v",
"name": "google form",
"createdAt": "2025-08-18T07:16:22.720Z",
"updatedAt": "2025-08-18T07:16:22.720Z"
},
{
"id": "eAzNESqLUWwWMrE9",
"name": "gmail",
"createdAt": "2025-08-18T07:16:22.709Z",
"updatedAt": "2025-08-18T07:16:22.709Z"
},
{
"id": "EYNbAs3Q9sg9NksG",
"name": "Jira",
"createdAt": "2025-09-10T10:47:53.750Z",
"updatedAt": "2025-09-10T10:47:53.750Z"
},
{
"id": "7zEwLFClveXBEcdb",
"name": "google sheet",
"createdAt": "2025-08-18T07:16:22.756Z",
"updatedAt": "2025-08-18T07:16:22.756Z"
}
],
"nodes": [
{
"id": "8b90ebac-96e0-4b28-8024-edd6692f45c9",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
-544
],
"parameters": {
"color": 3,
"width": 304,
"height": 176,
"content": "## Required\n\n\n\u2022 Google Form + response sheet\n\u2022 Jira Cloud project (API email + API token)\n\u2022 Gmail credential"
},
"typeVersion": 1
},
{
"id": "f7d9bcc1-d9c2-4844-ab4d-7d9d6b8610c3",
"name": "Trigger when row added",
"type": "n8n-nodes-base.googleSheetsTrigger",
"position": [
208,
-16
],
"parameters": {
"event": "rowAdded",
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"sheetName": {
"__rl": true,
"mode": "id",
"value": "",
"cachedResultUrl": "",
"cachedResultName": ""
},
"documentId": {
"__rl": true,
"mode": "url",
"value": ""
}
},
"credentials": {
"googleSheetsTriggerOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "5278e62a-2d6c-4aa5-8621-77e38efd9dc6",
"name": "Normalize fields",
"type": "n8n-nodes-base.code",
"position": [
416,
-16
],
"parameters": {
"jsCode": "const priorityMap = {\n \"Highest\": \"1\",\n \"High\": \"2\", \n \"Medium\": \"3\",\n \"Low\": \"4\",\n \"Lowest\": \"5\"\n};\n\nconst sheetPriority = ($json['Priority'] || \"\").toString().trim();\nconst jiraPriority = priorityMap[sheetPriority] || \"3\";\nconst context = $json['Context'] || \"No context provided\";\nconst email = $json['Adresse e-mail'] || $json['Email'] || \"No email provided\";\n\n// keep data from the Google Sheets Trigger\nconst originalData = $input.first().json;\n\nreturn {\n ...originalData, // keep all data from trigger\n priority: jiraPriority,\n summary: context,\n description: `Email: ${email}\\nContext: ${context}\\nSteps to reproduce: ${$json['If bug, steps to reproduce'] || \"N/A\"}\\nAcceptance criteria: ${$json['Acceptance criteria'] || \"N/A\"}`\n};"
},
"typeVersion": 2
},
{
"id": "ce1d830b-85af-423f-81d1-36089e5ce1ae",
"name": "Cretate Jira Ticket",
"type": "n8n-nodes-base.jira",
"position": [
672,
-16
],
"parameters": {
"project": {
"__rl": true,
"mode": "list",
"value": "10002",
"cachedResultName": "test2"
},
"summary": "={{$json.summary}}",
"issueType": {
"__rl": true,
"mode": "list",
"value": "10014",
"cachedResultName": "Story"
},
"additionalFields": {
"priority": {
"__rl": true,
"mode": "",
"value": "={{$json.priority}}"
},
"description": "={{$json.description}}"
}
},
"credentials": {
"jiraSoftwareCloudApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "387f2792-94a0-43ec-b358-a27229c50566",
"name": "Update the Google sheet with tickets information",
"type": "n8n-nodes-base.googleSheets",
"position": [
976,
-16
],
"parameters": {
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "5cc9d8ed-dea5-44cc-bc5f-60fcc2a8b464",
"name": "Notification email",
"type": "n8n-nodes-base.gmail",
"position": [
1296,
-16
],
"parameters": {
"message": "=<p>Hello, you just received a new Jira ticket created.</p>\n\n<p><strong>Details:</strong></p>\n<ul>\n <li><strong>Reference:</strong> {{$node[\"Cretate Jira Ticket\"].json.key}}</li>\n <li><strong>URL:</strong> \n <a href=\"https://YOURSITE.atlassian.net/browse/{{$node['Cretate Jira Ticket'].json.key}}\">View ticket</a>\n </li>\n <li><strong>Title:</strong> {{\n (String($node[\"Normalize fields\"].json.summary ?? '')\n .replace(/\\s+/g,' ')\n .trim())\n || 'New issue from Google Form'\n }}</li>\n <li><strong>Priority:</strong> {{\n (()=>{\n const p = String($node[\"Normalize fields\"].json.priority ?? $json.priority ?? '').toLowerCase().trim();\n const map = { '1':'Highest','2':'High','3':'Medium','4':'Low','5':'Lowest',\n 'highest':'Highest','high':'High','medium':'Medium','low':'Low','lowest':'Lowest' };\n return map[p] || (p || 'Medium');\n })()\n }}</li>\n <li><strong>Status:</strong> {{ String($json.status ?? 'Created') }}</li>\n</ul>\n\n<p><strong>Requester:</strong></p>\n<ul>\n <li><strong>Email:</strong> {{\n $node[\"Trigger when row added\"].json[\"Adresse e-mail\"]\n || $node[\"Trigger when row added\"].json.Email\n || $node[\"Normalize fields\"].json[\"Adresse e-mail\"]\n || $node[\"Normalize fields\"].json.Email\n || ''\n }}</li>\n</ul>",
"options": {},
"subject": "You just received a new ticket"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "d4016ada-d836-4ff2-9c57-882fda5d1e1f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
112,
-544
],
"parameters": {
"width": 448,
"height": 704,
"content": "## 1) Trigger and Normalize \n\nTrigger: New row added to Google Sheets\n\nData Processing:\n- Clean and normalize all fields\n- summary: Single-spaced, trimmed text\n- description: Preserve paragraphs (trimmed)\n- reporter_email: Extract from \"email address\" or \"Email\" fields\n- Handle optional fields (like attachments)\n\nBest Practices:\nPerform all data cleaning here to avoid reprocessing later"
},
"typeVersion": 1
},
{
"id": "0df66792-90e8-4802-9e0b-33d46d8f9e0d",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
576,
-544
],
"parameters": {
"color": 5,
"width": 304,
"height": 704,
"content": "## 2) Create Jira ticket\n\nAction: Call Jira API to create ticket\n\nKey Parameters:\n- Project: \n- Type: Story\n- Priority: Mapped to Jira IDs (1-5)\n- Description: Standardized format\n\nOutputs:\n- Ticket key (e.g., TES-503)\n- Ticket URL\n- Creation status\n\nTips\nPriority: Map with the ID"
},
"typeVersion": 1
},
{
"id": "6379b494-5fd6-4795-8310-2b3b28dbf39a",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
896,
-544
],
"parameters": {
"color": 4,
"width": 576,
"height": 704,
"content": "## 3) Update the sheet and send Gmail notification\nAction: Update source row with Jira information\n\nUpdated Fields:\n- jira_key: Ticket reference\n- jira_url: Ticket link\n- status: \"Created\"\n- created_at: Creation timestamp\n\nMatching Mechanism:\n- Use \"Horodateur\" column for row matching\n\n\nAction: Send confirmation email\n\nRecipients: The person who needs to get the notification + eventually the requester\n\nContent:\n- Ticket reference and link\n- Title and priority\n- Creation status\n- Requester information"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "9e5ef1b9-61ec-41c0-bd9a-ae923ff3e582",
"connections": {
"Normalize fields": {
"main": [
[
{
"node": "Cretate Jira Ticket",
"type": "main",
"index": 0
}
]
]
},
"Cretate Jira Ticket": {
"main": [
[
{
"node": "Update the Google sheet with tickets information",
"type": "main",
"index": 0
}
]
]
},
"Trigger when row added": {
"main": [
[
{
"node": "Normalize fields",
"type": "main",
"index": 0
}
]
]
},
"Update the Google sheet with tickets information": {
"main": [
[
{
"node": "Notification email",
"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.
gmailOAuth2googleSheetsOAuth2ApigoogleSheetsTriggerOAuth2ApijiraSoftwareCloudApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automated workflow that creates Jira issues directly from Google Forms. The flow validates and normalizes the data, creates the Jira issue, writes the key back to the Google Sheet, and sends a Gmail notification.
Source: https://n8n.io/workflows/8447/ — 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 is ideal for HR teams, startup founders, operations leads, remote-first companies, and freelancers managing onboarding manually or across multiple tools.
Automatically processes new orders added to Google Sheets. Small orders are approved instantly; large orders trigger an HTML email with one-click Approve / Reject links — each handled by an independen
General use cases include: Property managers who manage multiple buildings or units. Building owners looking to centralize tenant repair communication. Automation builders who want to learn multi-trig
FlujoDeReservasUpdated. Uses googleSheetsTrigger, googleSheets, googleCalendar, gmail. Event-driven trigger; 27 nodes.
This workflow automates the full offer letter lifecycle, from generation to final candidate response tracking. When a new row with a Pending status is added to Google Sheets, it creates a personalized