Adımızda “WP” var. WordPress ile başladık, WordPress ile büyüdük ve hala WordPress’i seviyoruz. Ama bir ürün inşa etmeye karar verdiğimizde — gerçek zamanlı AI konuşmaları, WhatsApp entegrasyonu ve takvim senkronizasyonu olan gerçek bir SaaS — WordPress’in sınırlarının nerede bittiğini tam olarak biliyorduk.

Bu makalede HeyCaly‘nin teknik altyapısını, her teknolojiyi neden seçtiğimizi ve bir WordPress ajansı olarak bu kararları nasıl aldığımızı açıklıyoruz. Amacımız sadece bir teknoloji listesi sunmak değil; her kararın arkasındaki “neden”i yanıtlamak.


HeyCaly Ne Yapar?

HeyCaly, randevu tabanlı işletmelerin (kuaförler, klinikler, spor salonları, spa’lar, veteriner klinikleri, diş hekimlikleri) AI destekli WhatsApp konuşmaları aracılığıyla geçmiş müşterilerle yeniden etkileşim kurmalarına yardımcı olan bir SaaS platformudur. Boş randevu slotlarını tespit eder, doğru zamanda doğru müşteriye kişiselleştirilmiş WhatsApp mesajları gönderir ve randevuyu otomatik olarak takvimlerine rezerve eder.

Kısacası: AI destekli müşteri yeniden etkileşim asistanı.

“Hizmet işletmeleri her hafta randevularının %20-40’ını boş bırakır. HeyCaly bu boşlukları akıllıca doldurur.”


Neden WordPress Değil?

Önce açık olalım: WordPress kötü bir teknoloji değil. Hala projelerimizde aktif olarak kullanıyoruz. WooCommerce mağazaları, kurumsal web siteleri, çok dilli içerik platformları — WordPress bunlar için hala mükemmel.

Ama HeyCaly farklı bir canavar:

  • Gerçek zamanlı WhatsApp mesajlaşması — webhook’lar milisaniyeler içinde işlenmeli
  • AI konuşma motoru — her mesaj için bağlam yükleme, prompt oluşturma, yanıt üretme
  • 27 arka plan işi — kampanya planlama, takvim senkronizasyonları, hatırlatmalar
  • Çoklu entegrasyonlar — Google Calendar, Outlook, Stripe, WhatsApp Business API
  • Çok kiracılı mimari — aynı altyapıda yüzlerce işletme, veri izolasyonu kritik
  • Edge middleware — her istekte milisaniye seviyesinde kimlik doğrulama

WordPress’in PHP tabanlı, istek-yanıt mimarisi bu gereksinimlerin çoğunu ya karşılayamaz ya da önemli geçici çözümler gerektirir. Matt Mullenweg kendisi 2023 State of the Word konuşmasında WordPress’in her kullanım durumu için ideal olmadığını kabul etti.

Vercel CEO’su Guillermo Rauch bunu güzel özetliyor:

“En iyi framework’ler basit başlamanızı ve karmaşığa doğru ölçeklendirmenizi sağlar. App Router tam da bunun için tasarlandı — bir blogdan milyar dolarlık SaaS’a, aynı zihinsel model.”
Guillermo Rauch, Vercel Keynote 2024

Tam da bunu yaptık.


Teknoloji Yığını: Büyük Resim

İşte HeyCaly’nin teknoloji haritası:

Katman Teknoloji Neden?
Framework Next.js (App Router) Server Components, API Routes, Edge Middleware — hepsi tek projede
Hosting Vercel (Frankfurt) GDPR uyumlu, global CDN, sıfır DevOps
Veritabanı Supabase (PostgreSQL) Açık kaynak Firebase alternatifi, RLS, gerçek zamanlı
Kimlik Doğrulama Clerk Organizasyon tabanlı çok kiracılılık, hazır UI
AI Claude Sonnet (Anthropic) Doğal çok dilli konuşmalar, güçlü akıl yürütme, güvenilir çıktı kalitesi
WhatsApp 360dialog Meta onaylı partner, işletme başına mimari
Arka Plan İşleri Inngest Olay güdümlü, sleepUntil(), 27 fonksiyon
Ödemeler Stripe Abonelik yönetimi, webhook’lar
Takvim Google Calendar API + Microsoft Graph OAuth 2.0, iki yönlü senkronizasyon
E-posta Postmark İşlemsel e-posta, yüksek teslim edilebilirlik
Hata Takibi Sentry Full-stack hata takibi, AB bölgesi
Pazarlama Sitesi Sanity + Next.js Headless CMS, yapılandırılmış içerik
UI shadcn/ui + Radix + Tailwind Erişilebilir, özelleştirilebilir bileşenler

