n8nen.nl logo n8nen.nl

N8N Sub-Workflows: Modulair Bouwen met de Execute Workflow Node [Complete Gids]

2026-03-10 n8nen
N8N Sub-Workflows: Modulair Bouwen met de Execute Workflow Node [Complete Gids]
Main Workflow Orchestrator Sub: Data Validatie Herbruikbaar in 8 workflows Sub: Slack Notificatie Herbruikbaar in 12 workflows Sub: Error Logger Herbruikbaar in alle workflows Modulair Bouwen met Sub-Workflows Execute Workflow Node • Herbruikbaarheid • Input/Output Modes • Access Control

Een workflow met 40+ nodes die alles doet — van data ophalen tot e-mails sturen tot error logging — is een nachtmerrie om te debuggen. De oplossing: sub-workflows. Splits je logica op in herbruikbare modules, net zoals functies in code. Fix een bug op één plek, en elke workflow die die module gebruikt profiteert automatisch.

Wat je leert:

  • Wat sub-workflows zijn en wanneer je ze gebruikt
  • De Execute Sub-workflow node stap voor stap configureren
  • Input data modes: typed fields, JSON example, of accept all
  • Execution modes: run once vs. run per item
  • Access control: wie mag jouw sub-workflow aanroepen?
  • Refactoring: bestaande workflows opsplitsen

Wat Zijn Sub-Workflows?

Een sub-workflow is een zelfstandig n8n workflow dat je vanuit een ander workflow kunt aanroepen. Denk eraan als een functie in programmeercode:

Code equivalent

// Een functie die je overal aanroept
function sendSlackAlert(message, channel) {
  slack.post(channel, message);
  return { status: 'sent' };
}

// Aanroepen vanuit verschillende plekken
sendSlackAlert("Order ontvangen", "#sales");
sendSlackAlert("Server error", "#alerts");

n8n equivalent

// Sub-workflow: "Slack Alert"
Execute Workflow Trigger
  → Input: message, channel
  → Slack Node (verstuur bericht)
  → Output: { status: 'sent' }

// Aanroepen vanuit Main Workflow
Execute Sub-workflow Node
  → Workflow: "Slack Alert"
  → Data: { message: "...", channel: "..." }

Waarom Sub-Workflows Gebruiken?

Voordeel Uitleg Voorbeeld
Herbruikbaarheid Schrijf logica 1x, gebruik het overal Slack notificatie in 12 workflows
Overzicht Kleinere workflows zijn makkelijker te debuggen 5-10 nodes per workflow i.p.v. 50
Onderhoud Fix op 1 plek, werkt overal Slack API wijzigt → 1 aanpassing
Geheugen Grote workflows kunnen OOM errors geven Splits in sub-workflows voor minder geheugengebruik
Tellen niet mee Sub-workflow executies tellen niet voor je plan limiet Alleen parent workflow telt als executie

Stap voor Stap: Sub-Workflow Instellen

Stap 1: Het Sub-Workflow Aanmaken

// Sub-Workflow: "Data Validatie"

// Node 1: Execute Sub-workflow Trigger
// Dit is het startpunt. Configureer de input:
Input Data Mode: "Define Using Fields Below"
  Fields:
    - email (String, required)
    - name (String, required)
    - phone (String, optional)

// Node 2: Code Node (validatie logica)
const email = $json.email;
const name = $json.name;
const errors = [];

if (!email || !email.includes('@')) {
  errors.push('Ongeldig e-mailadres');
}
if (!name || name.length < 2) {
  errors.push('Naam is verplicht (min 2 karakters)');
}
if ($json.phone && !/^\+?[0-9]{10,}$/.test($json.phone)) {
  errors.push('Ongeldig telefoonnummer');
}

return {
  valid: errors.length === 0,
  errors: errors,
  sanitized: {
    email: email?.toLowerCase().trim(),
    name: name?.trim(),
    phone: $json.phone?.replace(/\s/g, '')
  }
};

// Node 3: Edit Fields (output structureren)
// Return alleen de velden die de parent nodig heeft

Stap 2: Het Parent Workflow Configureren

// Parent Workflow: "Nieuwe Klant Registratie"

Webhook Trigger (POST /register)
  ↓
