{ "id": "x2VUvhqV1YTJCIN0", "meta": { "instanceId": "workflow-ae2499dd", "versionId": "1.0.0", "createdAt": "2025-09-29T07:08:01.511680", "updatedAt": "2025-09-29T07:08:01.511695", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "nodes": [ { "id": "094b9011-a53d-4a50-b44d-ad229612bb06", "name": "No Operation, do nothing", "type": "n8n-nodes-base.noOp", "position": [ 560, 220 ], "parameters": {}, "typeVersion": 1, "notes": "This noOp node performs automated tasks as part of the workflow." }, { "id": "6d9eee1f-995f-4558-8f97-25636e20022c", "name": "Save campaign.liquid", "type": "n8n-nodes-base.httpRequest", "position": [ 800, -100 ], "parameters": { "url": "{{ $env.BASE_URL }}", "method": "PUT", "options": {}, "jsonBody": "={\"asset\":\n {\n \"key\":\"snippets/{{ $('Set values here!').params[\"fields\"][\"values\"][2][\"stringValue\"] }}\",\n \"value\":\"{{ $('Set values here!').params[\"fields\"][\"values\"][3][\"stringValue\"].replace(\"IMAGE\",$('Check').item.json[\"body\"][\"items\"][0][\"Campaign Image\"][0][\"visible_name\"]).replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\") }}\"}}", "sendBody": true, "specifyBody": "json", "authentication": "{{ $credentials.genericCredentialType }}", "genericAuthType": "httpHeaderAuth" }, "credentials": { "httpHeaderAuth": { "id": "Z98cM8akgh1jPtG7", "name": "Header Auth Shopify" }, "shopifyAccessTokenApi": { "id": "WbxXaLMHozAgY3Rz", "name": "Shopify Access Token account" } }, "typeVersion": 4.1, "notes": "This httpRequest node performs automated tasks as part of the workflow." }, { "id": "fb3e9410-59ae-4d90-8bb3-1fd95f0e9a43", "name": "Upload Image", "type": "n8n-nodes-base.graphql", "position": [ 560, -100 ], "parameters": { "query": "mutation fileCreate($files: [FileCreateInput!]!) {\n fileCreate(files: $files) {\n files {\n id\n }\n }\n}", "endpoint": "{{ $env.API_ENDPOINT }}", "variables": "={\n \"files\": {\n \"alt\": \"{{ $json.body.items[0].Name }}\",\n \"contentType\": \"IMAGE\",\n\t\"filename\": \"{{ $json.body.items[0]['Campaign Image'][0].visible_name }}\",\n \"originalSource\": \"{{ $json.body.items[0]['Campaign Image'][0].url }}\"\n }\n}", "requestFormat": "json", "authentication": "{{ $credentials.headerAuth }}" }, "credentials": { "httpHeaderAuth": { "id": "Z98cM8akgh1jPtG7", "name": "Header Auth Shopify" } }, "typeVersion": 1, "notes": "This graphql node performs automated tasks as part of the workflow." }, { "id": "29f970fe-da65-4b6f-bf0b-1cadbd80f51c", "name": "Set values here!", "type": "n8n-nodes-base.set", "position": [ 120, 60 ], "parameters": { "fields": { "values": [ { "name": "Shopify Subdomain", "stringValue": "n8n-mautic-demo" }, { "name": "Theme ID", "stringValue": "125514514534" }, { "name": "Filename", "stringValue": "campaign.liquid" }, { "name": "Content", "stringValue": "" } ] }, "options": {} }, "typeVersion": 3.2, "notes": "This set node performs automated tasks as part of the workflow." }, { "id": "0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3", "name": "Call from Baserow", "type": "n8n-nodes-base.webhook", "position": [ -100, 60 ], "webhookId": "3041fdd6-4cb5-4286-9034-1337dddc3f45", "parameters": { "path": "3041fdd6-4cb5-4286-9034-1337dddc3f45", "options": {}, "httpMethod": "POST" }, "typeVersion": 1.1, "notes": "This webhook node performs automated tasks as part of the workflow." }, { "id": "6c9d35e8-0738-4d15-a0ff-40077e73d797", "name": "Check", "type": "n8n-nodes-base.if", "position": [ 320, 60 ], "parameters": { "options": {}, "conditions": { "options": { "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "21262344-6519-4f32-876b-82722a1fab66", "operator": { "type": "number", "operation": "gt" }, "leftValue": "={{\nDateTime.fromISO($json[\"body\"][\"items\"][0][\"Last modified\"])\n .diff(DateTime.fromISO($json[\"body\"][\"old_items\"][0][\"Last modified\"]),'minutes')\n .toObject()\n [\"minutes\"]\n}}", "rightValue": 0.1 }, { "id": "5c0a176c-5ba9-4060-a4d2-b9207cf47092", "operator": { "type": "boolean", "operation": "true", "singleValue": true }, "leftValue": "={{ $json.body.items[0].Active }}", "rightValue": "" }, { "id": "f764adc6-e7a1-4df7-861f-94b90a99f2d4", "operator": { "type": "array", "operation": "notEmpty", "singleValue": true }, "leftValue": "={{ $json[\"body\"][\"items\"][0][\"Campaign Image\"] }}", "rightValue": "" } ] } }, "typeVersion": 2, "notes": "This if node performs automated tasks as part of the workflow." }, { "id": "f6c17549-4192-4f96-ad81-518c52bdcda7", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [ -540, -40 ], "parameters": { "color": 4, "width": 360.408084305475, "height": 315.5897364788551, "content": "## Shopify API\n\nThis workflow uses GraphQL calls to the Shopify Admin API. In order to get a better understanding for the queries and mutations please check the API Docs.\n\n\n[Shopify GraphQL API docs]({{ $env.API_BASE_URL }}\n\nTo make it easy to build queries for the GraphQL API easy please check out the [GraphiQL App for the Admin API]({{ $env.API_BASE_URL }} from Shopify" }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "22743217-0c89-4fd1-b22d-0e00d6ca6854", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ 560, -300 ], "parameters": { "width": 331.1188177339898, "content": "## Shopify \nThe n8n Shopify node cannot upload images or theme assets so we need to make custom calls to the GraphQL and REST Api " }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "ca9561aa-85e8-47ad-8bac-60fc3a94f94e", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [ 80, -160 ], "parameters": { "color": 5, "width": 158.16682590559316, "content": "## Set values \nPlease edit this node and change the values for your own setup." }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." } ], "active": true, "pinData": { "Call from Baserow": [ { "json": { "body": { "items": [ { "id": 1, "Name": "Campaigna", "order": "1.00000000000000000000", "Active": true, "Last modified": "2024-03-01T11:21:58.157987Z", "Campaign Image": [ { "url": "{{ $env.WEBHOOK_URL }}", "name": "O5jM7aSUTYSBPQtxVHktkN4U7wlUoIJd_1af752d7847a230a853df92814639be35035229f2bb857b4ea870b64011cdde0.webp", "size": 107358, "is_image": true, "mime_type": "", "thumbnails": { "tiny": { "url": "{{ $env.WEBHOOK_URL }}", "width": null, "height": 21 }, "small": { "url": "{{ $env.WEBHOOK_URL }}", "width": 48, "height": 48 }, "card_cover": { "url": "{{ $env.WEBHOOK_URL }}", "width": 300, "height": 160 } }, "image_width": 1280, "uploaded_at": "2024-03-01T09:50:41.921452+00:00", "image_height": 720, "visible_name": "n8n-portainer.webp" } ] } ], "event_id": "dae85cec-94ce-4e6c-8091-fce28bdc4c6c", "table_id": 596, "old_items": [ { "id": 1, "Name": "Campaignas", "order": "1.00000000000000000000", "Active": true, "Last modified": "2024-03-01T11:21:16.099694Z", "Campaign Image": [ { "url": "{{ $env.WEBHOOK_URL }}", "name": "O5jM7aSUTYSBPQtxVHktkN4U7wlUoIJd_1af752d7847a230a853df92814639be35035229f2bb857b4ea870b64011cdde0.webp", "size": 107358, "is_image": true, "mime_type": "", "thumbnails": { "tiny": { "url": "{{ $env.WEBHOOK_URL }}", "width": null, "height": 21 }, "small": { "url": "{{ $env.WEBHOOK_URL }}", "width": 48, "height": 48 }, "card_cover": { "url": "{{ $env.WEBHOOK_URL }}", "width": 300, "height": 160 } }, "image_width": 1280, "uploaded_at": "2024-03-01T09:50:41.921452+00:00", "image_height": 720, "visible_name": "n8n-portainer.webp" } ] } ], "event_type": "rows.updated", "database_id": 112, "workspace_id": 108 }, "query": {}, "params": {}, "headers": { "host": "n8n.m3tam3re.com", "accept": "*/*", "user-agent": "python-requests/2.31.0", "content-type": "application/json", "content-length": "2617", "accept-encoding": "gzip, deflate, br", "x-baserow-event": "rows.updated", "x-forwarded-for": "202.61.226.110", "x-forwarded-host": "n8n.m3tam3re.com", "x-forwarded-proto": "https", "x-baserow-delivery": "dae85cec-94ce-4e6c-8091-fce28bdc4c6c" } } } ] }, "settings": { "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000 }, "versionId": "c82b43c0-aa47-4086-b7ae-588ee12e5e24", "connections": { "6d9eee1f-995f-4558-8f97-25636e20022c": { "main": [ [ { "node": "error-handler-6d9eee1f-995f-4558-8f97-25636e20022c", "type": "main", "index": 0 } ], [ { "node": "error-handler-6d9eee1f-995f-4558-8f97-25636e20022c-4fab974b", "type": "main", "index": 0 } ], [ { "node": "error-handler-6d9eee1f-995f-4558-8f97-25636e20022c-ba4ea63a", "type": "main", "index": 0 } ], [ { "node": "error-handler-6d9eee1f-995f-4558-8f97-25636e20022c-46bacafd", "type": "main", "index": 0 } ], [ { "node": "error-handler-6d9eee1f-995f-4558-8f97-25636e20022c-5a043914", "type": "main", "index": 0 } ], [ { "node": "error-handler-6d9eee1f-995f-4558-8f97-25636e20022c-0cc394c7", "type": "main", "index": 0 } ], [ { "node": "error-handler-6d9eee1f-995f-4558-8f97-25636e20022c-be6fda68", "type": "main", "index": 0 } ], [ { "node": "error-handler-6d9eee1f-995f-4558-8f97-25636e20022c-6f4fcb96", "type": "main", "index": 0 } ], [ { "node": "error-handler-6d9eee1f-995f-4558-8f97-25636e20022c-daeb2e7a", "type": "main", "index": 0 } ] ] }, "0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3": { "main": [ [ { "node": "error-handler-0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3", "type": "main", "index": 0 } ], [ { "node": "error-handler-0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3-38056c87", "type": "main", "index": 0 } ], [ { "node": "error-handler-0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3-e3072001", "type": "main", "index": 0 } ], [ { "node": "error-handler-0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3-cccdf8f6", "type": "main", "index": 0 } ], [ { "node": "error-handler-0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3-af326dab", "type": "main", "index": 0 } ], [ { "node": "error-handler-0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3-38c4548b", "type": "main", "index": 0 } ], [ { "node": "error-handler-0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3-000eae7b", "type": "main", "index": 0 } ], [ { "node": "error-handler-0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3-f4685aa2", "type": "main", "index": 0 } ], [ { "node": "error-handler-0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3-74465bde", "type": "main", "index": 0 } ] ] } }, "name": "Noop Workflow", "description": "Automated workflow: Noop Workflow. This workflow integrates 8 different services: webhook, stickyNote, httpRequest, graphql, set. It contains 13 nodes and follows best practices for error handling and security.", "notes": "Excellent quality workflow: Noop Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }