AutomationFlowsEmail & Gmail › Jira Ticket Creation From Google Forms with Sheet Updates and Email…

Jira Ticket Creation From Google Forms with Sheet Updates and Email…

Original n8n title: Jira Ticket Creation From Google Forms with Sheet Updates and Email Notifications

ByYassin Zehar @yassinzehar on n8n.io

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.

Event trigger★★★★☆ complexity9 nodesGoogle Sheets TriggerJiraGoogle SheetsGmail
Email & Gmail Trigger: Event Nodes: 9 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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.

Pro

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 →

More Email & Gmail workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Email & Gmail

This template is ideal for HR teams, startup founders, operations leads, remote-first companies, and freelancers managing onboarding manually or across multiple tools.

Google Sheets Trigger, Jira, HubSpot Trigger +7
Email & Gmail

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

Google Sheets Trigger, Google Sheets, Gmail +1
Email & Gmail

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

Google Sheets, Google Drive, Gmail +1
Email & Gmail

FlujoDeReservasUpdated. Uses googleSheetsTrigger, googleSheets, googleCalendar, gmail. Event-driven trigger; 27 nodes.

Google Sheets Trigger, Google Sheets, Google Calendar +1
Email & Gmail

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

Google Sheets Trigger, Google Drive, Google Docs +2