AutomationFlowsMarketing & Ads › Baserow Campaign Database to Shopify with Image Upload & Dynamic Template Update

Baserow Campaign Database to Shopify with Image Upload & Dynamic Template Update

BySascha @m3tam3re on n8n.io

Automating your marketing campaign management process can streamline your workflow and save you valuable time. With the combination of Baserow and n8n, you can efficiently handle your campaign data and seamlessly publish content to your Shopify store.

Webhook trigger★★★☆☆ complexity9 nodesHTTP RequestGraphQL
Marketing & Ads Trigger: Webhook Nodes: 9 Complexity: ★★★☆☆ Added:

This workflow corresponds to n8n.io template #2186 — we link there as the canonical source.

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 →

Download .json
{
  "id": "x2VUvhqV1YTJCIN0",
  "tags": [],
  "nodes": [
    {
      "id": "094b9011-a53d-4a50-b44d-ad229612bb06",
      "name": "No Operation, do nothing",
      "type": "n8n-nodes-base.noOp",
      "position": [
        560,
        220
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "6d9eee1f-995f-4558-8f97-25636e20022c",
      "name": "Save campaign.liquid",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        800,
        -100
      ],
      "parameters": {
        "url": "=https://{{ $('Set values here!').params[\"fields\"][\"values\"][0][\"stringValue\"] }}.myshopify.com/admin/api/2024-01/themes/{{ $('Set values here!').params[\"fields\"][\"values\"][1][\"stringValue\"] }}/assets.json",
        "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": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        },
        "shopifyAccessTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.1
    },
    {
      "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": "=https://{{ $('Set values here!').params[\"fields\"][\"values\"][0][\"stringValue\"] }}.myshopify.com/admin/api/2024-01/graphql.json",
        "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": "headerAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "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": "<img src=\"{{ 'IMAGE' | file_img_url: 'grande'}}\">"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "0bd9327d-4bbd-4884-a9a6-21b0c5b4c3d3",
      "name": "Call from Baserow",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -100,
        60
      ],
      "parameters": {
        "path": "3041fdd6-4cb5-4286-9034-1337dddc3f45",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 1.1
    },
    {
      "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
    },
    {
      "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](https://shopify.dev/docs/api/admin-graphql)\n\nTo make it easy to build queries for the GraphQL API easy please check out the [GraphiQL App for the Admin API](https://shopify.dev/docs/apps/tools/graphiql-admin-api) from Shopify"
      },
      "typeVersion": 1
    },
    {
      "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
    },
    {
      "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
    }
  ],
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "c82b43c0-aa47-4086-b7ae-588ee12e5e24",
  "connections": {
    "Check": {
      "main": [
        [
          {
            "node": "Upload Image",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Operation, do nothing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload Image": {
      "main": [
        [
          {
            "node": "Save campaign.liquid",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set values here!": {
      "main": [
        [
          {
            "node": "Check",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Call from Baserow": {
      "main": [
        [
          {
            "node": "Set values here!",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Automating your marketing campaign management process can streamline your workflow and save you valuable time. With the combination of Baserow and n8n, you can efficiently handle your campaign data and seamlessly publish content to your Shopify store.

Source: https://n8n.io/workflows/2186/ — original creator credit. Request a take-down →

More Marketing & Ads workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Marketing & Ads

This workflow is designed to manage the assignment and validation of unique QR code coupons within a lead generation system with SuiteCRM.

HTTP Request, Form Trigger, Google Sheets +1
Marketing & Ads

This workflow acts as an instant SDR that replies to new inbound leads across multiple channels in real time. It first captures and normalizes all incoming lead data into a unified structure. The work

Google Sheets, HTTP Request, Gmail +1
Marketing & Ads

AI Lead Qualification & Roting System. Uses httpRequest, twilio, airtable. Webhook trigger; 26 nodes.

HTTP Request, Twilio, Airtable
Marketing & Ads

A comprehensive n8n workflow template for streamlining influencer application processing with real-time social media data validation, intelligent scoring algorithms, and automated onboarding workflows

N8N Nodes Verifiemail, Stop And Error, HTTP Request +2
Marketing & Ads

This n8n workflow automates the generation of personalized marketing content for events, including emails, social media posts, and advertisements. Leveraging AI, it tailors content based on event deta

HTTP Request, Google Sheets, Email Send +1