Webhook ile Zapier ve Make Entegrasyonu Nasıl Yapılır

Otomasyon dünyasında webhook’lar, iki sistem arasındaki en hızlı ve en temiz iletişim yollarından biri. Zapier ve Make (eski adıyla Integromat) gibi no-code/low-code platformlar ise bu webhook’ları alıp onlarla bir şeyler yapmanı sağlıyor. Ama bu entegrasyonları düzgün kurmak, hata ayıklamak ve production’da güvenli çalıştırmak için biraz teknik bilgi şart. Bu yazıda sıfırdan başlayıp gerçek dünya senaryolarıyla webhook entegrasyonlarını nasıl kuracağını anlatacağım.

Webhook Nedir, Neden Kullanıyoruz?

Webhook, bir olay gerçekleştiğinde kaynak sistemin hedef sisteme HTTP POST isteği göndermesi prensibine dayanır. Polling’in (sürekli “yeni bir şey var mı?” diye sormak) aksine, webhook sadece bir şey olduğunda devreye girer. Bu hem kaynak kullanımı açısından verimli hem de anlık tepki süresi açısından çok daha iyi.

Klasik bir senaryo düşün: E-ticaret sitenizde bir sipariş oluştu. Bu sipariş bilgisinin hem CRM’e yazılması, hem muhasebe sistemine iletilmesi, hem de kargo firmasına bildirilmesi gerekiyor. Bunları manuel yapmak yerine, sipariş sistemi bir webhook ateşler ve Make ya da Zapier bu webhook’u yakalayıp tüm bu işlemleri otomatik halleder.

Zapier Webhook Kurulumu

Zapier’de Webhook Trigger Oluşturma

Zapier’de bir Zap oluştururken “Webhooks by Zapier” trigger’ını seçiyorsun. İki modu var:

  • Catch Hook: Gelen her POST isteğini yakalar, en çok kullanılan mod
  • Retrieve Poll: Belirli aralıklarla bir URL’yi sorgular (gerçek webhook değil)
  • Catch Raw Hook: Ham veriyi yakalar, base64 encoding olmadan

Zapier sana benzersiz bir URL verir. Örneğin:

https://hooks.zapier.com/hooks/catch/1234567/abcdefg/

Bu URL’ye test verisi gönderelim:

curl -X POST https://hooks.zapier.com/hooks/catch/1234567/abcdefg/ 
  -H "Content-Type: application/json" 
  -d '{
    "event": "order_created",
    "order_id": "ORD-2024-001",
    "customer": {
      "name": "Ahmet Yılmaz",
      "email": "[email protected]"
    },
    "amount": 299.90,
    "currency": "TRY"
  }'

Zapier bu veriyi aldıktan sonra “Test Trigger” diyerek alanları tanımlarsın ve sonraki adımlarda order_id, customer.name gibi dynamic field’lara erişebilirsin.

Zapier’de Webhook Action Kullanımı

Bazen Zapier’in başka bir sisteme webhook göndermesi gerekir. Bu durumda “Webhooks by Zapier” action’ını kullanırsın:

  • POST: JSON body ile veri gönder
  • PUT: Var olan kaydı güncelle
  • GET: Veri çek (ama bu artık webhook değil, API call)
  • Custom Request: Header, method, body’yi tamamen kontrol et

Custom Request ile imzalı bir isteği nasıl göndereceğini görelim:

# Zapier'in göndereceği isteği simüle edelim
curl -X POST https://api.hedefuygulama.com/webhook 
  -H "Content-Type: application/json" 
  -H "X-API-Key: sk_live_abc123xyz" 
  -H "X-Timestamp: $(date +%s)" 
  -d '{
    "event_type": "user_signup",
    "user_id": "{{trigger_user_id}}",
    "email": "{{trigger_email}}"
  }'

Make (Integromat) Webhook Kurulumu

Make, Zapier’e göre çok daha güçlü bir veri manipülasyon motoru sunuyor. Özellikle kompleks senaryolarda Make’i tercih etmemin nedeni tam da bu.

Make’de Webhook Modülü Ekleme

Make’de senaryo oluştururken ilk modül olarak “Webhooks > Custom webhook” eklersin. “Add” deyip yeni bir webhook tanımlarsın, Make sana şöyle bir URL verir:

https://hook.eu1.make.com/abc123defgh456ijklmn

