Tüm vaka çalışmaları

Vaka çalışması · Headless Odoo

Odoo 19 üzerinde headless mağaza ve B2B portalı

Kayıt sistemini yerinden oynatmadan Odoo 19'un önüne on dilli hızlı bir mağaza ve kimlik doğrulamalı bir B2B portalı nasıl koyduk — bunun için yazdığımız Odoo modülü ve ERP'yi halka açık internetten uzak tutan sunucu tarafı proxy ile.

Müşteri
VARS Su Ürünleri
Sektör
Su ürünleri ithalat ve dağıtım
Rolümüz
Mimari, Odoo modül geliştirme, frontend, SEO, dağıtım
Yıl
2026
VARS Su Ürünleri — Odoo 19 üzerinde headless mağaza ve B2B portalı

Sorun

VARS, kayıt sistemi olarak Odoo 19 Enterprise kullanıyor: ürünler, fiyatlar, stok, CRM, satış siparişleri ve gümrük belgeleri orada duruyor ve taşınması söz konusu değildi. Ticari ihtiyaç ise on dilde, uluslararası alıcıların bulabileceği kadar hızlı ve yapılandırılmış bir ihracat vitrini ile mevcut müşterilerin kendi siparişlerini ve belgelerini görebileceği bir portaldı.

Odoo'nun kendi website modülü bunu taşıyamazdı. On dilli bir kataloğu ERP üzerinden yayınlamak, pazarlama sitesinin hızını ve erişilebilirliğini ERP'nin hızına bağlar ve iş açısından kritik bir veritabanını doğrudan internete açar. Alternatif — kataloğu ayrı bir CMS'e kopyalamak — fiyat ve stok için iki ayrı doğruluk kaynağı yaratır ki ERP tam olarak bunu önlemek için vardır.

Karar: headless mimari, ERP proxy arkasında

Odoo'yu tek doğruluk kaynağı olarak koruduk ve önüne ayrı bir frontend koyduk. Genel katalog statik olarak üretiliyor ve hızlı HTML olarak sunuluyor; portal sayfaları ise tek bir müşterinin kendi verisini gösterdiği için istek bazında sunucuda render ediliyor. İkisi de aynı TanStack Start uygulamasından çalışıyor — bu ayrımı iki ayrı kod tabanı taşımadan yapabilmemizin sebebi bu.

Kritik kısıt şu: tarayıcı hiçbir zaman Odoo ile konuşmuyor. ERP'ye giden her çağrı, backend-for-frontend görevi gören bir sunucu fonksiyonundan geçiyor. Bu tek kural CORS yapılandırmasını tamamen ortadan kaldırıyor, Odoo oturum çerezini istemci tarafı script'ten uzak tutuyor ve ERP'nin dışarıdan erişilebilir olması gereğini ortadan kaldırıyor.

Güvenlik yaklaşımı

Riskin büyük kısmını üç karar taşıyor ve her biri teslim edilen depoda bir mimari karar kaydı olarak belgelenmiş durumda:

  • Lead girişleri yalnızca sunucuda tutulan bir bearer token ile doğrulanıyor. Tarayıcı kendi uç noktamıza gönderiyor, orada doğrulanıp filtreleniyor ve ardından Odoo'ya iletiliyor. Token istemciye hiç gitmiyor.
  • Müşteri kimlik doğrulaması Odoo'nun kendi oturumunu proxy'liyor: bilgiler sunucu fonksiyonuna gidiyor, Odoo doğruluyor ve dönen oturum kimliği HttpOnly, Secure, SameSite bir çerez olarak set ediliyor. Sayfadaki JavaScript bunu okuyamıyor.
  • Ödeme adımı Odoo'da taslak sipariş oluşturup alıcıyı Odoo'nun kendi ödeme portalına yönlendiriyor. Frontend'de ödeme SDK'sı ve webhook alıcısı yok; kart verisine hiç dokunmuyor ve PCI kapsamı dışında kalıyor.

Kurduğumuz entegrasyon katmanı

Frontend tek bir şeyle konuşuyor: bu proje için yazdığımız Odoo 19 modülü `varsco_content_api`. Frontend'in Odoo modellerine doğrudan uzanmasına izin vermek yerine sürümlenmiş bir `/api/v1` yüzeyi sunuyor; böylece iki sistem arasındaki sözleşme açık ve test edilebilir oluyor.

