n8n ile Koşullu İş Akışı: IF ve Switch Node Kullanımı

Otomasyon işlerinde en çok takıldığım nokta her zaman karar verme mantığıydı. Bir webhook geliyor, bir API çağrısı yapıyorsun, veri işliyorsun… ama ya gelen veri beklediğin gibi değilse? Ya farklı kaynaklardan farklı formatlarda veri geliyorsa? İşte burada n8n’in IF ve Switch node’ları devreye giriyor ve bir iş akışını gerçekten “akıllı” yapıyor.

Bu yazıda n8n’deki koşullu mantığı derinlemesine inceleyeceğiz. Sadece “şu kutuya tıkla, bu değeri gir” tarzı yüzeysel bir anlatım değil, gerçek dünyada karşılaştığım senaryolar üzerinden gideceğiz.

IF Node: Temel Karar Mekanizması

IF node’u, programlamadaki klasik if-else yapısının görsel karşılığı. İki çıkış var: true ve false. Koşul sağlanıyorsa true koluna, sağlanmıyorsa false koluna gidiyor.

Ama bu kadar basit gibi görünse de IF node’un içinde birkaç kritik detay var.

Koşul Tipleri

n8n’deki IF node’unda kullanabileceğiniz operatörler şunlar:

  • Equal: Tam eşitlik kontrolü, string ve number için farklı davranıyor
  • Not Equal: Eşit olmama durumu
  • Larger Than / Smaller Than: Sayısal karşılaştırmalar
  • Contains: String içinde arama
  • Starts With / Ends With: String başlangıç ve bitiş kontrolü
  • Regex: Güçlü pattern matching için
  • Is Empty / Is Not Empty: Null, undefined ve boş string kontrolü

Şimdi pratik bir örneğe geçelim. Diyelim ki bir müşteri destek sistemi kuruyorsun. Zendesk’ten gelen ticketları önceliklendirmek istiyorsun.

// IF node içinde expression kullanımı
// Sol taraf (Value 1): Gelen ticket'ın öncelik değeri
{{ $json["priority"] }}

// Sağ taraf (Value 2): Karşılaştırma değeri
urgent

// Operatör: Equal
// Bu koşul sağlanırsa -> true koluna (acil işlem kuyruğuna)
// Sağlanmazsa -> false koluna (normal kuyruk)

Basit görünüyor ama gerçek senaryolarda çok daha karmaşık koşullar kuruyorsun.

Çoklu Koşullar: AND ve OR Mantığı

IF node’un güzel yanı, tek bir node içinde birden fazla koşul tanımlayabiliyor olman. Ve bu koşulları AND veya OR ile birleştirebiliyorsun.

Şöyle bir senaryo düşün: E-ticaret sitenizde sipariş işliyorsunuz. Hem sipariş tutarı 500 TL üzerinde olmalı, hem de müşteri premium üye olmalı ki özel indirim uygulanabilsin.

// Koşul 1 (AND ile bağlı)
// Value 1: {{ $json["order_total"] }}
// Operatör: Larger Than
// Value 2: 500

// Koşul 2
// Value 1: {{ $json["customer_type"] }}
// Operatör: Equal
// Value 2: premium

// İkisi de sağlanmalı -> true koluna git

OR mantığında ise şöyle düşünebilirsin: Müşteri ya premium üyeyse, ya da sipariş 1000 TL üzerindeyse özel kargo hakkı kazanıyor.

// Koşul 1 (OR ile bağlı)
// Value 1: {{ $json["customer_type"] }}
// Operatör: Equal  
// Value 2: premium

// Koşul 2
// Value 1: {{ $json["order_total"] }}
// Operatör: Larger Than
// Value 2: 1000

// Herhangi biri sağlanırsa -> true koluna git

Switch Node: Çoklu Karar Yolları

Switch node, IF’in daha güçlü kardeşi. Tek bir değeri birden fazla durumla karşılaştırıp farklı çıkış yollarına yönlendiriyor. Programlamada switch-case yapısını biliyorsanız, mantık tamamen aynı.

Switch Node’un Temel Yapısı

Switch node’da üç farklı mod var:

  • Rules: Elle tanımladığın kurallar
  • Expression: JavaScript expression ile dinamik routing
  • Fixed Result: Her zaman aynı çıkışa git (test için kullanışlı)

Rules modu en yaygın kullanılan. Her kural için bir çıkış yolu tanımlıyorsun.

Gerçek bir senaryo: Bir monitoring sistemi kuruyorsun. Farklı servislerden gelen alert’ları tiplerine göre farklı kanallardan bildirmek istiyorsun.

// Switch node konfigürasyonu
// Mode: Rules
// Routing Field: {{ $json["alert_type"] }}

// Kural 1 - Output 0
// Değer: "critical"
// -> PagerDuty'ye gönder, SMS at

// Kural 2 - Output 1  
// Değer: "warning"
// -> Slack #ops-alerts kanalına gönder

// Kural 3 - Output 2
// Değer: "info"
// -> Sadece log'a yaz

// Default output (hiçbiri eşleşmezse) -> Output 3

