SaaS ürünlerinin %71’i artık embedded analytics (uygulama içine gömülü analitik) sunuyor (Gartner 2026). Müşterinin “kendi verilerini görmek için harici bir BI aracına gitmek” zamanı bitti; dashboard’lar, raporlar, custom drill-down’lar artık ürünün doğal bir parçası. Doğru embedded analytics stratejisi (Cube.js/Cube Cloud + ClickHouse/DuckDB + ücretli görselleştirme) %32 daha yüksek upsell oranı ve %26 daha düşük churn sağlıyor (OpenView SaaS Benchmark, 2025). Türkiye’deki SaaS ürünlerin %44’ü 2026 itibarıyla en az 5 dashboard sunuyor; analytic uçları olmayan ürünler enterprise satışta belirgin dezavantajlı.
Bu rehberde modern embedded analytics mimarisini, açık kaynak ve commercial seçenekleri, performans benchmark’larını ve maliyet kalemlerini somut sayılarla aktaracağız.
Embedded Analytics Bileşenleri
- OLAP veritabanı: ClickHouse, DuckDB, BigQuery — analytic sorgu motoru.
- Semantic layer: Cube.js, dbt Semantic Layer, Hex.
- API/Query gateway: Cube.js REST/GraphQL/SQL.
- Görselleştirme: Recharts, ECharts, Plotly, Tremor (UI components).
- Cache + materialized view: Pre-aggregation, Redis cache.
- Multi-tenant security: Row-level security, tenant isolation.
Semantic Layer: Cube.js
Cube.js, modern embedded analytics ekosisteminin “kalbi”. Görselleştirme katmanı ile veritabanı arasında bir semantic layer kurar:
- Veri modelleme: SQL’i kod (JS/YAML) olarak yazıyorsun (cube’lar).
- Measures + Dimensions: “Sipariş sayısı”, “Toplam gelir” gibi metric’leri tanımlıyorsun.
- Joins: Tablolar arası ilişkiler.
- Pre-aggregation: Sık sorgulanan ölçütler önceden hesaplanır.
- Tenant isolation: Her tenant’ın görebileceği veri otomatik filtrelenir.
- API: REST, GraphQL, SQL — frontend bunu kullanır.
Örnek Cube Tanımı
Bir sipariş cube’unda tipik tanımlar (pseudo):
- Measure:
count,totalAmount,avgAmount. - Dimension:
status,customerId,createdAt(zaman). - Time dimensions: granularity by day, week, month.
- SQL Filter:
tenant_id = ${SECURITY_CONTEXT.tenantId}. - Pre-aggregation:
{measures: ["count","totalAmount"], dimensions:["status"], granularity:"day"}.

Veritabanı Seçimi
| Veritabanı | Best for | Aylık Maliyet (100M satır) |
|---|---|---|
| ClickHouse (self-hosted) | Yüksek hacim OLAP, billions of rows | 10.000-30.000 TL |
| ClickHouse Cloud | Managed, otomatik scaling | 30.000-90.000 TL |
| DuckDB (embedded) | < 100GB data, in-app analytics | 0 (lokal) |
| BigQuery | Petabayt ölçek, serverless | Sorgu bazlı (5 USD/TB scan) |
| Snowflake | Enterprise, multi-cluster | 2-10 credits/saat (~50-300 USD) |
| TimescaleDB | Time-series + relational | 15.000-45.000 TL |
Polyglot persistence stratejisi açısından bu seçim çoklu veritabanı stratejisi rehberimizde derinleşiyor; CDC ile PostgreSQL → ClickHouse akıtma için PostgreSQL CDC + Debezium içeriğimiz kaynak.
Performans Hedefleri
- Dashboard ilk yükleme: ≤ 1,5 saniye
- Filter/drill-down sorgu: ≤ 500 ms (p95)
- 1M satır üzerinde aggregation: ≤ 200 ms (pre-aggregation ile)
- Concurrent kullanıcı: 500-5.000
- Cache hit rate: ≥ %75

Pre-Aggregation: Performansın Sırrı
Her sorguda 100M satır taramak yerine, sık kullanılan agregasyonlar önceden hesaplanır:
- Günlük revenue trend (1.000 satır) — 100M satır yerine.
- Müşteri segment’i bazlı conversion oranı.
- Ülke + product category bazlı top sellers.
- Otomatik refresh: 5 dk, 1 saat, gece batch.
- Incremental refresh: sadece yeni veri eklenir.
Pre-aggregation ile sorgu süresi 30-200x hızlanır; ölçeklendirilmiş bir SaaS analitiğinin temel garantisi.
Multi-Tenancy: Veri İzolasyonu
Müşteri A, müşteri B’nin verisini görmemeli. Cube.js’in tenant security context yaklaşımı:
- JWT token’ından
tenant_idçıkarılır. - Her sorguya otomatik
WHERE tenant_id = Xeklenir. - Pre-aggregation tenant başına ayrı.
- API katmanında double-check (frontend manipulate edemez).
- Audit log: her dashboard isteği kaydedilir (KVKK gerekliliği için kritik).

Görselleştirme Kütüphaneleri
| Kütüphane | Framework | Bundle | Best for |
|---|---|---|---|
| Recharts | React | 97 KB | Basit, hızlı başlangıç |
| ECharts | Framework-agnostic | 200-400 KB | Karmaşık, çok grafik tipi |
| Plotly.js | Framework-agnostic | 3 MB | Bilimsel, 3D, harita |
| Tremor | React (Tailwind) | 180 KB | Dashboard component sistemi |
| Apache Superset (embed) | iframe | — | Tam BI çözüm gömme |
| Metabase (embed) | iframe | — | Hızlı kurulum, no-code |
Üretim Mimarisi: Tipik Stack
- Frontend: React + Tremor + Recharts.
- Backend: Cube.js (Node.js) — self-hosted veya Cube Cloud.
- OLAP: ClickHouse Cloud (managed) veya self-hosted.
- Source data: PostgreSQL → CDC → ClickHouse (Debezium).
- Cache: Redis (Cube.js pre-aggregation cache).
- Auth: JWT (tenant context).
Frontend state management mimarisi için state management rehberimize, API katmanı için gRPC vs REST vs GraphQL içeriğimize bakabilirsiniz.
Türkiye Özelinde Pratik Notlar
- KVKK + dashboard: Müşteriye gösterilen agregasyonlarda kişisel veri olmamalı; aggregation sonrası anonymize edilmiş veri ekrana çıkmalı.
- Veri lokasyonu: ClickHouse Cloud Frankfurt EU üzerinden hızlı; Türkiye lokasyonu gerekirse self-hosted İstanbul DC + İstanbul AWS EC2 alternatif.
- Embedded vs harici Metabase: Türkiye’deki büyük müşteriler kendi BI takımları varsa harici embed (iframe + SSO); küçük müşteriler embedded native UX bekliyor.
- Maliyet hesabı: 0-5K MAU’da ClickHouse self-hosted en ekonomik (15-30K TL/ay); üzerinde Cube Cloud + ClickHouse Cloud operasyonel yükü düşürür.
- Eğitim ürünleri: EdTech ve LMS ürünlerinde öğrenci/öğretmen progress dashboard’ları için Cube.js + Tremor 2-3 haftada production-ready.
Maliyet ve Süre
| Kapsam | Süre | Maliyet (TL) |
|---|---|---|
| MVP: 3-5 dashboard, basit cube’lar | 2-3 ay | 250.000-450.000 |
| Orta: 10-20 dashboard, drill-down, filter | 4-6 ay | 600.000-1.100.000 |
| Enterprise: 30+ dashboard, custom widget, multi-tenant | 8-12 ay | 1.400.000-2.700.000 |
| Aylık operasyon | — | 20.000-80.000 |
Anti-Pattern ve Yaygın Hatalar
- Production OLTP’den direct sorgu: Dashboard işlemler PostgreSQL’i kilitler. Mutlaka CDC ile ayrı OLAP’a aktarın.
- Pre-aggregation yok: Her isteği 100M satır taramak — saniyeler süren dashboard’lar.
- Tenant kontrolü frontend’de: Frontend SQL veya filter manipüle edilebilir; sunucu tarafı zorunlu.
- Çok dashboard, az kullanılan: 30 dashboard’tan 3’ü kullanılıyor — gerisini geri çek, bakım yükü düşür.
- Cache invalidation eksik: Müşteri yeni veri ekledi, dashboard 1 saat eski veri gösteriyor.
- Sonsuz drill-down: Kullanıcı 7 seviye drill yapabiliyor; cardinality patlaması.
Sık Sorulan Sorular
Embedded mı yoksa harici BI (Metabase, Looker)?
Müşteri data analist değilse embedded — basit, native UX. İleri-düzey analiz isteyen kurumsal müşteriler için Metabase/Looker entegrasyonu (SSO ile gömülü iframe).
Cube.js vs dbt Semantic Layer?
Cube.js: SaaS uygulamasına entegre analytic için. dbt Semantic Layer: data warehouse + BI senaryoları için. SaaS ürün geliştiriyorsanız Cube.js seç.
ClickHouse’a veri nasıl taşınır?
CDC (Debezium → Kafka → ClickHouse Connector) veya batch ETL (dbt + Airflow). Yüksek hacim + düşük gecikme için CDC tercih edilir.
DuckDB’yi browser’da çalıştırmak mümkün mü?
Evet, DuckDB-WASM tarayıcıda çalışır. 100MB-1GB veri için pratik. Sunucu kullanmadan tamamen client-side analytic. Hex, Motherduck gibi servisler bunu kullanıyor.
Real-time dashboard mu, hourly refresh mi?
Trade-off: real-time (saniyelik) pre-aggregation devre dışı + sorgu maliyeti yüksek; hourly refresh maliyet/performans dengesi en iyi. Operational dashboard real-time, executive overview saatlik makul.
Ömer Önal’dan pratik not: Türkiye’deki SaaS ekiplerine embedded analytics konusunda danışmanlık verdiğimde gördüğüm en yaygın hata, “müşterilerin istediği her grafiği eklemek” tuzağı. 30 dashboard’tan 25’i kullanılmaz; her biri ekibe bakım yükü olarak kalır. Doğru yaklaşım: 3-5 yüksek değerli dashboard ile başla, kullanım metriklerini sıkı takip et, hangi widget açılıyor + hangisi açılmıyor ölç. 6 ay sonra “ne işe yaradı” datasıyla dashboard portföyünü budayın. İkinci pratik: ilk gün Cube.js semantic layer’ı kurmaya yatırım yapın — SQL’i komponent komponent yazmak 6 ay sonra teknik borç. Üçüncüsü: pre-aggregation strateji günlük operasyonun ayrılmaz parçası — ekibin DBA’i veya analytics engineer’ı bu pre-agg’leri build/refresh edebilmeli, frontend ekibi değil. Sizin SaaS ürününüzde şu an embedded dashboard var mı, varsa kullanım oranı ne, yoksa roadmap’in neresinde?
Sonuç
Embedded analytics, modern SaaS’ın rekabet farklılığı. Doğru tasarım (Cube.js + ClickHouse + Tremor) ile dashboard yükleme süresi ≤ 1,5 saniye, upsell oranı %32 artar, churn %26 azalır. Açık kaynak stack ile başlamak, ürün-pazar uyumunu kanıtladıkça managed çözümlere geçmek pragmatik yaklaşım. Tamamlayıcı içerikler: polyglot persistence, database sharding, event-driven mimari ve frontend state management. İletişim formundan projeniz için analytic mimari değerlendirme talep edebilirsiniz.
Dış otorite kaynaklar: Cube.js · ClickHouse · DuckDB · Tremor