72 bağımlılık, 30+ ortam değişkeni, 12 veritabanı tablosu. Ama her birinin bir nedeni var.


Next.js: Neden App Router?

HeyCaly’nin kalbinde Next.js‘in App Router mimarisi yatıyor. Bu sadece bir React framework’ü değil — frontend, backend ve API endpoint’lerini tek projede barındıran full-stack bir çözüm.

Server Components ile Performans

React Server Components sayesinde dashboard sayfaları sunucu tarafında render ediliyor. İstemciye gönderilen JavaScript miktarı minimal kalıyor:

Bir dashboard sayfası yüklendiğinde:
1. Sunucu  Veritabanı sorgusu (Supabase)
2. Sunucu  HTML render
3. İstemci  Minimal JS hydration

Bu özellikle mobil cihazlarda — HeyCaly kullanıcılarının %70’inden fazlasının bulunduğu platformda — dramatik bir performans farkı yaratıyor.

Route Groups ile Mimari Organizasyon

app/
├── (auth)/          → Giriş/kayıt sayfaları
├── (dashboard)/     → Korumalı alan (sidebar, ayarlar)
├── (onboarding)/    → 8 adımlı kurulum sihirbazı
└── api/             → ~30 API endpoint + webhook'lar

Next.js route groups sayesinde her bölümün kendi layout’u var. Onboarding akışı dashboard’dan tamamen bağımsız çalışıyor.

Edge Middleware

Her HTTP isteği Frankfurt edge node’unda milisaniyeler içinde kimlik doğrulamadan geçiyor:

// middleware.ts
export default clerkMiddleware(async (auth, req) => {
  // Genel rotalar: webhook'lar, giriş sayfaları
  // Diğer her şey: Clerk auth gerekli
});

Next.js VP of Product Lee Robinson, bu yaklaşımı şöyle açıklıyor:

“Edge’de middleware, kimlik doğrulamanın kaynak sunucunuz uyanmadan önce gerçekleştiği anlamına gelir. Bu sadece daha hızlı değil — temelden farklı bir güvenlik modeli.”


Supabase: Açık Kaynak PostgreSQL’in Gücü

Veritabanı seçerken Firebase, PlanetScale ve Supabase’i değerlendirdik. Supabase‘i seçmemizin üç temel nedeni:

1. PostgreSQL’in Gücü

HeyCaly’de 12 tablo, onlarca ilişki ve karmaşık sorgular var. NoSQL (Firebase/Firestore) bu ilişkisel veri modeline uymuyor. PostgreSQL’in TIMESTAMPTZ, JSONB, foreign key’leri ve indeksleri kritik.

2. Row-Level Security (RLS)

Çok kiracılı SaaS’ta veri izolasyonu hayati:

-- Her işletme sadece kendi müşterilerini görebilir
CREATE POLICY "business_isolation" ON customers
  USING (business_id = current_setting('app.business_id')::uuid);

Supabase CEO’su Paul Copplestone, bu felsefeyi şöyle açıklıyor:

“Postgres’i seçtik çünkü dünyanın en güvenilir veritabanı. Postgres üzerine inşa ettiğinizde, 35 yıllık savaşta test edilmiş güvenilirlik üzerine inşa ediyorsunuz.”

3. Migration Tabanlı Şema Yönetimi

Veritabanı şeması 5 migration dosyasıyla versiyon kontrolü altında:

supabase/migrations/
├── 001_initial.sql              → 12 tablo, indeksler, RLS
├── 002_onboarding_progress.sql  → Onboarding alanları
├── 003_demo_columns.sql         → Demo modu desteği
├── 004_conversation_metadata.sql → Konuşma metadata'sı
└── 005_partner_api.sql          → İşletme başına WhatsApp anahtarları

Her migration geri alınabilir, her değişiklik izlenebilir. WordPress’in dbDelta() fonksiyonuyla yaptığımız şema değişikliklerini düşündüğümüzde… Fark açık.


Claude AI: Neden Anthropic?

HeyCaly’nin en kritik bileşeni AI konuşma motoru. Bir müşteriye WhatsApp mesajı gönderdiğimizde, o mesajın doğal, kişisel ve ikna edici olması gerekiyor.