Bu yapıyla tek bir Switch node ile 4 farklı yola yönlendirebiliyorsun. IF node ile aynı işi yapmak için 3 ayrı IF node zincirlemeniz gerekirdi.

Expression Modu ile Dinamik Routing

Expression modu çok daha güçlü. JavaScript yazarak dinamik karar verebiliyorsun.

// Switch node, Expression modu
// Gelen veriyi değerlendiren expression:
{{ 
  (() => {
    const score = $json["risk_score"];
    if (score >= 80) return "high_risk";
    if (score >= 50) return "medium_risk";
    if (score >= 20) return "low_risk";
    return "safe";
  })()
}}

Bu expression’ı bir fraud detection sistemi için kullandım. Her transaction’a bir risk skoru hesaplanıyor, Switch node bu skora göre işlemin hangi inceleme kuyruğuna gideceğini belirliyor.

Gerçek Dünya Senaryosu 1: GitHub Webhook İşleme

GitHub’dan gelen webhook’ları işleyen bir pipeline kuralım. Farklı event tipleri (push, pull_request, issue) için farklı aksiyonlar almak istiyoruz.

// Webhook node'dan gelen veri örneği
{
  "headers": {
    "x-github-event": "pull_request"
  },
  "body": {
    "action": "opened",
    "pull_request": {
      "title": "Fix: Login page crash",
      "user": {
        "login": "ahmet-dev"
      },
      "additions": 145,
      "deletions": 23
    }
  }
}

Switch node konfigürasyonu:

// Routing field: {{ $json["headers"]["x-github-event"] }}

// Output 0: "push" eventi
// -> CI/CD pipeline tetikle
// -> Slack'e deployment bildirimi gönder

// Output 1: "pull_request" eventi
// -> PR boyutunu kontrol et (IF node ile)
// -> İlgili ekip üyelerini mention et

// Output 2: "issues" eventi
// -> JIRA'da ticket oluştur
// -> Support kanalına bildir

PR eventi yakalandıktan sonra, o kolda da bir IF node var:

// IF node: PR boyutu kontrolü
// Koşul 1: {{ $json["body"]["pull_request"]["additions"] }}
// Operatör: Larger Than
// Değer: 300

// Koşul 2 (AND): {{ $json["body"]["pull_request"]["deletions"] }}
// Operatör: Larger Than
// Değer: 100

// True -> "Bu PR çok büyük, parçalara bölün" uyarısı gönder
// False -> Normal review süreci başlat

Gerçek Dünya Senaryosu 2: Çok Katmanlı Müşteri Bildirimleri

Bir SaaS ürününüz var diyelim. Kullanıcı aktiviteleri farklı işlemler gerektiriyor. Bu senaryo IF ve Switch node’ları iç içe kullanmayı gösteriyor.

// İlk katman: Switch node
// Gelen event tipi: {{ $json["event_type"] }}

// "trial_started" -> Onboarding sequence başlat
// "subscription_upgraded" -> Upsell confirmation + invoice
// "payment_failed" -> Dunning management flow
// "subscription_cancelled" -> Churn prevention flow

Payment failed kolunda şöyle bir IF zinciri var:

// IF Node 1: Kaçıncı başarısız ödeme?
// Value 1: {{ $json["failed_attempts"] }}
// Operatör: Equal
// Value 2: 1

// True (ilk başarısız): 
// -> Nazik reminder email
// -> 3 gün sonra tekrar dene

// False (birden fazla):
// IF Node 2: Kaç gündür başarısız?
// Value 1: {{ $json["days_since_first_failure"] }}
// Operatör: Larger Than  
// Value 2: 14

// True (14 günden uzun):
// -> Hesabı dondur
// -> Son uyarı emaili gönder
// -> CS ekibine bildir

// False (14 günden kısa):
// -> Orta şiddetli uyarı
// -> Ödeme metodunu güncelle linki gönder

Switch Node’da Fallthrough Davranışı

n8n’de Switch node’un önemli bir özelliği: fallthrough seçeneği. Normalde bir koşul eşleştiğinde o çıkışa gider ve durur. Ama fallthrough aktifse, eşleşen koşuldan sonra da diğer koşulları değerlendirmeye devam ediyor.

Bu nerede işe yarar? Çakışan etiketleme senaryolarında. Örneğin bir içerik moderasyon sistemi:

// Fallthrough AÇIK Switch node
// Input: Forum mesajı metni

// Kural 1: Spam kelime içeriyor mu?
// {{ $json["message"].toLowerCase().includes("kazanın") }}
// True -> "spam" etiketi ekle, Output 0'a gönder

// Kural 2: Küfür içeriyor mu?
// {{ $json["contains_profanity"] }}
// True -> "küfür" etiketi ekle, Output 1'e gönder  

// Kural 3: Reklam linki içeriyor mu?
// {{ $json["has_external_links"] }}
// True -> "reklam" etiketi ekle, Output 2'ye gönder

// Fallthrough açık olunca, hem spam hem küfür içeren mesaj
// hem Output 0'a hem Output 1'e gidecek

