AutomationFlowsMarketing & Ads › Multi-channel Campaign Orchestrator

Multi-channel Campaign Orchestrator

Multi-Channel Campaign Orchestrator. Event-driven trigger; 11 nodes.

Event trigger★★★★☆ complexity11 nodes
Marketing & Ads Trigger: Event Nodes: 11 Complexity: ★★★★☆ Added:

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
{
  "name": "Multi-Channel Campaign Orchestrator",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -960,
        -80
      ],
      "id": "5d9a3f3b-1111-4a11-8c11-1234567890aa",
      "name": "Manual Trigger (dev)"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "c1b5fd3e-aaaa-4a3c-9d01-111111111111",
              "name": "name",
              "value": "Q2 Product Launch",
              "type": "string"
            },
            {
              "id": "c1b5fd3e-bbbb-4a3c-9d01-111111111111",
              "name": "audience_segment",
              "value": "existing-customers",
              "type": "string"
            },
            {
              "id": "c1b5fd3e-cccc-4a3c-9d01-111111111111",
              "name": "start_date",
              "value": "2025-04-01",
              "type": "string"
            },
            {
              "id": "c1b5fd3e-dddd-4a3c-9d01-111111111111",
              "name": "end_date",
              "value": "2025-04-30",
              "type": "string"
            },
            {
              "id": "c1b5fd3e-eeee-4a3c-9d01-111111111111",
              "name": "budget_usd",
              "value": "25000",
              "type": "string"
            },
            {
              "id": "c1b5fd3e-ffff-4a3c-9d01-111111111111",
              "name": "channels",
              "value": "{\"email\": true, \"ads\": true, \"crm\": true, \"internal_comms\": true}",
              "type": "string"
            },
            {
              "id": "c1b5fd3e-9999-4a3c-9d01-111111111111",
              "name": "goals",
              "value": "{\"pipeline_created_usd\": 150000, \"signups\": 500}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -760,
        -80
      ],
      "id": "bd3b2d3f-2222-4b22-9c22-1234567890bb",
      "name": "Set Campaign"
    },
    {
      "parameters": {
        "jsCode": "const item = items[0].json;\n\nconst required = ['name', 'audience_segment', 'start_date', 'end_date', 'budget_usd'];\nfor (const field of required) {\n  if (item[field] === undefined || item[field] === null || item[field] === '') {\n    throw new Error(`Missing required field: ${field}`);\n  }\n}\n\n// Parse numeric fields and JSON strings where relevant\nconst budget = Number(item.budget_usd);\nif (Number.isNaN(budget) || budget <= 0) {\n  throw new Error('budget_usd must be a positive number');\n}\n\nlet channels = {};\nlet goals = {};\ntry {\n  channels = item.channels ? JSON.parse(item.channels) : {};\n} catch (e) {\n  throw new Error('channels must be valid JSON');\n}\n\ntry {\n  goals = item.goals ? JSON.parse(item.goals) : {};\n} catch (e) {\n  throw new Error('goals must be valid JSON');\n}\n\nreturn [{\n  json: {\n    ...item,\n    budget_usd: budget,\n    channels,\n    goals,\n  },\n}];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -520,
        -80
      ],
      "id": "f8b1f0f0-3333-4c33-9d33-1234567890cc",
      "name": "Validate & Normalise"
    },
    {
      "parameters": {
        "jsCode": "const campaign = { ...items[0].json };\n\nif (!campaign.channels?.email) {\n  return [{ json: { ...campaign, email: { enabled: false } } }];\n}\n\nconst email = {\n  enabled: true,\n  segmentId: 'seg_placeholder',\n  campaignId: 'cmp_email_placeholder',\n  status: 'draft'\n};\n\nreturn [{ json: { ...campaign, email } }];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -260,
        -260
      ],
      "id": "a1e2b3c4-4444-4d44-9e44-1234567890dd",
      "name": "Setup Email Campaign"
    },
    {
      "parameters": {
        "jsCode": "const campaign = { ...items[0].json };\n\nif (!campaign.channels?.ads) {\n  return [{ json: { ...campaign, ads: { enabled: false } } }];\n}\n\nconst ads = {\n  enabled: true,\n  metaAdSetId: 'adset_meta_placeholder',\n  googleCampaignId: 'gads_placeholder',\n  budget_usd: campaign.budget_usd\n};\n\nreturn [{ json: { ...campaign, ads } }];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -260,
        -40
      ],
      "id": "b2f3c4d5-5555-4e55-9f55-1234567890ee",
      "name": "Setup Ads"
    },
    {
      "parameters": {
        "jsCode": "const campaign = { ...items[0].json };\n\nif (!campaign.channels?.crm) {\n  return [{ json: { ...campaign, crm: { enabled: false } } }];\n}\n\nconst crm = {\n  enabled: true,\n  campaignId: 'crm_campaign_placeholder',\n  taggedAccounts: 120\n};\n\nreturn [{ json: { ...campaign, crm } }];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -260,
        180
      ],
      "id": "c3g4d5e6-6666-4f66-9a66-1234567890ff",
      "name": "Setup CRM Campaign"
    },
    {
      "parameters": {
        "jsCode": "const campaign = { ...items[0].json };\n\nif (!campaign.channels?.internal_comms) {\n  return [{ json: { ...campaign, internalComms: { enabled: false } } }];\n}\n\nconst internalComms = {\n  enabled: true,\n  slackChannel: '#campaigns',\n  messageLink: 'https://your-workspace.slack.com/archives/campaign_message_placeholder'\n};\n\nreturn [{ json: { ...campaign, internalComms } }];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -260,
        400
      ],
      "id": "d4h5e6f7-7777-4a77-9b77-123456789011",
      "name": "Notify Internal Comms"
    },
    {
      "parameters": {
        "mode": "mergeByIndex"
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 2,
      "position": [
        0,
        -200
      ],
      "id": "e5i6f7g8-8888-4b88-9c88-123456789022",
      "name": "Merge Email + Ads"
    },
    {
      "parameters": {
        "mode": "mergeByIndex"
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 2,
      "position": [
        260,
        -40
      ],
      "id": "f6j7g8h9-9999-4c99-9d99-123456789033",
      "name": "Merge Campaign + CRM"
    },
    {
      "parameters": {
        "mode": "mergeByIndex"
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 2,
      "position": [
        520,
        160
      ],
      "id": "g7k8h9i0-aaaa-4daa-9eaa-123456789044",
      "name": "Merge Full Campaign"
    },
    {
      "parameters": {
        "jsCode": "const c = items[0].json;\n\nconst lines = [];\nlines.push(`# Campaign: ${c.name}`);\nlines.push('');\nlines.push(`Audience: ${c.audience_segment}`);\nlines.push(`Dates: ${c.start_date} \u2192 ${c.end_date}`);\nlines.push(`Budget: $${c.budget_usd}`);\nlines.push('');\nlines.push('## Channels');\n\nif (c.email?.enabled) {\n  lines.push('- Email: draft campaign created (segment: segment placeholder, ID: cmp_email_placeholder)');\n} else {\n  lines.push('- Email: disabled');\n}\n\nif (c.ads?.enabled) {\n  lines.push('- Ads: Meta and Google campaigns created (IDs: placeholders)');\n} else {\n  lines.push('- Ads: disabled');\n}\n\nif (c.crm?.enabled) {\n  lines.push('- CRM: campaign record created and accounts tagged');\n} else {\n  lines.push('- CRM: disabled');\n}\n\nif (c.internalComms?.enabled) {\n  lines.push('- Internal comms: posted to #campaigns');\n} else {\n  lines.push('- Internal comms: disabled');\n}\n\nconst summary_markdown = lines.join('\n');\n\nreturn [{ json: { ...c, summary_markdown } }];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        760,
        160
      ],
      "id": "h8l9i0j1-bbbb-4ebb-9fbb-123456789055",
      "name": "Build Summary"
    }
  ],
  "connections": {
    "Manual Trigger (dev)": {
      "main": [
        [
          {
            "node": "Set Campaign",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Campaign": {
      "main": [
        [
          {
            "node": "Validate & Normalise",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate & Normalise": {
      "main": [
        [
          {
            "node": "Setup Email Campaign",
            "type": "main",
            "index": 0
          },
          {
            "node": "Setup Ads",
            "type": "main",
            "index": 0
          },
          {
            "node": "Setup CRM Campaign",
            "type": "main",
            "index": 0
          },
          {
            "node": "Notify Internal Comms",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Setup Email Campaign": {
      "main": [
        [
          {
            "node": "Merge Email + Ads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Setup Ads": {
      "main": [
        [
          {
            "node": "Merge Email + Ads",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge Email + Ads": {
      "main": [
        [
          {
            "node": "Merge Campaign + CRM",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Setup CRM Campaign": {
      "main": [
        [
          {
            "node": "Merge Campaign + CRM",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge Campaign + CRM": {
      "main": [
        [
          {
            "node": "Merge Full Campaign",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notify Internal Comms": {
      "main": [
        [
          {
            "node": "Merge Full Campaign",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge Full Campaign": {
      "main": [
        [
          {
            "node": "Build Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "ca4b1d2e-cccc-4cdd-9eee-123456789066",
  "id": "KAMPOrchestrator001",
  "tags": []
}
Pro

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

About this workflow

Multi-Channel Campaign Orchestrator. Event-driven trigger; 11 nodes.

Source: https://github.com/tfest-dev/n8n-marketing/blob/main/multi-channel_campaign_orchestrator.json — 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

Maximize your conversion rates with this end-to-end automated outreach and lead nurturing system. This workflow manages the entire sales lifecycle—from instant contact enrollment via WhatsApp to AI-pe

N8N Nodes Wati, Airtable, HTTP Request
Marketing & Ads

This workflow is designed to take user inputs in order to generate an image using the Riverflow 2.0 model through the Replicate API. It can handle both image generation as well as image editing. Addit

Form Trigger, Data Table, HTTP Request +1
Marketing & Ads

Run professional email campaigns with A/B testing, Google Sheets tracking, and Slack analytics. FEATURES:

Google Sheets, Slack, Gmail +1
Marketing & Ads

This workflow allows you to send multi-step email campaigns using n8n, Gmail and Google Sheets.

Google Sheets, Gmail, Execute Workflow Trigger
Marketing & Ads

Enrich And Veryify Leads. Uses httpRequest, googleSheets, googleSheetsTrigger. Event-driven trigger; 32 nodes.

HTTP Request, Google Sheets, Google Sheets Trigger