Ömer ÖNAL
Mayıs 17, 2026Türkiye’de SaaS ürünlerine embedded analytics ekleyen ekiplere danışmanlık verdiğimde gördüğüm en yaygın yanlış, doğrudan ürün veritabanından (OLTP) dashboard sorgusu çalıştırmak. 100K kayıt seviyesinde sorun yok ama 5-10M’e ulaştığında PostgreSQL primary’sini kilitleyen analytic query’ler customer-facing endpoint’lerin timeout’una sebep oluyor. Doğru disiplin: gün 1’den OLTP → CDC → OLAP ayrımını planlamak. ClickHouse veya DuckDB Cloud devreye girince ekip biraz fazla iş gibi görse de, 12 ay sonra customer revenue dashboard’u 800 ms’de açılıyor ve müşteri churn’ü düşüyor. İkinci pratik: Cube.js semantic layer’ı geliştirmenin uzun vadeli avantajı, her ekipten bir analist veya backend dev SQL yazabiliyor olması — UI ekibinin “şu metric şöyle hesaplanmalıymış” çevirisinden çıkıyorsunuz. Üçüncüsü: pre-aggregation strategy hayati. Cube.js veya kendi materialized view’lerinizle 5 dk-1 saat refresh aralığı yeterli; “real-time olsun” diye pre-agg’leri devre dışı bırakırsanız 6 ay sonra OLAP cluster maliyetiniz 5x artar. Sizin ürününüzde dashboard analytics şu an OLTP’den mi geliyor, yoksa ayrı bir OLAP store devrede mi?