← All Productivity Workflows
BillionVerifyGoogle Chat

Escalate overdue and blocked Jira tickets with Gmail and Google Chat

Pull contacts, verify each address with BillionVerify, and continue to Google Chat — only deliverable addresses get through.

Why verify before the send

Sending to invalid, risky, catch-all, or disposable addresses spikes your bounce rate and erodes sender reputation. A verification gate before the Google Chat step removes that risk automatically — only deliverable addresses continue, the rest are flagged.

The workflow

BillionVerify — verification sits right before the send.

Node by node

  1. 1
    When clicking ‘Execute workflow’Trigger· n8n

    Starts the workflow — on a schedule, a webhook, or manually while you test.

  2. 2
    Schedule TriggerTrigger· n8n

    Starts the workflow — on a schedule, a webhook, or manually while you test.

  3. 3
    ⚙️ CONFIGSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  4. 4
    GET_JIRA_ISSUESSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  5. 5
    GET_ISSUES_LISTSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  6. 6
    Loop Over ItemsSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  7. 7
    END PROCESSSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  8. 8
    ISSUE_DATE_INSIGHTSSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  9. 9
    ROUTESLogic· n8n

    Routes items based on the workflow logic.

  10. 10
    Verify Email (BillionVerify) 4Verify· billionverify

    The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.

  11. 11
    IS_OVERDUE_BETWEENLogic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  12. 12
    Verify Email (BillionVerify)Verify· billionverify

    The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.

  13. 13
    GET_ISSUE_CHANGELOGSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  14. 14
    DATA_FLOWSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  15. 15
    CONTINUE_LOOPSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  16. 16
    IF deliverable 4Logic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  17. 17
    Verify Email (BillionVerify) 5Verify· billionverify

    The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.

  18. 18
    NOTIFY_TEAMSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  19. 19
    IF deliverableLogic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  20. 20
    AGGREGATE_ITEMSSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  21. 21
    MERGE_DATASource· n8n

    Provides or transforms the contact data flowing through the workflow.

  22. 22
    SEND_DUEDATE_REMINDERSend· n8n

    Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.

  23. 23
    IF deliverable 5Logic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  24. 24
    Wait - Rate Limit (Warning)Source· n8n

    Provides or transforms the contact data flowing through the workflow.

  25. 25
    MANAGER_ESCALATIONSend· n8n

    Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.

  26. 26
    GET_BLOCKED_ITEMSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  27. 27
    Wait - Rate Limit (Reminder)Source· n8n

    Provides or transforms the contact data flowing through the workflow.

  28. 28
    SEND_DUEDATE_WARNINGSend· n8n

    Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.

  29. 29
    CONTINUE_LOOP_ESCALATIONSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  30. 30
    Wait - Rate Limit (Escalation)Source· n8n

    Provides or transforms the contact data flowing through the workflow.

  31. 31
    COMPUTE_BLOCKED_DAYSSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  32. 32
    CONTINUE_LOOP_OVERDUE_WARNINGSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  33. 33
    CONTINUE_LOOP_BLOCKED_WARNINGSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  34. 34
    SwitchLogic· n8n

    Routes items based on the workflow logic.

  35. 35
    Verify Email (BillionVerify) 3Verify· billionverify

    The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.

  36. 36
    NOTIFY_TEAM_BLOCKEDSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  37. 37
    Verify Email (BillionVerify) 2Verify· billionverify

    The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.

  38. 38
    Wait - Rate Limit (Blocked Escalation)Source· n8n

    Provides or transforms the contact data flowing through the workflow.

  39. 39
    IF deliverable 3Logic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  40. 40
    IF deliverable 2Logic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  41. 41
    CONTINUE_LOOP_BLOCKED_ESCALATIONSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  42. 42
    SEND_BLOCKED_WARNINGSend· n8n

    Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.

  43. 43
    MANAGER_ESCALATION_BLOCKEDSend· n8n

    Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.

Workflow JSON

Copy or download this workflow, then import it in n8n (Workflows → Import from File / Paste). Install the BillionVerify community node first, then add your API key credential.

