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:

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.

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.

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}}
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:

- Randevu Oluştur (Create Booking):
- Girdiler: Randevu programı seçimi, başlangıç tarihi/saati (
ISOveyaYYYY-AA-GG SS:dd), dinamik form alanları, kayda özel açıklama (en fazla 5000 karakter) ve kişi (visitorId) eşleştirmesi. - 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.
- Etkinlik Oluştur (Create Event):
- 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).
- Çı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>.meetLinkveblock.<id>.descriptionalanları 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:

- 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
.icstakvim 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.



📖 JS SDK Dokümantasyonunda Calendar Kategorisi: Supsis genelindeki tüm JavaScript SDK fonksiyonlarının yer aldığı merkezi kütüphanede
supsis.calendarmetodları 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:00Türkiye saatiyle 17:00 demektir. Eksiz yazım (2026-09-25 17:00veya2026-09-25T17:00:00) doğrudan programın saat diliminde yorumlanır. Kod içinde saate manuel+3saat 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,getEventveupdateEventmetotlarının dönüş nesnesindestartLocal,endLocal(YYYY-MM-DD HH:mm) vetimezonealanları yer alır. Müşteriye bildirim iletirkenstartLocalreferans alınmalıdır (startveendUTC döner). - Form Alanları ve
visitorId: Varsayılan 3 alan sistemdename,surname,emailolarak 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)".

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.