Kapsamı: genel katalog ve mağaza ürünleri, CRM'e token'lı lead yazımı, siparişler ve profil için oturum doğrulamalı portal uç noktaları, teslimat adresleri, favori listesi, ürün yorumları, bülten kaydı, sipariş takibi ve ödeme akışı — her biri modülün test paketinde kendi test dosyasıyla.

Tabloyu iki modül daha tamamlıyor: ödeme portalı bağlantısını üreten `midvex_sale_payment_link` ve gümrük ile lojistik belgelerini müşteri portalında gösteren `midvex_customs_op` — hazır hiçbir mağaza yazılımının karşılamadığı, dış ticarete özgü bir ihtiyaç.

On dil ve bunu dürüst tutan kontroller

Site, sağdan sola yazılan Arapça ve Farsça dahil olmak üzere 45 route dosyası üzerinde on dilde yayında. Çeviri kapsamı iyi niyete bırakılmış değil: build, yanlış dile karışan alfabe, kaçak emoji, eksik çeviri kapsamı, eksik makale çevirisi ve mağaza ile kaynak verisi arasındaki sapma durumlarında hata veren beş ayrı dil kontrolü çalıştırıyor.

Bunların yanında birim testleri, uçtan uca test paketi, ayrı bir erişilebilirlik paketi ve frontend'in kendi tiplerini ve şemalarını belgelenmiş API sözleşmesine sabitleyen bir sözleşme testi çalışıyor — böylece frontend'in beklediği ile mutabık kalınan arasındaki sapma canlıda değil CI'da yakalanıyor.

CRM'e kadar ulaşan atıf

Her form gönderimi, kendisini üreten sayfayı, dili ve kampanya parametrelerini yakalıyor; API modülü de kampanya, kaynak, mecra, ülke ve dili Odoo lead kaydındaki gerçek CRM alanlarına yazıyor, geldiği sayfayı da kaydın üzerine işliyor. Pratik sonucu şu: pipeline'daki bir fırsat, onu üreten sayfaya ve dile kadar geri izlenebiliyor — çoğu B2B sitesinin iddia ettiği ama pek azının gerçekten kurduğu ölçüm.

Teknoloji ve entegrasyon yüzeyi

  • Odoo 19 Enterprise — kayıt sistemi (ürün, fiyat, stok, CRM, sipariş, gümrük)
  • varsco_content_api — sürümlenmiş /api/v1 sözleşmesi sunan özel Odoo 19 modülü
  • midvex_sale_payment_link · midvex_customs_op — özel Odoo modülleri
  • TanStack Start (React 19 + Vite) — statik mağaza, sunucuda render edilen portal, BFF proxy
  • TanStack Query · TanStack Router · Tailwind CSS · strict TypeScript
  • Vitest · Playwright · erişilebilirlik paketi · API sözleşme testi · beş dil kontrolü
  • Docker, Dokploy üzerinde dağıtım

Teslim edilenler

  • Odoo 19'a bağlı çalışan on dilli genel mağaza ve kimlik doğrulamalı B2B müşteri portalı — fiyat ve stok için ikinci bir doğruluk kaynağı olmadan.
  • Artık dışarıya açık olması gerekmeyen bir Odoo kurulumu ve PCI kapsamı dışında kalan bir frontend.
  • CRM'deki her talebin kendisini üreten sayfayı, dili ve kampanyayı taşıdığı bir lead akışı.
  • Bilinçli olarak yeniden kullanılabilir bir entegrasyon katmanı: yeni bir müşteri sitesi, aynı modülü çalıştıran bir Odoo'ya yöneltilmiş yeni bir frontend demek — sıfırdan yazım değil.

Trafik ve dönüşüm rakamları bilinçli olarak yok. Analitik, Eylül 2026'dan önce canlı build'de aktif değildi; o dönem için verilecek herhangi bir rakam uydurma olurdu. Ölçülmüş sonuçlar, arkalarında tam bir raporlama dönemi biriktiğinde buraya eklenecek.

Sonraki faz

Pazaryeri sipariş akışı: Türk pazaryerlerinden gelen siparişlerin, mağaza ve portal siparişleriyle aynı Odoo hattına düşmesi.

Headless ticaretOdoo ERPÖzel Odoo modülleriMüşteri portallarıÖzel iş sistemleriSEOSu ürünleriDış ticaret

İnternete açamayacağınız bir ERP mi işletiyorsunuz?

Headless bir kurulumun mantıklı olmasının en yaygın sebebi budur. Kayıt sisteminizin ne olduğunu ve önünde neye ihtiyacınız olduğunu anlatın.