verify-emails-in-google-chat.json
{
  "name": "Escalate overdue and blocked Jira tickets with Gmail and Google Chat + BillionVerify",
  "nodes": [
    {
      "id": "c93cacbb-f5fd-4d12-9c8b-cb1a08c6215d",
      "name": "When clicking ‘Execute workflow’",
      "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 🧠\n- [0 - 2] Imminent DueDate → 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 ⚠️\n\n* **if [1 - 2] OverDue Days** → Send Email to ticket assignee\n\n* **if ]2 - 4] OverDue Days** → 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 🚨\n* Greater than 4 OverDue Days → 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 — Deadlines & Blockages 🚨\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- 🧠 **Reminder** `[0–2 days left]` → Email to assignee\n- ⚠️ **Warning** `[1–4 days overdue]` → Email to assignee or Google Chat alert\n- 🚨 **Escalation** `[> 4 days overdue]` → Email to manager(s)\n- 🔴 **Blocked** → Escalates over 3 days: assignee email → team chat → manager\n\n\n### How to use\n\nEdit only the **⚙️ 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### ⚙️ 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 👉 [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
      ],
      "webhookId": "0d653565-9b18-473e-8246-cee2a4dae21c",
      "parameters": {
        "sendTo": "={{ $('⚙️ CONFIG').first().json.MANAGER_EMAILS }}",
        "message": "=Hello {{ $input.last().json.assignee.displayName }}, This is an alert for an overdue ticket: https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}",
        "options": {},
        "subject": "Jira DueDate Ticket Alert 🚨",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "Gmail account"
        }
      },
      "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  ⚠️  OR ESCALATION EMAIL 🚨)\n* Blocked + 1 Days → Send Email to ticket assignee\n* Blocked + 2 Days -> Notify google chat team\n* Blocked + 3 Days → 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
      ],
      "webhookId": "0d653565-9b18-473e-8246-cee2a4dae21c",
      "parameters": {
        "sendTo": "={{ $input.last().json.data.assignee.emailAddress }}",
        "message": "=Hello {{ $input.last().json.data.assignee.displayName }}, This an Alert for blocked ticket: https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.data.key }}",
        "options": {},
        "subject": "Jira Blocked Ticket Alert 🚨",
        "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 = {{ $('⚙️ CONFIG').first().json.JIRA_PROJECT_KEY }} AND status != Done AND sprint in openSprints()"
        },
        "operation": "getAll",
        "returnAll": true
      },
      "credentials": {
        "jiraSoftwareCloudApi": {
          "id": "credential-id",
          "name": "Jira SW Cloud account"
        }
      },
      "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: ⚠️ GMAIL / GOOGLE CHAT QUOTA ⚠️\n\n\n### 💬 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### 📧 Gmail API Quotas (n8n Node)\n* **Daily Limit (Workspace):** 2,000 recipients / day.\n* **Daily Limit (Free):** 500 recipients / day.\n* **Burst Rate:** ~1–3 emails per second.\n> **Tip:** **Split In Batches** (Size 1) + **Wait Node** (1s).\n\n---\n\n\n### 🛠️ 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
      ],
      "webhookId": "e0ac94d8-7a0f-4784-9b30-9bc39e1c8355",
      "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
      ],
      "webhookId": "e0ac94d8-7a0f-4784-9b30-9bc39e1c8355",
      "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
      ],
      "webhookId": "e0ac94d8-7a0f-4784-9b30-9bc39e1c8355",
      "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
      ],
      "webhookId": "e0ac94d8-7a0f-4784-9b30-9bc39e1c8355",
      "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": "={{ $('⚙️ 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 ⚠️\"\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 ? '⏱️ Cette tâche est en retard.' : '⏱️ Cette tâche 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://{{ $('⚙️ 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
      ],
      "webhookId": "2d7184d6-de02-40f3-964a-cbb084de7c07",
      "parameters": {
        "sendTo": "={{ $input.last().json.data.assignee.emailAddress }}",
        "message": "=Hello {{ $input.last().json.data.assignee.displayName }}, This a warning for your blocked ticket: https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.data.key }}",
        "options": {},
        "subject": "Jira Blocked Ticket Warning ⚠️",
        "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–3 emails per second",
      "onError": "continueRegularOutput",
      "position": [
        8992,
        2624
      ],
      "webhookId": "2d7184d6-de02-40f3-964a-cbb084de7c07",
      "parameters": {
        "sendTo": "={{ $input.last().json.assignee.emailAddress }}",
        "message": "=Hello {{ $input.last().json.assignee.displayName }}, This is a reminder for your imminent ticket: https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}",
        "options": {},
        "subject": "Jira DueDate Ticket Reminder 🧠",
        "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
      ],
      "webhookId": "2d7184d6-de02-40f3-964a-cbb084de7c07",
      "parameters": {
        "sendTo": "={{ $input.last().json.assignee.emailAddress }}",
        "message": "=Hello {{ $input.last().json.assignee.displayName }}, This is a warning for your overdue ticket: https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}",
        "options": {},
        "subject": "Jira DueDate Ticket  Warning ⚠️",
        "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": "={{ $('⚙️ 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 ⚠️\"\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 ? '⏱️ Cette tâche est en retard.' : '⏱️ Cette tâche 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://{{ $('⚙️ 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": "⚙️ 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": "## ⚙️ CONFIGURATION NODE\nSet all your values here — **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 📊"
      },
      "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
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $('⚙️ CONFIG').first().json.MANAGER_EMAILS }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        8648,
        3568
      ],
      "name": "Verify Email (BillionVerify)",
      "credentials": {
        "billionVerifyApi": {
          "id": "",
          "name": "BillionVerify account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is-deliverable",
              "leftValue": "={{ $json.is_deliverable }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ]
        }
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        8828,
        3568
      ],
      "name": "IF deliverable"
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $input.last().json.data.assignee.emailAddress }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        10104,
        4240
      ],
      "name": "Verify Email (BillionVerify) 2",
      "credentials": {
        "billionVerifyApi": {
          "id": "",
          "name": "BillionVerify account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is-deliverable",
              "leftValue": "={{ $json.is_deliverable }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ]
        }
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        10284,
        4240
      ],
      "name": "IF deliverable 2"
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $input.last().json.data.assignee.emailAddress }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        10104,
        3840
      ],
      "name": "Verify Email (BillionVerify) 3",
      "credentials": {
        "billionVerifyApi": {
          "id": "",
          "name": "BillionVerify account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is-deliverable",
              "leftValue": "={{ $json.is_deliverable }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ]
        }
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        10284,
        3840
      ],
      "name": "IF deliverable 3"
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $input.last().json.assignee.emailAddress }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        8632,
        2624
      ],
      "name": "Verify Email (BillionVerify) 4",
      "credentials": {
        "billionVerifyApi": {
          "id": "",
          "name": "BillionVerify account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is-deliverable",
              "leftValue": "={{ $json.is_deliverable }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ]
        }
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        8812,
        2624
      ],
      "name": "IF deliverable 4"
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $input.last().json.assignee.emailAddress }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        9048,
        3024
      ],
      "name": "Verify Email (BillionVerify) 5",
      "credentials": {
        "billionVerifyApi": {
          "id": "",
          "name": "BillionVerify account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is-deliverable",
              "leftValue": "={{ $json.is_deliverable }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ]
        }
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        9228,
        3024
      ],
      "name": "IF deliverable 5"
    }
  ],
  "connections": {
    "ROUTES": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify) 4",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "IS_OVERDUE_BETWEEN",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Verify Email (BillionVerify)",
            "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": "Verify Email (BillionVerify) 3",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "NOTIFY_TEAM_BLOCKED",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Verify Email (BillionVerify) 2",
            "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
          }
        ]
      ]
    },
    "⚙️ 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": "⚙️ CONFIG",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IS_OVERDUE_BETWEEN": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify) 5",
            "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 ‘Execute workflow’": {
      "main": [
        [
          {
            "node": "⚙️ CONFIG",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait - Rate Limit (Blocked Escalation)": {
      "main": [
        [
          {
            "node": "CONTINUE_LOOP_BLOCKED_ESCALATION",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify Email (BillionVerify)": {
      "main": [
        [
          {
            "node": "IF deliverable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable": {
      "main": [
        [
          {
            "node": "MANAGER_ESCALATION",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Verify Email (BillionVerify) 2": {
      "main": [
        [
          {
            "node": "IF deliverable 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable 2": {
      "main": [
        [
          {
            "node": "MANAGER_ESCALATION_BLOCKED",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Verify Email (BillionVerify) 3": {
      "main": [
        [
          {
            "node": "IF deliverable 3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable 3": {
      "main": [
        [
          {
            "node": "SEND_BLOCKED_WARNING",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Verify Email (BillionVerify) 4": {
      "main": [
        [
          {
            "node": "IF deliverable 4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable 4": {
      "main": [
        [
          {
            "node": "SEND_DUEDATE_REMINDER",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Verify Email (BillionVerify) 5": {
      "main": [
        [
          {
            "node": "IF deliverable 5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable 5": {
      "main": [
        [
          {
            "node": "SEND_DUEDATE_WARNING",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    }
  },
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  }
}

When to use this

  • Cleaning a list before a Google Chat send or sync.
  • Protecting Google Chat deliverability and sender reputation.
  • Keeping bounce rates low so your sending is never throttled.

FAQ

Why verify before sending in Google Chat?

Verifying first keeps your bounce rate low, which protects your sender reputation and your results.

How do I import this workflow?

Download the JSON, then in n8n go to Workflows → Import from File (or paste it). Install the BillionVerify community node and add your API key credential.

What happens to risky or catch-all addresses?

They are routed to the false branch and excluded from the send. You decide whether to retry, review, or drop them.

Add verification to your workflow

Create a free account, grab your API key, and stop bounces before they happen.

Get started free