Expression’larda JavaScript Kullanımı

IF ve Switch node’larda expression yazarken n8n’nin tüm JavaScript yeteneklerini kullanabiliyorsunuz. Bunu göz ardı eden çok insan görüyorum, gereksiz karmaşıklığa giriyor.

// Tarih bazlı koşul: Sadece iş saatlerinde işlem yap
{{ 
  (() => {
    const now = new Date();
    const hour = now.getHours();
    const day = now.getDay(); // 0: Pazar, 6: Cumartesi
    
    const isWeekday = day >= 1 && day <= 5;
    const isWorkHours = hour >= 9 && hour < 18;
    
    return isWeekday && isWorkHours;
  })()
}}
// true -> İş saati, direkt işlem yap
// false -> Kuyruga al, pazartesi işle

Dizi işlemleri için:

// Gelen siparişteki ürün kategorileri kontrolü
{{
  (() => {
    const items = $json["order_items"];
    const hasElectronics = items.some(item => 
      item.category === "electronics"
    );
    const hasHeavyItems = items.some(item => 
      item.weight_kg > 20
    );
    
    if (hasElectronics && hasHeavyItems) return "special_handling";
    if (hasElectronics) return "electronics_shipping";
    if (hasHeavyItems) return "freight";
    return "standard";
  })()
}}

Hata Yönetimi ve Edge Case’ler

IF ve Switch node’larda en çok gördüğüm hata: null/undefined değerlerle başa çıkamamak. Bir field olmayabilir, null gelebilir, yanlış tipte gelebilir.

// Hatalı yaklaşım - field yoksa crash yapar
{{ $json["user"]["subscription"]["plan"] }}

// Doğru yaklaşım - güvenli erişim
{{ $json?.["user"]?.["subscription"]?.["plan"] ?? "free" }}

Tip kontrolü de önemli:

// String olarak gelebilecek sayısal değer
{{
  (() => {
    const value = $json["order_count"];
    const count = typeof value === "string" ? parseInt(value) : value;
    return !isNaN(count) && count > 0;
  })()
}}
// Boolean kontrolü - "true" string'i ile true boolean farkı
{{
  (() => {
    const val = $json["is_active"];
    // Hem string "true" hem boolean true'yu yakala
    return val === true || val === "true" || val === 1 || val === "1";
  })()
}}

Performans ve Bakım Notları

Birkaç ay boyunca production’da n8n kullandıktan sonra öğrendiğim şeyler:

IF node zinciri yerine Switch kullan: Aynı field’ı 5 farklı değerle karşılaştırıyorsan 5 IF node zincirleme. Tek Switch node çok daha temiz ve bakımı kolay.

Expression karmaşıklığını sınırla: IF/Switch expression’larına çok iş yükleme. Hesaplamayı önceki bir Function veya Code node’da yap, IF’e sadece basit karşılaştırma bırak. Workflow’u debug ederken çok fark ediyor.

Node’ları isimlendirin: “IF” yerine “Müşteri Premium mi?” gibi isimler verin. Üç ay sonra workflow’a baktığınızda ne yaptığını anlıyorsunuz.

Test verileri hazırlayın: IF ve Switch node’ların her kolunu test etmek için farklı örnek veriler hazırlayın. n8n’in “Execute with previous node data” özelliği yetersiz kalıyor çoğu zaman, statik test verisi tanımlamak daha güvenli.

Özellikle switch node’da bir şeye dikkat edin: output sayısı arttıkça downstream’de birleştirme zorlaşıyor. Her çıkışın sonunda bir Merge node’a ihtiyaç duyabilirsiniz ve Merge node’un hangi modda çalıştığını iyi anlamanız gerekiyor.

Sonuç

n8n’deki IF ve Switch node’ları, görsel bir iş akışını gerçek anlamda programatik düşünmeye zorluyor. “Eğer şuysa, bunu yap; değilse bunu yap” cümlesini görsel olarak ifade etmek kulağa basit geliyor, ama production senaryolarında edge case’ler, null değerler, tip uyuşmazlıkları ve iç içe koşullar işi ciddi ölçüde karmaşıklaştırabiliyor.

Pratik önerilerim şunlar: Switch’i çok değerli karşılaştırmalar için kullanın, IF’i ikili boolean kararlar için saklayın. Expression’larınızda her zaman null safety uygulayın. Karmaşık hesaplamaları Code node’a taşıyın, koşullu node’larda sadece basit karşılaştırma yapın. Ve her workflow’un alternatif kollarını mutlaka test edin; “false” koluna hiç uğramayacağını düşündüğünüz branch, bir gün mutlaka tetiklenecek.

Bu yazıda anlattığım senaryoların büyük çoğunluğu kendi production workflow’larımdan geliyor. Monitoring sistemleri, ödeme işlemleri, müşteri bildirimleri… Hepsinde IF ve Switch node’lar bu işlerin bel kemiği. Doğru kullanıldığında gereksiz custom kod yazma ihtiyacını önemli ölçüde azaltıyor ve ekibin workflow mantığını takip etmesini kolaylaştırıyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir