n8n ile PDF Faturalardan Veri Çekip Muhasebeye Aktar

AgentRoost · May 8, 2026 · 5 dk okuma · Markdown olarak görüntüle
AgentRoost — n8n Automation

Küçük bir işletme yürütüyorsanız muhtemelen şu sahneyi tanıyorsunuzdur: e-posta kutusuna düşen PDF fatura, oradan "şimdi gireyim" niyetiyle masaüstüne taşınan dosya, akabinde çarşamba sabahı Excel'e açtığınızda yeniden okuduğunuz satırlar. Her fatura için beş dakika. Ayda yirmi fatura gelince bu yüz dakikaya dönüşüyor — ve bu, hata yapma ihtimalini saymadan.

Bu yazıda, e-posta gelen kutunuzu izleyen, PDF eki otomatik indiren, içindeki alanları (tutar, KDV, tarih, satıcı adı) AI ile çıkaran ve bunları doğrudan bir Google Sheets satırına yazan bir n8n akışını adım adım kuracağız.

Gerekli n8n Düğümleri

Akış altı düğümden oluşur:

Düğüm Görevi
Gmail Trigger (veya IMAP Email) Yeni e-postaları dinler, ek varsa tetikler
HTTP Request PDF ekini binary olarak indirir
Convert to File Binary veriyi base64 string'e çevirir
AI / LLM (OpenAI, Anthropic…) PDF içeriğini okuyup JSON üretir
Set Çıktıdaki alanları sütunlara eşler
Google Sheets: Append Row Veriyi tabloya yazar

Not: n8n'in "Extract from File" düğümü PDF metnini doğrudan çıkarabilir; ama sayfa düzeni karmaşık ya da taranmış görüntü içeriyorsa AI düğümüne vision/base64 göndermek çok daha güvenilirdir.


Adım Adım Akış Kurulumu

1. Tetikleyiciyi Ayarla: Gmail Trigger

Gmail Trigger düğümünü çalışma alanınıza ekleyin. Ayarlar:

  • Trigger On: Message Received
  • Filter: has:attachment filename:*.pdf (Gmail arama sözdizimi)
  • Poll Interval: her 5 dakika

Bu düğüm her yeni e-postayı bir JSON nesnesi olarak sonraki adıma iletir; attachments dizisinde PDF'nin indirme URL'si bulunur.

2. PDF'yi İndir: HTTP Request

Bir HTTP Request düğümü ekleyin:

  • Method: GET
  • URL: {{ $json.attachments[0].url }}
  • Authentication: Gmail OAuth2 (Trigger ile aynı kimlik bilgisi)
  • Response Format: File

Çıktı: ham binary akış — bir sonraki adımda base64'e çevrilecek.

3. AI Düğümüne Gönder: LLM / Chat Model

Burası sihrin gerçekleştiği yer. OpenAI veya Anthropic chat modelini kullanan bir AI Agent veya LLM Chain düğümü ekleyin. System prompt'u şu şekilde yazın:

Sen bir muhasebe asistanısın.
Sana base64 formatında bir PDF fatura gönderiyorum.
Aşağıdaki alanları JSON olarak döndür:

{
  "satici": "<tedarikçi/firma adı>",
  "fatura_no": "<fatura numarası>",
  "tarih": "<YYYY-MM-DD>",
  "tutar_kdvsiz": <sayı>,
  "kdv_orani": <sayı, örn. 20>,
  "kdv_tutari": <sayı>,
  "toplam_tutar": <sayı>,
  "para_birimi": "<TRY/EUR/USD>"
}

Eğer bir alan bulunamazsa null yaz.
Yalnızca JSON döndür, başka açıklama ekleme.

User Message alanına şunu yazın:

{{ $binary.data }}

Model olarak gpt-4o veya claude-3-5-sonnet seçin; her ikisi de PDF base64'ü görüntü olarak işleyebilir.

4. JSON'ı Parse Et: Set Düğümü

LLM'in döndürdüğü metin string bir JSON'dur. Code düğümüyle parse edin:

const raw = $input.item.json.text;          // LLM çıktısı
const parsed = JSON.parse(raw);
return [{ json: parsed }];

Ardından bir Set düğümü ile sütun adlarını netleştirin — özellikle tarih formatını kontrol edin:

// Tarih ISO formatında mı?
const d = new Date($json.tarih);
return isNaN(d) ? "Hatalı tarih" : d.toISOString().split("T")[0];

5. Tabloya Yaz: Google Sheets — Append Row

Google Sheets: Append Row düğümünü ekleyin:

  • Spreadsheet ID: <tablonuzun ID'si>
  • Sheet Name: Faturalar
  • Columns → Values:
    • Satıcı{{ $json.satici }}
    • Fatura No{{ $json.fatura_no }}
    • Tarih{{ $json.tarih }}
    • KDV'siz Tutar{{ $json.tutar_kdvsiz }}
    • KDV %{{ $json.kdv_orani }}
    • KDV Tutarı{{ $json.kdv_tutari }}
    • Toplam{{ $json.toplam_tutar }}
    • Para Birimi{{ $json.para_birimi }}

Birden fazla muhasebe aracıyla çalışıyorsanız aynı aşamada bir HTTP Request düğümü daha ekleyip Parasut, Foriba veya Xero API'sine de POST atabilirsiniz.


Yaygın Tuzaklar ve Çözümleri

"PDF boş döndü" sorunu Taranmış fatura (görüntü tabanlı PDF) ise model metni doğrudan okuyamaz. gpt-4o gibi multimodal bir model seçin ve PDF'yi image/jpeg değil application/pdf base64 olarak gönderin — model iç OCR uygular.

