{"id":42898,"date":"2026-06-28T09:05:18","date_gmt":"2026-06-28T06:05:18","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/"},"modified":"2026-06-28T09:05:18","modified_gmt":"2026-06-28T06:05:18","slug":"firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/","title":{"rendered":"Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli"},"content":{"rendered":"<h2>Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda kendi e-ticaret sitenizi kurmak m\u0131 istiyorsunuz? Haz\u0131r platformlar\u0131n sundu\u011fu s\u0131n\u0131rlamalar yerine, tamamen size \u00f6zel bir \u00e7\u00f6z\u00fcm aray\u0131\u015f\u0131nda m\u0131s\u0131n\u0131z? Firebase&#8217;in g\u00fcc\u00fcyle s\u0131f\u0131rdan, esnek ve \u00f6l\u00e7eklenebilir bir e-ticaret platformu nas\u0131l olu\u015fturulur, \u00fcr\u00fcn kataloglar\u0131n\u0131 nas\u0131l y\u00f6netir, atomik sipari\u015fleri nas\u0131l i\u015fler ve g\u00fc\u00e7l\u00fc bir y\u00f6netim paneli nas\u0131l kurars\u0131n\u0131z, bu makalede ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Bu rehber, kendi dijital ma\u011fazan\u0131z\u0131 in\u015fa etme yolculu\u011funuzda size yol g\u00f6sterecek.<\/p>\n<h2>Neden \u00d6zel Bir E-ticaret \u00c7\u00f6z\u00fcm\u00fc ve Firebase Kullanmal\u0131s\u0131n\u0131z?<\/h2>\n<p>E-ticaret d\u00fcnyas\u0131 h\u0131zla b\u00fcy\u00fcrken, bir\u00e7ok i\u015fletme Shopify, WooCommerce gibi haz\u0131r platformlara y\u00f6neliyor. Bu platformlar h\u0131zl\u0131 ba\u015flang\u0131\u00e7 i\u00e7in harika olsa da, zamanla kar\u015f\u0131la\u015f\u0131lan \u00f6zelle\u015ftirme k\u0131s\u0131tlamalar\u0131, performans sorunlar\u0131 veya artan maliyetler i\u015fletmeleri daha esnek \u00e7\u00f6z\u00fcmlere itebilir. \u00d6zellikle ni\u015f bir pazara hitap eden, benzersiz bir kullan\u0131c\u0131 deneyimi sunmak isteyen veya karma\u015f\u0131k i\u015f s\u00fcre\u00e7lerine sahip firmalar i\u00e7in \u00f6zel bir e-ticaret \u00e7\u00f6z\u00fcm\u00fc vazge\u00e7ilmez hale gelir.<\/p>\n<p>\u0130\u015fte tam da bu noktada, \u00f6zel bir e-ticaret platformu geli\u015ftirmenin avantajlar\u0131 ortaya \u00e7\u0131kar. Kendi \u00e7\u00f6z\u00fcm\u00fcn\u00fcz\u00fc in\u015fa ederek, marka kimli\u011finize tamamen uygun bir tasar\u0131m olu\u015fturabilir, i\u015f s\u00fcre\u00e7lerinize birebir uyan \u00f6zellikler ekleyebilir ve gelecekteki b\u00fcy\u00fcme hedeflerinize g\u00f6re kolayca \u00f6l\u00e7eklendirebilirsiniz. Haz\u0131r platformlarda m\u00fcmk\u00fcn olmayan entegrasyonlar\u0131 rahatl\u0131kla yapabilir, veri g\u00fcvenli\u011fi ve sahipli\u011fi konusunda tam kontrol sahibi olabilirsiniz. Ancak bu t\u00fcr bir geli\u015ftirme genellikle y\u00fcksek maliyetli ve zaman al\u0131c\u0131 bir s\u00fcre\u00e7 olarak g\u00f6r\u00fcl\u00fcr. \u0130\u015fte burada Firebase devreye giriyor ve bu alg\u0131y\u0131 k\u00f6kten de\u011fi\u015ftiriyor.<\/p>\n<p>Firebase, Google taraf\u0131ndan geli\u015ftirilen, mobil ve web uygulamalar\u0131 geli\u015ftirmek i\u00e7in bir dizi servis sunan bir uygulama geli\u015ftirme platformudur (Application Development Platform). Sunucusuz (serverless) mimarisi sayesinde altyap\u0131 y\u00f6netimiyle u\u011fra\u015fmadan, uygulaman\u0131z\u0131n temel i\u015flevlerine odaklanman\u0131z\u0131 sa\u011flar. E-ticaret projeleri i\u00e7in Firebase&#8217;i tercih etmek, bir\u00e7ok a\u00e7\u0131dan stratejik bir karard\u0131r. \u00d6l\u00e7eklenebilirlik, Firebase&#8217;in en b\u00fcy\u00fck avantajlar\u0131ndan biridir. Uygulaman\u0131z\u0131n kullan\u0131c\u0131 say\u0131s\u0131 veya veri hacmi ne kadar artarsa arts\u0131n, Firebase altyap\u0131s\u0131 bu y\u00fck\u00fc otomatik olarak y\u00f6netir. Bu, \u00f6zellikle indirim d\u00f6nemleri veya \u00f6zel kampanyalar gibi yo\u011fun trafik beklenen zamanlarda kritik bir \u00f6neme sahiptir.<\/p>\n<p>Firebase&#8217;in sundu\u011fu h\u0131zl\u0131 geli\u015ftirme imkan\u0131 da g\u00f6z ard\u0131 edilemez. \u00d6nceden olu\u015fturulmu\u015f bir\u00e7ok mod\u00fcl ve kolay entegrasyon yetenekleri sayesinde, geli\u015ftirme s\u00fcre\u00e7leri \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131sal\u0131r. Bu, pazar dinamiklerine daha h\u0131zl\u0131 adapte olman\u0131z\u0131 ve yeni \u00f6zellikleri daha \u00e7abuk devreye alman\u0131z\u0131 sa\u011flar. Ayr\u0131ca, ba\u015flang\u0131\u00e7 maliyetleri a\u00e7\u0131s\u0131ndan da olduk\u00e7a avantajl\u0131d\u0131r. Kullan\u0131m bazl\u0131 fiyatland\u0131rma modeli sayesinde, sadece kulland\u0131\u011f\u0131n\u0131z kaynaklar i\u00e7in \u00f6deme yapars\u0131n\u0131z. Bu, \u00f6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli i\u015fletmeler i\u00e7in b\u00fcy\u00fck bir esneklik sunar. K\u0131sacas\u0131, Firebase ile \u00f6zel bir e-ticaret platformu geli\u015ftirmek, hem maliyet etkinli\u011fi hem de esneklik a\u00e7\u0131s\u0131ndan modern i\u015fletmeler i\u00e7in g\u00fc\u00e7l\u00fc bir alternatiftir.<\/p>\n<h3>Firebase&#8217;in Temel Bile\u015fenleri Nelerdir ve E-ticarette Nas\u0131l Kullan\u0131l\u0131r?<\/h3>\n<p>Firebase ekosistemi, e-ticaret uygulaman\u0131z\u0131n her katman\u0131n\u0131 destekleyebilecek zengin bir servis yelpazesi sunar. Bu servislerin her biri, uygulaman\u0131z\u0131n belirli bir ihtiyac\u0131n\u0131 kar\u015f\u0131lamak \u00fczere tasarlanm\u0131\u015ft\u0131r. Bu bile\u015fenleri do\u011fru bir \u015fekilde anlamak ve entegre etmek, ba\u015far\u0131l\u0131 bir e-ticaret platformu in\u015fa etmenin anahtar\u0131d\u0131r.<\/p>\n<ul>\n<li>\n            <strong>Firestore (Cloud Firestore)<\/strong>: Bu, Firebase&#8217;in NoSQL veritaban\u0131d\u0131r. E-ticaret uygulaman\u0131z\u0131n t\u00fcm yap\u0131sal verilerini depolamak i\u00e7in idealdir. \u00dcr\u00fcn listeleri, kullan\u0131c\u0131 profilleri, sipari\u015f ge\u00e7mi\u015fleri, kategori bilgileri, sepet i\u00e7erikleri ve y\u00f6netim paneli ayarlar\u0131 gibi veriler Firestore&#8217;da g\u00fcvenli ve \u00f6l\u00e7eklenebilir bir \u015fekilde saklanabilir. Ger\u00e7ek zamanl\u0131 senkronizasyon \u00f6zelli\u011fi sayesinde, bir \u00fcr\u00fcn\u00fcn stok bilgisi g\u00fcncellendi\u011finde veya yeni bir sipari\u015f geldi\u011finde, bu de\u011fi\u015fiklikler an\u0131nda ilgili aray\u00fczlere yans\u0131t\u0131labilir. Bu, hem m\u00fc\u015fteri hem de y\u00f6netici deneyimi a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck bir avantajd\u0131r. \u00d6rne\u011fin, bir \u00fcr\u00fcn\u00fcn stok adedi azald\u0131\u011f\u0131nda, an\u0131nda web sitenizde &#8220;Son 3 \u00fcr\u00fcn!&#8221; gibi bir uyar\u0131 g\u00f6sterebilirsiniz.\n        <\/li>\n<li>\n            <strong>Authentication (Firebase Authentication)<\/strong>: Kullan\u0131c\u0131lar\u0131n uygulaman\u0131za g\u00fcvenli bir \u015fekilde giri\u015f yapmas\u0131n\u0131 ve kaydolmas\u0131n\u0131 sa\u011flar. E-posta\/\u015fifre, Google, Facebook, Apple gibi \u00e7e\u015fitli kimlik do\u011frulama y\u00f6ntemlerini destekler. E-ticaret sitenizde kullan\u0131c\u0131lar\u0131n hesap olu\u015fturmas\u0131, sipari\u015flerini takip etmesi ve ki\u015fiselle\u015ftirilmi\u015f bir deneyim ya\u015famas\u0131 i\u00e7in bu servis kritik \u00f6neme sahiptir. Y\u00f6netim paneli i\u00e7in de farkl\u0131 y\u00f6netici rolleri tan\u0131mlayarak yetkilendirme s\u00fcre\u00e7lerini kolayla\u015ft\u0131r\u0131r.\n        <\/li>\n<li>\n            <strong>Cloud Storage for Firebase<\/strong>: \u00dcr\u00fcn g\u00f6rselleri, banner resimleri, video tan\u0131t\u0131mlar\u0131 ve di\u011fer medya dosyalar\u0131 gibi b\u00fcy\u00fck boyutlu dosyalar\u0131 depolamak i\u00e7in kullan\u0131l\u0131r. Bu servis, y\u00fcksek performansl\u0131 ve k\u00fcresel olarak da\u011f\u0131t\u0131lm\u0131\u015f bir depolama \u00e7\u00f6z\u00fcm\u00fc sunar. E-ticaret sitenizdeki \u00fcr\u00fcn g\u00f6rsellerinin h\u0131zl\u0131 y\u00fcklenmesi, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan \u00e7ok \u00f6nemlidir ve Cloud Storage bu ihtiyac\u0131 m\u00fckemmel bir \u015fekilde kar\u015f\u0131lar. \u00dcr\u00fcnlerinizi g\u00f6rsel olarak zenginle\u015ftirmek i\u00e7in bu servisten faydalanabilirsiniz.\n        <\/li>\n<li>\n            <strong>Cloud Functions for Firebase<\/strong>: Sunucusuz kod \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flayan bir hizmettir. Belirli bir olay (\u00f6rne\u011fin, yeni bir sipari\u015f olu\u015fturuldu\u011funda veya bir \u00fcr\u00fcn\u00fcn sto\u011fu g\u00fcncellendi\u011finde) tetiklendi\u011finde otomatik olarak \u00e7al\u0131\u015fan kod par\u00e7ac\u0131klar\u0131 yazabilirsiniz. Bu, e-ticaret uygulaman\u0131zdaki karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131n\u0131 (\u00f6rne\u011fin, atomik sipari\u015f i\u015fleme, stok g\u00fcncelleme, \u00f6deme entegrasyonu, e-posta g\u00f6nderimi) g\u00fcvenli ve verimli bir \u015fekilde y\u00fcr\u00fctmek i\u00e7in idealdir. \u00d6rne\u011fin, bir sipari\u015f tamamland\u0131\u011f\u0131nda otomatik olarak m\u00fc\u015fteriye bir onay e-postas\u0131 g\u00f6nderebilir veya stoktan d\u00fc\u015fme i\u015flemini ger\u00e7ekle\u015ftirebilirsiniz.\n        <\/li>\n<li>\n            <strong>Firebase Hosting<\/strong>: Web sitenizi ve tek sayfal\u0131k uygulamalar\u0131n\u0131z\u0131 (SPA) h\u0131zl\u0131 ve g\u00fcvenli bir \u015fekilde bar\u0131nd\u0131rman\u0131z\u0131 sa\u011flar. K\u00fcresel bir i\u00e7erik da\u011f\u0131t\u0131m a\u011f\u0131 (CDN) sayesinde, kullan\u0131c\u0131lar\u0131n\u0131z nerede olursa olsun siteniz h\u0131zl\u0131 y\u00fcklenir. E-ticaret sitenizin \u00f6n y\u00fcz\u00fcn\u00fc (frontend) bu servis \u00fczerinden kolayca yay\u0131nlayabilirsiniz.\n        <\/li>\n<li>\n            <strong>Firebase Cloud Messaging (FCM)<\/strong>: Kullan\u0131c\u0131lara bildirimler g\u00f6ndermek i\u00e7in kullan\u0131l\u0131r. Sipari\u015f durumu g\u00fcncellemeleri, kampanya duyurular\u0131 veya terk edilmi\u015f sepet hat\u0131rlatmalar\u0131 gibi bildirimleri mobil ve web uygulamalar\u0131n\u0131za an\u0131nda iletebilirsiniz. Bu, m\u00fc\u015fteri etkile\u015fimini art\u0131rmak ve sat\u0131\u015flar\u0131 te\u015fvik etmek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/li>\n<\/ul>\n<p>Bu temel bile\u015fenler, bir araya geldi\u011finde g\u00fc\u00e7l\u00fc, esnek ve \u00f6l\u00e7eklenebilir bir e-ticaret altyap\u0131s\u0131 olu\u015fturman\u0131za olanak tan\u0131r. Her bir servisin kendine \u00f6zg\u00fc avantajlar\u0131, geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131r\u0131rken, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve g\u00fcvenli\u011fini art\u0131r\u0131r. Firebase&#8217;in sundu\u011fu bu entegre yap\u0131, modern e-ticaret projeleri i\u00e7in ger\u00e7ekten e\u015fsiz bir \u00e7\u00f6z\u00fcm sunmaktad\u0131r.<\/p>\n<h2>\u00dcr\u00fcn Katalo\u011fu Y\u00f6netimi: Firebase Firestore ile Veri Yap\u0131s\u0131 Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Her e-ticaret platformunun kalbinde, iyi yap\u0131land\u0131r\u0131lm\u0131\u015f ve y\u00f6netilebilir bir \u00fcr\u00fcn katalo\u011fu bulunur. \u00dcr\u00fcnlerinizin do\u011fru bir \u015fekilde saklanmas\u0131, kategorize edilmesi ve sunulmas\u0131, hem m\u00fc\u015fteri deneyimi hem de y\u00f6netim kolayl\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. Firebase Firestore, bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in esnek ve \u00f6l\u00e7eklenebilir bir NoSQL veritaban\u0131 sunar. \u00dcr\u00fcnlerinizi, kategorilerinizi ve hatta markalar\u0131n\u0131z\u0131 Firestore&#8217;da nas\u0131l modelleyece\u011fimizi ve y\u00f6netece\u011fimizi ad\u0131m ad\u0131m inceleyelim.<\/p>\n<p>\u00d6ncelikle, \u00fcr\u00fcnleriniz i\u00e7in bir veri modeli (data model) olu\u015fturmal\u0131y\u0131z. Firestore&#8217;da veriler koleksiyonlar (collections) ve belgeler (documents) \u015feklinde organize edilir. Her belge, anahtar-de\u011fer \u00e7iftlerinden olu\u015fan bir dizi alan (fields) i\u00e7erir. E-ticaret \u00fcr\u00fcnleri i\u00e7in genellikle a\u015fa\u011f\u0131daki gibi bir yap\u0131 tercih edilir:<\/p>\n<ul>\n<li><strong><code>urunler<\/code> koleksiyonu:<\/strong> Her bir belge bir \u00fcr\u00fcn\u00fc temsil eder.<\/li>\n<ul>\n<li><code>id<\/code>: \u00dcr\u00fcn\u00fcn benzersiz kimli\u011fi (Firestore otomatik olarak atar).<\/li>\n<li><code>ad<\/code>: \u00dcr\u00fcn\u00fcn ad\u0131 (\u00f6rne\u011fin, &#8220;Ak\u0131ll\u0131 Telefon X Pro&#8221;).<\/li>\n<li><code>aciklama<\/code>: \u00dcr\u00fcn\u00fcn detayl\u0131 a\u00e7\u0131klamas\u0131.<\/li>\n<li><code>fiyat<\/code>: \u00dcr\u00fcn\u00fcn sat\u0131\u015f fiyat\u0131 (say\u0131sal).<\/li>\n<li><code>indirimliFiyat<\/code>: Varsa indirimli fiyat\u0131 (iste\u011fe ba\u011fl\u0131, say\u0131sal).<\/li>\n<li><code>stokAdedi<\/code>: \u00dcr\u00fcn\u00fcn mevcut stok adedi (say\u0131sal).<\/li>\n<li><code>gorseller<\/code>: \u00dcr\u00fcn g\u00f6rsellerinin Cloud Storage URL&#8217;lerini i\u00e7eren bir dizi (array).<\/li>\n<li><code>kategoriId<\/code>: \u00dcr\u00fcn\u00fcn ait oldu\u011fu kategorinin kimli\u011fi (referans).<\/li>\n<li><code>markaId<\/code>: \u00dcr\u00fcn\u00fcn markas\u0131n\u0131n kimli\u011fi (referans).<\/li>\n<li><code>ozellikler<\/code>: Boyut, renk, materyal gibi ek \u00f6zellikleri i\u00e7eren bir harita (map).<\/li>\n<li><code>yayinlandi<\/code>: \u00dcr\u00fcn\u00fcn yay\u0131nda olup olmad\u0131\u011f\u0131n\u0131 belirten bir boolean de\u011fer.<\/li>\n<li><code>olusturmaTarihi<\/code>: \u00dcr\u00fcn\u00fcn sisteme eklendi\u011fi tarih (Timestamp).<\/li>\n<li><code>guncellemeTarihi<\/code>: \u00dcr\u00fcn\u00fcn son g\u00fcncellendi\u011fi tarih (Timestamp).<\/li>\n<\/ul>\n<\/ul>\n<p>Bu yap\u0131, \u00fcr\u00fcnlerinize dair temel bilgileri bar\u0131nd\u0131r\u0131rken, ayn\u0131 zamanda kategori ve marka gibi di\u011fer varl\u0131klara referans vermenizi sa\u011flar. Benzer \u015fekilde, kategoriler ve markalar i\u00e7in de ayr\u0131 koleksiyonlar olu\u015fturabiliriz:<\/p>\n<ul>\n<li><strong><code>kategoriler<\/code> koleksiyonu:<\/strong><\/li>\n<ul>\n<li><code>id<\/code>: Kategorinin benzersiz kimli\u011fi.<\/li>\n<li><code>ad<\/code>: Kategori ad\u0131 (\u00f6rne\u011fin, &#8220;Elektronik&#8221;, &#8220;Giyim&#8221;).<\/li>\n<li><code>aciklama<\/code>: Kategori a\u00e7\u0131klamas\u0131 (iste\u011fe ba\u011fl\u0131).<\/li>\n<li><code>ustKategoriId<\/code>: \u00dcst kategorinin kimli\u011fi (alt kategoriler i\u00e7in).<\/li>\n<\/ul>\n<li><strong><code>markalar<\/code> koleksiyonu:<\/strong><\/li>\n<ul>\n<li><code>id<\/code>: Markan\u0131n benzersiz kimli\u011fi.<\/li>\n<li><code>ad<\/code>: Marka ad\u0131 (\u00f6rne\u011fin, &#8220;Samsung&#8221;, &#8220;Nike&#8221;).<\/li>\n<li><code>logoUrl<\/code>: Marka logosunun Cloud Storage URL&#8217;si.<\/li>\n<\/ul>\n<\/ul>\n<p>\u00dcr\u00fcn g\u00f6rsellerini Cloud Storage&#8217;da depolamak, Firestore&#8217;daki belge boyutunu optimize eder ve g\u00f6rsellerin h\u0131zl\u0131 y\u00fcklenmesini sa\u011flar. Firestore belgesine sadece g\u00f6rselin URL&#8217;sini kaydederek, veritaban\u0131 performans\u0131n\u0131 art\u0131r\u0131rs\u0131n\u0131z. G\u00f6rsel y\u00fckleme i\u015flemi genellikle kullan\u0131c\u0131n\u0131n y\u00f6netim panelinden bir g\u00f6rsel se\u00e7mesiyle ba\u015flar, bu g\u00f6rsel Cloud Storage&#8217;a y\u00fcklenir ve d\u00f6nen URL, ilgili \u00fcr\u00fcn belgesinin <code>gorseller<\/code> dizisine eklenir.<\/p>\n<p>Firestore&#8217;da veri ekleme, g\u00fcncelleme ve silme (CRUD) i\u015flemleri olduk\u00e7a basittir. \u0130\u015fte bir \u00fcr\u00fcn ekleme \u00f6rne\u011fi:<\/p>\n<div class=\"code-container\">\n<pre><code class=\"language-javascript\">\nimport { collection, addDoc, serverTimestamp } from \"firebase\/firestore\";\nimport { db } from \".\/firebaseConfig\"; \/\/ firebaseConfig dosyan\u0131zdan db objesini import edin\n\nasync function urunEkle(urunData) {\n  try {\n    const docRef = await addDoc(collection(db, \"urunler\"), {\n      ad: urunData.ad,\n      aciklama: urunData.aciklama,\n      fiyat: urunData.fiyat,\n      stokAdedi: urunData.stokAdedi,\n      gorseller: urunData.gorseller, \/\/ Array of image URLs\n      kategoriId: urunData.kategoriId,\n      markaId: urunData.markaId,\n      ozellikler: urunData.ozellikler || {},\n      yayinlandi: true,\n      olusturmaTarihi: serverTimestamp(), \/\/ Firestore sunucu zaman damgas\u0131\n      guncellemeTarihi: serverTimestamp(),\n    });\n    console.log(\"\u00dcr\u00fcn ba\u015far\u0131yla eklendi, ID: \", docRef.id);\n    return docRef.id;\n  } catch (e) {\n    console.error(\"\u00dcr\u00fcn eklenirken hata olu\u015ftu: \", e);\n    throw e;\n  }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi:\n\/\/ urunEkle({\n\/\/   ad: \"Yeni Model Ak\u0131ll\u0131 Saat\",\n\/\/   aciklama: \"En yeni \u00f6zelliklere sahip, \u015f\u0131k tasar\u0131m.\",\n\/\/   fiyat: 1999.90,\n\/\/   stokAdedi: 50,\n\/\/   gorseller: [\"https:\/\/firebasestorage.googleapis.com\/v0\/b\/...\", \"https:\/\/firebasestorage.googleapis.com\/v0\/b\/...\"],\n\/\/   kategoriId: \"elektronik\",\n\/\/   markaId: \"tech-brand\",\n\/\/   ozellikler: { renk: \"Siyah\", ekranBoyutu: \"1.5 in\u00e7\" }\n\/\/ });\n        <\/code><\/pre>\n<\/p><\/div>\n<p>Bu kod par\u00e7as\u0131, Firestore&#8217;a yeni bir \u00fcr\u00fcn belgesi eklerken, <code>serverTimestamp()<\/code> kullanarak sunucu taraf\u0131nda otomatik olarak olu\u015fturma ve g\u00fcncelleme tarihlerini kaydeder. Bu, tarih tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar ve istemci taraf\u0131 saat farkl\u0131l\u0131klar\u0131ndan kaynaklanabilecek sorunlar\u0131 \u00f6nler. \u00dcr\u00fcn katalo\u011funuzu bu \u015fekilde yap\u0131land\u0131rarak, hem esnek bir veri y\u00f6netimi sa\u011flar hem de gelecekteki b\u00fcy\u00fcme ve \u00f6zellik eklemeleri i\u00e7in sa\u011flam bir temel olu\u015fturursunuz.<\/p>\n<h3>Dinamik \u00dcr\u00fcn Listeleme ve Filtreleme Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Bir e-ticaret sitesinde kullan\u0131c\u0131lar\u0131n arad\u0131klar\u0131 \u00fcr\u00fcnleri kolayca bulabilmesi, al\u0131\u015fveri\u015f deneyiminin temelini olu\u015fturur. Firebase Firestore, g\u00fc\u00e7l\u00fc sorgulama yetenekleri sayesinde dinamik \u00fcr\u00fcn listelemeleri, kategoriye g\u00f6re filtrelemeler, fiyata g\u00f6re s\u0131ralamalar ve hatta arama i\u015flevselli\u011fi sunman\u0131za olanak tan\u0131r. Ger\u00e7ek zamanl\u0131 g\u00fcncellemelerle birle\u015fti\u011finde, bu \u00f6zellikler kullan\u0131c\u0131lar\u0131n\u0131za p\u00fcr\u00fczs\u00fcz ve etkile\u015fimli bir deneyim sunar.<\/p>\n<p>Firestore sorgular\u0131, belirli kriterlere uyan belgeleri alman\u0131z\u0131 sa\u011flar. \u00d6rne\u011fin, sadece &#8220;Elektronik&#8221; kategorisindeki \u00fcr\u00fcnleri listelemek veya fiyat\u0131 belirli bir aral\u0131kta olan \u00fcr\u00fcnleri g\u00f6stermek isteyebilirsiniz. \u0130\u015fte baz\u0131 temel sorgu \u00f6rnekleri:<\/p>\n<ul>\n<li><strong>T\u00fcm \u00fcr\u00fcnleri listeleme:<\/strong> Bir koleksiyondaki t\u00fcm belgeleri almak en temel sorgudur.<\/li>\n<li><strong>Kategoriye g\u00f6re filtreleme:<\/strong> <code>where()<\/code> metodu ile belirli bir alana g\u00f6re filtreleme yapabilirsiniz. \u00d6rne\u011fin, <code>kategoriId<\/code> alan\u0131 &#8220;elektronik&#8221; olan \u00fcr\u00fcnleri getirmek.<\/li>\n<li><strong>Fiyata g\u00f6re s\u0131ralama:<\/strong> <code>orderBy()<\/code> metodu ile \u00fcr\u00fcnleri fiyata g\u00f6re artan (asc) veya azalan (desc) s\u0131rada s\u0131ralayabilirsiniz.<\/li>\n<li><strong>Fiyat aral\u0131\u011f\u0131na g\u00f6re filtreleme:<\/strong> \u0130ki <code>where()<\/code> ko\u015fulu kullanarak belirli bir fiyat aral\u0131\u011f\u0131ndaki \u00fcr\u00fcnleri se\u00e7ebilirsiniz (\u00f6rne\u011fin, <code>fiyat &gt;= 100<\/code> ve <code>fiyat &lt;= 500<\/code>).<\/li>\n<li><strong>Stokta olan \u00fcr\u00fcnleri g\u00f6sterme:<\/strong> <code>stokAdedi &gt; 0<\/code> ko\u015fulu ile sadece stokta bulunan \u00fcr\u00fcnleri listeleyebilirsiniz.<\/li>\n<\/ul>\n<p>Firestore&#8217;un ger\u00e7ek zamanl\u0131 dinleme \u00f6zelli\u011fi, \u00fcr\u00fcn katalo\u011funuzdaki de\u011fi\u015fikliklerin an\u0131nda kullan\u0131c\u0131 aray\u00fcz\u00fcne yans\u0131mas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir y\u00f6netici bir \u00fcr\u00fcn\u00fcn fiyat\u0131n\u0131 g\u00fcncelledi\u011finde veya stok adedini de\u011fi\u015ftirdi\u011finde, bu de\u011fi\u015fiklikler an\u0131nda web sitesinde g\u00f6r\u00fcnt\u00fclenir. Bu, \u00f6zellikle h\u0131zl\u0131 de\u011fi\u015fen envantere sahip i\u015fletmeler i\u00e7in kritik bir \u00f6zelliktir. <code>onSnapshot()<\/code> metodu ile bu ger\u00e7ek zamanl\u0131 dinlemeyi kolayca uygulayabilirsiniz.<\/p>\n<div class=\"code-container\">\n<pre><code class=\"language-javascript\">\nimport { collection, query, where, orderBy, onSnapshot } from \"firebase\/firestore\";\nimport { db } from \".\/firebaseConfig\";\n\nfunction urunleriListele(kategoriId = null, siralama = \"fiyat\", siralamaYonu = \"asc\") {\n  let q = collection(db, \"urunler\");\n\n  if (kategoriId) {\n    q = query(q, where(\"kategoriId\", \"==\", kategoriId));\n  }\n  q = query(q, orderBy(siralama, siralamaYonu));\n  q = query(q, where(\"yayinlandi\", \"==\", true)); \/\/ Sadece yay\u0131ndaki \u00fcr\u00fcnleri g\u00f6ster\n\n  const unsubscribe = onSnapshot(q, (querySnapshot) => {\n    const urunler = [];\n    querySnapshot.forEach((doc) => {\n      urunler.push({ id: doc.id, ...doc.data() });\n    });\n    console.log(\"G\u00fcncel \u00dcr\u00fcnler:\", urunler);\n    \/\/ Burada \u00fcr\u00fcnleri UI'da g\u00f6sterecek kodu \u00e7al\u0131\u015ft\u0131rabilirsiniz\n  }, (error) => {\n    console.error(\"\u00dcr\u00fcn listelenirken hata olu\u015ftu:\", error);\n  });\n\n  return unsubscribe; \/\/ Dinlemeyi durdurmak i\u00e7in kullan\u0131labilir\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi:\n\/\/ const unsubscribe = urunleriListele(\"elektronik\", \"fiyat\", \"desc\");\n\/\/ 10 saniye sonra dinlemeyi durdurmak i\u00e7in:\n\/\/ setTimeout(() => {\n\/\/   unsubscribe();\n\/\/   console.log(\"\u00dcr\u00fcn dinlemesi durduruldu.\");\n\/\/ }, 10000);\n        <\/code><\/pre>\n<\/p><\/div>\n<p>Performans optimizasyonu, b\u00fcy\u00fck kataloglar i\u00e7in hayati \u00f6neme sahiptir. Firestore&#8217;da karma\u015f\u0131k sorgular \u00e7al\u0131\u015ft\u0131r\u0131rken, indeksleme (indexing) \u00e7ok \u00f6nemlidir. \u00d6rne\u011fin, <code>kategoriId<\/code> ve <code>fiyat<\/code> alanlar\u0131n\u0131 ayn\u0131 anda filtreleyip s\u0131ralad\u0131\u011f\u0131n\u0131zda, Firestore otomatik olarak bir indeks olu\u015fturman\u0131z\u0131 isteyebilir veya manuel olarak Firebase konsolundan bu indeksleri tan\u0131mlaman\u0131z gerekebilir. \u0130ndeksler, veritaban\u0131n\u0131n sorgular\u0131 \u00e7ok daha h\u0131zl\u0131 bir \u015fekilde yan\u0131tlamas\u0131n\u0131 sa\u011flar, bu da kullan\u0131c\u0131 deneyimini do\u011frudan etkiler.<\/p>\n<p>Arama i\u015flevselli\u011fi i\u00e7in ise Firestore&#8217;un tam metin arama (full-text search) yetenekleri s\u0131n\u0131rl\u0131d\u0131r. Bu t\u00fcr geli\u015fmi\u015f arama ihtiya\u00e7lar\u0131 i\u00e7in genellikle Algolia veya ElasticSearch gibi \u00fc\u00e7\u00fcnc\u00fc taraf arama hizmetleriyle entegrasyon yapmak en iyi yakla\u015f\u0131md\u0131r. Bu hizmetler, \u00fcr\u00fcn adlar\u0131, a\u00e7\u0131klamalar\u0131 ve \u00f6zellikleri aras\u0131nda h\u0131zl\u0131 ve alakal\u0131 aramalar yapman\u0131z\u0131 sa\u011flar. Cloud Functions kullanarak Firestore&#8217;daki \u00fcr\u00fcn de\u011fi\u015fikliklerini bu arama servislerine otomatik olarak senkronize edebilirsiniz, b\u00f6ylece arama dizininiz her zaman g\u00fcncel kal\u0131r. Dinamik listeleme ve filtreleme, kullan\u0131c\u0131lar\u0131n arad\u0131klar\u0131 \u00fcr\u00fcne h\u0131zl\u0131ca ula\u015fmas\u0131n\u0131 sa\u011flayarak sat\u0131\u015flar\u0131n\u0131z\u0131 art\u0131rman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h2>Atomik Sipari\u015f \u0130\u015fleme: G\u00fcvenli ve Tutarl\u0131 Al\u0131\u015fveri\u015f Deneyimi Nas\u0131l Sa\u011flan\u0131r?<\/h2>\n<p>E-ticaretin en kritik s\u00fcre\u00e7lerinden biri sipari\u015f i\u015flemektir. Bir m\u00fc\u015fteri sipari\u015f verdi\u011finde, bu i\u015flemin g\u00fcvenli, tutarl\u0131 ve hatas\u0131z bir \u015fekilde ger\u00e7ekle\u015fmesi gerekir. &#8220;Atomik sipari\u015f&#8221; kavram\u0131, bir sipari\u015fin t\u00fcm bile\u015fenlerinin (stok d\u00fc\u015f\u00fcrme, sipari\u015f kayd\u0131, \u00f6deme onay\u0131 vb.) ya hep birlikte ba\u015far\u0131l\u0131 olmas\u0131 ya da hi\u00e7 birinin olmamas\u0131 anlam\u0131na gelir. Yani, bir sipari\u015f i\u015flemi yar\u0131da kal\u0131rsa veya bir hata olu\u015fursa, sistemin \u00f6nceki durumuna d\u00f6nmesi ve veri tutars\u0131zl\u0131\u011f\u0131n\u0131 \u00f6nlemesi esast\u0131r. Firebase Cloud Functions ve Firestore&#8217;un i\u015flem (transaction) yetenekleri, bu atomikli\u011fi sa\u011flamak i\u00e7in m\u00fckemmel ara\u00e7lar sunar.<\/p>\n<p>Bir sipari\u015fin i\u015flenmesi genellikle birden fazla ad\u0131m\u0131 i\u00e7erir: m\u00fc\u015fterinin sepetindeki \u00fcr\u00fcnlerin stok durumunun kontrol edilmesi, stoktan d\u00fc\u015f\u00fclmesi, sipari\u015f belgesinin olu\u015fturulmas\u0131, \u00f6demenin i\u015flenmesi ve m\u00fc\u015fteriye onay e-postas\u0131 g\u00f6nderilmesi. Bu ad\u0131mlardan herhangi birinde bir sorun ya\u015fan\u0131rsa (\u00f6rne\u011fin, \u00f6deme ba\u015far\u0131s\u0131z olursa veya stok yetersiz kal\u0131rsa), t\u00fcm i\u015flemin geri al\u0131nmas\u0131 gerekir. Aksi takdirde, m\u00fc\u015fteri \u00f6deme yapmad\u0131\u011f\u0131 halde stok d\u00fc\u015febilir veya \u00f6deme ba\u015far\u0131l\u0131 oldu\u011fu halde sipari\u015f kaydedilmeyebilir, bu da ciddi veri tutars\u0131zl\u0131klar\u0131na ve m\u00fc\u015fteri memnuniyetsizli\u011fine yol a\u00e7ar.<\/p>\n<p>Cloud Functions, bu t\u00fcr sunucu taraf\u0131 i\u015f mant\u0131\u011f\u0131n\u0131 g\u00fcvenli bir \u015fekilde y\u00fcr\u00fctmek i\u00e7in idealdir. M\u00fc\u015fteri taray\u0131c\u0131s\u0131ndan veya mobil uygulamas\u0131ndan do\u011frudan Firestore&#8217;a stok d\u00fc\u015f\u00fcrme gibi hassas i\u015flemleri yapmak yerine, bu i\u015flemleri bir Cloud Function&#8217;a devretmek g\u00fcvenlik a\u00e7\u0131s\u0131ndan \u00e7ok \u00f6nemlidir. Cloud Function, \u00f6deme a\u011f ge\u00e7itleri (Stripe, Iyzico, PayTR gibi) ile g\u00fcvenli bir \u015fekilde ileti\u015fim kurabilir, veritaban\u0131nda gerekli g\u00fcncellemeleri yapabilir ve hata durumunda geri alma (rollback) mekanizmalar\u0131n\u0131 devreye sokabilir.<\/p>\n<p>Sipari\u015f modeli i\u00e7in, <code>siparisler<\/code> ad\u0131nda ayr\u0131 bir koleksiyon olu\u015fturabiliriz. Bu koleksiyondaki her belge bir sipari\u015fi temsil eder ve genellikle a\u015fa\u011f\u0131daki alanlar\u0131 i\u00e7erir:<\/p>\n<ul>\n<li><code>id<\/code>: Sipari\u015fin benzersiz kimli\u011fi.<\/li>\n<li><code>kullaniciId<\/code>: Sipari\u015fi veren kullan\u0131c\u0131n\u0131n kimli\u011fi.<\/li>\n<li><code>urunler<\/code>: Sipari\u015f edilen \u00fcr\u00fcnlerin detaylar\u0131n\u0131 i\u00e7eren bir dizi. Her bir \u00fcr\u00fcn i\u00e7in <code>urunId<\/code>, <code>ad<\/code>, <code>adet<\/code>, <code>birimFiyat<\/code> gibi bilgiler saklanabilir.<\/li>\n<li><code>toplamTutar<\/code>: Sipari\u015fin toplam tutar\u0131.<\/li>\n<li><code>indirimTutari<\/code>: Varsa uygulanan indirim miktar\u0131.<\/li>\n<li><code>kargoAdresi<\/code>: M\u00fc\u015fterinin kargo adresi bilgileri.<\/li>\n<li><code>faturaAdresi<\/code>: M\u00fc\u015fterinin fatura adresi bilgileri.<\/li>\n<li><code>odemeDurumu<\/code>: \u00d6demenin durumu (beklemede, ba\u015far\u0131l\u0131, ba\u015far\u0131s\u0131z, iade edildi).<\/li>\n<li><code>siparisDurumu<\/code>: Sipari\u015fin durumu (beklemede, i\u015fleniyor, kargoya verildi, teslim edildi, iptal edildi).<\/li>\n<li><code>odemeYontemi<\/code>: Kullan\u0131lan \u00f6deme y\u00f6ntemi.<\/li>\n<li><code>odemeReferansKodu<\/code>: \u00d6deme a\u011f ge\u00e7idinden d\u00f6nen referans kodu.<\/li>\n<li><code>olusturmaTarihi<\/code>: Sipari\u015fin olu\u015fturuldu\u011fu tarih.<\/li>\n<li><code>guncellemeTarihi<\/code>: Sipari\u015fin son g\u00fcncellendi\u011fi tarih.<\/li>\n<\/ul>\n<p>Firestore&#8217;un i\u015flem (transaction) yetene\u011fi, birden fazla belge \u00fczerinde atomik okuma ve yazma i\u015flemleri yapman\u0131z\u0131 sa\u011flar. Bu, \u00f6zellikle stok g\u00fcncelleme gibi kritik durumlarda veri tutarl\u0131l\u0131\u011f\u0131n\u0131 garantiler. Bir i\u015flem i\u00e7inde, \u00f6nce bir \u00fcr\u00fcn\u00fcn mevcut stok adedini okur, sonra bu adedi d\u00fc\u015f\u00fcr\u00fcr ve son olarak sipari\u015f belgesini olu\u015fturursunuz. E\u011fer stok yetersizse veya ba\u015fka bir hata olu\u015fursa, i\u015flem iptal edilir ve veritaban\u0131 hi\u00e7bir de\u011fi\u015fiklik yapmam\u0131\u015f gibi kal\u0131r.<\/p>\n<p>\u0130\u015fte bir Cloud Function kullanarak atomik sipari\u015f olu\u015fturma ve stok g\u00fcncelleme \u00f6rne\u011fi:<\/p>\n<div class=\"code-container\">\n<pre><code class=\"language-javascript\">\nconst functions = require(\"firebase-functions\");\nconst admin = require(\"firebase-admin\");\nadmin.initializeApp();\nconst db = admin.firestore();\n\nexports.createOrder = functions.https.onCall(async (data, context) => {\n  \/\/ Kullan\u0131c\u0131n\u0131n kimlik do\u011frulamas\u0131 yap\u0131lm\u0131\u015f m\u0131 kontrol et\n  if (!context.auth) {\n    throw new functions.https.HttpsError(\n      \"unauthenticated\",\n      \"Sipari\u015f olu\u015fturmak i\u00e7in oturum a\u00e7mal\u0131s\u0131n\u0131z.\"\n    );\n  }\n\n  const { sepetUrunleri, kargoAdresi, odemeBilgileri } = data;\n  const userId = context.auth.uid;\n\n  if (!sepetUrunleri || sepetUrunleri.length === 0) {\n    throw new functions.https.HttpsError(\n      \"invalid-argument\",\n      \"Sepetinizde \u00fcr\u00fcn bulunmamaktad\u0131r.\"\n    );\n  }\n\n  let toplamTutar = 0;\n  const urunGuncellemeleri = []; \/\/ Stok g\u00fcncellemeleri i\u00e7in\n  const siparisDetaylari = []; \/\/ Sipari\u015f belgesine eklenecek \u00fcr\u00fcn detaylar\u0131\n\n  try {\n    await db.runTransaction(async (transaction) => {\n      \/\/ 1. \u00dcr\u00fcn stoklar\u0131n\u0131 kontrol et ve d\u00fc\u015f\u00fcr\n      for (const item of sepetUrunleri) {\n        const urunRef = db.collection(\"urunler\").doc(item.urunId);\n        const urunDoc = await transaction.get(urunRef);\n\n        if (!urunDoc.exists) {\n          throw new functions.https.HttpsError(\n            \"not-found\",\n            <code>\u00dcr\u00fcn bulunamad\u0131: ${item.urunId}<\/code>\n          );\n        }\n\n        const urunData = urunDoc.data();\n        if (urunData.stokAdedi < item.adet) {\n          throw new functions.https.HttpsError(\n            \"resource-exhausted\",\n            <code>${urunData.ad} adl\u0131 \u00fcr\u00fcn i\u00e7in yeterli stok bulunmamaktad\u0131r.<\/code>\n          );\n        }\n\n        const yeniStok = urunData.stokAdedi - item.adet;\n        transaction.update(urunRef, { stokAdedi: yeniStok, guncellemeTarihi: admin.firestore.FieldValue.serverTimestamp() });\n\n        toplamTutar += urunData.fiyat * item.adet;\n        siparisDetaylari.push({\n          urunId: item.urunId,\n          ad: urunData.ad,\n          adet: item.adet,\n          birimFiyat: urunData.fiyat,\n          gorselUrl: urunData.gorseller ? urunData.gorseller[0] : null,\n        });\n      }\n\n      \/\/ 2. \u00d6deme i\u015flemini burada yap (\u00d6rnek: Stripe\/Iyzico API \u00e7a\u011fr\u0131s\u0131)\n      \/\/ Bu k\u0131s\u0131m, ger\u00e7ek bir \u00f6deme a\u011f ge\u00e7idi entegrasyonu gerektirir.\n      \/\/ \u00d6rne\u011fin: const odemeSonuc = await stripe.charges.create({ ... });\n      const odemeBasarili = true; \/\/ Ger\u00e7ekte bu, \u00f6deme a\u011f ge\u00e7idinden gelen bir sonu\u00e7 olmal\u0131\n\n      if (!odemeBasarili) {\n        throw new functions.https.HttpsError(\n          \"aborted\",\n          \"\u00d6deme i\u015flemi ba\u015far\u0131s\u0131z oldu. L\u00fctfen tekrar deneyin.\"\n        );\n      }\n\n      \/\/ 3. Sipari\u015f belgesini olu\u015ftur\n      const newOrderRef = db.collection(\"siparisler\").doc();\n      transaction.set(newOrderRef, {\n        kullaniciId: userId,\n        urunler: siparisDetaylari,\n        toplamTutar: toplamTutar,\n        kargoAdresi: kargoAdresi,\n        odemeDurumu: \"basarili\",\n        siparisDurumu: \"beklemede\",\n        odemeYontemi: odemeBilgileri.yontem,\n        odemeReferansKodu: \"REF-\" + newOrderRef.id.substring(0, 8), \/\/ \u00d6deme a\u011f ge\u00e7idinden gelmeli\n        olusturmaTarihi: admin.firestore.FieldValue.serverTimestamp(),\n        guncellemeTarihi: admin.firestore.FieldValue.serverTimestamp(),\n      });\n\n      return { siparisId: newOrderRef.id, mesaj: \"Sipari\u015f ba\u015far\u0131yla olu\u015fturuldu.\" };\n    });\n  } catch (error) {\n    console.error(\"Sipari\u015f olu\u015fturma hatas\u0131:\", error);\n    if (error.code) {\n      throw error; \/\/ HttpsError ise do\u011frudan f\u0131rlat\n    }\n    throw new functions.https.HttpsError(\n      \"unknown\",\n      \"Sipari\u015f olu\u015fturulurken beklenmedik bir hata olu\u015ftu.\",\n      error.message\n    );\n  }\n});\n        <\/code><\/pre>\n<\/p><\/div>\n<p>Bu Cloud Function, bir m\u00fc\u015fteri sipari\u015f verdi\u011finde tetiklenir. \u0130\u015flem i\u00e7inde \u00fcr\u00fcnlerin stoklar\u0131 kontrol edilir ve d\u00fc\u015f\u00fcr\u00fcl\u00fcr, ard\u0131ndan \u00f6deme i\u015flemi ger\u00e7ekle\u015ftirilir (\u00f6rnekte basitle\u015ftirilmi\u015f) ve son olarak sipari\u015f belgesi olu\u015fturulur. E\u011fer bu ad\u0131mlardan herhangi biri ba\u015far\u0131s\u0131z olursa, i\u015flem otomatik olarak geri al\u0131n\u0131r ve veritaban\u0131 tutarl\u0131 kal\u0131r. Bu sayede, m\u00fc\u015fterilerinize g\u00fcvenli ve tutarl\u0131 bir al\u0131\u015fveri\u015f deneyimi sunarken, veri tutars\u0131zl\u0131klar\u0131ndan kaynaklanabilecek operasyonel sorunlar\u0131 da en aza indirirsiniz.<\/p>\n<h3>Sepet Y\u00f6netimi ve \u00d6deme Ak\u0131\u015f\u0131 Optimizasyonu<\/h3>\n<p>Bir e-ticaret sitesinde sepet y\u00f6netimi ve \u00f6deme ak\u0131\u015f\u0131, kullan\u0131c\u0131 deneyiminin en kritik par\u00e7alar\u0131d\u0131r. Kullan\u0131c\u0131lar\u0131n \u00fcr\u00fcnleri kolayca sepete ekleyebilmesi, sepet i\u00e7eri\u011fini d\u00fczenleyebilmesi ve sorunsuz bir \u015fekilde \u00f6deme yapabilmesi, sat\u0131\u015f d\u00f6n\u00fc\u015f\u00fcm oranlar\u0131n\u0131 do\u011frudan etkiler. Firebase, bu s\u00fcre\u00e7leri verimli bir \u015fekilde y\u00f6netmek i\u00e7in \u00e7e\u015fitli ara\u00e7lar sunar.<\/p>\n<p><strong>Sepet Y\u00f6netimi:<\/strong> Kullan\u0131c\u0131lar\u0131n sepetlerini Firestore&#8217;da y\u00f6netmek, ger\u00e7ek zamanl\u0131 g\u00fcncellemeler ve \u00f6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan avantajl\u0131d\u0131r. Her kullan\u0131c\u0131 i\u00e7in bir <code>sepet<\/code> koleksiyonu veya <code>kullanicilar<\/code> koleksiyonunun alt\u0131nda bir alt koleksiyon olarak sepet verilerini saklayabilirsiniz. \u00d6rne\u011fin:<\/p>\n<ul>\n<li><strong><code>sepetler<\/code> koleksiyonu:<\/strong> Her belge bir kullan\u0131c\u0131n\u0131n sepetini temsil eder.<\/li>\n<ul>\n<li><code>kullaniciId<\/code>: Sepetin sahibi olan kullan\u0131c\u0131n\u0131n kimli\u011fi.<\/li>\n<li><code>urunler<\/code>: Sepetteki \u00fcr\u00fcnleri i\u00e7eren bir dizi. Her bir \u00fcr\u00fcn i\u00e7in <code>urunId<\/code>, <code>adet<\/code>, <code>eklenmeTarihi<\/code> gibi bilgiler.<\/li>\n<li><code>sonGuncelleme<\/code>: Sepetin en son ne zaman g\u00fcncellendi\u011fi.<\/li>\n<\/ul>\n<\/ul>\n<p>Bu yap\u0131 sayesinde, kullan\u0131c\u0131lar farkl\u0131 cihazlardan giri\u015f yapt\u0131klar\u0131nda bile sepet i\u00e7eriklerine eri\u015febilirler. Sepete \u00fcr\u00fcn ekleme, \u00e7\u0131karma veya adet de\u011fi\u015ftirme i\u015flemleri, Firestore&#8217;da ilgili belgeyi g\u00fcncelleyerek kolayca yap\u0131labilir. Ger\u00e7ek zamanl\u0131 dinleme (<code>onSnapshot<\/code>) sayesinde, sepet i\u00e7eri\u011findeki de\u011fi\u015fiklikler an\u0131nda kullan\u0131c\u0131 aray\u00fcz\u00fcne yans\u0131t\u0131l\u0131r, bu da dinamik bir al\u0131\u015fveri\u015f deneyimi sunar.<\/p>\n<div class=\"code-container\">\n<pre><code class=\"language-javascript\">\nimport { doc, getDoc, setDoc, updateDoc, arrayUnion, arrayRemove } from \"firebase\/firestore\";\nimport { db } from \".\/firebaseConfig\";\n\nasync function sepeteEkle(userId, urunId, adet = 1) {\n  const sepetRef = doc(db, \"sepetler\", userId);\n  const sepetDoc = await getDoc(sepetRef);\n\n  if (!sepetDoc.exists()) {\n    \/\/ Sepet yoksa yeni olu\u015ftur\n    await setDoc(sepetRef, {\n      kullaniciId: userId,\n      urunler: [{ urunId, adet, eklenmeTarihi: new Date().toISOString() }],\n      sonGuncelleme: new Date().toISOString(),\n    });\n  } else {\n    \/\/ Sepet varsa \u00fcr\u00fcn\u00fc g\u00fcncelle veya ekle\n    const sepetData = sepetDoc.data();\n    const existingItemIndex = sepetData.urunler.findIndex(item => item.urunId === urunId);\n\n    if (existingItemIndex > -1) {\n      \/\/ \u00dcr\u00fcn sepette varsa adedi g\u00fcncelle\n      sepetData.urunler[existingItemIndex].adet += adet;\n    } else {\n      \/\/ \u00dcr\u00fcn sepette yoksa yeni ekle\n      sepetData.urunler.push({ urunId, adet, eklenmeTarihi: new Date().toISOString() });\n    }\n    await updateDoc(sepetRef, {\n      urunler: sepetData.urunler,\n      sonGuncelleme: new Date().toISOString(),\n    });\n  }\n  console.log(\"\u00dcr\u00fcn sepete eklendi\/g\u00fcncellendi.\");\n}\n        <\/code><\/pre>\n<\/p><\/div>\n<p><strong>\u00d6deme Ak\u0131\u015f\u0131 Optimizasyonu:<\/strong> \u00d6deme ak\u0131\u015f\u0131, m\u00fc\u015fterinin sepetindeki \u00fcr\u00fcnleri sat\u0131n alma s\u00fcrecidir. Bu s\u00fcrecin h\u0131zl\u0131, g\u00fcvenli ve anla\u015f\u0131l\u0131r olmas\u0131, terk edilmi\u015f sepet oranlar\u0131n\u0131 d\u00fc\u015f\u00fcrmek i\u00e7in hayati \u00f6nem ta\u015f\u0131r. \u00d6deme a\u011f ge\u00e7itleri (Payment Gateways) ile entegrasyon, bu s\u00fcrecin temelini olu\u015fturur. T\u00fcrkiye&#8217;de Iyzico, PayTR, ParamPos gibi yerel \u00e7\u00f6z\u00fcmler veya uluslararas\u0131 Stripe, PayPal gibi se\u00e7enekler kullan\u0131labilir.<\/p>\n<p>\u00d6deme entegrasyonu genellikle \u015fu ad\u0131mlar\u0131 i\u00e7erir:<\/p>\n<ol>\n<li><strong>Sipari\u015f \u00d6ncesi Haz\u0131rl\u0131k:<\/strong> M\u00fc\u015fteri sepetini onaylad\u0131\u011f\u0131nda, sunucu taraf\u0131nda (Cloud Function&#8217;da) bir sipari\u015f tasla\u011f\u0131 olu\u015fturulur ve toplam tutar hesaplan\u0131r.<\/li>\n<li><strong>\u00d6deme A\u011f Ge\u00e7idi \u0130le \u0130leti\u015fim:<\/strong> Cloud Function, \u00f6deme a\u011f ge\u00e7idinin API&#8217;sini kullanarak bir \u00f6deme oturumu ba\u015flat\u0131r veya bir \u00f6deme iste\u011fi olu\u015fturur. Bu i\u015flem, hassas kart bilgilerinin do\u011frudan istemci taraf\u0131ndan de\u011fil, g\u00fcvenli sunucu ortam\u0131nda i\u015flenmesini sa\u011flar.<\/li>\n<li><strong>M\u00fc\u015fteri Onay\u0131:<\/strong> M\u00fc\u015fteri, \u00f6deme a\u011f ge\u00e7idinin aray\u00fcz\u00fcne (genellikle y\u00f6nlendirme veya iframe ile) y\u00f6nlendirilir ve kart bilgilerini girerek \u00f6demeyi onaylar.<\/li>\n<li><strong>\u00d6deme Sonucu \u0130\u015fleme:<\/strong> \u00d6deme a\u011f ge\u00e7idi, i\u015flemin sonucunu (ba\u015far\u0131l\u0131\/ba\u015far\u0131s\u0131z) geri bildirir. Bu geri bildirim genellikle bir webhook veya callback URL arac\u0131l\u0131\u011f\u0131yla Cloud Function&#8217;\u0131n\u0131za ula\u015f\u0131r.<\/li>\n<li><strong>Sipari\u015f Durumu G\u00fcncelleme:<\/strong> Cloud Function, \u00f6deme sonucuna g\u00f6re sipari\u015fin durumunu (ba\u015far\u0131l\u0131, beklemede, ba\u015far\u0131s\u0131z) Firestore&#8217;da g\u00fcnceller ve ilgili stok i\u015flemlerini (atomik olarak) ger\u00e7ekle\u015ftirir.<\/li>\n<li><strong>M\u00fc\u015fteri Bildirimi:<\/strong> M\u00fc\u015fteriye sipari\u015fin durumu hakk\u0131nda e-posta veya uygulama i\u00e7i bildirim g\u00f6nderilir.<\/li>\n<\/ol>\n<p>Kullan\u0131c\u0131 deneyimi odakl\u0131 \u00f6deme ak\u0131\u015f\u0131 tasar\u0131m\u0131, tek sayfa \u00f6deme (one-page checkout), misafir \u00f6deme (guest checkout) se\u00e7enekleri, ilerleme \u00e7ubuklar\u0131 ve a\u00e7\u0131k hata mesajlar\u0131 gibi unsurlar\u0131 i\u00e7ermelidir. Ayr\u0131ca, mobil uyumluluk ve h\u0131zl\u0131 y\u00fckleme s\u00fcreleri de \u00f6deme ak\u0131\u015f\u0131n\u0131n optimizasyonunda g\u00f6z \u00f6n\u00fcnde bulundurulmas\u0131 gereken \u00f6nemli fakt\u00f6rlerdir. Firebase&#8217;in esnek yap\u0131s\u0131, bu entegrasyonlar\u0131 ve optimizasyonlar\u0131 kolayca yapman\u0131za olanak tan\u0131r, b\u00f6ylece m\u00fc\u015fterilerinize p\u00fcr\u00fczs\u00fcz ve g\u00fcvenilir bir al\u0131\u015fveri\u015f deneyimi sunabilirsiniz.<\/p>\n<h2>G\u00fc\u00e7l\u00fc Bir Y\u00f6netim Paneli (Admin Panel) Nas\u0131l Geli\u015ftirilir?<\/h2>\n<p>Bir e-ticaret platformunun sadece m\u00fc\u015fteriye y\u00f6nelik y\u00fcz\u00fc de\u011fil, ayn\u0131 zamanda i\u015fletme sahiplerine ve y\u00f6neticilere y\u00f6nelik arka y\u00fcz\u00fc de (admin panel) kritik \u00f6neme sahiptir. Y\u00f6netim paneli, \u00fcr\u00fcnleri y\u00f6netmek, sipari\u015fleri takip etmek, kullan\u0131c\u0131lar\u0131 denetlemek, raporlar almak ve genel site ayarlar\u0131n\u0131 yap\u0131land\u0131rmak i\u00e7in merkezi bir kontrol noktas\u0131 g\u00f6revi g\u00f6r\u00fcr. Firebase&#8217;in sa\u011flad\u0131\u011f\u0131 servislerle, \u00f6zel ihtiya\u00e7lar\u0131n\u0131za g\u00f6re g\u00fc\u00e7l\u00fc ve g\u00fcvenli bir y\u00f6netim paneli geli\u015ftirmek olduk\u00e7a m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p>Y\u00f6netim panelinin temel ihtiya\u00e7lar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>\u00dcr\u00fcn Y\u00f6netimi:<\/strong> Yeni \u00fcr\u00fcn ekleme, mevcut \u00fcr\u00fcnleri d\u00fczenleme, stok g\u00fcncellemeleri, \u00fcr\u00fcn g\u00f6rsellerini y\u00f6netme ve \u00fcr\u00fcnleri yay\u0131nlama\/yay\u0131ndan kald\u0131rma.<\/li>\n<li><strong>Sipari\u015f Takibi ve Y\u00f6netimi:<\/strong> Yeni sipari\u015fleri g\u00f6r\u00fcnt\u00fcleme, sipari\u015f durumlar\u0131n\u0131 g\u00fcncelleme (i\u015fleniyor, kargoya verildi, teslim edildi), iptal ve iade i\u015flemlerini y\u00f6netme.<\/li>\n<li><strong>Kullan\u0131c\u0131 Y\u00f6netimi:<\/strong> Kullan\u0131c\u0131 listelerini g\u00f6r\u00fcnt\u00fcleme, kullan\u0131c\u0131 bilgilerini d\u00fczenleme, y\u00f6netici rolleri atama\/kald\u0131rma.<\/li>\n<li><strong>Kategori ve Marka Y\u00f6netimi:<\/strong> Yeni kategoriler ve markalar ekleme, mevcut olanlar\u0131 d\u00fczenleme veya silme.<\/li>\n<li><strong>Raporlama ve Analitik:<\/strong> Sat\u0131\u015f raporlar\u0131, stok raporlar\u0131, en \u00e7ok satan \u00fcr\u00fcnler gibi istatistiksel verileri g\u00f6r\u00fcnt\u00fcleme.<\/li>\n<li><strong>Site Ayarlar\u0131:<\/strong> Kargo \u00fccretleri, indirim kodlar\u0131, genel site metinleri gibi ayarlar\u0131 y\u00f6netme.<\/li>\n<\/ul>\n<p>Y\u00f6netim panelinin geli\u015ftirilmesi i\u00e7in \u00e7e\u015fitli \u00f6n y\u00fcz (frontend) teknolojileri kullan\u0131labilir. React, Vue.js veya Angular gibi modern JavaScript framework&#8217;leri, dinamik ve etkile\u015fimli kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in pop\u00fcler tercihlerdir. Ancak, daha basit bir y\u00f6netim paneli i\u00e7in sadece HTML, CSS ve vanilya JavaScript de yeterli olabilir. \u00d6nemli olan, y\u00f6netim panelinin h\u0131zl\u0131, kullan\u0131c\u0131 dostu ve g\u00fcvenli olmas\u0131d\u0131r.<\/p>\n<p><strong>Firebase Authentication ile Y\u00f6netici Rol\u00fc Tan\u0131mlama:<\/strong> Y\u00f6netim paneline eri\u015fimi k\u0131s\u0131tlamak ve farkl\u0131 yetkilere sahip y\u00f6neticiler olu\u015fturmak i\u00e7in Firebase Authentication kullan\u0131l\u0131r. Kullan\u0131c\u0131lar\u0131n kimlik do\u011frulamas\u0131ndan sonra, \u00f6zel talep (custom claims) ad\u0131 verilen bir \u00f6zellik sayesinde kullan\u0131c\u0131lara y\u00f6netici rol\u00fc atayabilirsiniz. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n <code>admin: true<\/code> veya <code>role: \"product_manager\"<\/code> gibi bir \u00f6zel talebi olabilir.<\/p>\n<div class=\"code-container\">\n<pre><code class=\"language-javascript\">\n\/\/ Cloud Function i\u00e7inde y\u00f6netici rol\u00fc atama \u00f6rne\u011fi\nconst functions = require(\"firebase-functions\");\nconst admin = require(\"firebase-admin\");\nadmin.initializeApp();\n\nexports.setAdminClaim = functions.https.onCall(async (data, context) => {\n  \/\/ Sadece yetkili bir y\u00f6netici bu fonksiyonu \u00e7a\u011f\u0131rabilir\n  if (!(context.auth && context.auth.token.admin === true)) {\n    throw new functions.https.HttpsError(\n      \"permission-denied\",\n      \"Sadece y\u00f6neticiler bu i\u015flemi yapabilir.\"\n    );\n  }\n\n  const uid = data.uid;\n  const adminStatus = data.adminStatus;\n\n  try {\n    await admin.auth().setCustomUserClaims(uid, { admin: adminStatus });\n    return { message: <code>Kullan\u0131c\u0131 ${uid} i\u00e7in y\u00f6netici rol\u00fc ${adminStatus ? &quot;atand\u0131&quot; : &quot;kald\u0131r\u0131ld\u0131&quot;}.<\/code> };\n  } catch (error) {\n    console.error(\"Y\u00f6netici rol\u00fc atan\u0131rken hata:\", error);\n    throw new functions.https.HttpsError(\n      \"internal\",\n      \"Y\u00f6netici rol\u00fc atan\u0131rken bir hata olu\u015ftu.\"\n    );\n  }\n});\n        <\/code><\/pre>\n<\/p><\/div>\n<p><strong>Firestore G\u00fcvenlik Kurallar\u0131 (Security Rules) ile Yetkilendirme:<\/strong> Y\u00f6netim paneli aray\u00fcz\u00fcnde kullan\u0131c\u0131ya belirli verileri g\u00f6stermek veya belirli i\u015flemleri yapmas\u0131na izin vermek i\u00e7in Firestore G\u00fcvenlik Kurallar\u0131 kullan\u0131l\u0131r. Bu kurallar, istemci taraf\u0131nda veritaban\u0131na do\u011frudan eri\u015fimi kontrol eder ve sadece yetkili kullan\u0131c\u0131lar\u0131n belirli verilere okuma\/yazma izni olmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, sadece <code>admin: true<\/code> \u00f6zel talebine sahip kullan\u0131c\u0131lar\u0131n <code>urunler<\/code> koleksiyonuna yazma izni olabilirken, di\u011fer kullan\u0131c\u0131lar sadece okuma iznine sahip olabilir.<\/p>\n<div class=\"code-container\">\n<pre><code class=\"language-firestore\">\nrules_version = '2';\nservice cloud.firestore {\n  match \/databases\/{database}\/documents {\n    \/\/ \u00dcr\u00fcnlere eri\u015fim kurallar\u0131\n    match \/urunler\/{urunId} {\n      allow read: if true; \/\/ T\u00fcm kullan\u0131c\u0131lar okuyabilir\n      allow create, update, delete: if request.auth != null && request.auth.token.admin == true; \/\/ Sadece admin yazabilir\n    }\n\n    \/\/ Sipari\u015flere eri\u015fim kurallar\u0131\n    match \/siparisler\/{siparisId} {\n      allow read: if request.auth != null && (request.auth.uid == resource.data.kullaniciId || request.auth.token.admin == true);\n      allow create: if request.auth != null; \/\/ Oturum a\u00e7m\u0131\u015f herkes sipari\u015f olu\u015fturabilir\n      allow update: if request.auth != null && request.auth.token.admin == true; \/\/ Sadece admin g\u00fcncelleyebilir\n      allow delete: if false; \/\/ Sipari\u015fler silinemez\n    }\n\n    \/\/ Kullan\u0131c\u0131 profillerine eri\u015fim kurallar\u0131\n    match \/kullanicilar\/{userId} {\n      allow read, update: if request.auth != null && request.auth.uid == userId; \/\/ Sadece kendi profilini okuyup g\u00fcncelleyebilir\n      allow list: if request.auth != null && request.auth.token.admin == true; \/\/ Sadece admin t\u00fcm kullan\u0131c\u0131lar\u0131 listeleyebilir\n    }\n  }\n}\n        <\/code><\/pre>\n<\/p><\/div>\n<p>Bu kurallar, veritaban\u0131n\u0131z\u0131n g\u00fcvenli\u011fini sa\u011flarken, y\u00f6netim paneli kullan\u0131c\u0131lar\u0131n\u0131n sadece yetkili olduklar\u0131 i\u015flemleri yapabilmesini garanti eder. Y\u00f6netim panelini geli\u015ftirirken, kullan\u0131c\u0131 dostu formlar, veri tablolar\u0131 ve grafikler kullanarak y\u00f6neticilerin i\u015flerini kolayla\u015ft\u0131rmak \u00f6nemlidir. \u00d6rne\u011fin, \u00fcr\u00fcn g\u00fcncelleme formu, \u00fcr\u00fcn\u00fcn t\u00fcm alanlar\u0131n\u0131 (ad, a\u00e7\u0131klama, fiyat, stok, g\u00f6rseller) d\u00fczenlemeye olanak tan\u0131yan bir yap\u0131ya sahip olmal\u0131d\u0131r. G\u00f6rsel y\u00fckleme i\u00e7in Cloud Storage entegrasyonu da bu formun \u00f6nemli bir par\u00e7as\u0131d\u0131r. G\u00fc\u00e7l\u00fc bir y\u00f6netim paneli, e-ticaret operasyonlar\u0131n\u0131z\u0131n sorunsuz ve verimli bir \u015fekilde y\u00fcr\u00fct\u00fclmesi i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<h3>Y\u00f6netim Paneli \u0130\u00e7in G\u00fcvenlik ve Yetkilendirme Stratejileri<\/h3>\n<p>Y\u00f6netim paneli, bir e-ticaret platformunun en hassas b\u00f6l\u00fcm\u00fcd\u00fcr \u00e7\u00fcnk\u00fc t\u00fcm kritik i\u015f verilerini ve operasyonel kontrolleri i\u00e7erir. Bu nedenle, g\u00fcvenlik ve yetkilendirme stratejileri, y\u00f6netim panelinin geli\u015ftirilmesinde en \u00fcst d\u00fczeyde \u00f6ncelik ta\u015f\u0131mal\u0131d\u0131r. Firebase, bu konuda g\u00fc\u00e7l\u00fc ve entegre \u00e7\u00f6z\u00fcmler sunarak geli\u015ftiricilerin i\u015fini kolayla\u015ft\u0131r\u0131r.<\/p>\n<p><strong>Firebase Security Rules&#8217;\u0131n \u00d6nemi ve Kullan\u0131m\u0131:<\/strong> Firebase Security Rules (G\u00fcvenlik Kurallar\u0131), do\u011frudan Firebase konsolu \u00fczerinden y\u00f6netilen ve veritaban\u0131 (Firestore, Realtime Database) ile depolama (Cloud Storage) kaynaklar\u0131n\u0131za kimlerin, ne zaman ve hangi ko\u015fullar alt\u0131nda eri\u015febilece\u011fini tan\u0131mlayan sunucu taraf\u0131 kurallar\u0131d\u0131r. Bu kurallar, istemci taraf\u0131ndaki (\u00f6n y\u00fcz) kodunuzun g\u00fcvenlik a\u00e7\u0131klar\u0131 bar\u0131nd\u0131rmas\u0131 durumunda bile verilerinizi koruyan nihai savunma hatt\u0131n\u0131 olu\u015fturur. Bir iste\u011fin Firebase&#8217;e ula\u015fmas\u0131yla birlikte, g\u00fcvenlik kurallar\u0131 devreye girer ve iste\u011fin izinli olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer kural ihlal edilirse, istek reddedilir ve veri eri\u015fimi engellenir.<\/p>\n<p>Y\u00f6netim paneli ba\u011flam\u0131nda, g\u00fcvenlik kurallar\u0131 a\u015fa\u011f\u0131daki gibi senaryolar i\u00e7in kritik \u00f6neme sahiptir:<\/p>\n<ul>\n<li><strong>Veri Eri\u015fimi K\u0131s\u0131tlamas\u0131:<\/strong> Sadece belirli y\u00f6netici rollerine sahip kullan\u0131c\u0131lar\u0131n hassas verilere (\u00f6rne\u011fin, t\u00fcm kullan\u0131c\u0131lar\u0131n e-posta adresleri veya sipari\u015flerin finansal detaylar\u0131) eri\u015fmesine izin vermek.<\/li>\n<li><strong>\u0130\u015flem K\u0131s\u0131tlamas\u0131:<\/strong> Yaln\u0131zca yetkili y\u00f6neticilerin \u00fcr\u00fcn ekleme, fiyat de\u011fi\u015ftirme, stok g\u00fcncelleme veya sipari\u015f durumunu de\u011fi\u015ftirme gibi yazma i\u015flemlerini yapmas\u0131na izin vermek.<\/li>\n<li><strong>Rol Tabanl\u0131 Yetkilendirme (RBAC):<\/strong> Farkl\u0131 y\u00f6netici seviyeleri (\u00f6rne\u011fin, s\u00fcper y\u00f6netici, \u00fcr\u00fcn y\u00f6neticisi, sipari\u015f y\u00f6neticisi) tan\u0131mlayarak, her rol\u00fcn yaln\u0131zca kendi yetki alan\u0131ndaki verilere ve i\u015flemlere eri\u015fmesini sa\u011flamak.<\/li>\n<\/ul>\n<p>Yukar\u0131daki \u00f6rnek Firestore g\u00fcvenlik kurallar\u0131, bu rol tabanl\u0131 yetkilendirmeye bir \u00f6rnektir. <code>request.auth.token.admin == true<\/code> kontrol\u00fc, kullan\u0131c\u0131n\u0131n Firebase Authentication \u00f6zel taleplerinde &#8220;admin&#8221; rol\u00fcne sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Bu sayede, \u00f6n y\u00fczdeki bir hata veya k\u00f6t\u00fc niyetli bir istemci iste\u011fi, arka u\u00e7taki verilerinizi tehlikeye atamaz.<\/p>\n<p><strong>Y\u00f6netici Seviyeleri ve Yetkilendirme:<\/strong> B\u00fcy\u00fck veya karma\u015f\u0131k e-ticaret platformlar\u0131nda tek bir &#8220;y\u00f6netici&#8221; rol\u00fc yeterli olmayabilir. Farkl\u0131 departmanlar\u0131n veya g\u00f6revlerin farkl\u0131 yetki seviyelerine ihtiyac\u0131 vard\u0131r. \u00d6rne\u011fin:<\/p>\n<ul>\n<li><strong>S\u00fcper Y\u00f6netici (Super Admin):<\/strong> T\u00fcm verilere ve t\u00fcm i\u015flemlere tam eri\u015fime sahiptir. Yeni y\u00f6neticiler atayabilir, site ayarlar\u0131n\u0131 de\u011fi\u015ftirebilir.<\/li>\n<li><strong>\u00dcr\u00fcn Y\u00f6neticisi (Product Manager):<\/strong> Sadece \u00fcr\u00fcn katalo\u011funu (ekleme, d\u00fczenleme, silme) ve kategori\/marka bilgilerini y\u00f6netebilir. Sipari\u015f veya kullan\u0131c\u0131 verilerine eri\u015fimi k\u0131s\u0131tl\u0131d\u0131r.<\/li>\n<li><strong>Sipari\u015f Y\u00f6neticisi (Order Manager):<\/strong> Sipari\u015fleri g\u00f6r\u00fcnt\u00fcleyebilir, durumlar\u0131n\u0131 g\u00fcncelleyebilir, iade\/iptal s\u00fcre\u00e7lerini y\u00f6netebilir. \u00dcr\u00fcn veya kullan\u0131c\u0131 bilgilerini de\u011fi\u015ftiremez.<\/li>\n<li><strong>M\u00fc\u015fteri Hizmetleri Temsilcisi (Customer Service Rep):<\/strong> Kullan\u0131c\u0131 profillerini g\u00f6r\u00fcnt\u00fcleyebilir, sipari\u015f ge\u00e7mi\u015flerine bakabilir ancak veri de\u011fi\u015ftiremez.<\/li>\n<\/ul>\n<p>Bu farkl\u0131 y\u00f6netici seviyelerini uygulamak i\u00e7in, Firebase Authentication \u00f6zel taleplerini daha detayl\u0131 kullanabilirsiniz. \u00d6rne\u011fin, <code>{ role: \"super_admin\" }<\/code>, <code>{ role: \"product_manager\" }<\/code> gibi talepler tan\u0131mlayabilirsiniz. Firestore g\u00fcvenlik kurallar\u0131n\u0131zda da bu rollere g\u00f6re farkl\u0131 eri\u015fim izinleri belirleyebilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code class=\"language-firestore\">\n\/\/ \u00d6rnek: Rol tabanl\u0131 \u00fcr\u00fcn yazma izni\nmatch \/urunler\/{urunId} {\n  allow write: if request.auth != null && (request.auth.token.role == \"super_admin\" || request.auth.token.role == \"product_manager\");\n}\n\n\/\/ \u00d6rnek: Rol tabanl\u0131 sipari\u015f g\u00fcncelleme izni\nmatch \/siparisler\/{siparisId} {\n  allow update: if request.auth != null && (request.auth.token.role == \"super_admin\" || request.auth.token.role == \"order_manager\");\n}\n        <\/code><\/pre>\n<\/p><\/div>\n<p>Bu yakla\u015f\u0131m, y\u00f6netim panelinizin hem esnek hem de g\u00fcvenli olmas\u0131n\u0131 sa\u011flar. Her bir y\u00f6neticinin sadece g\u00f6rev tan\u0131m\u0131na uygun i\u015flemleri yapabilmesi, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korurken, yanl\u0131\u015fl\u0131kla veya k\u00f6t\u00fc niyetli veri manip\u00fclasyonu riskini en aza indirir. Ayr\u0131ca, d\u00fczenli g\u00fcvenlik denetimleri yapmak ve y\u00f6netici \u015fifrelerinin g\u00fc\u00e7l\u00fc oldu\u011fundan emin olmak da genel g\u00fcvenlik stratejisinin \u00f6nemli bir par\u00e7as\u0131d\u0131r. Firebase&#8217;in sundu\u011fu bu ara\u00e7lar sayesinde, e-ticaret y\u00f6netim panelinizi sa\u011flam bir g\u00fcvenlik temeli \u00fczerine in\u015fa edebilirsiniz.<\/p>\n<h2>\u0130leri D\u00fczey Firebase E-ticaret \u0130pu\u00e7lar\u0131 ve Entegrasyonlar<\/h2>\n<p>Firebase ile \u00f6zel bir e-ticaret platformu kurmak, temel i\u015flevselli\u011fin \u00f6tesine ge\u00e7erek uygulaman\u0131z\u0131 daha g\u00fc\u00e7l\u00fc, daha verimli ve daha kullan\u0131c\u0131 dostu hale getirecek bir\u00e7ok ileri d\u00fczey entegrasyon ve optimizasyon f\u0131rsat\u0131 sunar. Bu b\u00f6l\u00fcmde, e-ticaret platformunuzu bir \u00fcst seviyeye ta\u015f\u0131yacak baz\u0131 ipu\u00e7lar\u0131na ve entegrasyonlara de\u011finece\u011fiz.<\/p>\n<ul>\n<li>\n            <strong>Arama Motoru Entegrasyonu (Algolia, ElasticSearch)<\/strong>: Firestore&#8217;un temel sorgu yetenekleri genellikle yeterli olsa da, tam metin arama, fasetli arama (faceted search) veya an\u0131nda arama (instant search) gibi geli\u015fmi\u015f \u00f6zellikler i\u00e7in \u00fc\u00e7\u00fcnc\u00fc taraf arama motorlar\u0131na ihtiya\u00e7 duyulur. Algolia, bu alanda pop\u00fcler bir tercihtir. Cloud Functions kullanarak Firestore&#8217;daki \u00fcr\u00fcn verilerinizde bir de\u011fi\u015fiklik oldu\u011funda (yeni \u00fcr\u00fcn eklendi, fiyat de\u011fi\u015fti, stok g\u00fcncellendi), bu de\u011fi\u015fiklikleri otomatik olarak Algolia dizininize senkronize edebilirsiniz. Bu sayede, kullan\u0131c\u0131lar\u0131n\u0131z saniyeler i\u00e7inde binlerce \u00fcr\u00fcn aras\u0131nda alakal\u0131 sonu\u00e7lar\u0131 bulabilir.<\/p>\n<div class=\"code-container\">\n<pre><code class=\"language-javascript\">\n\/\/ Cloud Function: Firestore \u00fcr\u00fcn de\u011fi\u015fikli\u011fini Algolia'ya senkronize et\nconst functions = require(\"firebase-functions\");\nconst algoliasearch = require(\"algoliasearch\");\n\nconst ALGOLIA_APP_ID = functions.config().algolia.app_id;\nconst ALGOLIA_ADMIN_KEY = functions.config().algolia.admin_key;\nconst ALGOLIA_INDEX_NAME = \"urunler\";\n\nconst client = algoliasearch(ALGOLIA_APP_ID, ALGOLIA_ADMIN_KEY);\nconst index = client.initIndex(ALGOLIA_INDEX_NAME);\n\nexports.onProductWrite = functions.firestore\n  .document(\"urunler\/{urunId}\")\n  .onWrite(async (change, context) => {\n    const urunId = context.params.urunId;\n    const urunData = change.after.data();\n\n    if (!change.after.exists) {\n      \/\/ \u00dcr\u00fcn silindiyse Algolia'dan da sil\n      return index.deleteObject(urunId);\n    }\n\n    \/\/ \u00dcr\u00fcn eklendi veya g\u00fcncellendiyse Algolia'ya g\u00f6nder\n    urunData.objectID = urunId; \/\/ Algolia'n\u0131n kimlik alan\u0131\n    return index.saveObject(urunData);\n  });\n                <\/code><\/pre>\n<\/p><\/div>\n<\/li>\n<li>\n            <strong>Bildirimler (Firebase Cloud Messaging &#8211; FCM)<\/strong>: M\u00fc\u015fteri etkile\u015fimini art\u0131rmak ve \u00f6nemli g\u00fcncellemeleri an\u0131nda iletmek i\u00e7in FCM&#8217;i kullanabilirsiniz. Sipari\u015f durumu g\u00fcncellemeleri (&#8220;Sipari\u015finiz kargoya verildi!&#8221;), stokta tekrar olan \u00fcr\u00fcnler i\u00e7in uyar\u0131lar (&#8220;Sevdi\u011finiz \u00fcr\u00fcn tekrar stokta!&#8221;), terk edilmi\u015f sepet hat\u0131rlatmalar\u0131 veya ki\u015fiselle\u015ftirilmi\u015f kampanya duyurular\u0131 g\u00f6nderebilirsiniz. Bu bildirimler, mobil uygulamalar\u0131n\u0131zda veya web sitenizde do\u011frudan g\u00f6r\u00fcnt\u00fclenebilir.\n        <\/li>\n<li>\n            <strong>Analitik (Google Analytics, Firebase Analytics)<\/strong>: E-ticaret sitenizin performans\u0131n\u0131 anlamak ve iyile\u015ftirmek i\u00e7in analitik ara\u00e7lar\u0131 entegre etmek \u015fartt\u0131r. Firebase Analytics, uygulaman\u0131z\u0131n kullan\u0131m\u0131 hakk\u0131nda de\u011ferli bilgiler sunarken, Google Analytics for Firebase ile kullan\u0131c\u0131 davran\u0131\u015flar\u0131n\u0131, d\u00f6n\u00fc\u015f\u00fcm hunilerini ve gelir ak\u0131\u015flar\u0131n\u0131 derinlemesine analiz edebilirsiniz. Bu veriler, pazarlama stratejilerinizi optimize etmenize ve kullan\u0131c\u0131 deneyimini geli\u015ftirmenize yard\u0131mc\u0131 olur.\n        <\/li>\n<li>\n            <strong>Performans Optimizasyonlar\u0131<\/strong>: B\u00fcy\u00fck \u00f6l\u00e7ekli e-ticaret sitelerinde performans kritik \u00f6neme sahiptir.<\/p>\n<ul>\n<li><strong>\u00d6nbellekleme (Caching)<\/strong>: S\u0131k eri\u015filen verileri istemci taraf\u0131nda veya bir CDN (Content Delivery Network) ile \u00f6nbelle\u011fe alarak y\u00fckleme s\u00fcrelerini azalt\u0131n. Firebase Hosting&#8217;in yerle\u015fik CDN&#8217;i bu konuda yard\u0131mc\u0131 olur.<\/li>\n<li><strong>Veri K\u00fc\u00e7\u00fcltme (Data Minimization)<\/strong>: Sadece ihtiya\u00e7 duyulan verileri \u00e7ekmek i\u00e7in Firestore sorgular\u0131nda <code>select()<\/code> metodunu kullan\u0131n veya sadece gerekli alanlar\u0131 i\u00e7eren daha k\u00fc\u00e7\u00fck belgeler olu\u015fturun.<\/li>\n<li><strong>Sayfaland\u0131rma (Pagination)<\/strong>: B\u00fcy\u00fck \u00fcr\u00fcn listeleri i\u00e7in t\u00fcm veriyi tek seferde y\u00fcklemek yerine, sayfaland\u0131rma uygulayarak performans\u0131 art\u0131r\u0131n. <code>limit()<\/code> ve <code>startAfter()<\/code>\/<code>endBefore()<\/code> gibi Firestore metodlar\u0131 bu konuda etkilidir.<\/li>\n<\/ul>\n<\/li>\n<li>\n            <strong>Mikroservis Mimarisine Ge\u00e7i\u015f<\/strong>: Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a, t\u00fcm i\u015f mant\u0131\u011f\u0131n\u0131 tek bir Cloud Function&#8217;da toplamak yerine, farkl\u0131 i\u015flevleri (\u00f6rne\u011fin, \u00f6deme servisi, bildirim servisi, stok servisi) ayr\u0131 Cloud Functions olarak veya hatta ba\u015fka sunucusuz platformlarda (\u00f6rne\u011fin Google Cloud Run) ayr\u0131 mikroservisler olarak tasarlayabilirsiniz. Bu, y\u00f6netilebilirli\u011fi art\u0131r\u0131r, hata izolasyonu sa\u011flar ve farkl\u0131 ekiplerin ba\u011f\u0131ms\u0131z olarak \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r.\n        <\/li>\n<li>\n            <strong>Uluslararas\u0131la\u015fma (i18n) ve Yerelle\u015ftirme (l10n)<\/strong>: Farkl\u0131 dillerde ve para birimlerinde sat\u0131\u015f yapmak istiyorsan\u0131z, uygulaman\u0131z\u0131 uluslararas\u0131la\u015ft\u0131rma i\u00e7in tasarlay\u0131n. \u00dcr\u00fcn adlar\u0131, a\u00e7\u0131klamalar ve statik metinler i\u00e7in \u00e7oklu dil deste\u011fi sunun ve para birimi d\u00f6n\u00fc\u015ft\u00fcrme veya yerel \u00f6deme y\u00f6ntemleri entegrasyonu gibi \u00f6zellikler ekleyin.<\/li>\n<\/ul>\n<p>Bu ileri d\u00fczey ipu\u00e7lar\u0131 ve entegrasyonlar, Firebase tabanl\u0131 e-ticaret platformunuzun sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda rekabet\u00e7i, \u00f6l\u00e7eklenebilir ve gelece\u011fe haz\u0131r olmas\u0131n\u0131 sa\u011flar. Do\u011fru stratejilerle, Firebase&#8217;in sundu\u011fu esnekli\u011fi ve g\u00fcc\u00fc en \u00fcst d\u00fczeyde kullanarak ba\u015far\u0131l\u0131 bir dijital ma\u011faza in\u015fa edebilirsiniz.<\/p>\n<h2>Sonu\u00e7 ve Gelecek Perspektifleri<\/h2>\n<p>Firebase ile \u00f6zel bir e-ticaret platformu geli\u015ftirmek, i\u015fletmelere sadece bir web sitesi de\u011fil, ayn\u0131 zamanda gelece\u011fe d\u00f6n\u00fck, esnek ve \u00f6l\u00e7eklenebilir bir dijital altyap\u0131 sunar. Bu makale boyunca, Firebase&#8217;in temel bile\u015fenlerini kullanarak \u00fcr\u00fcn katalo\u011fu y\u00f6netimi, atomik sipari\u015f i\u015fleme ve g\u00fcvenli bir y\u00f6netim paneli olu\u015fturman\u0131n inceliklerini ele ald\u0131k. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, haz\u0131r platformlar\u0131n k\u0131s\u0131tlamalar\u0131na tak\u0131lmadan, kendi i\u015f s\u00fcre\u00e7lerinize ve marka kimli\u011finize tamamen uygun bir \u00e7\u00f6z\u00fcm in\u015fa etmek Firebase ile art\u0131k \u00e7ok daha ula\u015f\u0131labilir.<\/p>\n<p>Firebase&#8217;in sunucusuz mimarisi, geli\u015ftiricilerin altyap\u0131 y\u00f6netimi y\u00fck\u00fcnden kurtularak do\u011frudan i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131n\u0131 sa\u011flar. Bu, geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r, maliyetleri d\u00fc\u015f\u00fcr\u00fcr ve uygulaman\u0131z\u0131n h\u0131zla de\u011fi\u015fen pazar ko\u015fullar\u0131na adapte olabilmesini kolayla\u015ft\u0131r\u0131r. Firestore&#8217;un ger\u00e7ek zamanl\u0131 veritaban\u0131 yetenekleri, Cloud Functions&#8217;\u0131n g\u00fc\u00e7l\u00fc sunucusuz i\u015flem yetenekleri ve Firebase Authentication&#8217;\u0131n sa\u011flam g\u00fcvenlik \u00f6zellikleri, e-ticaret platformunuzun her katman\u0131nda g\u00fcvenilirlik ve performans sunar.<\/p>\n<p>Gelecekte, e-ticaret d\u00fcnyas\u0131 daha da ki\u015fiselle\u015ftirilmi\u015f deneyimlere, yapay zeka destekli \u00f6neri sistemlerine ve daha h\u0131zl\u0131 teslimat modellerine do\u011fru evrilecektir. Firebase, bu t\u00fcr yenilik\u00e7i entegrasyonlar i\u00e7in de g\u00fc\u00e7l\u00fc bir temel sunar. Google Cloud&#8217;un di\u011fer servisleriyle (\u00f6rne\u011fin, makine \u00f6\u011frenimi API&#8217;leri) kolayca entegre olabilmesi, e-ticaret platformunuzu s\u00fcrekli olarak geli\u015ftirmenize ve gelece\u011fin trendlerine uyum sa\u011flaman\u0131za olanak tan\u0131r. Kendi \u00f6zel e-ticaret \u00e7\u00f6z\u00fcm\u00fcn\u00fcz\u00fc Firebase ile in\u015fa etmek, dijital d\u00fcnyada kal\u0131c\u0131 bir iz b\u0131rakmak isteyen her i\u015fletme i\u00e7in stratejik ve ak\u0131ll\u0131ca bir yat\u0131r\u0131md\u0131r. Bu yolculukta ba\u015far\u0131lar dileriz!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Firebase e-ticaret i\u00e7in pahal\u0131 m\u0131?<\/strong><\/p>\n<p>Firebase, kullan\u0131m bazl\u0131 fiyatland\u0131rma modeline sahiptir. Ba\u015flang\u0131\u00e7ta \u00fccretsiz &#8220;Spark&#8221; plan\u0131 ile bir\u00e7ok k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli e-ticaret sitesi rahatl\u0131kla \u00e7al\u0131\u015fabilir. \u0130\u015flem hacmi ve veri depolama artt\u0131k\u00e7a maliyetler y\u00fckselse de, genellikle benzer \u00f6l\u00e7ekteki geleneksel sunucu maliyetlerine g\u00f6re daha uygun ve \u00f6ng\u00f6r\u00fclebilirdir. Yaln\u0131zca kulland\u0131\u011f\u0131n\u0131z kaynaklar i\u00e7in \u00f6deme yapt\u0131\u011f\u0131n\u0131zdan, gereksiz harcamalardan ka\u00e7\u0131nm\u0131\u015f olursunuz.<\/p>\n<p><strong>2. \u00d6deme entegrasyonu Firebase ile nas\u0131l yap\u0131l\u0131r?<\/strong><\/p>\n<p>\u00d6deme entegrasyonu genellikle Firebase Cloud Functions arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r. Hassas \u00f6deme bilgilerinin g\u00fcvenli\u011fini sa\u011flamak i\u00e7in, \u00f6deme a\u011f ge\u00e7itlerinin (Stripe, Iyzico, PayTR vb.) API \u00e7a\u011fr\u0131lar\u0131 do\u011frudan istemci taraf\u0131ndan de\u011fil, g\u00fcvenli bir Cloud Function \u00fczerinden yap\u0131lmal\u0131d\u0131r. Cloud Function, \u00f6deme a\u011f ge\u00e7idi ile ileti\u015fim kurar, \u00f6demeyi i\u015fler ve sonucunu Firestore&#8217;daki sipari\u015f belgesine yans\u0131t\u0131r.<\/p>\n<p><strong>3. Firebase tabanl\u0131 bir e-ticaret sitesinin SEO performans\u0131 nas\u0131l art\u0131r\u0131l\u0131r?<\/strong><\/p>\n<p>Firebase Hosting, h\u0131zl\u0131 y\u00fckleme s\u00fcreleri ve CDN deste\u011fi ile SEO i\u00e7in iyi bir ba\u015flang\u0131\u00e7 noktas\u0131 sunar. Ancak, tek sayfa uygulamalar\u0131 (SPA) i\u00e7in SEO zorluklar\u0131 olabilir. Bu durumda, sunucu taraf\u0131 render (SSR) veya \u00f6nceden render (pre-rendering) gibi teknikler kullanarak arama motorlar\u0131n\u0131n i\u00e7eri\u011finizi daha iyi indekslemesini sa\u011flayabilirsiniz. Ayr\u0131ca, temiz URL yap\u0131lar\u0131, meta etiket optimizasyonu ve yap\u0131land\u0131r\u0131lm\u0131\u015f veri (schema markup) kullan\u0131m\u0131 da SEO performans\u0131n\u0131 art\u0131racakt\u0131r.<\/p>\n<p><strong>4. Firebase b\u00fcy\u00fck \u00f6l\u00e7ekli e-ticaret siteleri i\u00e7in uygun mu?<\/strong><\/p>\n<p>Evet, Firebase b\u00fcy\u00fck \u00f6l\u00e7ekli e-ticaret siteleri i\u00e7in olduk\u00e7a uygundur. Sunucusuz mimarisi ve otomatik \u00f6l\u00e7eklenebilirlik \u00f6zellikleri sayesinde, milyonlarca kullan\u0131c\u0131ya ve y\u00fcksek i\u015flem hacmine kolayca adapte olabilir. \u00d6rne\u011fin, Black Friday gibi yo\u011fun d\u00f6nemlerde altyap\u0131n\u0131z\u0131n \u00e7\u00f6kme riski olmadan trafi\u011fi y\u00f6netebilir. B\u00fcy\u00fck veri k\u00fcmeleri i\u00e7in Firestore ve Cloud Functions&#8217;\u0131n optimize edilmi\u015f kullan\u0131m\u0131 kritik \u00f6neme sahiptir.<\/p>\n<p><strong>5. Firebase e-ticaret ile mobil uygulama entegrasyonu m\u00fcmk\u00fcn m\u00fc?<\/strong><\/p>\n<p>Kesinlikle evet. Firebase, mobil uygulama geli\u015ftirmeyi kolayla\u015ft\u0131rmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. iOS ve Android SDK&#8217;lar\u0131 sayesinde, web siteniz i\u00e7in kulland\u0131\u011f\u0131n\u0131z ayn\u0131 Firebase arka ucunu mobil uygulamalar\u0131n\u0131zla da payla\u015fabilirsiniz. Bu, kullan\u0131c\u0131lar\u0131n web&#8217;de ba\u015flad\u0131klar\u0131 al\u0131\u015fveri\u015f deneyimini mobil uygulamada sorunsuz bir \u015fekilde devam ettirmelerini sa\u011flar ve veri tutarl\u0131l\u0131\u011f\u0131n\u0131 garantiler.<\/p>\n<p>#Firebase #ECommerce #WebGeli\u015ftirme #Firestore #CloudFunctions #AdminPanel #E-ticaret #Teknoloji #Geli\u015ftirme<\/p>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda kendi e-ticaret sitenizi kurmak m\u0131 istiyorsunuz? Haz\u0131r platformlar\u0131n sundu\u011fu s\u0131n\u0131rlamalar yerine, tamamen size \u00f6zel bir \u00e7\u00f6z\u00fcm aray\u0131\u015f\u0131nda m\u0131s\u0131n\u0131z?","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-42898","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda kendi e-ticaret sitenizi kurmak m\u0131 istiyorsunuz? Haz\u0131r platformlar\u0131n sundu\u011fu s\u0131n\u0131rlamalar yerine, tamamen size \u00f6zel bir \u00e7\u00f6z\u00fcm aray\u0131\u015f\u0131nda m\u0131s\u0131n\u0131z?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-28T06:05:18+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"37 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli\",\"datePublished\":\"2026-06-28T06:05:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/\"},\"wordCount\":6178,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/\",\"name\":\"Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-06-28T06:05:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/","og_locale":"tr_TR","og_type":"article","og_title":"Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli","og_description":"G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda kendi e-ticaret sitenizi kurmak m\u0131 istiyorsunuz? Haz\u0131r platformlar\u0131n sundu\u011fu s\u0131n\u0131rlamalar yerine, tamamen size \u00f6zel bir \u00e7\u00f6z\u00fcm aray\u0131\u015f\u0131nda m\u0131s\u0131n\u0131z?","og_url":"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-06-28T06:05:18+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"37 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli","datePublished":"2026-06-28T06:05:18+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/"},"wordCount":6178,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/","url":"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/","name":"Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-06-28T06:05:18+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/firebase-ile-ozel-e-ticaret-katalog-siparis-ve-yonetim-paneli\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Firebase ile \u00d6zel E-ticaret: Katalog, Sipari\u015f ve Y\u00f6netim Paneli"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=42898"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42898\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42898"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42898"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}