Model Seçimi: Claude Sonnet

OpenAI GPT-4, Google Gemini ve Anthropic Claude üzerinde kapsamlı testler yaptık. Claude Sonnet’i seçme nedenlerimiz:

  1. Çok dilli doğallık — Claude, WhatsApp konuşmalarında birden fazla dilde en doğal tonu üretiyor
  2. Bağlamsal akıl yürütme — Müşteri geçmişi, hizmet detayları ve takvim durumunu tek yanıtta harmanlayabiliyor
  3. Çıktı kalitesi — WhatsApp’ın kısa mesaj formatına ideal, tutarlı şekilde iyi yapılandırılmış, özlü yanıtlar
  4. Güvenlik — Anthropic’in Constitutional AI yaklaşımı, hassas müşteri verileriyle güven veriyor

Anthropic CEO’su Dario Amodei:

“AI sistemlerinin en önemli özelliğinin güvenli, faydalı ve anlaşılır olmak olduğuna inanıyoruz.”
Anthropic Core Views on AI Safety

Sinyal Tabanlı Mimari (Tool Calling Değil)

Burada ilginç bir mühendislik kararı verdik. Anthropic’in tool calling özelliğini kullanmak yerine, metin tabanlı sinyal sistemi tasarladık:

AI yanıtı: "Harika, Perşembe saat 14:00 için randevunuzu aldım! 💇‍♀️"
[[APPOINTMENT_CONFIRMED]]{"date":"2026-02-27","time":"14:00","service":"Saç kesimi"}

Neden? WhatsApp mesajları kısa olmalı. Tool calling JSON yükü ekler. Sinyal sistemi daha hafif, daha dayanıklı ve JSON parsing başarısız olsa bile “onaylandı” sinyalini yakalayabiliyor.


Inngest: 27 Arka Plan İşi

Bir SaaS’ın “görünmez” ama en kritik katmanı arka plan işleri. Inngest burada oyunun kurallarını değiştirdi.

Neden Vercel Cron veya BullMQ Değil?

  • Vercel Cron: Basit zamanlama için yeterli, ama olay güdümlü iş akışları için yetersiz
  • BullMQ/Redis: Kendi sunucularımızı yönetmek istemedik
  • Inngest: Olay güdümlü, sleepUntil() ile zamanlanmış görevler, yerleşik retry mantığı

Inngest CTO’su Dan Farrelly:

“Geleneksel job queue’lar sizi ‘işi kuyruğa at, worker alsın’ şeklinde düşünmeye zorlar. Inngest ‘bu olay gerçekleştiğinde, şunu yap’ şeklinde düşünmenizi sağlar — işletmeniz gerçekte nasıl çalışıyorsa öyle.”
Inngest Blog: Why Event-Driven

İş Haritası

HeyCaly 27 Inngest fonksiyonu çalıştırıyor:

Kategori İşler
WhatsApp Mesaj alma → AI yanıtı oluşturma → Gönderme → Durum takibi
Kampanyalar Zamanlama → Müşteri filtreleme → Toplu gönderim (50’lik gruplar)
Takvim Google/Outlook senkronizasyonu → Slot hesaplama → Çakışma tespiti
Faturalandırma Aylık sıfırlama → Kullanım uyarıları → Deneme yönetimi
Hatırlatıcılar 24 saat önce → 2 saat önce (cron)
WhatsApp Warmup Günlük limit sıfırlama → Seviye yükseltme → Kalite izleme
İçe Aktarma CSV ayrıştırma → Toplu ekleme → Telefon doğrulama (Twilio)
Demo Demo hesap oluşturma → Örnek konuşmalar → Sıfırlama

Kampanya gönderiminde 50’lik gruplar kullanıyoruz. Bu, Meta’nın WhatsApp Business API hız limitlerini karşılarken warmup seviyesine göre günlük limiti asla aşmamamızı sağlıyor.


Clerk: Çok Kiracılı Kimlik Doğrulama

HeyCaly’de her işletme bir “organizasyon”dur. Her organizasyonun kendi ekip üyeleri, müşterileri ve konuşmaları vardır. Clerk bu organizasyon tabanlı çok kiracılığı kutudan çıktığı gibi sunar.

