Randevu Programları, Chatbot AI & Otomasyon SDK

Bu dokümanda, aynı gün içinde randevu alma esnekliği, Chatbot ve Yapay Zeka (AI) üzerinden sohbet esnasında otomatik randevu oluşturma adımları ve Otomasyonlar için Takvim JavaScript SDK kullanımı açıklanmaktadır.


1-) Aynı Gün Randevu Alma Mekanizması

Müşteriye açık randevu alma ekranları ve rezervasyon programları, hızlı dönüşüm sağlamak adına aynı gün randevu alımını destekler.

1.a – Bugünün Tarihi Seçilebilirliği & İleri Saat Dilimleri:
* Müşteri randevu ekranını açtığında, bugünün tarihi kapalı görünmez. * Müşteri o gün içinde şu andan sonraki uygun saat dilimlerini doğrudan seçebilir. * Sadece geçmiş saat dilimleri (geçmiş zaman) seçime kapalı tutulur.

1.b – Minimum Rezervasyon Süresi Kuralları:
Randevu programı ayarlarında "Minimum Rezervasyon Süresi" kuralı aktifse bu kural öncelikli olarak uygulanır. * Örnek: Minimum rezervasyon süresi 24 saat seçilmişse bugün seçime kapalı kalır.2.a – Chatbot AI Ayarları (Randevu Sekmesi Yapılandırması): Chatbot → AI Ayarları ekranındaki bilgi kaynakları arasına Randevu sekmesi eklenmiştir. * Bu sekmede sistemde tanımlı rezervasyon programları listelenir ve aktif randevu sayaçları diğer bilgi türleri ile birlikte görüntülenir. * İlgili randevu programı seçilerek yapay zekaya tanıtılır.

2.b – Sohbet İçerisinde Otomatik Slot Eleme & Randevu Oluşturma: Yapay zeka sohbet sırasında şu adımları otomatik yürütür: 1. Bilgi Toplama: Müşteriden ad, soyad, e-posta ve telefon gibi gerekli form alanlarını sohbet akışında toplar. 2. Müsait Saat Elemesi: Takvimdeki dolu saatleri ve çakışan randevuları otomatik olarak eler. 3. Seçim & Onay: Müşteriye yalnızca uygun olan saat slotlarını sunar ve müşterinin seçtiği saati onaylayarak randevuyu oluşturur. 4. Konuşmaya Bağlama: Sohbetten alınan randevu ilgili canlı konuşma kaydına otomatik bağlanır. Böylece temsilci, kişi kartında ve sohbet geçmişinde oluşturulan randevuyu anında görebilir.ri saatleri anında seçilebilir duruma gelir.


2-) Chatbot & Yapay Zeka (AI) İle Otomatik Randevu

Supsis AI Chatbot altyapısı, temsilciye ihtiyaç duymadan müşteriyle sohbet ederken müsait saatleri analiz eder, gerekli bilgileri toplar ve randevu kaydını tamamlar.

2.a – Chatbot AI Ayarları (Randevu Sekmesi Yapılandırması):
Chatbot → AI Ayarları ekranındaki bilgi kaynakları arasına Randevu sekmesi eklenmiştir. * Bu sekmede sistemde tanımlı rezervasyon programları listelenir ve aktif randevu sayaçları diğer bilgi türleri ile birlikte görüntülenir. * İlgili randevu programı seçilerek yapay zekaya tanıtılır. * Yapay zekâ asistanı, müşteriden doğal dilde topladığı ek detayları (konu, katılımcı sayısı, özel talepler vb.) randevu kaydının Açıklama* alanına otomatik olarak yazar.

2.b – Sohbet İçerisinde Otomatik Slot Eleme & Randevu Oluşturma:
Yapay zeka sohbet sırasında şu adımları otomatik yürütür: 1. Bilgi Toplama: Müşteriden ad, soyad, e-posta, telefon ve randevu konusunu sohbet akışında toplar. 2. Müsait Saat Elemesi: Takvimdeki dolu saatleri ve çakışan randevuları otomatik olarak eler. 3. Seçim & Onay: Müşteriye yalnızca uygun olan saat slotlarını sunar ve müşterinin seçtiği saati onaylayarak randevuyu oluşturur. 4. Google Meet & Açıklama: İlgili takvim Google'a bağlıysa otomatik Google Meet bağlantısı üretilir; toplanan notlar açıklamaya eklenir. 5. Konuşmaya Bağlama: Sohbetten alınan randevu ilgili canlı konuşma kaydına otomatik bağlanır. Böylece temsilci, kişi kartında ve sohbet geçmişinde oluşturulan randevuyu anında görebilir.


