
Shopify'da standart bir sipariş yalnızca ürün, adet ve fiyattan oluşmayabilir.
Bir marka müşteriden checkout öncesinde hediye notu, teslimat tercihi, paketleme seçeneği, gravür metni, ürün kişiselleştirmesi veya siparişe özel operasyon bilgisi almak isteyebilir.
İlk bakışta bunların tamamı “sepete ekstra bir alan ekleyelim” problemi gibi görünür. Asıl problem ise UI değil, verinin hangi commerce entity'sine ait olduğudur.
Önce temel ayrım: Veri neye ait?
Bir custom field eklemeden önce şu soru sorulmalıdır: Bu bilgi siparişin tamamına mı, belirli ürüne mi, müşteriye mi ait?
“Siparişin tamamını hediye paketi yap” cart/order-level bir bilgidir. “Bu kolyenin üzerine F.C. yaz” ise belirli bir ürün satırına aittir.
Cart attribute nedir?
Cart attribute, sepetin tamamıyla ilişkili key/value verisidir.
Örneğin gift_message = "İyi ki doğdun" veya delivery_preference = "evening" gibi bilgiler belirli bir SKU'ya değil mevcut cart'a aittir.
Cart attribute için uygun örnekler
- hediye mesajı,
- sipariş teslimat tercihi,
- genel sipariş notu,
- kurumsal referans numarası,
- kampanya bağlamı,
- storefront tarafından oluşturulan bazı operasyon değerleri.
Ancak cart attribute'u genel amaçlı database gibi kullanmamak gerekir.
Line-level veri nedir?
Bazı bilgiler cart'ın tamamına değil belirli bir ürün satırına aittir. Aynı kupadan iki adet sepette bulunup birine “Furkan”, diğerine “Eren” yazılacaksa veri ilgili cart line ile birlikte tutulmalıdır.
Cart attribute ile metafield aynı şey mi?
Hayır. Cart attribute geçici alışveriş oturumuna, product metafield ürüne, customer metafield müşteriye ve order metafield oluşmuş siparişin kalıcı business data'sına aittir.
Storefront'taki hidden input her zaman doğru çözüm değildir
Modern storefront'ta cart product page, quick add, cart drawer, recommendation widget, app, mobile menu veya AI agent üzerinden değişebilir. Cart state'ini yalnız belirli bir form component'inin bildiği veri haline getirmek kırılgan bir mimaridir.
Örnek: Hediye mesajı
Kötü mimari: CartDrawer → local state → giftMessage
Daha doğru yaklaşım: Gift Message UI → Cart Action → Cart Attribute → Commerce State
UI artık source of truth değildir; cart source of truth'tur.
Örnek: Gravürlü ürün
Aynı SKU iki farklı kişiselleştirmeyle sepete eklenebiliyorsa bunlar iki ayrı ticari satırdır. Bu ayrım fulfillment tarafında da kritiktir.
Nested cart lines ne zaman kullanılmalı?
Bazı durumlarda ek bilgi değil gerçek bir parent-child ürün ilişkisi vardır: laptop + ek garanti, kolye + gravür hizmeti veya hediye + premium paketleme gibi. Bağımsız fiyatı, inventory'si veya fulfillment anlamı bulunan seçeneklerde ayrı merchandise/cart line daha doğru olabilir.
Operasyon sistemleri neden baştan düşünülmeli?
Storefront'ta bilgi göstermek kolaydır. Asıl soru bu bilginin Storefront → Cart → Checkout → Order → ERP → Warehouse → Production zincirinde kaybolup kaybolmadığıdır.
Cart data contract oluşturmak neden önemli?
| Alan | Scope | Tip | Zorunlu | Hedef |
|---|---|---|---|---|
gift_message |
Cart | String | Hayır | Order |
delivery_slot |
Cart | Enum | Evet | WMS |
engraving |
Line | String | Hayır | Production |
campaign_source |
Cart | String | Hayır | Analytics |
Shopify custom cart checklist
- Veri cart'a mı line'a mı ait?
- Bu bilgi kalıcı mı geçici mi?
- Metafield daha doğru entity olabilir mi?
- Seçeneğin kendi fiyatı var mı?
- Ayrı merchandise line gerekli mi?
- Aynı SKU farklı customization'larla sepete eklenebilir mi?
- Cart refresh sonrasında veri korunuyor mu?
- Cart drawer ile cart page aynı state'i görüyor mu?
- Checkout'a ve order'a veri ulaşıyor mu?
- ERP/WMS bilgiyi alıyor mu?
- Refund sırasında doğru line ile ilişkilendirilebiliyor mu?
- Hassas veri içeriyor mu?
AI agent'lar açısından neden daha önemli?
Bir AI agent “Ürünü sepete ekle ve hediye notuna ‘İyi ki doğdun’ yaz” dediğinde agent'ın React component state'ini manipüle etmesi yerine commerce action çağırması çok daha güvenlidir.
Cart data'yı dört seviyeye ayırın
Cart-level
- gift note,
- requested delivery date,
- channel metadata.
Line-level
- engraving text,
- personalization,
- add-on relation.
Customer-level
- language,
- B2B segment,
- loyalty state.
Order snapshot
Sipariş verildiği andaki immutable ticari bağlam.
Attribute naming contract
Kötü:
note
delivery
source
Daha açık:
gift_note
requested_delivery_date
campaign_source
Veri tipi problemi
Tarih, enum ve boolean serialization standardı belirlenmelidir.
requested_delivery_date = 2026-09-05
gift_wrap = true
Security
Cart attribute client-controlled olabilir. Fiyat, discount amount, tax exemption veya permission gibi kritik kararlar attribute'a güvenerek verilmemelidir.
Snapshot neden gerekli?
Personalization text gibi fulfillment için gerekli alanlar order line üzerinde immutable snapshot haline gelmelidir.
ERP entegrasyonu
ERP consumer yalnız known keys kabul etmelidir. Unknown key için ignore/quarantine/log politikası olmalıdır.
Versioning
{
"version": 2,
"engraving": "...",
"gift_wrap": true
}
Test senaryoları
- cart merge,
- quantity change,
- line remove,
- checkout recovery,
- multi-currency,
- accelerated checkout,
- reorder,
- API-created cart.
Attribute'ları business contract olarak dokümante edin
Örnek:
| Key | Scope | Type | Owner | Order'a taşınır mı? |
|---|---|---|---|---|
| gift_note | cart | string | storefront | evet |
| engraving | line | string | configurator | evet |
| campaign_source | cart | enum | marketing | analytics |
Bu tablo zamanla “bu key neydi?” problemini önler.
Sonuç
Shopify'da custom cart geliştirme form alanı ekleme problemi değildir. Doğru soru bu veri hangi commerce entity'sine ait ve sipariş lifecycle'ı boyunca nasıl taşınacak? olmalıdır.
Reliefers olarak özel Shopify storefront ve tema projelerinde cart'ı yalnız drawer component'i olarak değil; storefront, checkout, sipariş ve operasyon sistemleri arasında çalışan bir commerce state katmanı olarak tasarlıyoruz.
