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": "QA Kit - Manual Workflow Harness",
"nodes": [
{
"parameters": {},
"id": "5e8c4b45-7df5-42a2-8b9e-caf094fc8b01",
"name": "When clicking Execute workflow",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
0,
0
]
},
{
"parameters": {
"jsCode": "return [\n {\n json: {\n caseId: 'pass-basic-ticket',\n requestId: 'req_demo_001',\n taskType: 'summarize_ticket',\n payload: {\n ticketId: 'TICKET-123',\n text: 'Synthetic customer note for QA testing.'\n }\n }\n },\n {\n json: {\n caseId: 'fail-missing-task-type',\n requestId: 'req_demo_002',\n payload: {\n ticketId: 'TICKET-124',\n text: 'Synthetic note with a missing taskType.'\n }\n }\n }\n];"
},
"id": "78bd0c4b-0288-4132-8c70-a7ddf27e1c6e",
"name": "Seed synthetic QA cases",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
240,
0
]
},
{
"parameters": {
"jsCode": "return items.map((item) => {\n const value = item.json;\n const missing = [];\n for (const field of ['requestId', 'taskType', 'payload']) {\n if (value[field] === undefined || value[field] === null || value[field] === '') {\n missing.push(field);\n }\n }\n\n const passed = missing.length === 0;\n return {\n json: {\n caseId: value.caseId,\n passed,\n missing,\n sanitizedInput: value,\n recommendation: passed\n ? 'Input contract looks valid. Continue to downstream workflow nodes.'\n : `Reject or route to repair branch. Missing: ${missing.join(', ')}`\n }\n };\n});"
},
"id": "2db8ce9d-f1cb-4f16-bc3b-9a3fda6935e6",
"name": "Validate input contract",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
500,
0
]
},
{
"parameters": {
"jsCode": "const passed = items.filter((item) => item.json.passed).length;\nconst failed = items.length - passed;\nreturn [\n {\n json: {\n status: failed === 0 ? 'pass' : 'needs_attention',\n totalCases: items.length,\n passed,\n failed,\n cases: items.map((item) => item.json),\n nextStep: failed === 0\n ? 'Attach this validation block before the production workflow body.'\n : 'Fix required fields or add a repair branch before expensive API or AI calls.'\n }\n }\n];"
},
"id": "27b5293e-006c-4516-a771-a530d2424fdd",
"name": "Build QA report",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
760,
0
]
}
],
"connections": {
"When clicking Execute workflow": {
"main": [
[
{
"node": "Seed synthetic QA cases",
"type": "main",
"index": 0
}
]
]
},
"Seed synthetic QA cases": {
"main": [
[
{
"node": "Validate input contract",
"type": "main",
"index": 0
}
]
]
},
"Validate input contract": {
"main": [
[
{
"node": "Build QA report",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"saveManualExecutions": true
},
"staticData": null,
"tags": []
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
QA Kit - Manual Workflow Harness. Event-driven trigger; 4 nodes.
Source: https://github.com/hesong0222-dev/n8n-workflow-qa-kit/blob/main/workflows/qa-harness-manual.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.
Blotato. Uses googleSheets, @blotato/n8n-nodes-blotato. Event-driven trigger; 65 nodes.
This template is a hands-on, practical exam designed to help you master n8n Expressions—the key to accessing and manipulating data in your workflows.
This template is a hands-on, practical exam designed to test your understanding of the fundamental JSON data types. It's the perfect way to solidify your knowledge after learning the basics.
Agendamiento. Uses n8n-nodes-evolution-api, redis, dataTable, executeWorkflowTrigger. Event-driven trigger; 60 nodes.
Kv Cloudflare Key Value Database Full Api Integration Workflow. Uses stickyNote, httpRequest, manualTrigger. Event-driven trigger; 47 nodes.