This workflow corresponds to n8n.io template #9825 — 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": "qcrbyv2z8OnQhJ8F",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Streamline Change Request Reviews from Monday.com to Jira, Slack, and Google Sheets",
"tags": [],
"nodes": [
{
"id": "b8a91ff9-d449-45c9-b706-61e83d030052",
"name": "Workflow Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1440,
-512
],
"parameters": {
"color": 4,
"width": 389,
"height": 535,
"content": "## \ud83c\udfaf Change Request Approval Workflow\n\nAutomated change management system that routes requests based on risk level and status.\n\n**What it does:**\n- Fetches change requests from Monday.com daily\n- Routes by status (Pending/Approved/Rejected)\n- Creates Jira tickets for approved requests\n- Logs approved requests to Google Sheets\n- Sends Slack notifications to stakeholders\n- Handles resubmissions for rejected requests\n\n**Use Case:** Perfect for IT teams managing change requests with approval workflows and risk-YOUR_OPENAI_KEY_HERE_OPENAI_KEY_HERE routing.\n\n**Required Setup:**\n- Monday.com board with change requests\n- Jira project for approved changes\n- Google Sheets for audit trail\n- Slack workspace for notifications\n- Gmail for email confirmations"
},
"typeVersion": 1
},
{
"id": "0bdc7dc2-9c82-4244-ac4b-705a9614327f",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-880,
-240
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 3 * * 1-5"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "7d410d1e-b7c0-4437-a1bd-a3204182b655",
"name": "Note - Schedule",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1024,
-512
],
"parameters": {
"width": 262,
"height": 253,
"content": "## \u23f0 Daily Schedule\n\nRuns weekdays at 3:00 AM to process change requests.\n\n**Schedule:** Mon-Fri at 03:00\n**Cron:** `0 3 * * 1-5`\n\n**Customize:** Adjust timing based on your team's timezone and workflow needs."
},
"typeVersion": 1
},
{
"id": "a88be726-9d70-4b65-b27e-8f6de2aa6000",
"name": "Fetch Change Requests",
"type": "n8n-nodes-base.mondayCom",
"position": [
-688,
-240
],
"parameters": {
"boardId": "YOUR_BOARD_ID",
"groupId": "topics",
"resource": "boardItem",
"operation": "getAll"
},
"typeVersion": 1
},
{
"id": "82495c67-2b53-4687-9403-d149fae710b6",
"name": "Note - Fetch",
"type": "n8n-nodes-base.stickyNote",
"position": [
-784,
-96
],
"parameters": {
"width": 262,
"height": 269,
"content": "## \ud83d\udccb Fetch Requests\n\n**Setup Required:**\n1. Replace `YOUR_BOARD_ID` with your Monday.com board ID\n2. Update `groupId` if using different group\n3. Connect Monday.com credentials\n\n**Fetches:** All change request items from board"
},
"typeVersion": 1
},
{
"id": "34f52f17-bcae-4ee9-91b2-21bcf735715b",
"name": "Extract Request Data",
"type": "n8n-nodes-base.set",
"position": [
-464,
-240
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a1970365-569f-4272-a0a1-cfb19592ae14",
"name": "id",
"type": "string",
"value": "={{ $json.id }}"
},
{
"id": "20ee1686-786d-4702-8786-562dd485ae77",
"name": "name",
"type": "string",
"value": "={{ $json.name }}"
},
{
"id": "3957374a-b750-40d9-889a-0b8cc320d317",
"name": "Component affected",
"type": "string",
"value": "={{ $json.column_values[4].text }}"
},
{
"id": "7724954e-5ab9-493d-ac12-f8da9754561b",
"name": "Approvers",
"type": "string",
"value": "={{ $json.column_values[5].text }}"
},
{
"id": "c749e528-e47e-4de6-b40a-8ae74acfcb52",
"name": "Status",
"type": "string",
"value": "={{ $json.column_values[1].text }}"
},
{
"id": "c74e1543-2ac9-46dc-aa93-0e45ca8f1dbd",
"name": "Description",
"type": "string",
"value": "={{ $json.column_values[6].text }}"
},
{
"id": "59caec12-5c47-498e-a784-28c3b92a2fb0",
"name": "Risk Level",
"type": "string",
"value": "={{ $json.column_values[3].text }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "711aebae-2618-4900-8b45-220ca132c4ba",
"name": "Note - Extract",
"type": "n8n-nodes-base.stickyNote",
"position": [
-592,
-544
],
"parameters": {
"width": 262,
"height": 293,
"content": "## \ud83d\udd04 Data Transformation\n\nExtracts and maps Monday.com columns to clean fields.\n\n**Mapped Fields:**\n- ID, Name, Status\n- Component affected\n- Approvers\n- Description\n- Risk Level\n\n**Note:** Adjust column indices if your board structure differs"
},
"typeVersion": 1
},
{
"id": "5f7bbae1-47bd-4093-809b-0a108e4dd5fd",
"name": "Filter Pending Requests",
"type": "n8n-nodes-base.if",
"position": [
-240,
-240
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.Status }}",
"value2": "Pending"
}
]
}
},
"typeVersion": 1
},
{
"id": "67a96247-6ade-4425-b15d-a27dbc97945a",
"name": "Note - Status Route",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
-80
],
"parameters": {
"width": 262,
"height": 285,
"content": "## \ud83d\udd00 Status Router\n\nRoutes requests based on status.\n\n**True Branch:** Status = \"Pending\"\n- Sends notification to stakeholders\n\n**False Branch:** Status = \"Approved\" or \"Rejected\"\n- Continues to next routing node"
},
"typeVersion": 1
},
{
"id": "7334c79d-6312-4102-878b-e71e6c74a391",
"name": "Notify Pending Request",
"type": "n8n-nodes-base.slack",
"position": [
-16,
-336
],
"parameters": {
"text": "=\ud83d\udd14 New Request Requires Your Approval\n\n*Name:* {{ $json.name }}\n*Request:* {{ $json.Description }}\n*Risk Level:* {{ $json['Risk Level'] }}\n*Component:* {{ $json['Component affected'] }}\n*Approver:* {{ $json.Approvers }}\n\nPlease review and update the status in Monday.com",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "YOUR_CHANNEL_ID",
"cachedResultName": "change-requests"
},
"otherOptions": {}
},
"typeVersion": 2
},
{
"id": "7e709062-4468-4156-8d6b-e5924dcd055d",
"name": "Note - Pending Slack",
"type": "n8n-nodes-base.stickyNote",
"position": [
-176,
-608
],
"parameters": {
"width": 262,
"height": 258,
"content": "## \ud83d\udcac Slack Alert - Pending\n\n**Setup Required:**\n1. Replace `YOUR_CHANNEL_ID` with Slack channel ID\n2. Connect Slack API credentials\n\n**Sends:** Notification for pending approvals with all request details"
},
"typeVersion": 1
},
{
"id": "19f26741-55e1-4414-82e1-7e18eb2a25c6",
"name": "Filter Approved Requests",
"type": "n8n-nodes-base.if",
"position": [
-16,
-144
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.Status }}",
"value2": "Approved"
}
]
}
},
"typeVersion": 1
},
{
"id": "2e1b935e-9a0d-4ae6-8683-1aa981086636",
"name": "Note - Approved Route",
"type": "n8n-nodes-base.stickyNote",
"position": [
-64,
0
],
"parameters": {
"width": 262,
"height": 258,
"content": "## \u2705 Approved Router\n\n**True Branch:** Status = \"Approved\"\n- Creates Jira ticket\n- Logs to Google Sheets\n\n**False Branch:** Status = \"Rejected\"\n- Handles resubmission flow"
},
"typeVersion": 1
},
{
"id": "38e773fd-a193-4768-a5b9-a08e09d995e5",
"name": "Create Jira Ticket",
"type": "n8n-nodes-base.jira",
"position": [
224,
-336
],
"parameters": {
"project": {
"__rl": true,
"mode": "list",
"value": "YOUR_PROJECT_ID",
"cachedResultName": "Change Management"
},
"summary": "={{ $json.name }}",
"issueType": {
"__rl": true,
"mode": "list",
"value": "10006",
"cachedResultName": "Task"
},
"additionalFields": {
"description": "={{ $json.Description }}"
}
},
"typeVersion": 1
},
{
"id": "3b269183-16cb-472e-ad53-55eec45dcb7a",
"name": "Note - Jira",
"type": "n8n-nodes-base.stickyNote",
"position": [
112,
-592
],
"parameters": {
"width": 262,
"height": 237,
"content": "## \ud83c\udfab Create Jira Issue\n\n**Setup Required:**\n1. Replace `YOUR_PROJECT_ID` with Jira project ID\n2. Update issue type if needed\n3. Connect Jira credentials\n\n**Creates:** Task with request name and description"
},
"typeVersion": 1
},
{
"id": "5c7ae18a-9006-4fe2-965b-9158dc97a071",
"name": "Log to Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
224,
-144
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"required": false,
"displayName": "id",
"defaultMatch": true,
"canBeUsedToMatch": true
},
{
"id": "name",
"type": "string",
"display": true,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Component affected",
"type": "string",
"display": true,
"required": false,
"displayName": "Component affected",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Approvers",
"type": "string",
"display": true,
"required": false,
"displayName": "Approvers",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Description",
"type": "string",
"display": true,
"required": false,
"displayName": "Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Risk Level",
"type": "string",
"display": true,
"required": false,
"displayName": "Risk Level",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"id"
]
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "YOUR_SHEET_GID",
"cachedResultName": "Approved Requests"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_SHEET_ID",
"cachedResultName": "Change Request Log"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "e9131c3a-0780-4327-a6aa-5dfa1b78c6f5",
"name": "Note - Sheets",
"type": "n8n-nodes-base.stickyNote",
"position": [
176,
176
],
"parameters": {
"width": 262,
"height": 309,
"content": "## \ud83d\udcca Audit Trail\n\n**Setup Required:**\n1. Replace `YOUR_SHEET_ID` with Google Sheets document ID\n2. Replace `YOUR_SHEET_GID` with sheet tab ID\n3. Connect Google OAuth2 credentials\n\n**Logs:** All approved requests for compliance tracking"
},
"typeVersion": 1
},
{
"id": "20d32c52-d750-46b6-96b9-de5973da359d",
"name": "Notify Approval",
"type": "n8n-nodes-base.slack",
"position": [
448,
-336
],
"parameters": {
"text": "=\ud83d\udd14 Request Approved\n\n*Name:* {{ $('Filter Approved Requests').item.json.name }}\n*Request:* {{ $('Filter Approved Requests').item.json.Description }}\n*Risk Level:* {{ $('Filter Approved Requests').item.json[\"Risk Level\"] }}\n*Component:* {{ $('Filter Approved Requests').item.json[\"Component affected\"] }}\n*Approver:* {{ $('Filter Approved Requests').item.json.Approvers }}\n*Jira Ticket:* {{ $json.key }}\n\nPlease proceed with implementation.",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "YOUR_CHANNEL_ID",
"cachedResultName": "change-requests"
},
"otherOptions": {}
},
"typeVersion": 2
},
{
"id": "f09cf9cc-1a82-4c7e-92f1-ee4c289d10da",
"name": "Note - Approved Slack",
"type": "n8n-nodes-base.stickyNote",
"position": [
448,
-224
],
"parameters": {
"width": 262,
"height": 269,
"content": "## \ud83d\udcac Slack Alert - Approved\n\n**Setup Required:**\n1. Use same Slack channel ID\n2. Same credentials as pending notification\n\n**Sends:** Confirmation with Jira ticket key for approved requests"
},
"typeVersion": 1
},
{
"id": "aeb63837-91ff-4cc6-bc41-8535632dfef5",
"name": "Send Confirmation Email",
"type": "n8n-nodes-base.gmail",
"position": [
672,
-336
],
"parameters": {
"sendTo": "user@example.com",
"message": "=Your change request has been approved.\n\nName: {{ $('Filter Approved Requests').item.json.name }}\nComponent affected: {{ $('Filter Approved Requests').item.json[\"Component affected\"] }}\n\nJira Ticket: {{ $('Create Jira Ticket').item.json.key }}\n\nPlease proceed with the implementation as planned.",
"options": {},
"subject": "Change Request Approved",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "0af472d6-740a-4fba-9c8e-1048ae537732",
"name": "Note - Email",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
-576
],
"parameters": {
"width": 262,
"height": 301,
"content": "## \ud83d\udce7 Email Confirmation\n\n**Setup Required:**\n1. Replace `YOUR_EMAIL@example.com` with recipient\n2. Connect Gmail OAuth2 credentials\n\n**Sends:** Professional confirmation email with Jira ticket link"
},
"typeVersion": 1
},
{
"id": "201bb8ec-0ef7-4477-b0f1-1e1edb305b1f",
"name": "Filter Rejected Requests",
"type": "n8n-nodes-base.if",
"position": [
224,
64
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.Status }}",
"value2": "Rejected"
}
]
}
},
"typeVersion": 1
},
{
"id": "b95b46e2-6495-4588-951a-d26e914460e1",
"name": "Note - Rejected Route",
"type": "n8n-nodes-base.stickyNote",
"position": [
448,
224
],
"parameters": {
"width": 262,
"height": 258,
"content": "## \u274c Rejected Router\n\n**True Branch:** Status = \"Rejected\"\n- Creates resubmission item in Monday.com\n\n**False Branch:** No action\n- End of workflow for other statuses"
},
"typeVersion": 1
},
{
"id": "03d9109c-b8ed-4946-904f-0623d2460088",
"name": "Create Resubmission Item",
"type": "n8n-nodes-base.mondayCom",
"position": [
448,
64
],
"parameters": {
"name": "=Resubmission: {{ $json.name }}",
"boardId": "YOUR_BOARD_ID",
"groupId": "topics",
"resource": "boardItem",
"additionalFields": {}
},
"typeVersion": 1
},
{
"id": "041490e8-5ad2-4333-8428-615b07fb2677",
"name": "Note - Resubmit",
"type": "n8n-nodes-base.stickyNote",
"position": [
736,
64
],
"parameters": {
"width": 262,
"height": 285,
"content": "## \ud83d\udd04 Resubmission Handler\n\n**Setup Required:**\n1. Use same board ID as fetch node\n2. Same Monday.com credentials\n\n**Creates:** New item prefixed with \"Resubmission:\" for rejected requests"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "ad65aef6-ec63-402b-b1b9-eac62f2064c3",
"connections": {
"Notify Approval": {
"main": [
[
{
"node": "Send Confirmation Email",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Fetch Change Requests",
"type": "main",
"index": 0
}
]
]
},
"Create Jira Ticket": {
"main": [
[
{
"node": "Notify Approval",
"type": "main",
"index": 0
}
]
]
},
"Extract Request Data": {
"main": [
[
{
"node": "Filter Pending Requests",
"type": "main",
"index": 0
}
]
]
},
"Fetch Change Requests": {
"main": [
[
{
"node": "Extract Request Data",
"type": "main",
"index": 0
}
]
]
},
"Filter Pending Requests": {
"main": [
[
{
"node": "Notify Pending Request",
"type": "main",
"index": 0
}
],
[
{
"node": "Filter Approved Requests",
"type": "main",
"index": 0
}
]
]
},
"Filter Approved Requests": {
"main": [
[
{
"node": "Create Jira Ticket",
"type": "main",
"index": 0
},
{
"node": "Log to Google Sheets",
"type": "main",
"index": 0
}
],
[
{
"node": "Filter Rejected Requests",
"type": "main",
"index": 0
}
]
]
},
"Filter Rejected Requests": {
"main": [
[
{
"node": "Create Resubmission Item",
"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.
gmailOAuth2googleSheetsOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Streamline IT and operations change management by automating approval routing, Jira issue creation, audit logging, and real-time Slack alerts. This workflow ensures faster reviews, traceable approvals, and transparent communication across systems. 🚀💼 Step 1: Triggers…
Source: https://n8n.io/workflows/9825/ — 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.
Streamline IT and operations change management by automating approval routing, Jira issue creation, audit logging, and real-time Slack alerts. This workflow ensures faster reviews, traceable approvals
Keep your product and project teams perfectly aligned by automatically syncing task dependencies between Jira and Monday.com. This workflow ensures real-time visibility into cross-platform blockers an
This workflow automatically scans AWS accounts for orphaned resources (unattached EBS volumes, old snapshots >90 days, unassociated Elastic IPs) that waste money. It calculates cost impact, validat
Synchronize OKRs (Objectives and Key Results) between Monday.com and Jira to automatically calculate progress variance, update dashboards, and share variance reports via Slack and Outlook. This workfl
Automate your GoHighLevel (GHL) pipeline tracking and deal management process. This workflow fetches all opportunities, calculates the time spent in each stage, logs historical pipeline data in Google