Webhook’un yapısını belirlemek için “Determine data structure” özelliğini kullanırsın. Bunun için örnek veriyi gönderip Make’in şemayı otomatik çıkarmasını sağlarsın:

curl -X POST https://hook.eu1.make.com/abc123defgh456ijklmn 
  -H "Content-Type: application/json" 
  -d '{
    "timestamp": "2024-01-15T10:30:00Z",
    "source": "monitoring_system",
    "alert": {
      "level": "critical",
      "service": "api-gateway",
      "message": "Response time exceeded 2000ms",
      "value": 2345
    },
    "host": "prod-server-01"
  }'

Make bu veriyi analiz edip data structure’ı otomatik oluşturur. Sonraki modüllerde alert.level, alert.service gibi alanlara direkt erişebilirsin.

Make’de Webhook Response Ayarlama

Make’nin güçlü özelliklerinden biri, webhook’a hemen response dönebilmesi. “Webhook Response” modülünü ekleyerek kaynak sisteme anında yanıt verebilirsin:

# Kaynak sistemin aldığı response örneği
HTTP/1.1 200 OK
Content-Type: application/json

{
  "status": "received",
  "message": "Webhook processed successfully",
  "scenario_execution_id": "exec_xyz789"
}

Bu özellik özellikle Shopify, GitHub gibi sistemlerde önemli. Eğer belirli süre içinde 200 dönmezsen, platform webhook’u başarısız sayar ve retry mekanizmasını başlatır.

Güvenlik: Webhook İmzalamak

Production ortamında webhook URL’lerini herkese açık bırakmak büyük risk. Herhangi biri senin URL’ne fake veri gönderebilir. Bunu önlemek için iki yöntem var.

HMAC İmzalama

GitHub, Stripe ve benzeri platformlar HMAC-SHA256 imzalama kullanır. Gelen isteğin gerçekten beklediğin kaynaktan geldiğini doğrularsın.

Webhook imzasını doğrulayan basit bir Python script:

#!/usr/bin/env python3
# webhook_verify.py - Webhook imzası doğrulama testi

import hmac
import hashlib
import json

SECRET_KEY = "webhook_secret_key_buraya"
payload = '{"event": "test", "data": "hello"}'
signature_header = "sha256=abc123..."

# İmzayı hesapla
computed_sig = hmac.new(
    SECRET_KEY.encode('utf-8'),
    payload.encode('utf-8'),
    hashlib.sha256
).hexdigest()

expected_sig = f"sha256={computed_sig}"
print(f"Beklenen imza: {expected_sig}")

Make ve Zapier’de bu imzayı nasıl doğrularsın? Her ikisi de custom header’ları okuyabilir. Make’de “Filter” modülü ile gelen X-Hub-Signature-256 header’ını kontrol edebilirsin.

IP Whitelist ile Ekstra Güvenlik

Eğer webhook’u gönderen sistemin IP adresleri belirliyse (Zapier’in IP aralıkları gibi), Nginx seviyesinde filtreleme yapabilirsin:

# /etc/nginx/sites-available/webhook-proxy.conf
server {
    listen 443 ssl;
    server_name webhooks.sirketim.com;

    # Zapier IP aralıkları
    allow 34.102.136.0/24;
    allow 34.170.144.0/24;
    # Make IP aralıkları
    allow 88.99.82.0/24;
    deny all;

    location /webhook/ {
        proxy_pass http://localhost:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 30s;
        proxy_connect_timeout 10s;
    }
}

Gerçek Dünya Senaryosu 1: GitHub’dan Slack’e Deployment Bildirimi

Bir ekibin deployment sürecini otomatikleştirme senaryosu. GitHub Actions deployment tamamlandığında Make üzerinden Slack’e mesaj gönderilecek.

GitHub repository’de webhook tanımla:

# GitHub CLI ile webhook oluşturma
gh api repos/kullaniciadi/repo-adi/hooks 
  --method POST 
  -f name="web" 
  -f "config[url]=https://hook.eu1.make.com/abc123" 
  -f "config[content_type]=json" 
  -f "config[secret]=gizli_anahtar_123" 
  -F active=true 
  -f "events[]=deployment_status"

Make senaryosunda gelen veriyi parse edip Slack’e yollarsın. Ama öncesinde test verisi gönderip yapıyı anlamak lazım:

# GitHub webhook payload simülasyonu
curl -X POST https://hook.eu1.make.com/abc123 
  -H "Content-Type: application/json" 
  -H "X-GitHub-Event: deployment_status" 
  -d '{
    "deployment_status": {
      "state": "success",
      "environment": "production",
      "created_at": "2024-01-15T14:22:00Z"
    },
    "deployment": {
      "ref": "main",
      "sha": "a3f8c2d"
    },
    "repository": {
      "name": "proje-api",
      "full_name": "sirket/proje-api"
    },
    "sender": {
      "login": "devops-ahmet"
    }
  }'

Make’de şu akışı kurarsın:

  • Webhook modülü veriyi alır
  • Router modülü state değerine göre farklı yollara ayrılır (success, failure, pending)
  • Her yol için farklı Slack mesajı gönderilir
  • Slack mesajı renk kodlu olur: yeşil başarı, kırmızı hata

Gerçek Dünya Senaryosu 2: Zapier ile Müşteri Onboarding Otomasyonu

Bir SaaS ürününde yeni müşteri kayıt olduğunda şu işlemlerin otomatik yapılması gerekiyor: CRM’e kayıt, Slack’te ekibe bildirim, hoşgeldin emaili gönderme, Notion’da müşteri kartı oluşturma.

Kendi backend’inden Zapier’e webhook atmak için:

#!/bin/bash
# send_webhook.sh - Backend'den Zapier'e webhook gönderme

ZAPIER_URL="https://hooks.zapier.com/hooks/catch/1234567/abcdefg/"
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")

PAYLOAD=$(cat <<EOF
{
  "event": "customer_signup",
  "timestamp": "${TIMESTAMP}",
  "customer": {
    "id": "CUST-$(date +%s)",
    "name": "${1}",
    "email": "${2}",
    "plan": "${3:-starter}",
    "source": "website"
  },
  "metadata": {
    "utm_source": "${4:-organic}",
    "signup_page": "/pricing"
  }
}
EOF
)

RESPONSE=$(curl -s -w "n%{http_code}" -X POST "${ZAPIER_URL}" 
  -H "Content-Type: application/json" 
  -d "${PAYLOAD}")

HTTP_CODE=$(echo "${RESPONSE}" | tail -n1)
BODY=$(echo "${RESPONSE}" | head -n-1)

if [ "${HTTP_CODE}" == "200" ]; then
    echo "Webhook başarıyla gönderildi"
    echo "Response: ${BODY}"
else
    echo "HATA: HTTP ${HTTP_CODE}"
    echo "Response: ${BODY}"
    exit 1
fi

Scripti şöyle çalıştırırsın:

chmod +x send_webhook.sh
./send_webhook.sh "Mehmet Kaya" "[email protected]" "professional" "google_ads"

Hata Yönetimi ve Retry Mekanizması

Webhook’ların en büyük zorluğu, karşı taraf down olduğunda ne yapacağın. İyi bir webhook alıcısı şu özelliklere sahip olmalı:

  • İdempotency: Aynı webhook iki kez gelse bile işlem bir kez yapılmalı
  • Hızlı response: 200 OK hemen dönüp işlemi arka planda yap
  • Retry loglaması: Hangi webhook’ların başarısız olduğunu takip et

Basit bir webhook receiver servisi:

#!/bin/bash
# webhook_receiver_test.sh
# Netcat ile hızlı test receiver
# Sadece development/test için!

PORT=8080
echo "Webhook receiver port ${PORT}'de dinleniyor..."

while true; do
    REQUEST=$(echo -e "HTTP/1.1 200 OKrnContent-Type: application/jsonrnrn{"status":"received"}" 
        | nc -l -p ${PORT} -q 1)
    
    echo "--- Yeni İstek $(date) ---"
    echo "${REQUEST}" | head -20
    echo "------------------------"
done

Make ve Zapier’de retry konusunda şunları bilmek lazım:

  • Zapier başarısız webhook’ları 24 saat boyunca retry eder, maksimum 3 kez
  • Make’de “Error Handler” modülü ekleyerek hataları yakalayabilirsin
  • Her ikisinde de “Task History” veya “Scenario History” bölümünden geçmiş çalışmaları görebilirsin

Make’de Webhook Veri Dönüşümü

Make’nin en güçlü yanlarından biri veri dönüşümü. Gelen webhook verisini tamamen farklı bir formata çevirebilirsin.

Örneğin, WooCommerce’den gelen sipariş webhook’unu Muhasebe API’sinin beklediği formata çevirmek için Make’de “Set variable” ve “JSON” modülleri kullanılır. Bunu test etmek için:

# WooCommerce benzeri sipariş verisi gönder
curl -X POST https://hook.eu1.make.com/woocommerce_test 
  -H "Content-Type: application/json" 
  -d '{
    "id": 12345,
    "status": "completed",
    "total": "459.90",
    "currency": "TRY",
    "billing": {
      "first_name": "Fatma",
      "last_name": "Demir",
      "email": "[email protected]",
      "phone": "+905551234567",
      "address_1": "Atatürk Cad. No:1",
      "city": "Istanbul"
    },
    "line_items": [
      {
        "product_id": 789,
        "name": "Laptop Stand",
        "quantity": 1,
        "total": "299.90"
      },
      {
        "product_id": 456,
        "name": "USB Hub",
        "quantity": 2,
        "total": "160.00"
      }
    ]
  }'

Make’de bu veriyi muhasebe formatına çevirirken şu dönüşümleri yaparsın:

  • total string değerini number’a çevir: parseFloat(total)
  • İsim birleştir: first_name & " " & last_name
  • Tarih formatla: formatDate(now; "DD.MM.YYYY")
  • Satırları döngüyle işle: Iterator modülü kullan

Monitoring ve Alerting

Production’da webhook entegrasyonlarını körü körüne çalıştırmak olmaz. Basit bir monitoring scripti:

#!/bin/bash
# webhook_health_check.sh
# Webhook endpoint'lerinin sağlıklı çalıştığını kontrol et

ENDPOINTS=(
    "https://hooks.zapier.com/hooks/catch/1234567/healthcheck/"
    "https://hook.eu1.make.com/healthcheck_abc123"
)

LOG_FILE="/var/log/webhook_health.log"
ALERT_EMAIL="[email protected]"

for endpoint in "${ENDPOINTS[@]}"; do
    HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" 
        -X POST "${endpoint}" 
        -H "Content-Type: application/json" 
        -d '{"type": "health_check"}' 
        --max-time 10)
    
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    
    if [ "${HTTP_CODE}" == "200" ]; then
        echo "[${TIMESTAMP}] OK - ${endpoint}" >> "${LOG_FILE}"
    else
        echo "[${TIMESTAMP}] FAIL (${HTTP_CODE}) - ${endpoint}" >> "${LOG_FILE}"
        echo "Webhook endpoint down: ${endpoint}" | 
            mail -s "Webhook Alert" "${ALERT_EMAIL}"
    fi
done

Bu scripti crontab’a ekle:

# Her 5 dakikada bir kontrol et
*/5 * * * * /opt/scripts/webhook_health_check.sh

Zapier vs Make: Hangisini Seçmeli?

Birini seçerken şu kriterlere bak:

  • Veri hacmi: Ayda 100’den az işlem için Zapier ücretsiz planı yeterli. Binlerce işlem için Make daha ekonomik
  • Kompleksite: Basit A’dan B’ye aktarım için Zapier. Döngüler, koşullar, veri manipülasyonu gereken yerlerde Make
  • Hata yönetimi: Make’nin error handling modülleri çok daha gelişmiş
  • Webhook response hızı: İkisi de benzer, her ikisi de saniyeler içinde çalışır
  • Debug araçları: Make’nin görsel akış editörü hata ayıklamayı kolaylaştırır

Ekibinde teknik olmayan kişiler var ve basit otomasyon yeterliyse Zapier. DevOps ekibi için kompleks iş akışları kuruyorsan Make’i tercih et.

Sonuç

Webhook entegrasyonları doğru kurulduğunda sistem yönetiminin en güçlü araçlarından biri. Zapier ile hızlıca prototip çıkarabilir, Make ile production-grade otomasyon kurabilirsin. Ama her iki platformda da şunları unutma:

  • Webhook URL’lerini asla herkese açık bırakma, imzalama veya IP whitelist uygula
  • Her webhook’a 200 OK’ı hızlıca dön, uzun işlemleri arka plana al
  • İdempotency için benzersiz event ID’leri kullan ve işlenen ID’leri kaydet
  • Health check scriptleriyle entegrasyonları sürekli izle
  • Retry mekanizmalarını test et, başarısız senaryoları simüle et

Bu temel prensipler üzerine kurulu bir webhook altyapısı, hem güvenilir hem de ölçeklenebilir olacaktır. Sorun yaşarsan webhook loglarına ve platform’ların task history bölümlerine başvur, genellikle sorunun kaynağını orada bulursun.

Bir yanıt yazın

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