3-) Chatbot Diyagram Akış Blokları & Özellik Değişkenleri

Diyagram tabanlı kural bazlı Chatbot akışlarında randevu ve etkinlik blokları gelişmiş form yapısıyla çalışır:

Chatbot Rezervasyon Blokları Genel Akışı

3.a – Etkinlik ile Randevu Arasındaki Temel Fark

  • Etkinlik (Event): Bir temsilcinin takvimine eklenen serbest kayıttır (başlık, açıklama, süre, konum, davetli temsilciler). Belirli bir randevu programı kuralına bağlı değildir.
  • Randevu (Rezervasyon): Bir Randevu Programına bağlıdır. Süre, müsaitlik/slot kuralları, hedef takvim ve form alanları doğrudan programdan gelir. Sistem boş saat kontrolü yapar, müşteriye ve temsilciye bilgilendirme maili gönderir, iptal linki üretir ve takvim Google'a bağlıysa Google Meet bağlantısını otomatik oluşturur.

Chatbot Rezervasyon Bloğu Randevu Programı ve Form Seçim Alanı

3.b – Açıklama Alanı Desteği

Chatbot'taki Rezervasyon Oluştur ve Etkinlik Oluştur bloklarına Açıklama alanı eklenmiştir: * Müşteriyle yapılan sohbette toplanan bilgiler (konu, talep, katılımcı sayısı vb.) özellik değişkenleri aracılığıyla ({{konu}}, {{talep}} vb.) bu alana aktarılabilir. * Girilen metin, program açıklamasının altına eklenir; takvim kaydında, Google etkinliğinde, müşteri ile temsilciye iletilen randevu bildirim mailinde ve takvim davetinde (.ics) eksiksiz görünür.

Chatbot Takvim Etkinlik Bloğu ve Google Meet Anahtarı

3.c – Randevu Sonrası Kullanılabilen Dinamik Değişkenler

Randevu veya etkinlik bloğu başarıyla çalıştığında, sonraki bloklarda ve bot yanıtlarında kullanılmak üzere özellik seçicisinde yeni Randevu / Takvim grubu aktifleşir:

  • Randevu (Rezervasyon) Değişkenleri:
  • {{reservation_event_id}}: Oluşan randevunun benzersiz kayıt kimliği
  • {{reservation_title}}: Randevu başlığı
  • {{reservation_start}}: Başlangıç tarihi ve saati
  • {{reservation_end}}: Bitiş tarihi ve saati
  • {{reservation_meet_link}}: Otomatik üretilen Google Meet toplantı bağlantısı
  • {{reservation_description}}: Randevu açıklama metni
  • Etkinlik Değişkenleri:
  • {{event_id}}, {{event_title}}, {{event_start}}, {{event_end}}, {{event_meet_link}}

Örnek Bot Yanıtı

Randevunuz başarıyla oluşturuldu! ✅
📅 {{reservation_title}} · {{reservation_start}}
🔗 Görüşme Bağlantısı: {{reservation_meet_link}}
Google Meet bağlantısı yalnızca ilgili takvim Google Hesabına bağlıysa oluşur. Bağlantı oluşmama ihtimaline karşı bot yanıtından önce bir Filtre bloğu ile reservation_meet_link için "boş değil" kontrolü yapılması tavsiye edilir.

3.d – WhatsApp ve Çok Kanallı Uyumluluk

  • WhatsApp Akışı: Gün seçimi, saat seçimi ve rezervasyon oluşturma blok zinciri WhatsApp üzerinde buton veya liste mesajı olarak kusursuz çalışır.
  • Rezervasyon Ekranını Görüntüle: Web widget dışında harici pencere açılamadığı için WhatsApp'ta müşteriye randevu sayfasının direkt web bağlantısı iletilir; müşteri tarayıcıda randevuyu tamamladığında akış kaldığı yerden devam eder.
  • Meet Linki Paylaşımı: Müşteriye Meet bağlantısını göndermek için bot yanıtı mesajına {{reservation_meet_link}} eklemek yeterlidir.

4-) Otomasyon Blokları (Calendar Actions)

Otomasyon kurgularında kod yazmaya gerek kalmadan takvim ve randevu süreçlerini yönetmek için Calendar Actions kategorisi altında iki temel blok sunulur:

Otomasyon Calendar Actions Randevu ve Rezervasyon Bloğu

  1. Randevu Oluştur (Create Booking):
  2. Girdiler: Randevu programı seçimi, başlangıç tarihi/saati (ISO veya YYYY-AA-GG SS:dd), dinamik form alanları, kayda özel açıklama (en fazla 5000 karakter) ve kişi (visitorId) eşleştirmesi.
  3. Kontrol: Başlangıç saati mutlaka programın boş slotlarından biri olmalıdır. Dolu bir saat gönderilirse blok Başarısız çıkışına yönlenir.
  4. Etkinlik Oluştur (Create Event):
  5. Girdiler: Başlık (summary), açıklama, temsilci (takvim sahibi), hedef takvim, başlangıç tarihi, etkinlik süresi, saat dilimi, ek davetli temsilciler, kişi kartı ve Google Meet Anahtarı (otomatik video konferans bağlantısı oluşturma switch'i).
  6. Çıkış Değişkenleri: Blokların Başarılı çıkışına bağlanan sonraki adımlarda (ör. WhatsApp şablon mesajı veya e-posta) block.<id>.eventId, block.<id>.title, block.<id>.start, block.<id>.end, block.<id>.meetLink ve block.<id>.description alanları seçilebilir.

5-) E-Posta Bildirimleri ve .ics Takvim Daveti

Randevu tamamlandığında hem müşteriye hem de ilgili temsilciye otomatik bilgilendirme e-postası iletilir:

Örnek Müşteri Randevu Onay Maili ve Google Meet Daveti

  • Müşteri E-Postası: Randevu tarihi (programın saat diliminde ve alıcının dilinde biçimlendirilmiş), saat dilimi, Google Meet toplantı bağlantısı, randevu açıklaması, form cevapları, randevu iptal ve yeniden planlama bağlantılarını içerir. Kod bloğundan (supsis.calendar.createReservation) açılan randevularda da müşteriye onay maili ve Google Meet davetiyesi eksiksiz iletilir.
  • Temsilci E-Postası: Müşteri bilgileri, Meet linki, toplanan form alanları ve randevu açıklamasını içerir (iptal butonu yer almaz).
  • Takvim Daveti (.ics Dosyası): Gönderilen maillere doğru saat, açıklama ve Google Meet linkiyle hazırlanmış standart .ics takvim dosyası eklenir. Gmail, Outlook veya Apple Calendar kullanıcıları etkinliği tek tıkla kendi takvimlerine kaydedebilir.

6-) Otomasyonlar ve Chatbot İçin Takvim JavaScript SDK'sı (supsis.calendar)

Otomasyon motorundaki ve Chatbot akışlarındaki JavaScript kod bloklarında supsis.calendar modülü zenginleştirilmiştir. Kod editöründe supsis. yazıldığında takvim fonksiyonları otomatik tamamlama (autocomplete) listesinde hazır şablonlarla önerilir. Ayrıca yerleşik AI Kod Asistanı, takvim ID'sine gerek kalmadan planId ve program kurallarına göre doğru kodları üretir.

Otomasyon JS Editörü supsis.calendar Otomatik Tamamlama Desteği

Chatbot JS Editörü supsis.calendar Otomatik Tamamlama Desteği

Takvim Fonksiyon Tamamlama Listesi

📖 JS SDK Dokümantasyonunda Calendar Kategorisi: Supsis genelindeki tüm JavaScript SDK fonksiyonlarının yer aldığı merkezi kütüphanede supsis.calendar metodları ayrı bir kategori olarak listelenmiştir. Detaylı interaktif arama ve parametre incelemesi için JS SDK Referans Kılavuzu sayfasını ziyaret edebilirsiniz.

6.a – Takvim ve Rezervasyon SDK Fonksiyonları:

Fonksiyon Parametreler Açıklama
supsis.calendar.getReservationSlots(params) { planId, from, to, includeBooked } Program kurallarına göre (tampon, çalışma saati, kota) boş ve dolu saat slotlarını listeler.
supsis.calendar.isSlotAvailable(params) { planId, start } Belirli bir saatin uygunluğunu kontrol eder; uygun değilse reason nedeni döner.
supsis.calendar.createReservation(data) { planId, startDate, fields, description, visitorId, skipSlotCheck } Tanımlı randevu programı üzerinden slot doğrulamalı yeni randevu oluşturur; eksik alanları visitorId'den doldurur.
supsis.calendar.listReservationPlans() - Hesaptaki tüm rezervasyon programlarını listeler (planId tespiti için).
supsis.calendar.getReservationPlan(params) { planId } Program süresi, saat dilimi, form alanları (formInputs: label, type, required) ve takvim bilgilerini getirir.
supsis.calendar.listVisitorReservations(params) { email, upcomingOnly } Ziyaretçinin e-posta adresine bağlı aktif/geçmiş randevularını listeler.
supsis.calendar.updateReservation(data) { eventId, startDate, description, fields } Randevuyu erteler veya günceller; müşteriye otomatik güncelleme e-postası iletir.
supsis.calendar.createEvent(data) { title, agentId, calendarId, start, end, description, visitorId, withGoogleMeet } Temsilci takvimine serbest etkinlik ekler; Google Meet linki üretebilir.
supsis.calendar.updateEvent(data) { eventId, ... } Mevcut takvim etkinliğini günceller (Google Takvim ile senkronize).
supsis.calendar.listEvents(params) { userId, startDate, endDate, calendarIds } Temsilcinin takvim etkinliklerini tarih aralığına göre listeler.
supsis.calendar.getCalendars() - Sistemdeki yetkili takvimlerin listesini döndürür.
supsis.calendar.getEvent(eventId) eventId Belirtilen etkinliğin detay ve saat bilgilerini getirir.
supsis.calendar.deleteEvent(eventId) eventId Belirtilen etkinliği takvimden ve senkronize platformlardan siler.
supsis.calendar.checkAvailability(params) { calendarId, startDate, endDate } Sadece belirli takvimin ham doluluk durumunu kontrol eder.

6.b – Saat Dilimi ve Saat Yazım Kuralları:

  • Saat Yazım Kuralı: 2026-09-25T17:00:00+03:00 Türkiye saatiyle 17:00 demektir. Eksiz yazım (2026-09-25 17:00 veya 2026-09-25T17:00:00) doğrudan programın saat diliminde yorumlanır. Kod içinde saate manuel +3 saat ekleme/çıkarma işlemi yapılmamalıdır.
Yazım Şekli Anlamı ve Yorumlanması
2026-09-25T17:00:00+03:00 Türkiye saatiyle 17:00 (UTC 14:00)
2026-09-25T14:00:00Z Aynı an, standart UTC yazımı
2026-09-25 17:00 Eksiz format: Programın saat diliminde 17:00
2026-09-25T14:00:00+03:00 Türkiye saatiyle 14:00 (Sık yapılan hata: UTC sanılarak yazılır)
  • Yerel Saat Dönüş Alanları: createReservation, updateReservation, listVisitorReservations, listEvents, getEvent ve updateEvent metotlarının dönüş nesnesinde startLocal, endLocal (YYYY-MM-DD HH:mm) ve timezone alanları yer alır. Müşteriye bildirim iletirken startLocal referans alınmalıdır (start ve end UTC döner).
  • Form Alanları ve visitorId: Varsayılan 3 alan sistemde name, surname, email olarak kayıtlıdır (panelde Ad, Soyad, E-posta). Kullanıcı tanımlı özel alanlar (örn. "Aktif Rahatsızlık": "Bel fıtığı") ekrandaki etiketle birebir eşleşmelidir. visitorId (24 haneli ID) verildiğinde randevu müşteri kartına bağlanır ve boş bırakılan form alanları kişi profilinden otomatik tamamlanır.

6.c – Slot Uygunsuzluk Nedenleri (reason Tablosu):

isSlotAvailable çağrısı sonucunda slot uygun değilse (available: false), sistem aşağıdaki reason kodlarından birini döndürür:

Reason Kodu Açıklama
booked Seçilen saat başka bir randevu veya takvim etkinliğiyle dolu.
quota_full O gün için tanımlanmış maksimum günlük randevu kotası dolmuş.
past Geçmiş bir tarih veya saat seçilmiş.
too_soon Programın "En Erken Rezervasyon" kuralından önce bir zaman dilimi seçilmiş.
too_late Programın "En Geç Rezervasyon" sınırından sonraki bir gün seçilmiş.
program_closed Randevu programının aktif çalışma tarih aralığı dışında.
outside_hours Temsilcinin veya işletmenin tanımlı çalışma saatleri dışında.
plan_not_found Belirtilen planId sistemde bulunamadı.

Hata durumunda hata mesajı programın yerel saatini yansıtır: "2026-09-25 17:00 (Europe/Istanbul) musait degil (booked)".

Örnek Senaryoda Takvim Fonksiyon Kullanımı

6.d – AI Kod Asistanı Örnek Senaryosu (Boş Saatleri Getirme ve Mesajlaştırma):

Chatbot veya Otomasyon kod bloğundaki AI Kod Asistanına "randevu programının boş saatlerini getir ve müşteriye listele" komutu verildiğinde üretilen standart JavaScript kod yapısı:

