Davye n8n otomasyonu
Davye.com Akıllı WhatsApp Satış & Destek Asistanı
Bu proje, davye.com'un WhatsApp operasyonlarını otomatize etmek için kurulmuştur. Temel işlevi, gelen standart soruları yapay zeka ile 7/24 yanıtlamak ve gerektiğinde canlı desteğe bağlamaktır. Özel müdahale gerektiren durumlarda bot otomatik olarak devreden çıkar ve sohbetin manuel yönetilmesi için müşteriyi doğrudan canlı desteğe aktarır.
Kullanılan Teknolojiler
- n8n: Webhook'ları dinler, veritabanı sorgularını tetikler, yapay zekaya veri taşır ve döngü/filtreleme işlemlerini yönetir.
- Evolution API: WhatsApp iletişim köprüsü. Gelen mesajları anlık olarak n8n'e iletir ve üretilen yanıtları WhatsApp üzerinden müşteriye gönderir. Meta'nın resmi API'si olmadan WhatsApp Web protokolü üzerinden kesintisiz iletişim sağlar.
- PostgreSQL: Müşteri sepet verileri, mesajlaşma geçmişi, sınır kontrolleri ve canlı desteğe aktarılan numaraların kaydını güvenle tutar.
- Google Gemini AI: Gelen mesajların niyetini anlar, sistem yönergesine (prompt) ve veritabanından gelen müşteri özelliklerine göre dinamik, doğal yanıtlar üretir.
Veritabanı Mimarisi
Sistemin sorunsuz çalışmasını sağlayan temel veri tabloları, yapıları ve bu verilerin kaynakları aşağıda listelenmiştir.
1. uye_bilgi Tablosu
| Sütun Adı | Veri Tipi | Maksimum Uzunluk / Detay |
|---|---|---|
| id | integer | null |
| ticimax_id | character varying (VARCHAR) | 50 |
| isim | character varying (VARCHAR) | 100 |
| soyisim | character varying (VARCHAR) | 100 |
| cep | character varying (VARCHAR) | 20 |
| character varying (VARCHAR) | 150 | |
| meslek | character varying (VARCHAR) | 100 |
| uye_turu | character varying (VARCHAR) | 50 |
| il | character varying (VARCHAR) | 50 |
| siparis_yasakli | boolean | null |
| is_hekim | boolean | null |
| guncellenme_tarihi | timestamp | null |
2. ana_urunler Tablosu
urunler.xml dosyasına giderek ürünlerin URL (link) bağlantılarını çeker ve tablodaki ürünlerle eşleştirerek kaydeder.| Sütun Adı | Veri Tipi | Maksimum Uzunluk / Detay |
|---|---|---|
| barkod | character varying (VARCHAR) | 100 |
| urun_adi | text | null |
| stok_adedi | integer | null |
| satis_fiyati | numeric | null |
| indirimli_fiyat | numeric | null |
| kategori | text | null |
| son_guncelleme | timestamp | null |
| urun_url | text | null |
3. uye_sepet Tablosu
| Sütun Adı | Veri Tipi | Maksimum Uzunluk / Detay |
|---|---|---|
| telefon | integer | 20 |
| tarih | timestamp without time zone | null |
| sepet_ozeti | text | null |
4. mesaj_kuyrugu Tablosu
| Sütun Adı | Veri Tipi | Maksimum Uzunluk / Detay |
|---|---|---|
| telefon | character varying (VARCHAR) | 50 |
| mesaj_metni | text | null |
| son_guncelleme | bigint | null |
5. canli_destek_aktif Tablosu
"insana_baglanma" kararı verdiğinde n8n otomatik olarak müşteriyi buraya yazar. Ayrıca yetkili personel gerektiğinde manuel olarak numaraları bu tabloya ekleyip/silebilir.| Sütun Adı | Veri Tipi | Maksimum Uzunluk / Detay |
|---|---|---|
| telefon | character varying (VARCHAR) | 50 |
| devir_tarihi | timestamp | null |
BÖLÜM 3: Ana İş Akışı ve Karar Mekanizması
3.1. Ön Güvenlik ve Canlı Destek Kontrolü (Filtreleme Aşaması)
- Gönderen Kontrolü: Mesajı müşteri mi attı, yoksa canlı destekteki temsilci mi? Eğer mesaj bizden (temsilciden) gittiyse bot anında kendini devreden çıkarır.
- Medya Tipi Kontrolü: Gelen veri metin mi? Eğer müşteri görsel, video veya ses kaydı gönderdiyse, yapay zeka bunları analiz etmeye çalışmak yerine sohbeti doğrudan canlı desteğe yönlendirir.
- 24 Saatlik Kalkan Kuralı: Sistem
canli_destek_aktiftablosuna bakar. Eğer müşteri zaten canlı desteğe bağlanmışsa ve son konuşmanın üzerinden 24 saat geçmemişse, bot sessiz kalmaya devam eder. 24 saat dolduysa bot tekrar devreye girer.
3.2. Akıllı Bekleme Odası (Mesaj Kuyruğu Sistemi)
Müşteriler genellikle söyleyeceklerini tek bir uzun mesaj yerine, art arda kısa mesajlar (Örn: "Merhaba" gönder, "Bir şey soracaktım" gönder) şeklinde yazarlar.
- Bot, her gelen mesajdan sonra tam 10 saniye bekler.
- Bu süre içinde aynı numaradan yeni mesaj gelirse sayacı sıfırlar.
- Müşteri yazmayı bitirdiğinde, tüm mesajları tek bir metin bloğu halinde birleştirip yapay zekaya tek bir paket olarak sunar.
3.3. Yapay Zeka İşlemleri
Mesaj tüm güvenlik filtrelerini geçip kuyruktan çıktıktan sonra, sistemin beyni olan Google Gemini'a iletilir. Burada iki güçlü mekanizma kurduk: Özel JSON Yönergesi (Prompt) ve Dinamik SQL Ürün Araması.
3.3.1. Yapay Zeka Yönergesi ve JSON Çıktısı
Sistemin esnekliğini ve n8n içindeki algoritmik kontrolünü sağlayan en önemli adım, yapay zekayı "Sadece JSON formatında çıktı veren bir Karar Motoru" olarak eğitmektir. Prompt yapımız temel olarak şu şekildedir:
Gemini Prompt
Sen tıbbi ve dental malzemeleri satan davye.com'un ve melihgunalecza.com'un profesyonel satış temsilcisisin. Asla bir yapay zeka veya bot olduğunu belli etme, karşındakiyle gerçek bir insan (firma çalışanı) gibi konuş. Müşteriye adıyla hitap etme. Görevin, müşteriden gelen mesajı analiz etmek, niyetini anlamak ve aradığı ürünü tespit etmektir.
ZORUNLU NİYET LİSTESİ VE SEÇİLME DURUMLARI:
- "stok_bekleme_talebi": Müşteri stokta olmayan bir ürün geldiğinde kendisine haber verilmesini istiyorsa veya botun teklifine "Evet isterim" diyorsa.
- "stok_sorgulama": Müşteri elinizde bir ürünün ŞU AN olup olmadığını soruyorsa VEYA aradığı ürün stokta yoksa.
- "fiyat_sorgulama": Müşteri fiyat, indirim, ödeme koşulu soruyorsa VEYA web sitesi linki atıp sipariş vermek istiyorsa.
- "insana_baglanma": Müşterinin sorusunu anlayamadığında, elindeki bilgilerle ona yardımcı olamadığında, müşteri özel bir fiyat/pazarlık talebinde bulunduğunda veya doğrudan "Davut", "yetkili", "canlı destek" gibi kelimelerle bir insanla görüşmek istediğini belirttiğinde KESİNLİKLE bunu seç.
- "genel_soru": Müşteri sadece "Merhaba", "Nasılsın" diyorsa VEYA tıbbi ürünler dışında alakasız bir soru soruyorsa bunu seç.
---
MÜŞTERİ BİLGİLERİ:
Sistemdeki Kayıtlı Adı: {{ $('Musteri_GBT_Cek').first().json.isim || 'Kayıt Yok' }}
Sistemdeki Mesleği: {{ $('Musteri_GBT_Cek').first().json.meslek || 'Kayıt Yok' }}
WhatsApp Profil Adı: {{ $('Webhook1').first().json.body.data.pushName || $('Webhook1').first().json.body.data.message.pushName || 'Gizli' }}
---
MÜŞTERİNİN MESAJI: {{ $('Execute a SQL query1').item.json.mesaj_metni }}
---
ÜRÜN ARAMA VE EŞLEŞTİRME KURALLARI:
0. ZORUNLU ARAÇ (TOOL) KULLANIMI: Müşteri ürün adı, kodu veya linki (URL) yazdığında aracı (tool) KULLANMADAN asla "urun_net_mi": true yapma! (Aracı kullanırken, aracın kendi açıklamasında yer alan arama kurallarına harfiyen uy!)
1. HALÜSİNASYON VE KURAL UYDURMA YASAĞI:
- Kendi kendine "Bu ürün sadece hekimlere satılır", "Şu belge gereklidir" GİBİ KURALLAR UYDURMA!
- ASLA "sistem kayıtlarınızda", "varsayım yaptım", "yanılgıysa özür dilerim" gibi yapay zeka olduğunu belli eden cümleler kurma!
2. ÇOKLU SONUÇ (UZUN İSİM SAYMA YASAĞI):
- Araç birden fazla ürün döndürürse "urun_net_mi": false yap.
- Müşteriye ASLA uzun ürün isimlerini listeleme! Gruplayıp ÖRNEK VEREREK detay iste.
3. STOK YOK DURUMU:
- Araçtan gelen ürünün 'stok_adedi' 0 ise VEYA 'urun_url' boş ise ürün STOKTA YOKTUR. Niyeti "stok_sorgulama" yap, "Maalesef bu ürünümüz şu an stoklarımızda bulunmuyor. Stoğa girince haber vereyim mi?" yaz.
4. SİPARİŞ İÇİN ADET SORGULAMA VE DÖNGÜ KIRMA:
- Ürün belliyse ve adet yoksa adedi sor ("adet_net_mi": false yap).
- DİKKAT (DÖNGÜYÜ KIR): Müşteri "Kaç adet?" sorusuna veya doğrudan "23 adet" gibi KISA BİR CEVAP verirse, aracı yeniden aratmaya çalışma! Önceki ürünü hatırla, DERHAL "adet_net_mi": true yap, işlemi onaylayıp KONUYU KAPAT.
5. LİNKTEN SİPARİŞ: Müşteri URL atarsa aracı kullan. Bulursan fiyatı ver ve KAÇ ADET istediğini mutlaka sor! (Eğer adet belliyse direkt siparişi oluştur).
6. HEKİM/KLİNİK SORUSUNU ANLAMA: Müşteri "Neden soruyorsunuz?" derse: "Lokal anestezi ürünleri prosedür gereği sadece sağlık kuruluşlarına satılabilmektedir, kliniğiniz var mı hocam?" yaz. Onaylarsa "hekim_ibaresi_var_mi" true yap.
7. STOK BEKLEME ONAYI VE HAFIZA KORUMA (ÇOK ÖNEMLİ):
- Müşteri stokta olmayan ürün için "Gelince haber ver" veya "Evet isterim" derse niyeti "stok_bekleme_talebi" yap.
- DİKKAT: Müşteri "Evet isterim" diyerek onayladığında, geçmiş sohbetlerdeki ürünü ve adedi (Örn: 58 adet) SAKIN UNUTMA! Hafızanı sıfırlama!
- Adet önceden konuşulduysa ("istenen_adet" doluysa), "adet_net_mi": true yap ve TEKRAR ADET SORMA! Direkt "Notumu aldım" de.
8. KONU DEĞİŞTİRME VE İSTİSNAİ HAFIZA DURUMU:
- Müşteri ESKİ BİR ÜRÜNDEN, YENİ BİR ÜRÜNE geçerse eski adedi DERHAL UNUT ("adet_net_mi": false yap).
- İSTİSNA (Ters Sıralama): Eğer müşteri ÖNCE adedi söyleyip (örn: "58 adet") SONRA ürünü/linki verirse, o adedi SAKIN SİLME! O adedi doğrudan yeni linkteki ürüne tanımla ("istenen_adet": 58, "adet_net_mi": true yap).
ÇIKTI (JSON) KURALLARI - KESİNLİKLE UY:
- Söylemek istediğin her şeyi SADECE "bot_cevabi" içine yaz. JSON bloğunun dışına asla normal metin ekleme.
{
"niyet": "ZORUNLU LİSTEDEN SEÇİLEN KELİME",
"urun_adi": "SADECE araçtan gelen TAM ve UZUN veritabanı adı.",
"urun_net_mi": true veya false,
"adet_net_mi": true veya false,
"istenen_adet": "Müşterinin belirttiği adet (Örn: '5', '3 kutu'). Belli değilse null yap.",
"kategori": "Araçtan (tool) gelen kategori bilgisi. (Eğer urun_net_mi false ise null yap)",
"stok_adedi": "Araçtan (tool) gelen stok bilgisi. (Eğer urun_net_mi false ise null yap)",
"satis_fiyati": "Araçtan (tool) gelen fiyat bilgisi. (Eğer urun_net_mi false ise null yap)",
"indirimli_fiyat": "Araçtan (tool) gelen indirimli fiyat bilgisi. (Yoksa veya 0 ise null yap)",
"bot_cevabi": "Fiyatı verdikten sonra adedi sor! Adet belliyse işlemi onayla. Asla AI olduğunu belli etme.",
"hekim_ibaresi_var_mi": true veya false
}
Bu JSON çıktısı sayesinde, n8n içerisindeki Switch (Yönlendirici) node'umuz verileri bir yazılım gibi okuyarak kusursuz bir yol ayrımı yapabilmektedir (Örn: niyet = insana_baglanma ise botu sustur ve insan temsilciye bildir).
3.3.2. Ürün Arama (SQL Sorgusu) ve Fiyat Kontrolü
Müşteri ürün sorduğunda, AI'ın veritabanındaki güncel stok ve fiyatları bilmesi gerekir. AI, prompt sayesinde müşterinin aradığı kelimeyi veya URL'i tespit eder ve n8n bu veriyi alıp ana_urunler tablomuza aşağıdaki SQL sorgusunu fırlatır:
Sql Sorgusu
SELECT
urun_adi,
ROUND(indirimli_fiyat, 2) AS indirimli_fiyat,
ROUND(satis_fiyati, 2) AS satis_fiyati,
stok_adedi,
kategori,
urun_url
FROM ana_urunler
WHERE urun_url ILIKE '%' || BTRIM($1::text, ' "''') || '%'
OR (
urun_adi ILIKE '%' || split_part(BTRIM($1::text, ' "'''), ' ', 1) || '%'
AND urun_adi ILIKE '%' || split_part(BTRIM($1::text, ' "'''), ' ', 2) || '%'
AND urun_adi ILIKE '%' || split_part(BTRIM($1::text, ' "'''), ' ', 3) || '%'
)
LIMIT 15;
Araç (Tool) Açıklaması
Bu araca aramak istediğin ürünün EN BELİRGİN 1 veya 2 kelimesini, REFERANS KODUNU veya müşteri LİNK (URL) attıysa direkt o linki/linkteki ürün adını yaz.
ASLA "almak istiyorum", "var mı", "fiyatı nedir" gibi cümleler kurma! Sadece arama terimini gir.
(Örnek doğru kullanımlar: "Ultracain Forte", "S4183", "jetokain", "ekartor-flep-15cm")
🚦 Karar Kavşağı: 5 Ana Niyet (Switch Node)
Yapay zekanın ürettiği JSON çıktısındaki verilere göre, n8n sistemi mesajı aşağıdaki 5 ana yoldan (kapıdan) birine yönlendirir.
🛑 Yol 1: İnsana Bağlanma
niyet = "insana_baglanma"
Müşteri "sipariş vereceğim" dediğinde, pazarlık yaptığında veya AI tıkandığında devreye girer. Sohbet yetkiliye aktarılır, bot susar.
💬 Yol 2: Genel Sohbet
niyet = "genel_soru"
Klasik/basit sorulara veya selamlara yanıt verilir. Sohbet uzarsa görüşme canlı desteğe bırakılır.
❓ Yol 3: Eksik Bilgi
urun_net_mi = false
Fiyat sorulduğunda kaç adet istendiği eksikse veya çeşit belli değilse eksikleri sorar. Ana döngü yoludur.
🛒 Yol 4: Net Sipariş ve Katalog
urun_net_mi = true && adet_net_mi = true
Bilgiler netleşince çalışır. GBT kontrolü olumluysa yuvarlanmış net fiyatlar ve katalog (PDF) atılarak top canlı desteğe atılır.
📦 Yol 5: Stok Bekleme Talebi
niyet = "stok_bekleme_talebi"
Müşteri "Stoğu gelince bilgi almak istiyorum" dediğinde ürün ve adet verisi hafızadan çekilip veritabanına kalıcı olarak yazılır.
⚙️ Senaryolar
Sistemin; Excel kontrolleri, eksik bilgi tamamlama, URL okuma, lokal anestezi güvenliği ve stok takibi gibi tüm fonksiyonlarını nasıl işlettiğinin tam haritasıdır.
1 Sisteme Giriş, Üye Tanıma ve GBT Akışı (Arka Plan)
2 Fiyat Sorgulama ve Eksik Bilgi Toplama (Yol 3 Döngüsü)
adet_net_mi = false