The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "WF-REV-SL-03 Delivery Status Cleanup 15min",
"nodes": [
{
"id": "trg-15min",
"name": "Every 15 min",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-16,
0
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "*/15 * * * *"
}
]
}
}
},
{
"id": "http-get-batch",
"name": "GET Convex delivery-check-batch",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
208,
0
],
"parameters": {
"method": "GET",
"url": "https://YOUR_CONVEX_DEPLOYMENT/reviews/sales-delivery-check-batch?limit=50",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"options": {}
},
"onError": "continueRegularOutput",
"retryOnFail": true,
"maxTries": 3
},
{
"id": "split-out",
"name": "Split to Items",
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
432,
0
],
"parameters": {
"fieldToSplitOut": "leads",
"options": {}
}
},
{
"id": "loop",
"name": "Loop Batches (10)",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
656,
0
],
"parameters": {
"batchSize": 10,
"options": {}
}
},
{
"id": "http-close-sms-hist",
"name": "Close GET SMS history",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
880,
112
],
"parameters": {
"method": "GET",
"url": "=https://api.close.com/api/v1/activity/sms/?lead_id={{ $json.closeLeadId }}&direction=outbound&_order_by=-date_created&_limit=1&_fields=id,status",
"authentication": "genericCredentialType",
"genericAuthType": "httpBasicAuth",
"options": {}
},
"onError": "continueRegularOutput",
"retryOnFail": true,
"maxTries": 3
},
{
"id": "code-latest-status",
"name": "Get Latest SMS Status",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1104,
112
],
"parameters": {
"language": "javaScript",
"jsCode": "// Extract latest SMS status from Close response\nconst lead = $('Loop Batches (10)').item.json;\nconst hist = $input.first().json;\nconst latest = (hist.data && hist.data[0]) ? hist.data[0] : null;\nconst status = latest ? String(latest.status || '').toLowerCase() : 'no_history';\n// Final statuses per Close: sent, delivered, error, failed, bounced\nconst isFinal = ['delivered','error','failed','bounced','undelivered'].includes(status);\nconst isDelivered = status === 'delivered' || status === 'sent';\nreturn [{ json: { ...lead, latestStatus: status, isFinal, isDelivered } }];"
}
},
{
"id": "if-final",
"name": "Is Final Status?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
1328,
112
],
"parameters": {
"conditions": {
"combinator": "and",
"options": {
"version": 2,
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"conditions": [
{
"leftValue": "={{ $json.isFinal }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
]
}
}
},
{
"id": "if-delivered",
"name": "Is Delivered?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
1552,
0
],
"parameters": {
"conditions": {
"combinator": "and",
"options": {
"version": 2,
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"conditions": [
{
"leftValue": "={{ $json.isDelivered }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
]
}
}
},
{
"id": "http-set-mobile",
"name": "Convex set-phone-type mobile",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
1776,
-96
],
"parameters": {
"method": "POST",
"url": "https://YOUR_CONVEX_DEPLOYMENT/reviews/sales-set-phone-type",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"sendBody": true,
"bodyContentType": "json",
"jsonBody": "={{ JSON.stringify({ leadId: $json.id, phoneType: 'mobile' }) }}",
"options": {}
},
"onError": "continueRegularOutput",
"retryOnFail": true,
"maxTries": 3
},
{
"id": "http-set-landline",
"name": "Convex set-phone-type landline",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
1776,
128
],
"parameters": {
"method": "POST",
"url": "https://YOUR_CONVEX_DEPLOYMENT/reviews/sales-set-phone-type",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"sendBody": true,
"bodyContentType": "json",
"jsonBody": "={{ JSON.stringify({ leadId: $json.id, phoneType: 'landline' }) }}",
"options": {}
},
"onError": "continueRegularOutput",
"retryOnFail": true,
"maxTries": 3
},
{
"id": "http-move-error",
"name": "Convex move-to-error",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
2000,
128
],
"parameters": {
"method": "POST",
"url": "https://YOUR_CONVEX_DEPLOYMENT/reviews/sales-move-to-error",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"sendBody": true,
"bodyContentType": "json",
"jsonBody": "={{ JSON.stringify({ leadId: $json.id, reason: 'landline' }) }}",
"options": {}
},
"onError": "continueRegularOutput",
"retryOnFail": true,
"maxTries": 3
},
{
"id": "wait",
"name": "Wait 1s",
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
2224,
0
],
"parameters": {
"amount": 1,
"unit": "seconds"
}
}
],
"connections": {
"Every 15 min": {
"main": [
[
{
"node": "GET Convex delivery-check-batch",
"type": "main",
"index": 0
}
]
]
},
"GET Convex delivery-check-batch": {
"main": [
[
{
"node": "Split to Items",
"type": "main",
"index": 0
}
]
]
},
"Split to Items": {
"main": [
[
{
"node": "Loop Batches (10)",
"type": "main",
"index": 0
}
]
]
},
"Close GET SMS history": {
"main": [
[
{
"node": "Get Latest SMS Status",
"type": "main",
"index": 0
}
]
]
},
"Get Latest SMS Status": {
"main": [
[
{
"node": "Is Final Status?",
"type": "main",
"index": 0
}
]
]
},
"Is Final Status?": {
"main": [
[
{
"node": "Is Delivered?",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait 1s",
"type": "main",
"index": 0
}
]
]
},
"Is Delivered?": {
"main": [
[
{
"node": "Convex set-phone-type mobile",
"type": "main",
"index": 0
}
],
[
{
"node": "Convex set-phone-type landline",
"type": "main",
"index": 0
}
]
]
},
"Convex set-phone-type mobile": {
"main": [
[
{
"node": "Wait 1s",
"type": "main",
"index": 0
}
]
]
},
"Convex set-phone-type landline": {
"main": [
[
{
"node": "Convex move-to-error",
"type": "main",
"index": 0
}
]
]
},
"Convex move-to-error": {
"main": [
[
{
"node": "Wait 1s",
"type": "main",
"index": 0
}
]
]
},
"Wait 1s": {
"main": [
[
{
"node": "Loop Batches (10)",
"type": "main",
"index": 0
}
]
]
},
"Loop Batches (10)": {
"main": [
[],
[
{
"node": "Close GET SMS history",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"timezone": "America/New_York",
"saveDataSuccessExecution": "none",
"callerPolicy": "workflowsFromSameOwner",
"availableInMCP": false
},
"active": false
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
WF-REV-SL-03 Delivery Status Cleanup 15min. Uses httpRequest. Scheduled trigger; 12 nodes.
Source: https://github.com/rafiulislam4246/review-engine/blob/main/workflows/15-sales-delivery-status-cleanup.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Birthday Automation - Production (Fixed). Uses stopAndError, httpRequest, emailSend, bannerbear. Scheduled trigger; 86 nodes.
This template runs two scheduled workflows to govern Microsoft Entra ID (Azure AD) guest accounts by detecting stale users via Microsoft Graph, staging deletions in SharePoint with a 72-hour window, n
Jira-Allure-Auto-Qa. Uses httpRequest, jira. Scheduled trigger; 68 nodes.
Spotify-Sync-Surrealdb-V1. Uses httpRequest, n8n-nodes-surrealdb, spotify. Scheduled trigger; 62 nodes.
As n8n instances scale, teams often lose track of sub-workflows—who uses them, where they are referenced, and whether they can be safely updated. This leads to inefficiencies like unnecessary copies o