async function main() {
    try {
        // 1. Randevu programını belirle (attribute'tan planId veya program adı okunabilir)
        const planIdAttr = chatbot.readAttribute("reservation_plan_id", "");
        const planTitleAttr = chatbot.readAttribute("reservation_plan_title", "");

        const plans = await supsis.calendar.listReservationPlans();

        if (!plans || plans.length === 0) {
            await chatbot.sendMessage("Şu anda tanımlı bir randevu programı bulunmuyor.", "text");
            return {
                success: false,
                message: "Randevu programı bulunamadı",
            };
        }

        // Plan seçimi: önce ID, sonra başlık, yoksa ilk program
        let selectedPlan = null;

        if (planIdAttr) {
            selectedPlan = plans.find((p) => p.id === planIdAttr);
        }

        if (!selectedPlan && planTitleAttr) {
            selectedPlan = plans.find((p) => p.title.toLowerCase() === planTitleAttr.toLowerCase());
        }

        if (!selectedPlan) {
            selectedPlan = plans[0];
        }

        chatbot.sendTyping();

        // 2. Programın önümüzdeki 7 günlük boş saatlerini getir
        const slotsResult = await supsis.calendar.getReservationSlots({
            planId: selectedPlan.id,
        });

        const days = slotsResult.days || {};
        const dayKeys = Object.keys(days).sort();

        // Sadece müsait olan slotları filtrele ve günlere göre grupla
        const availableByDay = {};
        let totalAvailable = 0;

        for (const dayKey of dayKeys) {
            const daySlots = days[dayKey].filter((slot) => slot.available);
            if (daySlots.length > 0) {
                availableByDay[dayKey] = daySlots;
                totalAvailable += daySlots.length;
            }
        }

        // 3. Kullanıcıya mesaj oluştur
        if (totalAvailable === 0) {
            await chatbot.sendMessage(
                `"${selectedPlan.title}" programı için önümüzdeki 7 gün içinde uygun boş saat bulunmamaktadır.`,
                "text"
            );

            chatbot.setAttributes({
                reservation_slots_found: false,
                reservation_plan_id: selectedPlan.id,
            });

            return {
                success: true,
                planId: selectedPlan.id,
                planTitle: selectedPlan.title,
                totalAvailable: 0,
                days: {},
            };
        }

        let messageText = `📅 *${selectedPlan.title}* için uygun saatler:\n\n`;

        for (const dayKey of Object.keys(availableByDay)) {
            const daySlots = availableByDay[dayKey];
            const formattedDay = moment(dayKey).locale("tr").format("DD MMMM YYYY, dddd");

            messageText += `*${formattedDay}*\n`;

            const times = daySlots.map((slot) => {
                // startLocal formatı "YYYY-MM-DD HH:mm" -> sadece saat kısmını al
                const timePart = slot.startLocal.split(" ")[1];
                return timePart;
            });

            messageText += times.join(", ") + "\n\n";
        }

        messageText += `İlk uygun saat: ${slotsResult.firstAvailable ? slotsResult.firstAvailable.startLocal : "-"}`;

        await chatbot.sendMessage(messageText, "text");

        // 4. Attribute olarak kaydet (sonraki adımda randevu oluşturmak için kullanılabilir)
        chatbot.setAttributes({
            reservation_plan_id: selectedPlan.id,
            reservation_plan_title: selectedPlan.title,
            reservation_slots_found: true,
            reservation_first_available: slotsResult.firstAvailable ? slotsResult.firstAvailable.start : "",
            reservation_first_available_local: slotsResult.firstAvailable ? slotsResult.firstAvailable.startLocal : "",
        });

        return {
            success: true,
            planId: selectedPlan.id,
            planTitle: selectedPlan.title,
            timezone: slotsResult.timezone,
            duration: slotsResult.duration,
            totalAvailable,
            days: availableByDay,
            firstAvailable: slotsResult.firstAvailable,
        };
    } catch (error) {
        await chatbot.sendMessage("Randevu saatleri getirilirken bir hata oluştu. Lütfen daha sonra tekrar deneyin.", "text");

        return {
            success: false,
            error: error.message,
        };
    }
}

📌 Önemli Not: Google Meet bağlantısının oluşabilmesi için etkinliğin veya randevu programının bağlı olduğu takvim sahibinin Google Takvim entegrasyonu (Entegrasyonlar → Google Takvim) aktif olmalıdır. Takvim bağlı değilse kayıt açılır ancak Meet link alanı boş döner.