Neden Supabase Auth veya NextAuth Değil?

  • Supabase Auth: Organizasyon kavramı yok, özel kurulum gerekli
  • NextAuth: Harika, ama ekip yönetimi arayüzü yok
  • Clerk: Organizasyon oluşturma → webhook → veritabanında otomatik işletme kaydı. Hazır davet sistemi, rol yönetimi, güvenli oturum işleme
Yeni kayıt akışı:
1. Kullanıcı Clerk'e kaydolur
2. Clerk webhook tetiklenir
3. Stripe müşterisi oluşturulur
4. Business + team_member kaydı Supabase'e
5. 14-günlük deneme başlar

Bu akış tamamen otomatik — sıfır insan müdahalesi.


heycaly.com: Sanity ile Headless CMS

HeyCaly’nin pazarlama websitesi (heycaly.com) uygulama kodundan tamamen bağımsız. Burada headless CMS olarak Sanity kullanıyoruz.

Neden WordPress Değil?

Evet, ironik. Ama nedenler çok somut:

  1. Aynı dağıtım hattı: heycaly.com da Next.js ile yapılmış. Sanity’den içerik çekiyor ve Vercel’de statik sayfalar oluşturuyor. Tek bir git push hem uygulamayı hem de websiteyi güncelliyor.

  2. Yapılandırılmış içerik: Sanity’nin GROQ sorgu diliyle, 9 dildeki (İngilizce, Türkçe, İspanyolca, Almanca, Portekizce, İtalyanca, Arapça, Fransızca ve Azerbaycanca) çok dilli içeriği tek bir kaynaktan yönetiyoruz.

  3. Performans: Statik olarak oluşturulan sayfalar Vercel’in CDN’inden sunuluyor. Sayfa yükleme süreleri WordPress’in dinamik PHP renderlamasına göre %60 daha düşük.

  4. Geliştirici deneyimi: İçerik ekibi Sanity Studio üzerinden düzenliyor, geliştiriciler aynı Next.js projesi içindeki şablonları güncelliyor. İki dünya sorunsuz birleşiyor.

Sanity kurucusu Simen Svale Skogsrud’un bu yaklaşımı özetleyen sözleri:

“İçerik veridir, sayfa değil. İçeriği yapılandırılmış veri olarak ele aldığınızda, onu her yere sunabilirsiniz — bir websiteye, mobil uygulamaya, WhatsApp mesajına veya AI promptına.”

Bu felsefe HeyCaly için biçilmiş kaftan. Sanity’deki içerik hem websitede hem de potansiyel olarak uygulama içi yardım metinlerinde kullanılabilir.

Headless CMS yaklaşımımız hakkında daha fazla bilgi →


Güvenlik: Şifreleme, İzolasyon, Uyumluluk

Sağlık verileri, randevu bilgileri, telefon numaraları — HeyCaly hassas verilerle çalışıyor. Güvenlik mimarimiz:

AES-256-CBC Şifreleme

WhatsApp API anahtarları ve OAuth token’ları veritabanında şifrelenmiş olarak saklanıyor:

Kaydet: düz metin  AES-256-CBC şifrele  DB
Kullan:  DB  şifre çöz  API çağrısı  bellekten temizle

Veri İzolasyonu

  • Clerk: Her organizasyonun kendi auth sınırı
  • Supabase RLS: Veritabanı seviyesinde satır düzeyinde erişim kontrolü
  • Service Role: Inngest arkaplan işleri güvenli service role anahtarıyla çalışıyor

GDPR Uyumluluğu

  • Vercel hosting: Frankfurt, Almanya (AB bölgesi)
  • Sentry: AB bölgesi konfigürasyonu
  • Supabase: AB bölgesi
  • Tüm kişisel veriler Avrupa sınırları içinde kalıyor

Stripe: Abonelikler ve Faturalandırma

Stripe entegrasyonu dört plan seviyesini yönetiyor:

Plan Mesaj/Ay WhatsApp Numaraları Takvimler Ekip
Starter 50 1 1
Growth 500 1 1 3
Business 2,000 3 3 5
Enterprise Sınırsız Sınırsız Sınırsız Sınırsız

Webhook tabanlı olay akışı:

Stripe webhook  subscription.updated
   Inngest: plan limitlerini güncelle
   Supabase: businesses tablosunu güncelle
   Postmark: onay e-postası gönder

14 günlük deneme Business plan limitleriyle başlıyor. 12. gün uyarısı, 14. gün ödenmemişse otomatik Starter’a düşürme — hepsi Inngest cron işleriyle yönetiliyor.


Sentry: Hata Takibi