Execute Sub-workflow Node
  Workflow: "Data Validatie" (selecteer op naam of ID)
  Mode: "Run Once With All Items"
  Wait for Completion: Yes
  Data to Send: {
    email: {{ $json.body.email }},
    name: {{ $json.body.name }},
    phone: {{ $json.body.phone }}
  }
  ↓
IF Node ({{ $json.valid }} === true)
  ├── Ja → Database Insert → Welkomstmail → Respond 200
  └── Nee → Respond 400 ({{ $json.errors }})

Input Data Modes

De Execute Sub-workflow Trigger node biedt drie manieren om input data te definiëren:

Define Using Fields

Definieer individuele velden met naam en type. Meest expliciet en type-safe.

Aanbevolen voor productie

Define Using JSON Example

Geef een voorbeeld JSON object. n8n leidt de structuur af.

Handig voor prototyping

Accept All Data

Accepteert alles wat binnenkomt. Geen validatie. Het sub-workflow moet zelf omgaan met ontbrekende data.

Alleen voor flexibele utilities

Execution Modes

Run Once With All Items

Alle input items worden in één keer naar het sub-workflow gestuurd. Het sub-workflow ontvangt een array van items.

Gebruik wanneer: Het sub-workflow alle items tegelijk nodig heeft (bijv. rapportage, aggregatie).

Run Once For Each Item

Het sub-workflow wordt apart uitgevoerd voor elk input item. Elke executie ziet precies 1 item.

Gebruik wanneer: Elk item onafhankelijk verwerkt moet worden (bijv. per klant, per order).

Wachten op Voltooiing

De optie "Wait for Sub-Workflow Completion" bepaalt of het parent workflow wacht tot het sub-workflow klaar is:

Optie Gedrag Wanneer gebruiken
Wait = Yes Parent wacht op output van sub-workflow Als je de output nodig hebt in volgende nodes
Wait = No Parent gaat direct door (fire-and-forget) Logging, notificaties, async taken

Access Control: Wie Mag het Aanroepen?

Standaard kan elk workflow een sub-workflow aanroepen. In productie wil je dit beperken:

// Sub-workflow access control instellen:

// 1. Open het sub-workflow
// 2. Klik op het tandwiel-icoon (workflow settings)
// 3. Bij "This workflow can be called by":
//    - "None" → Kan niet als sub-workflow gebruikt worden
//    - "Any workflow" → Iedereen kan het aanroepen
//    - "Specific workflows" → Alleen geselecteerde workflows

// Aanbeveling: gebruik "Specific workflows" in productie.
// Dit voorkomt onbedoeld gebruik en maakt
// afhankelijkheden expliciet.

5 Patronen voor Sub-Workflows

Patroon 1: Notificatie Service

// Sub-Workflow: "Unified Notification"
// Input: { channel, message, urgency }

Execute Workflow Trigger
  ↓
Switch Node (op channel)
  ├── "slack" → Slack Node
  ├── "email" → Email Node (SMTP)
  ├── "teams" → Microsoft Teams Node
  └── "all" → Parallel: Slack + Email + Teams
  ↓
Edit Fields (return: { sent: true, channel, timestamp })

// Gebruik vanuit elk workflow:
Execute Sub-workflow: "Unified Notification"
  Data: { channel: "slack", message: "Nieuwe order!", urgency: "high" }

Patroon 2: Data Enrichment

// Sub-Workflow: "Enrich Company Data"
// Input: { domain }

Execute Workflow Trigger
  ↓
HTTP Request → Clearbit/Apollo API
  GET https://company-api.com/lookup?domain={{ $json.domain }}
  ↓
Code Node (structureer data)
  return {
    company: response.name,
    industry: response.industry,
    employees: response.employees,
    country: response.country,
    enriched: true
  };

// Gebruik in Lead Generatie workflow:
Execute Sub-workflow: "Enrich Company Data"
  Data: { domain: {{ $json.email.split('@')[1] }} }

Patroon 3: Error Handler

// Sub-Workflow: "Central Error Handler"
// Input: { workflow, node, error, data }

Execute Workflow Trigger
  ↓
Code Node (classificeer error)
  const isRetryable = [408, 429, 500, 502, 503].includes(
    $json.error.statusCode
  );
  ↓
IF Node (retryable?)
  ├── Ja → Google Sheets Append (retry queue)
  └── Nee → Google Sheets Append (dead letter queue)
  ↓
