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": "SudoMock - Sequential Batch Render (10 Renders)",
"nodes": [
{
"parameters": {},
"id": "11111111-aaaa-bbbb-cccc-111111111111",
"name": "When clicking Test workflow",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
240,
400
]
},
{
"parameters": {
"operation": "uploadPsd",
"psdFileUrl": "https://drive.usercontent.google.com/download?id=1CVh67lYHkyCHRw6NGJYYWLRar65E6b9K&export=download",
"psdName": "Batch Test Mockup"
},
"id": "22222222-aaaa-bbbb-cccc-222222222222",
"name": "Upload PSD",
"type": "n8n-nodes-sudomock.sudoMock",
"typeVersion": 1,
"position": [
460,
400
]
},
{
"parameters": {
"jsCode": "const mockupData = $input.item.json.data;\nconst pressureSO = mockupData.smart_objects.find(so => so.name === \"Pressure\");\n\nif (!pressureSO) {\n throw new Error(\"Smart object 'Pressure' not found in mockup\");\n}\n\nconst designs = [\n \"https://picsum.photos/seed/design1/1000/1000\",\n \"https://picsum.photos/seed/design2/1000/1000\",\n \"https://picsum.photos/seed/design3/1000/1000\",\n \"https://picsum.photos/seed/design4/1000/1000\",\n \"https://picsum.photos/seed/design5/1000/1000\",\n \"https://picsum.photos/seed/design6/1000/1000\",\n \"https://picsum.photos/seed/design7/1000/1000\",\n \"https://picsum.photos/seed/design8/1000/1000\",\n \"https://picsum.photos/seed/design9/1000/1000\",\n \"https://picsum.photos/seed/design10/1000/1000\"\n];\n\nreturn designs.map((designUrl, index) => ({\n json: {\n mockupUuid: mockupData.uuid,\n smartObjectUuid: pressureSO.uuid,\n designUrl: designUrl,\n batchNumber: index + 1\n }\n}));"
},
"id": "33333333-aaaa-bbbb-cccc-333333333333",
"name": "Prepare Designs",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
680,
400
]
},
{
"parameters": {
"batchSize": 1
},
"id": "44444444-aaaa-bbbb-cccc-444444444444",
"name": "Loop",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
900,
400
]
},
{
"parameters": {
"operation": "render",
"mockupUuid": "={{ $json.mockupUuid }}",
"smartObjects": {
"items": [
{
"uuid": "={{ $json.smartObjectUuid }}",
"assetUrl": "={{ $json.designUrl }}",
"fit": "cover"
}
]
},
"exportOptions": {
"imageFormat": "webp",
"imageSize": 1920,
"quality": 90,
"exportLabel": "={{ 'render-' + $json.batchNumber }}"
}
},
"id": "55555555-aaaa-bbbb-cccc-555555555555",
"name": "Render",
"type": "n8n-nodes-sudomock.sudoMock",
"typeVersion": 1,
"position": [
1120,
400
],
"continueOnFail": true
},
{
"parameters": {
"jsCode": "const loopData = $('Loop').item.json;\nconst renderResult = $input.item.json;\n\nreturn [{\n json: {\n batchNumber: loopData.batchNumber,\n mockupUuid: loopData.mockupUuid,\n designUrl: loopData.designUrl,\n renderedUrl: renderResult.renderedImageUrl || null,\n success: !!renderResult.renderedImageUrl,\n error: renderResult.error || null\n }\n}];"
},
"id": "66666666-aaaa-bbbb-cccc-666666666666",
"name": "Collect Result",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1340,
400
]
},
{
"parameters": {
"jsCode": "const allResults = $input.all();\nconst mockupUuid = allResults[0]?.json?.mockupUuid || \"\";\n\nreturn [{\n json: {\n total: allResults.length,\n successful: allResults.filter(r => r.json.success).length,\n failed: allResults.filter(r => !r.json.success).length,\n renderedUrls: allResults.filter(r => r.json.renderedUrl).map(r => r.json.renderedUrl),\n mockupUuid: mockupUuid\n }\n}];"
},
"id": "77777777-aaaa-bbbb-cccc-777777777777",
"name": "Summary",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1340,
600
]
},
{
"parameters": {
"operation": "deleteMockup",
"deleteMockupUuid": "={{ $json.mockupUuid }}"
},
"id": "88888888-aaaa-bbbb-cccc-888888888888",
"name": "Cleanup",
"type": "n8n-nodes-sudomock.sudoMock",
"typeVersion": 1,
"position": [
1560,
600
]
}
],
"connections": {
"When clicking Test workflow": {
"main": [
[
{
"node": "Upload PSD",
"type": "main",
"index": 0
}
]
]
},
"Upload PSD": {
"main": [
[
{
"node": "Prepare Designs",
"type": "main",
"index": 0
}
]
]
},
"Prepare Designs": {
"main": [
[
{
"node": "Loop",
"type": "main",
"index": 0
}
]
]
},
"Loop": {
"main": [
[
{
"node": "Summary",
"type": "main",
"index": 0
}
],
[
{
"node": "Render",
"type": "main",
"index": 0
}
]
]
},
"Render": {
"main": [
[
{
"node": "Collect Result",
"type": "main",
"index": 0
}
]
]
},
"Collect Result": {
"main": [
[
{
"node": "Loop",
"type": "main",
"index": 0
}
]
]
},
"Summary": {
"main": [
[
{
"node": "Cleanup",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"staticData": null,
"tags": []
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
SudoMock - Sequential Batch Render (10 Renders). Uses n8n-nodes-sudomock. Event-driven trigger; 8 nodes.
Source: https://github.com/sudomock/n8n-nodes-sudomock/blob/main/examples/batch-render-workflow.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.
SudoMock - Complete API Test (All 7 Operations). Uses n8n-nodes-sudomock. Event-driven trigger; 11 nodes.
SudoMock - Rate Limit Error Handling Test. Uses n8n-nodes-sudomock. Event-driven trigger; 9 nodes.
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.