De Set/Edit Fields node (voorheen bekend als de Set node) is een van de meest fundamentele en krachtige nodes in N8N. Deze node vormt het hart van data transformatie in je workflows en stelt je in staat om data precies te manipuleren zoals je applicaties dat vereisen. Of je nu velden moet hernoemen voor API-compatibiliteit, waarden moet berekenen, of data moet filteren - de Set/Edit Fields node is je go-to gereedschap.
In deze uitgebreide gids duiken we diep in alle mogelijkheden van deze essentiële node, van basis mapping tot geavanceerde JavaScript expressions, met praktische voorbeelden die je direct kunt toepassen in je eigen workflows.
Wat is de Set/Edit Fields Node?
De Set/Edit Fields node is een data transformatie node die je volledige controle geeft over de data die door je workflow stroomt. Deze node functioneert als een centrale hub waar je:
- Nieuwe velden creëert met statische of dynamische waarden
- Bestaande velden wijzigt of overschrijft
- Velden hernoemt om aan API-vereisten te voldoen
- Data filtert door alleen specifieke velden door te geven
- Waarden berekent met JavaScript expressions
- Data structuren transformeert van plat naar genest of vice versa
Basis Configuratie en Modi
De Set/Edit Fields node biedt twee hoofdmodi voor het bewerken van data:
1. Manual Mapping Mode
In de Manual Mapping mode gebruik je de grafische interface om velden te configureren. Dit is de meest gebruiksvriendelijke methode:
Voordelen Manual Mapping:
- Visuele drag-and-drop interface
- Direct preview van data transformaties
- Automatische type detectie
- Ingebouwde validatie
- Eenvoudig voor beginners
2. JSON Output Mode
In de JSON Output mode schrijf je direct JSON die N8N aan de input data toevoegt:
{
"fullName": "{{ $json.firstName + ' ' + $json.lastName }}",
"age": "{{ new Date().getFullYear() - $json.birthYear }}",
"isActive": true,
"metadata": {
"processed": "{{ new Date().toISOString() }}",
"version": "2.0"
}
}
Core Operaties in Detail
1. Nieuwe Velden Creëren
Het toevoegen van nieuwe velden is een van de meest gebruikte operaties. Je kunt zowel statische als dynamische waarden gebruiken:
| Type | Voorbeeld | Use Case |
|---|---|---|
| Static String | "Nederland" |
Vaste waarden toevoegen |
| Static Number | 42 |
Default waarden instellen |
| Expression | {{ $json.price * 1.21 }} |
BTW berekenen |
| Date/Time | {{ $now.toISO() }} |
Timestamps toevoegen |
| Conditional | {{ $json.age >= 18 ? 'Adult' : 'Minor' }} |
Categoriseren |
2. Velden Hernoemen
Het hernoemen van velden is cruciaal voor API-integratie. Verschillende systemen gebruiken verschillende naamconventies:
// Van CamelCase naar snake_case
firstName → first_name
lastName → last_name
phoneNumber → phone_number
// Van Nederlands naar Engels
voornaam → firstName
achternaam → lastName
geboortedatum → dateOfBirth
3. Data Filteren
Met de optie "Include Other Input Fields" kun je bepalen welke velden worden doorgegeven:
Filter Strategie:
- Enabled (default): Alle input velden worden doorgegeven
- Disabled: Alleen gedefinieerde velden worden doorgegeven
- Gebruik: Perfect voor het verwijderen van gevoelige data
Geavanceerde Expression Patterns
De kracht van de Set/Edit Fields node ligt in het gebruik van JavaScript expressions. Hier zijn de meest gebruikte patterns:
String Manipulatie
// Hoofdlettergebruik
{{ $json.name.toUpperCase() }} // ALLES IN HOOFDLETTERS
{{ $json.name.toLowerCase() }} // alles in kleine letters
{{ $json.name.charAt(0).toUpperCase() + $json.name.slice(1) }} // Eerste Letter Hoofdletter
// Trimmen en opschonen
{{ $json.email.trim().toLowerCase() }} // Spaties verwijderen en lowercase
{{ $json.phone.replace(/[^0-9]/g, '') }} // Alleen cijfers behouden
// Combineren
{{ `${$json.street} ${$json.number}, ${$json.city}` }} // Adres samenstellen
{{ [$json.firstName, $json.lastName].join(' ') }} // Array naar string
Numerieke Berekeningen
// Basis berekeningen
{{ $json.price * 1.21 }} // BTW toevoegen (21%)
{{ ($json.price * $json.quantity).toFixed(2) }} // Totaal met 2 decimalen
{{ Math.round($json.amount / 100) }} // Centen naar euro's
// Percentages
{{ (($json.current / $json.total) * 100).toFixed(1) + '%' }} // Percentage berekenen
{{ $json.discount ? $json.price * (1 - $json.discount/100) : $json.price }} // Korting toepassen
Datum en Tijd
// Huidige datum/tijd
{{ $now.toISO() }} // ISO format: 2025-01-03T10:30:00.000Z
{{ $now.format('dd-MM-yyyy') }} // Nederlandse datum: 03-01-2025
{{ $now.plus({days: 7}).toISO() }} // Week later
// Datum manipulatie
{{ DateTime.fromISO($json.date).plus({months: 1}).toISO() }} // Maand toevoegen
{{ DateTime.fromISO($json.date).toFormat('dd LLLL yyyy') }} // 03 januari 2025
// Leeftijd berekenen
{{ Math.floor(DateTime.now().diff(DateTime.fromISO($json.birthDate), 'years').years) }}
Array Operaties
// Array methoden
{{ $json.tags.join(', ') }} // Array naar string
{{ $json.items.map(item => item.name) }} // Specifiek veld extraheren
{{ $json.prices.reduce((a, b) => a + b, 0) }} // Som berekenen
{{ $json.emails.filter(e => e.includes('@')) }} // Filteren
// Array checks
{{ $json.categories.includes('premium') }} // Boolean check
{{ $json.items.length }} // Aantal items
{{ $json.values.sort((a, b) => a - b) }} // Sorteren
Praktische Use Cases
Use Case 1: E-commerce Order Processing
// E-commerce order transformatie
{
// Klantgegevens combineren
"customerName": "{{ $json.billing_first_name + ' ' + $json.billing_last_name }}",
// Order items transformeren
"orderItems": "{{ $json.line_items.map(item => ({
sku: item.sku,
name: item.name,
quantity: item.quantity,
price: parseFloat(item.price),
total: parseFloat(item.total)
})) }}",
// Financiële berekeningen
"totalAmount": "{{ parseFloat($json.total) }}",
"taxAmount": "{{ parseFloat($json.total_tax) }}",
"netAmount": "{{ parseFloat($json.total) - parseFloat($json.total_tax) }}",
// Datum formatting
"orderDate": "{{ DateTime.fromISO($json.date_created).toFormat('yyyy-MM-dd') }}",
"processedAt": "{{ $now.toISO() }}",
// Metadata toevoegen
"source": "WooCommerce",
"currency": "{{ $json.currency || 'EUR' }}",
"status": "pending_processing"
}
Use Case 2: CRM Contact Synchronisatie
// Contact data transformatie voor CRM
{
// Namen standaardiseren
"firstName": "{{ $json.voornaam.trim().charAt(0).toUpperCase() + $json.voornaam.slice(1).toLowerCase() }}",
"lastName": "{{ $json.achternaam.trim().toUpperCase() }}",
// Email validatie en opschoning
"email": "{{ $json.email.trim().toLowerCase() }}",
"emailValid": "{{ $json.email.includes('@') && $json.email.includes('.') }}",
// Telefoon formatting
"phone": "{{ $json.telefoon.replace(/[^0-9+]/g, '') }}",
"phoneFormatted": "{{ $json.telefoon.replace(/^06/, '+316') }}",
// Adres samenstellen
"fullAddress": "{{ [$json.straat, $json.huisnummer, $json.postcode, $json.plaats].filter(Boolean).join(', ') }}",
// Lead scoring
"leadScore": "{{
($json.email ? 20 : 0) +
($json.telefoon ? 20 : 0) +
($json.bedrijf ? 30 : 0) +
($json.budget > 10000 ? 30 : 10)
}}",
// Tags genereren
"tags": "{{ [
$json.bron,
$json.land || 'NL',
$json.interesse,
$json.budget > 50000 ? 'enterprise' : 'standard'
].filter(Boolean) }}"
}
Use Case 3: API Response Normalisatie
// Verschillende API responses normaliseren
{
// Consistente ID formatting
"id": "{{ $json.id || $json._id || $json.ID || $json.uuid }}",
// Status normalisatie
"status": "{{
($json.status || $json.state || $json.condition || 'unknown')
.toLowerCase()
.replace('_', '-')
}}",
// Timestamp standaardisatie
"createdAt": "{{
$json.created_at ||
$json.createdAt ||
$json.created ||
$json.timestamp ||
$now.toISO()
}}",
// Error handling
"hasError": "{{ !!($json.error || $json.errors || $json.errorMessage) }}",
"errorMessage": "{{ $json.error?.message || $json.errors?.[0] || $json.errorMessage || null }}",
// Data extractie met fallbacks
"data": "{{
$json.data ||
$json.result ||
$json.payload ||
$json.body ||
$json
}}"
}
Best Practices en Optimalisatie
Performance Tips
Optimalisatie Strategieën:
- Minimaliseer complexe expressions: Splits complexe berekeningen op in meerdere velden
- Gebruik caching: Hergebruik berekende waarden in latere expressions
- Filter vroeg: Verwijder onnodige data zo vroeg mogelijk in de workflow
- Batch processing: Gebruik de Split In Batches node voor grote datasets
- Vermijd nested loops: Gebruik array methoden zoals map() efficiënt
Error Handling
// Veilige data access met fallbacks
{
// Null/undefined checking
"name": "{{ $json.name || 'Unknown' }}",
// Nested property safe access
"city": "{{ $json.address?.city || 'Not specified' }}",
// Type conversie met validatie
"age": "{{
isNaN(parseInt($json.age)) ? null : parseInt($json.age)
}}",
// Try-catch voor complexe operaties
"parsed": "{{
(() => {
try {
return JSON.parse($json.data);
} catch(e) {
return null;
}
})()
}}"
}
Dot Notation Configuratie
De Set/Edit Fields node ondersteunt standaard dot notation voor het creëren van geneste structuren:
| Dot Notation Enabled | Dot Notation Disabled |
|---|---|
user.name = "Jan"Resultaat: { user: { name: "Jan" } }
|
user.name = "Jan"Resultaat: { "user.name": "Jan" }
|
Integratie met Andere Nodes
De Set/Edit Fields node werkt naadloos samen met andere N8N nodes:
Voor Merge Operations
Gebruik Set/Edit Fields om keys te normaliseren voordat je data merged met de Merge node:
// Keys aligneren voor merge
{
"customerId": "{{ $json.customer_id || $json.klant_id }}",
"orderId": "{{ $json.order_number || $json.bestelling_nr }}"
}
Na HTTP Request
Transform API responses van de HTTP Request node:
// API response opschonen
{
"success": "{{ $json.status === 200 }}",
"data": "{{ $json.body.data }}",
"timestamp": "{{ $now.toISO() }}"
}
Voor Database Operations
Prepare data voor database inserts:
// Database-ready format
{
"created_at": "{{ $now.toSQL() }}",
"updated_at": "{{ $now.toSQL() }}",
"is_active": "{{ $json.status === 'active' ? 1 : 0 }}",
"json_data": "{{ JSON.stringify($json.metadata) }}"
}
Troubleshooting Guide
Veelvoorkomende Problemen
| Probleem | Oorzaak | Oplossing |
|---|---|---|
| Expression geeft undefined | Veld bestaat niet | Gebruik fallbacks: $json.field || 'default' |
| Type mismatch errors | Verkeerde data types | Expliciet converteren: String(), Number() |
| Nested structure werkt niet | Dot notation disabled | Enable "Support Dot Notation" optie |
| Data wordt overschreven | Include fields disabled | Enable "Include Other Input Fields" |
| Performance issues | Complexe expressions | Gebruik Code node voor complexe logic |
Debug Tips
Debug Strategieën:
- Gebruik {{ console.log($json) }} in expressions voor debugging
- Test expressions eerst met één item voordat je de hele dataset verwerkt
- Gebruik de Preview functie om transformaties te valideren
- Split complexe transformaties op in meerdere Set/Edit Fields nodes
- Document je expressions met comments:
/* BTW berekening */ $json.price * 1.21
Geavanceerde Patterns
Dynamic Field Generation
// Dynamisch velden genereren op basis van conditions
{
...($json.type === 'business' && {
"kvkNumber": $json.kvk,
"vatNumber": $json.btw,
"companyName": $json.bedrijfsnaam
}),
...($json.type === 'personal' && {
"firstName": $json.voornaam,
"lastName": $json.achternaam,
"birthDate": $json.geboortedatum
}),
// Gemeenschappelijke velden
"email": $json.email,
"phone": $json.telefoon
}
Data Validation Patterns
// Uitgebreide validatie met feedback
{
"validationResults": {
"email": {
"valid": "{{ /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test($json.email) }}",
"message": "{{ /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test($json.email) ? 'Valid' : 'Invalid email format' }}"
},
"phone": {
"valid": "{{ /^[0-9+\-\s()]+$/.test($json.phone) && $json.phone.replace(/\D/g, '').length >= 10 }}",
"message": "{{ $json.phone.replace(/\D/g, '').length < 10 ? 'Too short' : 'Valid' }}"
},
"postalCode": {
"valid": "{{ /^[1-9][0-9]{3}\s?[A-Z]{2}$/i.test($json.postalCode) }}",
"message": "{{ /^[1-9][0-9]{3}\s?[A-Z]{2}$/i.test($json.postalCode) ? 'Valid' : 'Invalid Dutch postal code' }}"
}
},
"isValid": "{{
/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test($json.email) &&
/^[0-9+\-\s()]+$/.test($json.phone) &&
/^[1-9][0-9]{3}\s?[A-Z]{2}$/i.test($json.postalCode)
}}"
}
Batch Metadata Enrichment
// Metadata toevoegen voor tracking
{
// Bestaande data behouden
...($json),
// Processing metadata
"_metadata": {
"processedAt": "{{ $now.toISO() }}",
"workflowId": "{{ $workflow.id }}",
"executionId": "{{ $execution.id }}",
"nodeId": "{{ $node.id }}",
"itemIndex": "{{ $itemIndex }}",
"environment": "{{ $env.NODE_ENV || 'production' }}",
"version": "1.0.0"
},
// Data quality indicators
"_quality": {
"completeness": "{{
Object.keys($json).filter(k => $json[k] !== null && $json[k] !== '').length /
Object.keys($json).length
}}",
"hasRequiredFields": "{{
['email', 'name', 'phone'].every(field => $json[field])
}}"
}
}
Conclusie en Next Steps
De Set/Edit Fields node is het Zwitserse zakmes van data transformatie in N8N. Van simpele veld hernoeming tot complexe data manipulatie met JavaScript expressions - deze node biedt alle tools die je nodig hebt voor professionele data transformatie.
Key Takeaways
- Gebruik Manual Mapping voor eenvoudige transformaties en visuele feedback
- Switch naar JSON Output mode voor complexe, dynamische transformaties
- Leverage JavaScript expressions voor krachtige data manipulatie
- Filter data vroeg in je workflow voor optimale performance
- Combineer met andere nodes zoals Code node voor ultra-complexe logic
- Test expressions met preview voordat je grote datasets verwerkt
- Document complexe transformaties voor toekomstig onderhoud
Veelgestelde Vragen
Wanneer gebruik ik Set/Edit Fields vs Code node?
Gebruik Set/Edit Fields voor standaard transformaties en mapping. Switch naar de Code node wanneer je loops, complexe conditionals, of externe libraries nodig hebt.
Kan ik binary data manipuleren met Set/Edit Fields?
Set/Edit Fields werkt primair met JSON data. Voor binary data manipulatie gebruik je beter de Code node of specifieke binary processing nodes.
Hoe handel ik null/undefined values af?
Gebruik altijd fallbacks in je expressions: {{ $json.field || 'default' }} of de optional chaining operator: {{ $json.nested?.field }}
Is er een limiet aan het aantal velden dat ik kan toevoegen?
Er is geen harde limiet, maar voor performance redenen is het beter om niet meer dan 50-100 velden per node te manipuleren. Split complexe transformaties over meerdere nodes.
Deze gids wordt regelmatig bijgewerkt met nieuwe features en best practices. Bookmark deze pagina en check regelmatig voor updates over de Set/Edit Fields node in N8N.