Slack Node (alert in #errors channel)

// Gebruik als Error Workflow voor al je productie-workflows

Patroon 4: Rate-Limited API Wrapper

// Sub-Workflow: "Rate-Limited API Call"
// Respecteert rate limits automatisch

Execute Workflow Trigger
  Input: { url, method, body, rateLimit }
  ↓
Code Node (check rate limit)
  const staticData = $getWorkflowStaticData('global');
  const now = Date.now();
  const lastCall = staticData.lastApiCall || 0;
  const minInterval = $json.rateLimit || 1000;
  
  if (now - lastCall < minInterval) {
    const waitMs = minInterval - (now - lastCall);
    await new Promise(r => setTimeout(r, waitMs));
  }
  
  staticData.lastApiCall = Date.now();
  return $json;
  ↓
HTTP Request Node (dynamisch geconfigureerd)
  URL: {{ $json.url }}
  Method: {{ $json.method }}
  Body: {{ $json.body }}

Patroon 5: AI Processing Pipeline

// Sub-Workflow: "AI Text Processor"
// Input: { text, task, outputFormat }

Execute Workflow Trigger
  ↓
AI Chain → Anthropic Chat Model
  System: "Je bent een tekst-processor. Taak: {{ $json.task }}"
  User: "{{ $json.text }}"
  Output format: {{ $json.outputFormat }}
  ↓
Code Node (parse + validate output)
  ↓
Edit Fields (return structured result)

// Gebruik:
// - Samenvatten: { task: "summarize", outputFormat: "json" }
// - Classificeren: { task: "classify", outputFormat: "json" }
// - Vertalen: { task: "translate to EN", outputFormat: "text" }

Refactoring: Bestaand Workflow Opsplitsen

n8n heeft een ingebouwde sub-workflow conversion tool die het opsplitsen vergemakkelijkt:

  1. 1. Selecteer de nodes die je wilt extraheren (klik + sleep, of Ctrl/Cmd + klik)
  2. 2. Rechtermuisklik → "Convert to Sub-Workflow"
  3. 3. n8n maakt automatisch een nieuw workflow met een Execute Workflow Trigger
  4. 4. Expressions die verwijzen naar andere nodes worden automatisch als parameters meegegeven

Beperkingen bij conversie

  • De selectie moet aaneengesloten zijn (connected nodes)
  • De selectie mag geen trigger nodes bevatten
  • Maximaal 1 start-node en 1 eind-node die verbinding hebben met nodes buiten de selectie
  • AI sub-nodes moeten allemaal geselecteerd worden

Best Practices

1

Houd sub-workflows klein en gefocust

5-10 nodes per sub-workflow. Eén duidelijke taak per module. "Slack notificatie sturen" — niet "Notificatie sturen en loggen en analytics bijwerken".

2

Gebruik typed input fields in productie

"Accept All Data" is handig voor prototyping maar gevaarlijk in productie. Definieer altijd welke velden je verwacht.

3

Naamgeving: prefix met "Sub:"

Gebruik een consistente naamconventie: "Sub: Slack Alert", "Sub: Data Validatie". Zo zie je direct welke workflows sub-workflows zijn.

4

Test met echte data

Pin voorbeeld-data in de Trigger node van je sub-workflow. Zo kun je het los testen zonder de parent workflow te draaien.

5

Documenteer je sub-workflows

Voeg een Sticky Note toe aan elk sub-workflow met: doel, verwachte input, output format, en welke workflows het aanroepen.

Conclusie

Sub-workflows zijn de sleutel tot schaalbare n8n automatisering. Begin met het identificeren van logica die je in meerdere workflows herhaalt — notificaties, data validatie, error handling — en extraheer die naar herbruikbare sub-workflows. Je toekomstige zelf zal je dankbaar zijn.

Start met Modulair Bouwen

  1. 1. Identificeer herhaalde logica in je bestaande workflows
  2. 2. Extraheer naar sub-workflows met duidelijke input/output
  3. 3. Gebruik de "Convert to Sub-Workflow" functie voor snelle refactoring
  4. 4. Stel access control in voor productie-workflows

Gerelateerde Artikelen

#n8n #sub-workflows #execute workflow #modulair #herbruikbaar #refactoring #best practices #architectuur