"Toplam hesaplamıyor" sorunu LLM bazen toplam_tutar yerine null döndürür, tutarı metin içinde bırakır. Code düğümünde fallback ekleyin:

parsed.toplam_tutar = parsed.toplam_tutar
  ?? (parsed.tutar_kdvsiz + parsed.kdv_tutari);

Birden fazla ek Gmail Trigger birden fazla ek içeren e-postalar için tek nesne döndürür. Eklerin tümünü işlemek için attachments dizisini bir Split In Batches düğümüyle yineleyin.

Yanlış tedarikçi adı LLM, fatura üstündeki resmi unvanı tam yazmayabilir. Set düğümüne bir "normalize" adımı ekleyin; ya da tabloda Satıcı sütununa veri doğrulama (açılır liste) uygulayıp eşleşmeyen değerleri renkle işaretleyin.


Bu Akışı AgentRoost'ta Çalıştırın

Yukarıdaki akışı kendi bilgisayarınızda denediniz, işe yaradı. Şimdi sorun şu: bilgisayar kapandığında akış da duruyor. Sunucu kurmak, Docker Compose yazmak, SSL sertifikası almak istemiyorsanız buraya gelin.

AgentRoost'ta nasıl çalışır:

  1. agentroost.app üzerinden hesap açın (e-posta veya Google/Microsoft/Discord ile).
  2. n8n çerçevesini seçin, instance'ınıza bir isim verin.
  3. Yaklaşık iki dakika içinde https://<sizin-id>.agentroost.app adresinde kendi n8n editörünüz açılır — yalnızca size özel.
  4. Yukarıdaki akışı içe aktarın (JSON export/import) veya sıfırdan oluşturun.
  5. AI düğümlerine API anahtarı girmenize gerek yok — AI kredisi aboneliğe dahil. OpenAI, Anthropic ve aralarından seçim yapabileceğiniz yüzlerce modele doğrudan bağlanabilirsiniz.

Instance yalnızca sizin; verileriniz, iş akışlarınız, kimlik bilgileriniz başka hiçbir müşteriyle paylaşılmıyor. 24/7 çalışıyor, webhooklar hemen aktif oluyor, SSL otomatik.

Fiyat $19.99/ay'dan başlıyor (sunucu + AI kredisi + bakım hepsi bir arada). 14 günlük para iade garantisi var, aylık ödeme, istediğiniz zaman iptal.

Planları karşılaştır →


Özet: Ne Kazanıyorsunuz?

  • Fatura başına beş dakikalık manuel giriş → sıfır.
  • Sayısal hata riski → minimuma iniyor (LLM hatalı parse ederse Code düğümünüzde yakalanıyor).
  • Yeni tedarikçi eklediğinizde prompt'u güncellemeniz gerekmiyor — AI formatı kendisi öğreniyor.
  • Aynı akışa Slack bildirimi, e-posta onayı veya muhasebe uygulaması webhook'u eklemeniz birkaç düğüm meselesi.

n8n'i kendiniz yönetmek istemiyorsanız AgentRoost'ta kendi instance'ınız zaten hazır bekliyor.

Sıkça sorulan sorular

n8n'de AI düğümü için OpenAI API anahtarı girmem gerekiyor mu?

AgentRoost üzerindeki kendi n8n instance'ınızda AI kredisi aboneliğe dahildir. OpenAI veya Anthropic hesabı açmanıza, kredi yüklemenize ya da API anahtarı girmenize gerek yoktur. Düğümü seçip modeli belirleyin, doğrudan kullanabilirsiniz. Kendi API anahtarınızı kullanmak isterseniz bu da mümkündür; n8n'in kimlik bilgisi yönetimi bunu destekler.

Faturalar taranmış görüntü içeriyorsa (metin katmanı yoksa) bu akış çalışır mı?

Evet, ancak doğru model seçimi şart. gpt-4o veya claude-3-5-sonnet gibi multimodal (görüntü anlayan) bir model kullanmanız gerekir. PDF'yi base64 olarak gönderdiğinizde model dahili OCR uygulayarak görüntüdeki metni çıkarır. Saf metin PDF'lerde herhangi bir GPT-4 sınıfı model yeterlidir.

Bu akış çalışabilmesi için bilgisayarımın açık kalması gerekiyor mu?

n8n'i kendi bilgisayarınızda çalıştırıyorsanız evet, bilgisayar kapandığında akış durur. AgentRoost'taki kendi n8n instance'ınız ayrılmış sunucuda 24/7 çalışır; bilgisayarınızı kapatmanızın hiçbir etkisi yoktur. Webhook'lar ve zamanlayıcılar sürekli aktiftir.

AgentRoost'u deneyip beğenmezsem ne olur?

14 günlük para iade garantisi sunuyoruz. Aylık abonelik, istediğiniz zaman iptal edebilirsiniz. İptal etmeden önce n8n'deki akışlarınızı JSON olarak dışa aktarabilirsiniz; standart n8n formatında olduğundan başka bir yere kolayca taşıyabilirsiniz.

Google Sheets yerine Parasut veya başka bir muhasebe uygulamasına bağlanabilir miyim?

Evet. n8n, REST API sunan her uygulamaya HTTP Request düğümüyle bağlanır. Parasut, Xero, QuickBooks veya Foriba gibi platformların API belgelerine bakarak endpoint ve token bilgilerini n8n'deki Credentials bölümüne girin. Google Sheets adımı yerine ya da ek olarak bu düğümü kullanabilirsiniz.