{
  "id": "lBzYkA3Hk0wMPihF",
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "name": "Jira Ticket Deadline & Blockage Notifier",
  "tags": [],
  "nodes": [
    {
      "id": "c93cacbb-f5fd-4d12-9c8b-cb1a08c6215d",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        6016,
        3088
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "6f4473d4-0134-4d95-8fba-ca32bc22298e",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        7424,
        2704
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "341ef938-af93-46e2-a454-64ea5c7f991c",
      "name": "END PROCESS",
      "type": "n8n-nodes-base.noOp",
      "position": [
        8960,
        2256
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "b351a94f-3217-4daf-9f6f-2a102aa23044",
      "name": "Note - Level 1 Reminder",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        8896,
        2528
      ],
      "parameters": {
        "color": 7,
        "width": 720,
        "height": 272,
        "content": "## LEVEL 1 -> REMINDER ASSIGNEE \ud83e\udde0\n- [0 - 2] Imminent DueDate \u2192 Send email to ticket assignee"
      },
      "typeVersion": 1
    },
    {
      "id": "0c9fb7ab-4cb6-4400-80bf-79f9d3921801",
      "name": "Note - Level 2 Warning",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        8896,
        2848
      ],
      "parameters": {
        "color": 7,
        "width": 1152,
        "height": 560,
        "content": "## LEVEL 2 -> (WARNING ASSIGNEE OR NOTIFICATION CHANNEL) -> WARNING \u26a0\ufe0f\n\n* **if [1 - 2] OverDue Days** \u2192 Send Email to ticket assignee\n\n* **if ]2 - 4] OverDue Days** \u2192 Send notification to google chat dedicated channel"
      },
      "typeVersion": 1
    },
    {
      "id": "ff65c963-1b31-474a-9283-7061d3d9679e",
      "name": "Note - Level 3 Escalation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        8896,
        3456
      ],
      "parameters": {
        "color": 7,
        "width": 768,
        "height": 288,
        "content": "## LEVEL 3 -> ESCALATION MANAGER -> ALERT \ud83d\udea8\n* Greater than 4 OverDue Days \u2192 Send email to manager(s)"
      },
      "typeVersion": 1
    },
    {
      "id": "c3235594-6225-4c8e-aebd-f64239a38217",
      "name": "ROUTES",
      "type": "n8n-nodes-base.switch",
      "position": [
        7984,
        2912
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "37e0a73e-2415-4fc1-9998-4a261194236f",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    },
                    "leftValue": "={{ $input.last().json.isImminent }}",
                    "rightValue": ""
                  }
                ]
              }
            },
            {
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "0c83b937-ca5a-49ec-be1a-194eb4c6e1f4",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    },
                    "leftValue": "={{ $input.last().json.isOverdue && $input.last().json.overdue_days <= 4}}",
                    "rightValue": ""
                  }
                ]
              }
            },
            {
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "8d2eb47c-6428-4eee-a554-00eac1e7fbd8",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    },
                    "leftValue": "={{ $input.last().json.isOverdue && $input.last().json.overdue_days > 4  }}",
                    "rightValue": ""
                  }
                ]
              }
            },
            {
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "e782ccbf-8565-428b-92dc-3deb04531162",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    },
                    "leftValue": "={{  $input.last().json.isBlocked }}",
                    "rightValue": ""
                  }
                ]
              }
            },
            {
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "d68ebbe7-614e-4bbb-8f1a-28a77fa31a0c",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    },
                    "leftValue": "={{ true // Continue Loop }}",
                    "rightValue": ""
                  }
                ]
              }
            }
          ]
        },
        "options": {
          "allMatchingOutputs": true
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "9d5faec2-6653-4007-bf77-c35d16f2260d",
      "name": "Note - What Is This Workflow",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5824,
        2016
      ],
      "parameters": {
        "width": 640,
        "height": 944,
        "content": "## Jira Tickets Monitoring \u2014 Deadlines & Blockages \ud83d\udea8\n\nAutomate Jira ticket monitoring with progressive escalation to assignees, teams, and managers.\n\n\n### How it works\n\nFetches all open sprint tickets daily and routes each one based on its status:\n\n- \ud83e\udde0 **Reminder** `[0\u20132 days left]` \u2192 Email to assignee\n- \u26a0\ufe0f **Warning** `[1\u20134 days overdue]` \u2192 Email to assignee or Google Chat alert\n- \ud83d\udea8 **Escalation** `[> 4 days overdue]` \u2192 Email to manager(s)\n- \ud83d\udd34 **Blocked** \u2192 Escalates over 3 days: assignee email \u2192 team chat \u2192 manager\n\n\n### How to use\n\nEdit only the **\u2699\ufe0f CONFIG** node with your 4 values, then enable the Schedule Trigger.\n\n\n### Requirements\n\n- Jira Software Cloud\n- Gmail (OAuth2)\n- Google Chat Webhook\n\n\n### \u2699\ufe0f CONFIG\n\n- `JIRA_DOMAIN`: e.g `my-company.atlassian.net`\n- `JIRA_PROJECT_KEY`: e.g. `PROJ`\n- `MANAGER_EMAILS`: Escalation recipient(s)\n- `GOOGLE_CHAT_WEBHOOK_URL`: Your Google Chat space webhook\n\n\n### Need Help?\n\nVisit \ud83d\udc49 [aixautomation.tech](https://aixautomation.tech/)"
      },
      "typeVersion": 1
    },
    {
      "id": "ea6adf87-9a03-4eab-ac3e-198c179dd8b9",
      "name": "MANAGER_ESCALATION",
      "type": "n8n-nodes-base.gmail",
      "onError": "continueRegularOutput",
      "position": [
        9008,
        3568
      ],
      "parameters": {
        "sendTo": "={{ $('\u2699\ufe0f CONFIG').first().json.MANAGER_EMAILS }}",
        "message": "=Hello {{ $input.last().json.assignee.displayName }}, This is an alert for an overdue ticket: https://{{ $('\u2699\ufe0f CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}",
        "options": {},
        "subject": "Jira DueDate Ticket Alert \ud83d\udea8",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2.2,
      "waitBetweenTries": 5000
    },
    {
      "id": "d797d9f0-a813-4805-8792-91bbdffdc3f1",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        6432,
        3104
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 7
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "0e6f9872-5176-4357-a969-b90bb0e45803",
      "name": "Note - Blocked Tickets Logic",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        8896,
        3808
      ],
      "parameters": {
        "color": 7,
        "width": 2464,
        "height": 720,
        "content": "## Blocked Tickets (WARNING ASSIGNEE  \u26a0\ufe0f  OR ESCALATION EMAIL \ud83d\udea8)\n* Blocked + 1 Days \u2192 Send Email to ticket assignee\n* Blocked + 2 Days -> Notify google chat team\n* Blocked + 3 Days \u2192 send email to manager. \n"
      },
      "typeVersion": 1
    },
    {
      "id": "d6ee8543-a77f-4864-be81-f8c8bf15d026",
      "name": "MANAGER_ESCALATION_BLOCKED",
      "type": "n8n-nodes-base.gmail",
      "onError": "continueRegularOutput",
      "position": [
        10464,
        4240
      ],
      "parameters": {
        "sendTo": "={{ $input.last().json.data.assignee.emailAddress }}",
        "message": "=Hello {{ $input.last().json.data.assignee.displayName }}, This an Alert for blocked ticket: https://{{ $('\u2699\ufe0f CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.data.key }}",
        "options": {},
        "subject": "Jira Blocked Ticket Alert \ud83d\udea8",
        "emailType": "text"
      },
      "retryOnFail": true,
      "typeVersion": 2.2,
      "waitBetweenTries": 5000
    },
    {
      "id": "579919c1-a353-479b-b5b3-c2f9282a51fb",
      "name": "IS_OVERDUE_BETWEEN",
      "type": "n8n-nodes-base.if",
      "position": [
        8976,
        3040
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "23a7703e-2b5f-4244-869b-23af22a1fec4",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $input.last().json.overdue_days >= 1 &&  $input.last().json.overdue_days <= 2 }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "c3fc68cd-b7ee-4861-8a4d-ab0082e34b2d",
      "name": "AGGREGATE_ITEMS",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        9184,
        4144
      ],
      "parameters": {
        "include": "specifiedFields",
        "options": {},
        "aggregate": "aggregateAllItemData",
        "fieldsToInclude": "created, items",
        "destinationFieldName": "jira_issue_changelog"
      },
      "typeVersion": 1
    },
    {
      "id": "6baf8aac-d716-43af-9eb1-604051410174",
      "name": "DATA_FLOW",
      "type": "n8n-nodes-base.code",
      "position": [
        8976,
        3968
      ],
      "parameters": {
        "jsCode": "return (\n  [\n    {\n      json: {\n        ...$input.last().json\n      }\n    }\n  ]\n)"
      },
      "typeVersion": 2
    },
    {
      "id": "47bb7350-1d66-4fc0-aad9-3633cda23f11",
      "name": "MERGE_DATA",
      "type": "n8n-nodes-base.merge",
      "position": [
        9424,
        3984
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "executeOnce": true,
      "typeVersion": 3.2
    },
    {
      "id": "46e9dc22-e952-41ce-bffd-25094fa3fc42",
      "name": "GET_BLOCKED_ITEM",
      "type": "n8n-nodes-base.code",
      "position": [
        9664,
        3984
      ],
      "parameters": {
        "jsCode": "const blocked_item = $input.last().json.jira_issue_changelog.filter((item) => {\n  return (\n    // filter by labels field\n    item.items[0].field == \"labels\" && item.items[0].toString === \"blocked\"\n  )\n})\n\n\nreturn (\n  [\n    {\n      json: {\n        blocked_item,\n        data: $input.last().json\n      }\n    }\n  ]\n)"
      },
      "typeVersion": 2
    },
    {
      "id": "a9ae5760-cf82-46ef-943c-d03e39bf700f",
      "name": "COMPUTE_BLOCKED_DAYS",
      "type": "n8n-nodes-base.code",
      "position": [
        9872,
        3984
      ],
      "parameters": {
        "jsCode": "const today = new Date();\nconst blocked_date = new Date($input.last().json.blocked_item[0].created)\nconst diff = today - blocked_date;\nconst blocked_days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\nreturn (\n  [\n    {\n      json: {\n        blocked_days,\n        data: $input.last().json.data\n      }\n    }\n  ]\n)"
      },
      "typeVersion": 2
    },
    {
      "id": "d4f1ac3c-7605-4ec3-81d6-7fee1ac68dc6",
      "name": "Switch",
      "type": "n8n-nodes-base.switch",
      "position": [
        10080,
        3952
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "b899124e-ca75-4da5-8819-d31e7984559a",
                    "operator": {
                      "type": "number",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $input.last().json.blocked_days }}",
                    "rightValue": 1
                  }
                ]
              }
            },
            {
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "c8d62507-f9dd-4128-a443-b64eafad39fa",
                    "operator": {
                      "type": "number",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $input.last().json.blocked_days }}",
                    "rightValue": 2
                  }
                ]
              }
            },
            {
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "e94bcb44-3073-483c-a487-dfcdbb7e32aa",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $input.last().json.blocked_days }}",
                    "rightValue": "3"
                  }
                ]
              }
            },
            {
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "3b878fe6-a918-4920-8602-f43ef9d9424b",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    },
                    "leftValue": "={{ true // continue loop }}",
                    "rightValue": ""
                  }
                ]
              }
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.4
    },
    {
      "id": "73b5c491-72da-4d7c-8d87-70415098ec95",
      "name": "CONTINUE_LOOP",
      "type": "n8n-nodes-base.code",
      "position": [
        8224,
        3232
      ],
      "parameters": {
        "jsCode": "return (\n  [\n    {\n      json: {\n        success: true\n      }\n    }\n  ]\n)"
      },
      "typeVersion": 2
    },
    {
      "id": "4190444b-8700-4614-a0a6-04865a15d434",
      "name": "CONTINUE_LOOP_OVERDUE_WARNING",
      "type": "n8n-nodes-base.code",
      "position": [
        9472,
        2624
      ],
      "parameters": {
        "jsCode": "return (\n  [\n    {\n      json: {\n        success_leve_1: true\n      }\n    }\n  ]\n)"
      },
      "typeVersion": 2
    },
    {
      "id": "0e5b6ed1-0f0d-4089-aa75-b2c1a1cbdc73",
      "name": "CONTINUE_LOOP_ESCALATION",
      "type": "n8n-nodes-base.code",
      "position": [
        9904,
        3232
      ],
      "parameters": {
        "jsCode": "return (\n  [\n    {\n      json: {\n        success_leve_2: true\n      }\n    }\n  ]\n)"
      },
      "typeVersion": 2
    },
    {
      "id": "13d4646e-9424-4f16-be04-4f056de51843",
      "name": "CONTINUE_LOOP_BLOCKED_WARNING",
      "type": "n8n-nodes-base.code",
      "position": [
        9520,
        3568
      ],
      "parameters": {
        "jsCode": "return (\n  [\n    {\n      json: {\n        success_leve_3: true\n      }\n    }\n  ]\n)"
      },
      "typeVersion": 2
    },
    {
      "id": "d31106b5-5277-40b2-a544-092744f58a33",
      "name": "CONTINUE_LOOP_BLOCKED_ESCALATION",
      "type": "n8n-nodes-base.code",
      "position": [
        11216,
        4352
      ],
      "parameters": {
        "jsCode": "return (\n  [\n    {\n      json: {\n        success_leve_4: true\n      }\n    }\n  ]\n)"
      },
      "typeVersion": 2
    },
    {
      "id": "e02a848a-dad0-4c0e-a203-2e9c46f72859",
      "name": "GET_JIRA_ISSUES",
      "type": "n8n-nodes-base.jira",
      "position": [
        6976,
        2704
      ],
      "parameters": {
        "options": {
          "jql": "=project = {{ $('\u2699\ufe0f CONFIG').first().json.JIRA_PROJECT_KEY }} AND status != Done AND sprint in openSprints()"
        },
        "operation": "getAll",
        "returnAll": true
      },
      "credentials": {
        "jiraSoftwareCloudApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 1,
      "waitBetweenTries": 5000
    },
    {
      "id": "039f87a2-b2a1-4f2a-91f3-afec38ac6464",
      "name": "GET_ISSUES_LIST",
      "type": "n8n-nodes-base.code",
      "position": [
        7216,
        2704
      ],
      "parameters": {
        "jsCode": "const issues = $input.all().map((e) => {\n  const new_obj = {\n    key:e.json.key,\n    due_date:e.json.fields.duedate,\n    assignee:e.json.fields.assignee,\n    labels:e.json.fields.labels\n  }\n  return (\n    new_obj\n  )\n})\n\nconst issues_list = issues.filter((e) => {\n  return (e.due_date != null)\n})\n\nreturn (\n  [\n    ...issues_list\n  ]\n);"
      },
      "typeVersion": 2
    },
    {
      "id": "d5931d7e-6b2c-4557-b94a-3c01a06bca09",
      "name": "ISSUE_DATE_INSIGHTS",
      "type": "n8n-nodes-base.code",
      "position": [
        7728,
        2912
      ],
      "parameters": {
        "jsCode": "const dueDate_string = $input.last().json.due_date;\nconst today_string = new Date().toISOString().split('T')[0];\nconst key = $input.last().json.key;\nconst assignee = $input.last().json.assignee;\n\nconst due = new Date(dueDate_string);\nconst tod = new Date()\n// difftime < 0 overdue, == 0 duedate, > 0 still on date\nconst diffTime = due - tod;\nconst daysLeft = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\nreturn [\n  {\n    json: {\n      key,\n      dueDate_string,\n      today_string,\n      isOverdue: daysLeft < 0 ? true : false,\n      isImminent: daysLeft >= 0 && daysLeft <= 2,\n      isBlocked: $input.last().json.labels.includes(\"blocked\"),\n      days_left: daysLeft,\n      overdue_days: daysLeft < 0 ? daysLeft * -1 : 0,\n      assignee: assignee\n    }\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "7bb905aa-b11a-49e5-b7b1-2c6c4b839387",
      "name": "GET_ISSUE_CHANGELOG",
      "type": "n8n-nodes-base.jira",
      "position": [
        8976,
        4144
      ],
      "parameters": {
        "issueKey": "={{ $input.last().json.key }}",
        "operation": "changelog"
      },
      "executeOnce": false,
      "typeVersion": 1
    },
    {
      "id": "bf6c3148-f27f-493f-98c1-30bdfadc19db",
      "name": "Note - Production Quotas Warning",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        10224,
        2608
      ],
      "parameters": {
        "color": 3,
        "width": 560,
        "height": 1120,
        "content": "## TO CONSIDER FOR PRODUCTION: \u26a0\ufe0f GMAIL / GOOGLE CHAT QUOTA \u26a0\ufe0f\n\n\n### \ud83d\udcac Google Chat Webhook Quotas\n* **Per-Space Limit:** 60 messages / minute (Strict).\n* **Per-Project Limit:** 3,000 messages / minute.\n* **Max Message Size:** ~32 KB.\n> **Tip:** In HTTP Node, set Batching to **1 item per 1000ms**.\n\n---\n\n\n### \ud83d\udce7 Gmail API Quotas (n8n Node)\n* **Daily Limit (Workspace):** 2,000 recipients / day.\n* **Daily Limit (Free):** 500 recipients / day.\n* **Burst Rate:** ~1\u20133 emails per second.\n> **Tip:** **Split In Batches** (Size 1) + **Wait Node** (1s).\n\n---\n\n\n### \ud83d\udee0\ufe0f Error Handling Strategy\n* **Retry on Failure:**\n* **Max Retries:** 3\n* **Delay Between Retries:** 5000ms (5 seconds).\n* **Error Action:** \"Continue\" to avoid stopping the whole workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "96aeefd6-6ef9-46c9-b53f-746bd0396c66",
      "name": "Wait - Rate Limit (Blocked Escalation)",
      "type": "n8n-nodes-base.wait",
      "position": [
        10960,
        4304
      ],
      "parameters": {
        "amount": 1
      },
      "typeVersion": 1.1
    },
    {
      "id": "ab8da30a-eb23-4e26-89fc-955d02e6f7c0",
      "name": "Wait - Rate Limit (Reminder)",
      "type": "n8n-nodes-base.wait",
      "position": [
        9232,
        2624
      ],
      "parameters": {
        "amount": 1
      },
      "typeVersion": 1.1
    },
    {
      "id": "b54bacd9-b0d7-4163-985e-cad1b494b8a3",
      "name": "Wait - Rate Limit (Warning)",
      "type": "n8n-nodes-base.wait",
      "position": [
        9664,
        3232
      ],
      "parameters": {
        "amount": 1
      },
      "typeVersion": 1.1
    },
    {
      "id": "8c494186-d369-438c-a8ec-199ba4c0f8c6",
      "name": "Wait - Rate Limit (Escalation)",
      "type": "n8n-nodes-base.wait",
      "position": [
        9248,
        3568
      ],
      "parameters": {
        "amount": 1
      },
      "typeVersion": 1.1
    },
    {
      "id": "d77dc4fc-49fb-4a77-802d-5bcdafb6ed09",
      "name": "NOTIFY_TEAM",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Quota                       | TypeLimit (per 60 seconds)  |       Impact\n\nPer-Project (Write)\t | 3,000 messages\t| This is the total messages your \"app\" (webhook) can send across all spaces it has access to.\n\nPer-Space (Write)\t | 60 messages\t| This is the limit for a single chat space. If you send more than 1 message per second to one channel, you will hit this.\n\nMessage Size\t         | ~32 KB\t        |  A single message (including text and any card JSON) cannot exceed roughly 32 KB",
      "position": [
        9408,
        3232
      ],
      "parameters": {
        "url": "={{ $('\u2699\ufe0f CONFIG').first().json.GOOGLE_CHAT_WEBHOOK_URL }}",
        "method": "POST",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 1,
              "batchInterval": 1100
            }
          }
        },
        "jsonBody": "={\n  \"cards\": [\n    {\n      \"header\": {\n        \"title\": \"Jira DueDate Ticket Warning \u26a0\ufe0f\"\n      },\n      \"sections\": [\n        {\n          \"widgets\": [\n            {\n              \"textParagraph\": {\n                \"text\": \"<b>Issue:</b> {{ $input.last().json.key }}\"\n              }\n            },\n            {\n              \"textParagraph\": {\n                \"text\": \"<b>Assignee:</b> {{ $input.last().json.assignee.displayName }}\"\n              }\n            },\n            {\n              \"textParagraph\": {\n                \"text\": \"<b>Due date:</b> {{ $input.last().json.dueDate_string }}\"\n              }\n            },\n            {\n              \"textParagraph\": {\n                \"text\": \"{{ $input.last().json.isOverdue ? '\u23f1\ufe0f Cette t\u00e2che est en retard.' : '\u23f1\ufe0f Cette t\u00e2che est proche de la deadline.' }}\"\n              }\n            }\n          ]\n        },\n        {\n          \"widgets\": [\n            {\n              \"buttons\": [\n                {\n                  \"textButton\": {\n                    \"text\": \"VOIR LE TICKET\",\n                    \"onClick\": {\n                      \"openLink\": {\n                        \"url\": \"https://{{ $('\u2699\ufe0f CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}\"\n                      }\n                    }\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.4
    },
    {
      "id": "7115286c-b711-4cf8-9523-ce3e2509cc22",
      "name": "SEND_BLOCKED_WARNING",
      "type": "n8n-nodes-base.gmail",
      "onError": "continueRegularOutput",
      "position": [
        10464,
        3840
      ],
      "parameters": {
        "sendTo": "={{ $input.last().json.data.assignee.emailAddress }}",
        "message": "=Hello {{ $input.last().json.data.assignee.displayName }}, This a warning for your blocked ticket: https://{{ $('\u2699\ufe0f CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.data.key }}",
        "options": {},
        "subject": "Jira Blocked Ticket Warning \u26a0\ufe0f",
        "emailType": "text"
      },
      "retryOnFail": true,
      "typeVersion": 2.2,
      "waitBetweenTries": 5000
    },
    {
      "id": "886ec602-647b-40f2-8846-1ebf8421769f",
      "name": "SEND_DUEDATE_REMINDER",
      "type": "n8n-nodes-base.gmail",
      "notes": "Account                          |   TypeDaily Sending Limit   |    Burst Limit (Rate)\n\nFree Gmail                      |  ~500 recipients/day          |    ~1 email per second\n\nGoogle Workspace        |    ~2,000 recipients/day     |    ~2\u20133 emails per second",
      "onError": "continueRegularOutput",
      "position": [
        8992,
        2624
      ],
      "parameters": {
        "sendTo": "={{ $input.last().json.assignee.emailAddress }}",
        "message": "=Hello {{ $input.last().json.assignee.displayName }}, This is a reminder for your imminent ticket: https://{{ $('\u2699\ufe0f CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}",
        "options": {},
        "subject": "Jira DueDate Ticket Reminder \ud83e\udde0",
        "emailType": "text"
      },
      "retryOnFail": true,
      "typeVersion": 2.2,
      "waitBetweenTries": 5000
    },
    {
      "id": "bfb53c90-8246-4f95-8cdc-0d1890b72a33",
      "name": "SEND_DUEDATE_WARNING",
      "type": "n8n-nodes-base.gmail",
      "onError": "continueRegularOutput",
      "position": [
        9408,
        3024
      ],
      "parameters": {
        "sendTo": "={{ $input.last().json.assignee.emailAddress }}",
        "message": "=Hello {{ $input.last().json.assignee.displayName }}, This is a warning for your overdue ticket: https://{{ $('\u2699\ufe0f CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}",
        "options": {},
        "subject": "Jira DueDate Ticket  Warning \u26a0\ufe0f",
        "emailType": "text"
      },
      "retryOnFail": true,
      "typeVersion": 2.2,
      "waitBetweenTries": 5000
    },
    {
      "id": "6c9b5ebc-ec31-482e-89fa-e2df0f683975",
      "name": "NOTIFY_TEAM_BLOCKED",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Quota                       | TypeLimit (per 60 seconds)  |       Impact\n\nPer-Project (Write)\t | 3,000 messages\t| This is the total messages your \"app\" (webhook) can send across all spaces it has access to.\n\nPer-Space (Write)\t | 60 messages\t| This is the limit for a single chat space. If you send more than 1 message per second to one channel, you will hit this.\n\nMessage Size\t         | ~32 KB\t        |  A single message (including text and any card JSON) cannot exceed roughly 32 KB",
      "position": [
        10464,
        4048
      ],
      "parameters": {
        "url": "={{ $('\u2699\ufe0f CONFIG').first().json.GOOGLE_CHAT_WEBHOOK_URL }}",
        "method": "POST",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 1,
              "batchInterval": 1100
            }
          }
        },
        "jsonBody": "={\n  \"cards\": [\n    {\n      \"header\": {\n        \"title\": \"Jira DueDate Ticket Warning \u26a0\ufe0f\"\n      },\n      \"sections\": [\n        {\n          \"widgets\": [\n            {\n              \"textParagraph\": {\n                \"text\": \"<b>Issue:</b> {{ $input.last().json.key }}\"\n              }\n            },\n            {\n              \"textParagraph\": {\n                \"text\": \"<b>Assignee:</b> {{ $input.last().json.assignee.displayName }}\"\n              }\n            },\n            {\n              \"textParagraph\": {\n                \"text\": \"<b>Due date:</b> {{ $input.last().json.dueDate_string }}\"\n              }\n            },\n            {\n              \"textParagraph\": {\n                \"text\": \"{{ $input.last().json.isOverdue ? '\u23f1\ufe0f Cette t\u00e2che est en retard.' : '\u23f1\ufe0f Cette t\u00e2che est proche de la deadline.' }}\"\n              }\n            }\n          ]\n        },\n        {\n          \"widgets\": [\n            {\n              \"buttons\": [\n                {\n                  \"textButton\": {\n                    \"text\": \"VOIR LE TICKET\",\n                    \"onClick\": {\n                      \"openLink\": {\n                        \"url\": \"https://{{ $('\u2699\ufe0f CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}\"\n                      }\n                    }\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.4
    },
    {
      "id": "6d921474-4367-49df-bcce-5663e9904d49",
      "name": "Note - Manual Testing Trigger",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5824,
        2992
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 288,
        "content": "## MANUAL TRIGGER FOR TESTING"
      },
      "typeVersion": 1
    },
    {
      "id": "24fe6d20-c826-44bf-8bb5-45a5bcb1b8ae",
      "name": "\u2699\ufe0f CONFIG",
      "type": "n8n-nodes-base.set",
      "position": [
        6656,
        2704
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "20ec815c-0122-4afd-8e28-92331aebc688",
              "name": "JIRA_DOMAIN",
              "type": "string",
              "value": "YOUR-COMPANY.atlassian.net"
            },
            {
              "id": "8ceaeb0e-a182-400f-811f-9c874abaa615",
              "name": "JIRA_PROJECT_KEY",
              "type": "string",
              "value": "YOUR_PROJECT_KEY"
            },
            {
              "id": "2be49975-547f-4515-af08-2dc8f88f4a22",
              "name": "MANAGER_EMAILS",
              "type": "string",
              "value": "user@example.com [ CAN BE LIST OF EMAILS ]"
            },
            {
              "id": "09ba7ee7-867d-48b0-b007-bad57c89c4cb",
              "name": "GOOGLE_CHAT_WEBHOOK_URL",
              "type": "string",
              "value": "https://chat.googleapis.com/v1/spaces/XXXXXX/messages?key=YOUR_TOKEN_HERE&token=YOUR_TOKEN_HERE"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "b1193c34-7888-453e-8b4b-aa19e5a60853",
      "name": "Note - Config Instructions",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6496,
        2608
      ],
      "parameters": {
        "color": 3,
        "width": 432,
        "height": 240,
        "content": "## \u2699\ufe0f CONFIGURATION NODE\nSet all your values here \u2014 **this is the only node you need to edit**"
      },
      "typeVersion": 1
    },
    {
      "id": "7df7065a-4731-4d4a-8d13-e4fe76be5459",
      "name": "Note - Prepare Data Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6944,
        2608
      ],
      "parameters": {
        "color": 7,
        "width": 944,
        "height": 432,
        "content": "## PREPARE DATA \ud83d\udcca"
      },
      "typeVersion": 1
    },
    {
      "id": "5a690ddf-c55f-4359-bcdf-1480b97f379b",
      "name": "Note - Workflow End",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        8880,
        2176
      ],
      "parameters": {
        "color": 7,
        "width": 720,
        "height": 256,
        "content": "## WORKFLOW END"
      },
      "typeVersion": 1
    },
    {
      "id": "dfeb8e14-ba51-4dfa-bb45-92328bcf4e6b",
      "name": "Note - Automatic Trigger",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6336,
        2992
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 288,
        "content": "## AUTOMATIC TRIGGER FOR PRODUCTION"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "9687e19c-ef1a-45c6-9c18-f674d43c0a5a",
  "connections": {
    "ROUTES": {
      "main": [
        [
          {
            "node": "SEND_DUEDATE_REMINDER",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "IS_OVERDUE_BETWEEN",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "MANAGER_ESCALATION",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "GET_ISSUE_CHANGELOG",
            "type": "main",
            "index": 0
          },
          {
            "node": "DATA_FLOW",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "CONTINUE_LOOP",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "SEND_BLOCKED_WARNING",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "NOTIFY_TEAM_BLOCKED",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "MANAGER_ESCALATION_BLOCKED",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait - Rate Limit (Blocked Escalation)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "DATA_FLOW": {
      "main": [
        [
          {
            "node": "MERGE_DATA",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MERGE_DATA": {
      "main": [
        [
          {
            "node": "GET_BLOCKED_ITEM",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "NOTIFY_TEAM": {
      "main": [
        [
          {
            "node": "Wait - Rate Limit (Warning)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CONTINUE_LOOP": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2699\ufe0f CONFIG": {
      "main": [
        [
          {
            "node": "GET_JIRA_ISSUES",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AGGREGATE_ITEMS": {
      "main": [
        [
          {
            "node": "MERGE_DATA",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "GET_ISSUES_LIST": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GET_JIRA_ISSUES": {
      "main": [
        [
          {
            "node": "GET_ISSUES_LIST",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "END PROCESS",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "ISSUE_DATE_INSIGHTS",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GET_BLOCKED_ITEM": {
      "main": [
        [
          {
            "node": "COMPUTE_BLOCKED_DAYS",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "\u2699\ufe0f CONFIG",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IS_OVERDUE_BETWEEN": {
      "main": [
        [
          {
            "node": "SEND_DUEDATE_WARNING",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "NOTIFY_TEAM",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MANAGER_ESCALATION": {
      "main": [
        [
          {
            "node": "Wait - Rate Limit (Escalation)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GET_ISSUE_CHANGELOG": {
      "main": [
        [
          {
            "node": "AGGREGATE_ITEMS",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ISSUE_DATE_INSIGHTS": {
      "main": [
        [
          {
            "node": "ROUTES",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "NOTIFY_TEAM_BLOCKED": {
      "main": [
        [
          {
            "node": "Wait - Rate Limit (Blocked Escalation)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "COMPUTE_BLOCKED_DAYS": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "SEND_BLOCKED_WARNING": {
      "main": [
        [
          {
            "node": "Wait - Rate Limit (Blocked Escalation)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "SEND_DUEDATE_WARNING": {
      "main": [
        [
          {
            "node": "Wait - Rate Limit (Warning)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "SEND_DUEDATE_REMINDER": {
      "main": [
        [
          {
            "node": "Wait - Rate Limit (Reminder)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CONTINUE_LOOP_ESCALATION": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MANAGER_ESCALATION_BLOCKED": {
      "main": [
        [
          {
            "node": "Wait - Rate Limit (Blocked Escalation)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait - Rate Limit (Warning)": {
      "main": [
        [
          {
            "node": "CONTINUE_LOOP_ESCALATION",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait - Rate Limit (Reminder)": {
      "main": [
        [
          {
            "node": "CONTINUE_LOOP_OVERDUE_WARNING",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CONTINUE_LOOP_BLOCKED_WARNING": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CONTINUE_LOOP_OVERDUE_WARNING": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait - Rate Limit (Escalation)": {
      "main": [
        [
          {
            "node": "CONTINUE_LOOP_BLOCKED_WARNING",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CONTINUE_LOOP_BLOCKED_ESCALATION": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "\u2699\ufe0f CONFIG",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait - Rate Limit (Blocked Escalation)": {
      "main": [
        [
          {
            "node": "CONTINUE_LOOP_BLOCKED_ESCALATION",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}