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 →
{
"updatedAt": "2026-04-25T04:35:25.046Z",
"createdAt": "2026-04-25T04:34:12.958Z",
"id": "MLG4B67xXI8WH7Mp",
"name": "TEST-Sesion2-CB-Redis-CC-AWS",
"description": null,
"active": true,
"isArchived": false,
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "test-sesion2-cb-cc-aws",
"responseMode": "responseNode",
"options": {}
},
"id": "webhook-trigger-s2",
"name": "Webhook Sesion 2",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
200,
300
]
},
{
"parameters": {
"authentication": "privateKey",
"resource": "command",
"command": "=bash -ic 'claude -p \"Lee el skill /home/ubuntu/addendo-website/.claude/agents/skills-globales/test-saludo.md y usalo como guia para saludar en espanol a {{ $json.body.name }}. Se breve, maximo 2 oraciones.\" --bare --max-budget-usd 0.05 --output-format json --no-session-persistence < /dev/null'"
},
"id": "ssh-claude-code-aws",
"name": "SSH Claude Code AWS",
"type": "n8n-nodes-base.ssh",
"typeVersion": 1,
"position": [
460,
300
],
"credentials": {
"sshPrivateKey": {
"name": "<your credential>"
}
},
"onError": "continueErrorOutput",
"retryOnFail": false
},
{
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "// Skill #50 v1.1.1 - Mandamiento #15: logs estructurados con context\n// Validar exitCode + parsear stdout JSON de Claude Code CLI\nconst sshOutput = $input.first().json;\nconst traceId = `s2-cb-cc-${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\nconst workflowId = $workflow.id;\nconst timestampIso = new Date().toISOString();\n\n// Validacion defensiva exitCode (skill #50 Mandamiento error handling)\nconst exitCode = sshOutput.exitCode !== undefined ? sshOutput.exitCode : sshOutput.code;\nif (exitCode !== undefined && exitCode !== 0) {\n console.log(JSON.stringify({\n level: 'ERROR',\n event: 'ssh_command_failed',\n trace_id: traceId,\n workflow_id: workflowId,\n timestamp: timestampIso,\n exit_code: exitCode,\n stderr_preview: (sshOutput.stderr || '').slice(0, 500)\n }));\n throw new Error(`SSH command failed (exit ${exitCode}): ${(sshOutput.stderr || 'no stderr').slice(0, 300)}`);\n}\n\nconst stdout = (sshOutput.stdout || '').trim();\nif (!stdout) {\n throw new Error('SSH stdout vacio - Claude Code CLI no produjo output');\n}\n\nlet claudePayload;\ntry {\n claudePayload = JSON.parse(stdout);\n} catch (err) {\n throw new Error(`Failed to parse Claude Code stdout as JSON: ${err.message}. Raw stdout (first 500 chars): ${stdout.slice(0, 500)}`);\n}\n\nconst metrics = {\n cost_usd: claudePayload.total_cost_usd || 0,\n latency_ms: claudePayload.duration_ms || 0,\n tokens_input: claudePayload.usage?.input_tokens || 0,\n tokens_output: claudePayload.usage?.output_tokens || 0\n};\n\nconsole.log(JSON.stringify({\n level: 'INFO',\n event: 'claude_code_aws_invocation_ok',\n trace_id: traceId,\n workflow_id: workflowId,\n timestamp: timestampIso,\n metrics: metrics\n}));\n\nreturn [{\n json: {\n status: 'success',\n test_name: 'TEST-Sesion2-CB-Redis-CC-AWS',\n claude_code_response: claudePayload.result || claudePayload.response || '',\n metrics: metrics,\n timestamp: timestampIso,\n trace_id: traceId\n }\n}];"
},
"id": "code-parse-metrics",
"name": "Parse Metrics + Log",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
720,
300
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {
"responseCode": 200
}
},
"id": "respond-success-s2",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
980,
300
]
}
],
"connections": {
"Webhook Sesion 2": {
"main": [
[
{
"node": "SSH Claude Code AWS",
"type": "main",
"index": 0
}
]
]
},
"SSH Claude Code AWS": {
"main": [
[
{
"node": "Parse Metrics + Log",
"type": "main",
"index": 0
}
]
]
},
"Parse Metrics + Log": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"saveDataSuccessExecution": "all",
"saveExecutionProgress": true,
"saveManualExecutions": true,
"timezone": "America/New_York",
"callerPolicy": "workflowsFromSameOwner",
"availableInMCP": false
},
"staticData": null,
"meta": null,
"versionId": "2f97533d-c796-47a6-9431-68bd503682c8",
"activeVersionId": "2f97533d-c796-47a6-9431-68bd503682c8",
"versionCounter": 4,
"triggerCount": 1,
"shared": [
{
"updatedAt": "2026-04-25T04:34:12.960Z",
"createdAt": "2026-04-25T04:34:12.960Z",
"role": "workflow:owner",
"workflowId": "MLG4B67xXI8WH7Mp",
"projectId": "kOz4cM3t590yiTX0",
"project": {
"updatedAt": "2026-04-06T19:49:50.605Z",
"createdAt": "2026-04-06T05:13:47.025Z",
"id": "kOz4cM3t590yiTX0",
"name": "Jose Raul Ramirez <admin@addendo.io>",
"type": "personal",
"icon": null,
"description": null,
"creatorId": "22729d36-131e-405e-8267-dcd82aca785f"
}
}
],
"tags": [],
"activeVersion": {
"updatedAt": "2026-04-25T04:35:25.048Z",
"createdAt": "2026-04-25T04:35:25.048Z",
"versionId": "2f97533d-c796-47a6-9431-68bd503682c8",
"workflowId": "MLG4B67xXI8WH7Mp",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "test-sesion2-cb-cc-aws",
"responseMode": "responseNode",
"options": {}
},
"id": "webhook-trigger-s2",
"name": "Webhook Sesion 2",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
200,
300
],
"webhookId": "test-sesion2-cb-cc-aws-webhook"
},
{
"parameters": {
"authentication": "privateKey",
"resource": "command",
"command": "=bash -ic 'claude -p \"Lee el skill /home/ubuntu/addendo-website/.claude/agents/skills-globales/test-saludo.md y usalo como guia para saludar en espanol a {{ $json.body.name }}. Se breve, maximo 2 oraciones.\" --bare --max-budget-usd 0.05 --output-format json --no-session-persistence < /dev/null'"
},
"id": "ssh-claude-code-aws",
"name": "SSH Claude Code AWS",
"type": "n8n-nodes-base.ssh",
"typeVersion": 1,
"position": [
460,
300
],
"credentials": {
"sshPrivateKey": {
"id": "LrawZQkbyyn4o6qu",
"name": "Addendo SSH AWS Production"
}
},
"onError": "continueErrorOutput",
"retryOnFail": false
},
{
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "// Skill #50 v1.1.1 - Mandamiento #15: logs estructurados con context\n// Validar exitCode + parsear stdout JSON de Claude Code CLI\nconst sshOutput = $input.first().json;\nconst traceId = `s2-cb-cc-${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\nconst workflowId = $workflow.id;\nconst timestampIso = new Date().toISOString();\n\n// Validacion defensiva exitCode (skill #50 Mandamiento error handling)\nconst exitCode = sshOutput.exitCode !== undefined ? sshOutput.exitCode : sshOutput.code;\nif (exitCode !== undefined && exitCode !== 0) {\n console.log(JSON.stringify({\n level: 'ERROR',\n event: 'ssh_command_failed',\n trace_id: traceId,\n workflow_id: workflowId,\n timestamp: timestampIso,\n exit_code: exitCode,\n stderr_preview: (sshOutput.stderr || '').slice(0, 500)\n }));\n throw new Error(`SSH command failed (exit ${exitCode}): ${(sshOutput.stderr || 'no stderr').slice(0, 300)}`);\n}\n\nconst stdout = (sshOutput.stdout || '').trim();\nif (!stdout) {\n throw new Error('SSH stdout vacio - Claude Code CLI no produjo output');\n}\n\nlet claudePayload;\ntry {\n claudePayload = JSON.parse(stdout);\n} catch (err) {\n throw new Error(`Failed to parse Claude Code stdout as JSON: ${err.message}. Raw stdout (first 500 chars): ${stdout.slice(0, 500)}`);\n}\n\nconst metrics = {\n cost_usd: claudePayload.total_cost_usd || 0,\n latency_ms: claudePayload.duration_ms || 0,\n tokens_input: claudePayload.usage?.input_tokens || 0,\n tokens_output: claudePayload.usage?.output_tokens || 0\n};\n\nconsole.log(JSON.stringify({\n level: 'INFO',\n event: 'claude_code_aws_invocation_ok',\n trace_id: traceId,\n workflow_id: workflowId,\n timestamp: timestampIso,\n metrics: metrics\n}));\n\nreturn [{\n json: {\n status: 'success',\n test_name: 'TEST-Sesion2-CB-Redis-CC-AWS',\n claude_code_response: claudePayload.result || claudePayload.response || '',\n metrics: metrics,\n timestamp: timestampIso,\n trace_id: traceId\n }\n}];"
},
"id": "code-parse-metrics",
"name": "Parse Metrics + Log",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
720,
300
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {
"responseCode": 200
}
},
"id": "respond-success-s2",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
980,
300
]
}
],
"connections": {
"Webhook Sesion 2": {
"main": [
[
{
"node": "SSH Claude Code AWS",
"type": "main",
"index": 0
}
]
]
},
"SSH Claude Code AWS": {
"main": [
[
{
"node": "Parse Metrics + Log",
"type": "main",
"index": 0
}
]
]
},
"Parse Metrics + Log": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"authors": "Jose Raul Ramirez ",
"name": null,
"description": null,
"autosaved": false,
"workflowPublishHistory": [
{
"createdAt": "2026-04-25T04:35:25.169Z",
"id": 117,
"workflowId": "MLG4B67xXI8WH7Mp",
"versionId": "2f97533d-c796-47a6-9431-68bd503682c8",
"event": "activated",
"userId": "22729d36-131e-405e-8267-dcd82aca785f"
}
]
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
sshPrivateKey
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
TEST-Sesion2-CB-Redis-CC-AWS. Uses ssh. Webhook trigger; 4 nodes.
Source: https://github.com/AddendoGrowthPartner/addendo-website/blob/main/workflows/backups/2026-05-04-pre-sesion3/workflow-MLG4B67xXI8WH7Mp-pre-sesion3.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.
TEST-Sesion2-CB-Redis-CC-AWS. Uses ssh. Webhook trigger; 4 nodes.
Automate WhatsApp communication for recruitment agencies with an interactive, structured customer experience. This workflow handles pricing inquiries, request submissions, tracking, complaints, and hu
Hectelion | Evaluation d'entreprise. Uses googleDrive, httpRequest, microsoftOutlook, googleSheets. Webhook trigger; 64 nodes.
Code. Uses googleSheets, gmail, supabase, stickyNote. Webhook trigger; 51 nodes.