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": "Cleaning Inspection - Submit",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "inspection-submit",
"responseMode": "responseNode",
"options": {
"allowedOrigins": "*"
}
},
"id": "webhook-submit",
"name": "Webhook - Submit",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
260,
300
]
},
{
"parameters": {
"jsCode": "// Extract and validate inspection data from webhook body\nconst body = $input.first().json.body;\n\nif (!body || !body.id) {\n return [{ json: { error: 'Missing inspection data or ID', status: 400 } }];\n}\n\n// Add server-side metadata\nconst enriched = {\n ...body,\n _serverReceivedAt: new Date().toISOString(),\n _serverVersion: '1.0'\n};\n\nreturn [{ json: enriched }];"
},
"id": "code-validate",
"name": "Validate & Enrich",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
480,
300
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "has-error",
"leftValue": "={{ $json.error }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "if-error",
"name": "Has Error?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
700,
300
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ success: false, error: $json.error }) }}",
"options": {
"responseCode": 400,
"responseHeaders": {
"entries": [
{
"name": "Access-Control-Allow-Origin",
"value": "*"
}
]
}
}
},
"id": "respond-error",
"name": "Respond Error",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
920,
200
]
},
{
"parameters": {
"operation": "set",
"key": "={{ 'inspection:' + $json.id }}",
"value": "={{ JSON.stringify($json) }}",
"expireAfterSeconds": 7776000
},
"id": "redis-save",
"name": "Save to Storage",
"type": "n8n-nodes-base.redis",
"typeVersion": 1,
"position": [
920,
400
],
"disabled": true,
"notesInFlow": true,
"notes": "Enable this if you have Redis configured. Otherwise the Code node below handles file-based storage."
},
{
"parameters": {
"jsCode": "// File-based storage fallback using n8n's built-in static data\n// This persists data in n8n's workflow static data (SQLite/Postgres)\nconst inspection = $input.first().json;\nconst id = inspection.id;\n\n// Use workflow static data as a simple key-value store\nconst staticData = $getWorkflowStaticData('global');\n\n// Initialize storage array if needed\nif (!staticData.inspections) {\n staticData.inspections = {};\n}\n\n// Store the inspection by ID\nstaticData.inspections[id] = inspection;\n\n// Also maintain a list of IDs for quick lookup (max 500 recent)\nif (!staticData.inspectionIds) {\n staticData.inspectionIds = [];\n}\nconst ids = staticData.inspectionIds;\nconst existingIdx = ids.indexOf(id);\nif (existingIdx >= 0) {\n ids.splice(existingIdx, 1);\n}\nids.unshift(id);\nif (ids.length > 500) {\n const removedId = ids.pop();\n delete staticData.inspections[removedId];\n}\n\nreturn [{ json: { success: true, id: id, storedAt: new Date().toISOString(), totalStored: ids.length } }];"
},
"id": "code-store",
"name": "Store Inspection",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
920,
500
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ success: true, id: $json.id, storedAt: $json.storedAt, totalStored: $json.totalStored }) }}",
"options": {
"responseCode": 200,
"responseHeaders": {
"entries": [
{
"name": "Access-Control-Allow-Origin",
"value": "*"
}
]
}
}
},
"id": "respond-success",
"name": "Respond Success",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
1140,
500
]
}
],
"connections": {
"Webhook - Submit": {
"main": [
[
{
"node": "Validate & Enrich",
"type": "main",
"index": 0
}
]
]
},
"Validate & Enrich": {
"main": [
[
{
"node": "Has Error?",
"type": "main",
"index": 0
}
]
]
},
"Has Error?": {
"main": [
[
{
"node": "Respond Error",
"type": "main",
"index": 0
}
],
[
{
"node": "Store Inspection",
"type": "main",
"index": 0
}
]
]
},
"Store Inspection": {
"main": [
[
{
"node": "Respond Success",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"tags": [
{
"name": "Sparkery"
},
{
"name": "Cleaning Inspection"
}
]
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Cleaning Inspection - Submit. Uses redis. Webhook trigger; 7 nodes.
Source: https://github.com/Wendealai/WendealDashboard/blob/33c6d58fed11f0b2bc23442f897154656b811dfb/n8n-workflows/inspection-submit.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.
Statemachine. Uses redis, redisTrigger. Webhook trigger; 20 nodes.
This workflow is great for n8n users who want to prevent duplicate or overlapping workflow runs. If you're a developer, DevOps engineer, or automation enthusiast managing tasks like database updates,
A production-ready authentication workflow implementing secure user registration, login, token verification, and refresh token mechanisms. Perfect for adding authentication to any application without
Reagendamiento. Uses executeWorkflowTrigger, redis, n8n-nodes-evolution-api, dataTable. Event-driven trigger; 73 nodes.