Automate release notes from ClickUp to Notion & Slack with GPT-4o
Pull contacts, verify each address with BillionVerify, and continue to ClickUp β 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 ClickUp 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
- 1Configure GPT-4o ModelSourceΒ· n8n
Provides or transforms the contact data flowing through the workflow.
- 2ClickUp Task Status TriggerTriggerΒ· n8n
Starts the workflow β on a schedule, a webhook, or manually while you test.
- 3Configure GPT-4o Model1SourceΒ· n8n
Provides or transforms the contact data flowing through the workflow.
- 4Validate ClickUp PayloadLogicΒ· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 5Fetch Task Details from ClickUpSourceΒ· n8n
Provides or transforms the contact data flowing through the workflow.
- 6Log Errors in Google SheetsSourceΒ· n8n
Provides or transforms the contact data flowing through the workflow.
- 7Parse Task Details in JavaScriptSourceΒ· n8n
Provides or transforms the contact data flowing through the workflow.
- 8Generate Release Notes FAQ (AI)SourceΒ· n8n
Provides or transforms the contact data flowing through the workflow.
- 9Save Release Notes to NotionSourceΒ· n8n
Provides or transforms the contact data flowing through the workflow.
- 10Generate Slack Release Announcement (AI)SourceΒ· n8n
Provides or transforms the contact data flowing through the workflow.
- 11Announce Release in SlackSourceΒ· n8n
Provides or transforms the contact data flowing through the workflow.
- 12Verify 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.
- 13IF deliverableLogicΒ· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 14Send Acknowledgment Email to AssigneeSendΒ· 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.
{
"name": "Automate release notes from ClickUp to Notion & Slack with GPT-4o + BillionVerify",
"nodes": [
{
"id": "0a9f291a-fb5e-48d2-aef0-8b4cb3471228",
"name": "Configure GPT-4o Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
160,
128
],
"parameters": {
"model": "gpt-4o",
"options": {}
},
"credentials": {
"azureOpenAiApi": {
"id": "credential-id",
"name": "azureOpenAiApi Credential"
}
},
"typeVersion": 1
},
{
"id": "296c2339-d34b-45b4-8c79-05a1ab1bb5e1",
"name": "Log Errors in Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
-288,
544
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "error_id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "error_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "error",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "error",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"error_id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1338537721,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=1338537721",
"cachedResultName": "error log sheet"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
"cachedResultName": "Interviewer Brief Pack "
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "credential-id",
"name": "googleSheetsOAuth2Api Credential"
}
},
"typeVersion": 4.6
},
{
"id": "a754bf62-8af5-43d5-8210-a9d451828bfa",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1008,
-240
],
"parameters": {
"color": 7,
"width": 528,
"height": 368,
"content": "## ClickUp Trigger & Validation\nListens for ClickUp task status changes and validates the webhook payload. \nPrevents invalid or empty task events from being processed.\n"
},
"typeVersion": 1
},
{
"id": "ae6259ca-a0d7-49c5-b33f-c122d087c856",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1664,
-944
],
"parameters": {
"width": 576,
"height": 576,
"content": "## How it works\nThis automation turns ClickUp task updates into complete release-note workflows. \nWhen a taskβs status changes in ClickUp (e.g., βIn Reviewβ β βCompleteβ), the workflow fetches full task details, cleans them, and uses Azure OpenAI GPT-4o to generate structured, Markdown-style release notes. \nThe notes are saved automatically in Notion under the βRelease Notesβ database, then shared in Slack as a formatted announcement. \nFinally, an HTML email acknowledgment is sent to the task owner confirming that the release is documented and live. \nAny validation or API errors are logged in Google Sheets for traceability.\n\n## Setup steps\n1. Connect your credentials: \n - ClickUp (webhook + API) \n - Azure OpenAI API \n - Notion (database) \n - Slack \n - Gmail \n - Google Sheets (for error logging)\n2. Replace Notion DB ID, Slack user/channel, and Google Sheet ID with yours. \n3. Confirm ClickUp team ID and event trigger (`taskStatusUpdated`). \n4. Adjust the Gmail HTML message if desired. \n5. Run a test task update to verify flow end-to-end.\n"
},
"typeVersion": 1
},
{
"id": "652ed9cf-0a37-4772-8b59-232706351ce2",
"name": "ClickUp Task Status Trigger",
"type": "n8n-nodes-base.clickUpTrigger",
"position": [
-944,
-64
],
"webhookId": "5e28e69f-9b57-48b6-a5b0-9150c156e111",
"parameters": {
"team": "9014872066",
"events": [
"taskStatusUpdated"
],
"filters": {}
},
"credentials": {
"clickUpApi": {
"id": "credential-id",
"name": "clickUpApi Credential"
}
},
"typeVersion": 1
},
{
"id": "f803efdb-39a1-44ad-bf1b-f93dbe68a29a",
"name": "Validate ClickUp Payload",
"type": "n8n-nodes-base.if",
"position": [
-688,
-64
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e2adb005-2b3c-4d1e-8445-442df1fe925a",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.task_id }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "386b65fa-bf70-40ef-9a3b-00ca7e84d49d",
"name": " Fetch Task Details from ClickUp",
"type": "n8n-nodes-base.clickUp",
"position": [
-352,
-80
],
"parameters": {
"id": "={{ $json.task_id }}",
"operation": "get"
},
"credentials": {
"clickUpApi": {
"id": "credential-id",
"name": "clickUpApi Credential"
}
},
"typeVersion": 1
},
{
"id": "9df1d658-7d5b-4ad9-a8c5-921cd84f0d7e",
"name": "Parse Task Details in JavaScript",
"type": "n8n-nodes-base.code",
"position": [
-112,
-80
],
"parameters": {
"jsCode": "// Extract ClickUp task details safely\nconst task = $json;\n\n// Handle cases where arrays or fields might be empty\nconst assignee = (task.assignees && task.assignees.length > 0) ? task.assignees[0] : {};\nconst customFields = task.custom_fields || [];\n\n// Try to find the first field with a value (like a GitHub or docs link)\nconst linkField = customFields.find(f => f.value) || {};\n\nreturn [\n {\n json: {\n title: task.name || \"Untitled Task\",\n description: task.description || \"No description available.\",\n status: task.status?.status || \"No status\",\n priority: task.priority?.priority || \"Not set\",\n due_date: task.due_date || \"No due date\",\n assignee: assignee.username || \"Unassigned\",\n email: assignee.email || \"No email\",\n link: linkField.value || \"No link provided\",\n url: task.url || \"No URL\",\n },\n },\n];\n"
},
"typeVersion": 2
},
{
"id": "0cea2e62-14b1-4b94-82f9-fad9d1039e42",
"name": "Generate Release Notes FAQ (AI)",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
144,
-80
],
"parameters": {
"text": "=Task Title: {{$json.title}}\nDescription: {{$json.description}}\nStatus: {{$json.status}}\nPriority: {{$json.priority}}\nDue Date: {{$json.due_date}}\nAssignee: {{$json.assignee}} ({{$json.email}})\nTask URL: {{$json.url}}\nReference Link: {{$json.link}}\n\nPlease create a brief FAQ in Markdown format using the 4 sections:\n1) What changed\n2) Why\n3) How to use\n4) Known issues\n",
"options": {
"systemMessage": "=You are a release notes editor. \nYour job is to turn technical task information into a clear, simple FAQ for users and internal teams. \nBe concise, non-marketing, and structured under these exact 4 sections:\n1) What changed\n2) Why\n3) How to use\n4) Known issues\n\nEach section should be 2β4 short bullet points.\n"
},
"promptType": "define"
},
"typeVersion": 2.1
},
{
"id": "8928882c-2c88-43f3-9797-f6179f2bb841",
"name": "Save Release Notes to Notion",
"type": "n8n-nodes-base.notion",
"position": [
544,
-80
],
"parameters": {
"title": "={{ $('Parse Task Details in JavaScript').item.json.title }}",
"simple": false,
"options": {},
"resource": "databasePage",
"databaseId": {
"__rl": true,
"mode": "list",
"value": "29a802b9-1fa0-804a-b406-e078961e0659",
"cachedResultUrl": "https://www.notion.so/29a802b91fa0804ab406e078961e0659",
"cachedResultName": "Release Notes"
},
"propertiesUi": {
"propertyValues": [
{
"key": "Task URL|rich_text",
"textContent": "={{ $('Parse Task Details in JavaScript').item.json.url }}"
},
{
"key": "Status|rich_text",
"textContent": "={{ $('Parse Task Details in JavaScript').item.json.status }}"
},
{
"key": "Priority|rich_text",
"textContent": "={{ $('Parse Task Details in JavaScript').item.json.priority }}"
},
{
"key": "Owner|rich_text",
"textContent": "={{ $('Parse Task Details in JavaScript').item.json.assignee }}"
},
{
"key": "FAQ Content|rich_text",
"textContent": "={{ $json.output }}"
}
]
}
},
"credentials": {
"notionApi": {
"id": "credential-id",
"name": "notionApi Credential"
}
},
"typeVersion": 2.2
},
{
"id": "63000865-c681-490a-8ce0-f8faf3c89e01",
"name": "Announce Release in Slack",
"type": "n8n-nodes-base.slack",
"position": [
1184,
-80
],
"webhookId": "ddaa7632-9e35-4bd3-82d6-572d5cae84cc",
"parameters": {
"text": "={{ $json.output }}",
"user": {
"__rl": true,
"mode": "list",
"value": "U09HMPVD466",
"cachedResultName": "newscctv22"
},
"select": "user",
"otherOptions": {}
},
"credentials": {
"slackApi": {
"id": "credential-id",
"name": "slackApi Credential"
}
},
"typeVersion": 2.3
},
{
"id": "add680c8-a40a-489c-bc5f-34cac0a078a0",
"name": "Configure GPT-4o Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
816,
128
],
"parameters": {
"model": "gpt-4o",
"options": {}
},
"credentials": {
"azureOpenAiApi": {
"id": "credential-id",
"name": "azureOpenAiApi Credential"
}
},
"typeVersion": 1
},
{
"id": "1d91b3cc-e61d-419d-a15e-8dfe2a9a4dd5",
"name": "Generate Slack Release Announcement (AI)",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
800,
-80
],
"parameters": {
"text": "=Create a Slack release announcement message using this task information:\n\nTask Title:{{ $(' Fetch Task Details from ClickUp').item.json.name }}\nDescription: {{ $(' Fetch Task Details from ClickUp').item.json.description }}\nStatus: {{ $(' Fetch Task Details from ClickUp').item.json.status }}\nPriority:{{ $json.properties }}\nAssignee: {{ $(' Fetch Task Details from ClickUp').item.json.assignees[0].email }}\nTask URL: {{$json.url}}\n\nFormat it as a professional Slack message with emojis, proper formatting, and a clickable task link.",
"options": {
"systemMessage": "=You are a Slack message formatter for release announcements.\n\nYour job is to take ClickUp task information and create a visually appealing, professional Slack message.\n\nRequirements:\n1. Use Slack markdown formatting (bold with *, italics with _, code blocks with ```)\n2. Include appropriate emojis for visual appeal\n3. Keep it concise and scannable\n4. Structure: Header β Key Details β Task Link β Release Date β Footer\n5. Use bullet points or clean formatting for readability\n6. Add a clickable link to the ClickUp task\n7. Include automation signature at the bottom\n\nReturn ONLY the formatted Slack message text, no JSON, no explanations"
},
"promptType": "define"
},
"typeVersion": 2.1
},
{
"id": "be95e9d0-6750-477a-b4a2-d1a097aac9fd",
"name": " Send Acknowledgment Email to Assignee",
"type": "n8n-nodes-base.gmail",
"position": [
1536,
-80
],
"webhookId": "0c82c299-6938-42ed-bda6-5007d79af34f",
"parameters": {
"sendTo": "={{ $('Parse Task Details in JavaScript').item.json.email }}",
"message": "=<!DOCTYPE html>\n<html>\n<head>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;\n line-height: 1.6;\n color: #333;\n max-width: 600px;\n margin: 0 auto;\n padding: 20px;\n }\n .header {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n padding: 30px;\n border-radius: 10px 10px 0 0;\n text-align: center;\n }\n .header h1 {\n margin: 0;\n font-size: 24px;\n }\n .content {\n background: #f8f9fa;\n padding: 30px;\n border-radius: 0 0 10px 10px;\n }\n .info-box {\n background: white;\n padding: 20px;\n border-radius: 8px;\n margin: 20px 0;\n border-left: 4px solid #667eea;\n }\n .info-row {\n margin: 12px 0;\n display: flex;\n align-items: center;\n }\n .label {\n font-weight: 600;\n color: #667eea;\n min-width: 120px;\n }\n .value {\n color: #333;\n }\n .priority-urgent { color: #dc3545; font-weight: bold; }\n .priority-high { color: #fd7e14; font-weight: bold; }\n .priority-normal { color: #ffc107; }\n .priority-low { color: #28a745; }\n .status-ready { color: #28a745; font-weight: bold; }\n .cta-button {\n display: inline-block;\n background: #667eea;\n color: white !important;\n padding: 14px 30px;\n text-decoration: none;\n border-radius: 6px;\n margin: 20px 0;\n font-weight: 600;\n text-align: center;\n }\n .cta-button:hover {\n background: #5568d3;\n }\n .faq-section {\n background: white;\n padding: 20px;\n border-radius: 8px;\n margin: 20px 0;\n }\n .faq-section h3 {\n color: #667eea;\n margin-top: 0;\n }\n .footer {\n text-align: center;\n padding: 20px;\n color: #6c757d;\n font-size: 12px;\n border-top: 1px solid #dee2e6;\n margin-top: 30px;\n }\n .emoji {\n font-size: 18px;\n margin-right: 8px;\n }\n </style>\n</head>\n<body>\n <div class=\"header\">\n <h1>π Your Release is Ready!</h1>\n </div>\n \n <div class=\"content\">\n <p>Hi <strong>{{ $('Parse Task Details in JavaScript').item.json.assignee }}</strong>,</p>\n \n <p>Great news! Your feature release has been processed and documented. Here are the details:</p>\n \n <div class=\"info-box\">\n <div class=\"info-row\">\n <span class=\"label\">π Feature:</span>\n <span class=\"value\">{{ $('Parse Task Details in JavaScript').item.json.title }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">β‘ Priority:</span>\n <span class=\"value priority-{{ $('Parse Task Details in JavaScript').item.json.priority.toLowerCase() }}\">\n {{ $('Parse Task Details in JavaScript').item.json.priority }}\n </span>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">β
Status:</span>\n <span class=\"value status-ready\">{{ $('Parse Task Details in JavaScript').item.json.status }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">π
Release Date:</span>\n <span class=\"value\">{{ $now.toFormat('MMMM dd, yyyy') }}</span>\n </div>\n </div>\n\n <center>\n <a href=\"{{ $('Save Release Notes to Notion').item.json.url }}\" class=\"cta-button\">\n π View Full Release Notes in Notion\n </a>\n </center>\n\n <div class=\"faq-section\">\n <h3>π Release Notes Preview</h3>\n <p style=\"white-space: pre-line; color: #495057; line-height: 1.8;\">{{ $('Generate Release Notes FAQ (AI)').item.json.output.substring(0, 500) }}...</p>\n </div>\n\n <div class=\"info-box\" style=\"border-left-color: #28a745;\">\n <p style=\"margin: 0;\"><strong>π Quick Links:</strong></p>\n <ul style=\"margin: 10px 0;\">\n <li><a href=\"{{ $('Parse Task Details in JavaScript').item.json.url }}\" style=\"color: #667eea;\">View ClickUp Task</a></li>\n <li><a href=\"{{ $('Save Release Notes to Notion').item.json.url }}\" style=\"color: #667eea;\">View Notion Documentation</a></li>\n {{ $('Parse Task Details in JavaScript').item.json.link !== 'No link provided' ? '<li><a href=\"' + $('Parse Task Details in JavaScript').item.json.link + '\" style=\"color: #667eea;\">Reference Link</a></li>' : '' }}\n </ul>\n </div>\n\n <p style=\"margin-top: 30px;\">The team has been notified via Slack, and this release is now live in our knowledge base.</p>\n \n <p>If you have any questions or need to update the documentation, please reach out to the team.</p>\n \n <p style=\"margin-top: 30px;\">\n Best regards,<br>\n <strong>Release Automation Team</strong>\n </p>\n </div>\n\n <div class=\"footer\">\n <p>π€ This is an automated message generated by our n8n workflow.</p>\n <p>If you believe you received this in error, please contact your system administrator.</p>\n </div>\n</body>\n</html>",
"options": {},
"subject": "=β
Release Ready: {{ $('Parse Task Details in JavaScript').item.json.title }}"
},
"credentials": {
"gmailOAuth2": {
"id": "credential-id",
"name": "gmailOAuth2 Credential"
}
},
"typeVersion": 2.1
},
{
"id": "56486d5f-7142-4092-8808-d95961f28ac8",
"name": "Sticky Note12",
"type": "n8n-nodes-base.stickyNote",
"position": [
-416,
-304
],
"parameters": {
"color": 7,
"width": 464,
"height": 464,
"content": "## Task Data Fetching & Parsing\nRetrieves detailed ClickUp task info and converts it into clean JSON fields. \nEnsures consistent input for AI-based release-note generation.\n"
},
"typeVersion": 1
},
{
"id": "26dd72fa-2822-41ad-8eee-f8b8fb4a1cda",
"name": "Sticky Note13",
"type": "n8n-nodes-base.stickyNote",
"position": [
96,
-288
],
"parameters": {
"color": 7,
"width": 352,
"height": 576,
"content": "## AI Release-Note Generation\nUses GPT-4o to summarize task details into a four-section FAQ format. \nEach section highlights what changed, why, how to use it, and any known issues.\n"
},
"typeVersion": 1
},
{
"id": "e7920945-1bac-4cdc-b0bf-8aaa731e271f",
"name": "Sticky Note14",
"type": "n8n-nodes-base.stickyNote",
"position": [
464,
-352
],
"parameters": {
"color": 7,
"height": 640,
"content": "## Notion Documentation & Record Keeping\nAutomatically creates a new Notion entry under βRelease Notes.β \nCaptures all key fields: title, owner, priority, status, and generated FAQ.\n"
},
"typeVersion": 1
},
{
"id": "4a84e45d-17b4-4ec9-96bf-4c6ec252e393",
"name": "Sticky Note15",
"type": "n8n-nodes-base.stickyNote",
"position": [
736,
-304
],
"parameters": {
"color": 7,
"width": 640,
"height": 592,
"content": "## Slack Announcement & AI Formatting\nFormats a professional, emoji-enhanced Slack message using GPT-4o. \nPosts it to the team channel to announce the new release instantly.\n"
},
"typeVersion": 1
},
{
"id": "0f1b231a-9a08-4e5b-8344-01aa0f8ae8c8",
"name": "Sticky Note16",
"type": "n8n-nodes-base.stickyNote",
"position": [
1408,
-256
],
"parameters": {
"color": 7,
"width": 400,
"height": 400,
"content": "## Email Acknowledgment & Closure\nSends a confirmation email to the task assignee. \nIncludes release details, links to Notion & ClickUp, and a preview of the AI-generated notes.\n"
},
"typeVersion": 1
},
{
"id": "ad64298d-dcf6-45e5-86a0-dadef7539b6c",
"name": "Sticky Note17",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
320
],
"parameters": {
"color": 7,
"width": 304,
"height": 464,
"content": "## Error Handling & Logging\nLogs any missing payloads or API failures to Google Sheets. \nProvides visibility into workflow issues for easy debugging.\n"
},
"typeVersion": 1
},
{
"parameters": {
"operation": "verify",
"email": "={{ $('Parse Task Details in JavaScript').item.json.email }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
1176,
-80
],
"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": [
1356,
-80
],
"name": "IF deliverable"
}
],
"connections": {
"Configure GPT-4o Model": {
"ai_languageModel": [
[
{
"node": "Generate Release Notes FAQ (AI)",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Configure GPT-4o Model1": {
"ai_languageModel": [
[
{
"node": "Generate Slack Release Announcement (AI)",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Validate ClickUp Payload": {
"main": [
[
{
"node": " Fetch Task Details from ClickUp",
"type": "main",
"index": 0
}
],
[
{
"node": "Log Errors in Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Announce Release in Slack": {
"main": [
[
{
"node": "Verify Email (BillionVerify)",
"type": "main",
"index": 0
}
]
]
},
"ClickUp Task Status Trigger": {
"main": [
[
{
"node": "Validate ClickUp Payload",
"type": "main",
"index": 0
}
]
]
},
"Save Release Notes to Notion": {
"main": [
[
{
"node": "Generate Slack Release Announcement (AI)",
"type": "main",
"index": 0
}
]
]
},
"Generate Release Notes FAQ (AI)": {
"main": [
[
{
"node": "Save Release Notes to Notion",
"type": "main",
"index": 0
}
]
]
},
" Fetch Task Details from ClickUp": {
"main": [
[
{
"node": "Parse Task Details in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Parse Task Details in JavaScript": {
"main": [
[
{
"node": "Generate Release Notes FAQ (AI)",
"type": "main",
"index": 0
}
]
]
},
"Generate Slack Release Announcement (AI)": {
"main": [
[
{
"node": "Announce Release in Slack",
"type": "main",
"index": 0
}
]
]
},
"Verify Email (BillionVerify)": {
"main": [
[
{
"node": "IF deliverable",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable": {
"main": [
[
{
"node": " Send Acknowledgment Email to Assignee",
"type": "main",
"index": 0
}
],
[]
]
}
},
"settings": {
"executionOrder": "v1"
}
}When to use this
- Cleaning a list before a ClickUp send or sync.
- Protecting ClickUp deliverability and sender reputation.
- Keeping bounce rates low so your sending is never throttled.
FAQ
Why verify before sending in ClickUp?
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