Prodüksyondaki her hata anında yakalanıyor. Sentry‘nin Next.js SDK’sı üç katmanda çalışıyor:

// İstemci tarafı hataları
sentry.client.config.ts

// Sunucu tarafı hataları (API rotaları, Server Components)
sentry.server.config.ts

// Edge runtime hataları (middleware)
sentry.edge.config.ts

WhatsApp webhook’larında bir timeout, Stripe webhook’unda eksik alan, Claude API yanıtında beklenmeyen format — her biri ekibe anlık bildirim olarak ulaşıyor.


Performans Metrikleri

Frankfurt’taki Vercel’in Edge Network’ündeki ölçümler:

Metrik Değer
TTFB (Time to First Byte) < 100ms (Edge middleware)
WhatsApp webhook işleme < 500ms (alma → Inngest olayı)
AI yanıt oluşturma 1-3 saniye (Claude Sonnet, 500 token)
Panel sayfa yüklemesi < 1.5s (Server Components)
heycaly.com ana sayfa < 800ms (statik, CDN)

Zaman Dilimi Yönetimi: Küçük Ama Kritik

Randevu tabanlı bir sistemde zaman dilimi yönetimi ya sizi kurtarır ya da batırır. HeyCaly’nin yaklaşımı:

  1. Veritabanı: Her şey UTC’de (TIMESTAMPTZ)
  2. İşletme ayarı: IANA formatında zaman dilimi (Europe/Istanbul, America/New_York)
  3. AI promptu: Müsait slotlar işletmenin yerel zaman diliminde sunuluyor
  4. Müşteri mesajı: AI yerel saat yazıyor (“Perşembe 14:00”)
  5. Saklama: Veritabanına yazmadan önce sunucu tarafında UTC’ye çevriliyor

date-fns-tz kütüphanesi bu dönüşümleri güvenilir şekilde yapıyor.

“Bilgisayar Bilimlerinde sadece iki zor şey vardır: cache invalidation ve isimlendirme.”
— Phil Karlton

Üçüncüyü ekleriz: zaman dilimi yönetimi.


WordPress’den Öğrendiklerimiz

Bu makaleyi “WordPress kötü, modern stack iyi” diye bitirmek istemiyoruz. Çünkü bu doğru değil.

WordPress bize şunları öğretti:

  • Kullanıcı deneyimi her şeyden önemli — WordPress’in küresel olarak %43 pazar payına sahip olmasının nedeni teknik üstünlük değil, kullanım kolaylığı
  • Plugin mimarisinde düşün — HeyCaly’nin modüler yapısı (her entegrasyonun kendi lib/ klasöründe) WordPress’in plugin felsefesinden ilham alıyor
  • Geriye uyumluluk önemli — Migration tabanlı şema yönetimi, Stripe webhook versiyonlama — hepsi aynı prensip
  • Topluluk gücü — shadcn/ui, Radix, Tailwind — açık kaynak topluluk bileşenleri WordPress’in tema/plugin ekosisteminin modern karşılığı

WordPress projelerimiz hakkında daha fazla bilgi →

HeyCaly’yi yaparken, WordPress deneyimimiz en büyük avantajımızdı. Yıllarca edindiğimiz “kullanıcı nasıl düşünür” bilgisi hiçbir framework dokümantasyonunda yazılı değil.


Doğru İş İçin Doğru Araç

Bir müşteri kurumsal website istediğinde WordPress öneriyoruz. E-ticaret istediklerinde WooCommerce kuruyoruz. İçerik ağırlıklı, çok dilli platform istediklerinde WordPress + WPML sunuyoruz.

Ama ihtiyaç gerçek zamanlı AI, WhatsApp entegrasyonu, olay tabanlı arkaplan işleri ve çok kiracılı SaaS mimarisi olduğunda — Next.js, Supabase, Inngest ve Claude AI ile yapıyoruz.

Bu bir teknoloji savaşı değil. Doğru iş için doğru aracı kullanmakla ilgili.

The WP Clan olarak her iki dünyada da deneyimimiz var. Projenizin hangi dünyaya ait olduğunu birlikte çözelim.

Projeleriniz için iletişime geçin →


Kaynaklar ve İleri Okuma


Bu makale The WP Clan ekibi tarafından yazılmıştır. WordPress, headless CMS, SaaS geliştirme ve AI entegrasyonu için hizmetlerimize göz atın.

Bir yanıt yazın

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

Close Search Window