# Takip Sorunları

Event ve ciro teşhisi
Kaynak: https://selwise.com/docs/troubleshooting/tracking-issues

Olaylar, siparişler ya da içerik beklediğiniz gibi gelmiyorsa bu sayfa sorunu sırayla daraltır: önce script'in yüklendiğini, sonra isteklerin gittiğini, sonra sunucunun ne cevap verdiğini, en sonda da panelde nerede görüneceğini doğrularsınız. Her adımda bakacağınız yer ve cevabın anlamı yazılıdır.

## 1. Debug modunu açın

Tarayıcı konsolunda, sorunlu sayfada:

```js
localStorage.setItem('selwise_debug', 'true');
location.reload();
```

Konsolda `[Selwise]` önekli tanılama günlükleri görünür. Kapatmak için `localStorage.removeItem('selwise_debug')`. Test modunu (test işaretli kampanya ve kurallar) ayrıca `?selwise_test_mode=true` ile açabilirsiniz: [JavaScript API](/docs/integration/javascript-api#test-ve-hata-ayıklama).

## 2. Script yüklendi mi

DevTools → **Console**:

```js
typeof window.Selwise            // "object" olmalı
window.Selwise.getVisitorId?.()  // bir kimlik döndürmeli (vid_...)
```

| Sonuç | Anlamı |
| --- | --- |
| `undefined` | Script sayfada yok, yüklenemedi ya da engellendi. **Network** sekmesinde `client.js` isteğini arayın |
| `object` ama `getVisitorId` yok | Yalnızca komut kuyruğu taslağı var: `client.js` hiç çalışmadı |
| Konsolda `No site key — widget not started` | `data-site-key` eksik ya da boş |
| `client.js` isteği `(blocked)` / `ERR_BLOCKED_BY_CLIENT` | Reklam engelleyici ya da gizlilik eklentisi. Normal bir ziyaretçi için de aynı olur; test için eklentiyi kapatın |
| Konsolda `Refused to load the script ... Content Security Policy` | Sitenizin CSP'si `https://widget.selwise.com`'a izin vermiyor: [CSP](/docs/integration/advanced-installation#csp-ve-içerik-güvenlik-politikası) |
| `client.js` iki kez yüklenmiş | Script iki kez eklenmiş: çift olay ve çift çizim. Birini kaldırın |

## 3. Açılış istekleri

**Network** sekmesinde `selwise` ile süzün (**Fetch/XHR**). Sayfa yüklendikten hemen sonra şunları görmelisiniz:

| İstek | Beklenen |
| --- | --- |
| `GET .../public/sites/SITE_KEY/config?p=4` | `200`. Kampanya, öneri, takip ayarı döner |
| `GET .../scripts?path=...` | `200` |
| `GET .../integrations` | `200` |
| `POST .../events/batch` | `200`, ilk olaylar gittiğinde (aşağıda) |

### config isteği başarısızsa

| Durum | Neden ve çözüm |
| --- | --- |
| `404` `Site not found` | Site anahtarı yanlış ya da kanal silinmiş. Snippet'teki anahtarı panelden kopyaladığınızla karşılaştırın |
| `403` `Site not verified` | Kanalın alan adı doğrulanmamış: [Alan Adı Doğrulama](/docs/channels/domain-verification) |
| `403` `Origin '...' is not authorized for site '...'` | İsteğin geldiği sayfanın hostu kanalın alan adı ya da doğrulanmış takma adı değil. İleti kabul edilen tüm alan adlarını sayar. `www`/apex ve ülke hostları için takma ad ekleyin. `localhost` **üretimde kabul edilmez** |
| `403` `Delivery is switched off for this account.` / `This account is closed.` | Hesabın teslimatı kapatılmış; hesap yöneticinizle konuşun. Widget `selwise:subscription-inactive` olayını yayınlar ve durur |
| Konsolda `blocked by CORS policy`, durum `403` ya da `(failed)` | Doğrulanmamış kanal, bilinmeyen anahtar ya da yetkisiz köken için API tarayıcıya CORS izni vermez; tarayıcı gerçek durumu gizleyip CORS hatası gösterir. Aynı isteği `curl` ile (`-H "Origin: https://magaza.com"`) yapıp gerçek cevabı görün |
| `429` | Hız sınırı (dakikada 100); `Retry-After` kadar bekleyin |
| `5xx` ya da zaman aşımı | Geçici; widget birkaç saniye sonra yeniden dener. Sürerse destekle paylaşın |

Aynı isteği terminalden deneyin; yanıt gövdesi nedeni söyler:

```bash
curl -i "https://api.selwise.com/api/v1/public/sites/SITE_KEY/config?p=4" \
  -H "Origin: https://magaza.com"
```

## 4. Olay isteği: events/batch

Olaylar hemen gitmeyebilir: widget olayları kuyruğa alır ve toplu gönderir (varsayılan ayarda yaklaşık bir saniye içinde; kanalda gelişmiş toplu gönderim açıksa ayarlı gönderim aralığına, varsayılan 30 saniyeye kadar). Sayfadan ayrılırken kalan olaylar `sendBeacon` ile gönderilir; bu istek DevTools'ta **Preserve log** açık değilse kaybolur.

`POST .../events/batch` yanıtını açın:

```json
{ "success": true, "accepted": 3, "degraded": 1, "rejected": 0, "results": [ ... ] }
```

| Gördüğünüz | Anlamı ve çözüm |
| --- | --- |
| HTTP `200`, `success: true` | Olaylar kaydedildi |
| HTTP `200`, `success: false`, gövdede yalnızca `{ "success": false }` | Site anahtarı bilinmiyor ya da kanal doğrulanmamış. Durum kodu `200` olsa da **hiçbir şey kaydedilmedi** |
| HTTP `200`, `success: false`, `results[].error` = `consent not granted: event dropped` | Ziyaretçi onay vermemiş **ya da henüz cevap vermemiş**: `consentSnapshot.granted` `false`. Onay denetimini ve banner'ı kontrol edin: [Onay Yönetimi](/docs/integration/consent) |
| `accepted` > 0 ve `degraded` > 0 | Kaydedildi ama bir şey düzeltildi. `results[].warnings` nedeni söyler (aşağıda) |
| `rejected` > 0 | `results[].error` olay başına nedeni söyler |
| HTTP `400` `Validation failed` | `errors[]` hangi alanın sorunlu olduğunu söyler (`events.0.name: ...`); bilinmeyen alan tüm isteği düşürür. Kendi gönderdiğiniz bir olayda alan adını düzeltin |
| HTTP `400` `Batch size exceeds maximum of 200 events` | Çok büyük batch; bölün |
| HTTP `429` | Ziyaretçi başına dakikada 120 ya da IP başına dakikada 1200 olay sınırı: `Retry-After` kadar bekleyin |
| İstek hiç yok | Aşağıdaki "Hiç istek gitmiyor" bölümü |

`results[].warnings` içindeki sık görülen iletiler:

| İleti | Anlamı |
| --- | --- |
| `Missing productItemCode for event: ...` | Ürün olayında ürün kodu yok; olay yine kaydedilir ama ürün raporlarına girmez |
| `Unsupported event name "x" mapped to custom_event` | Olay adı kanonik listede yok: [Event Referansı](/docs/integration/events) |
| Ürün doğrulama iletisi (ürünün katalogda bulunamadığını söyler) | Gönderilen ürün kodu katalogda yok: `productItemCode` beslemedeki `item_code` ile aynı değil |
| `eventId missing, generated fallback eventId` | Kendi gönderdiğiniz olayda `eventId` yok; yeniden gönderim çift kayıt yaratır |

### Hiç istek gitmiyor

Önce [Script yüklendi mi](#2-script-yüklendi-mi) adımını geçtiyseniz şunlara bakın:

- **Onay bekleniyor.** Panelde **Cookie Consent → Policy** içinde **Require consent before tracking** ve **Hold events until the answer** açıkken, ziyaretçi cevap verene kadar olaylar bellekte bekler ve hiçbir istek gitmez (`config` isteği yine gider). Banner'ı gösterin ya da `window.Selwise.grantConsent()` çağırın; sorunun bu olup olmadığını `window.Selwise.getConsentState()` söyler: `null` ise "henüz sorulmadı".
- **Olay üretilmiyor.** Sayfa görüntüleme dışındaki olaylar veri katmanından ya da `Selwise.track()` çağrısından gelir. `window.selwiseLayer` ve **Data Layer** entegrasyonunun açık olduğunu kontrol edin: [Veri Katmanı](/docs/integration/data-layer).
- **Abonelik pasif.** Konsolda `Subscription inactive` uyarısı ve `config` isteğinde `403`.
- **Depolama kapalı.** Gizli sekmede ya da engelli depolamada widget bellek içi depolamaya düşer; yine çalışır ama ziyaretçi kimliği sayfa yenilenince sıfırlanır.

## 5. Sipariş gitmiyor ya da gelir yok

| Belirti | Sebep ve çözüm |
| --- | --- |
| `POST .../orders` isteği yok | `trackOrder` çağrısı çalışmıyor: yalnızca ödeme başarıyla bittiğinde render edilen teşekkür sayfasında olmalı; `orderId` boşsa çağrı **sessizce** hiçbir şey yapmaz. Komut kuyruğu satırı snippet'te var mı kontrol edin |
| İstek `200`, `created: false` | Aynı `orderId` zaten kayıtlı (sayfa yenilendi). Normal ve güvenli |
| İstek `400` `deprecated field is not allowed: id` | `id` alanı gönderiliyor; `orderId` kullanın |
| İstek `400` `placedAt must be a valid ISO date string` | Tarih biçimi |
| İstek `403` | Alan adı / anahtar sorunu (yukarıdaki tablo). Sunucudan gönderiyorsanız `Origin` göndermeyin, `mobile_write` anahtarı kullanın |
| Satın alma var ama gelir panelde yok | `status` iptal/iade gibi gelire sayılmayan bir değer, ya da `total` boş ve `items` yok: [Sipariş API'si](/docs/api-reference/orders-api) |
| Gelir var, ürün bazlı rapor boş | `items[].productItemCode` beslemeyle eşleşmiyor |
| Gelir kampanyaya/öneriye atfedilmiyor | Sunucudan gönderiyorsunuz ve `visitorId`/`sessionId` taşımıyorsunuz, ya da sipariş son etkileşimden 168 saatten sonra gelmiş: [Sipariş Atfı Kuralı](/docs/analytics/order-credit) |

## 6. Panelde nerede görünür

**Analitik → Event Tracking Analytics** (Analytics) sekmesinde olaylar 1-2 dakika içinde görünür; aralık "son 24 saat" ise ve hiç olay yoksa "No tracking signal yet" yazar. Bu sekmenin sinyallerini ve olay kalitesini [Olay Sağlığı](/docs/analytics/event-health) sayfası açıklar. Rakamlar yerinde değilse yukarıdaki ağ kontrollerini tekrarlayın; ağ doğruysa sorun veri hattında değil, panelin zaman aralığı ya da kanal seçimindedir.

## Sık karşılaşılan sorunlar

| Belirti | Sebep ve çözüm |
| --- | --- |
| Hiç olay gitmiyor | Alan adı doğrulanmamış (`403`) ya da onay verilmemiş. Doğrulamayı ve onay akışını kontrol edin |
| Olay `degraded` | `productItemCode`, beslemedeki `item_code` ile aynı değil |
| Ürün olayları eksik | Otomatik tespit temanızda çalışmıyor; ilgili olayları `window.selwiseLayer.push()` ya da `Selwise.track()` ile manuel gönderin: [Event Referansı](/docs/integration/events) |
| Aynı olay iki kez sayılıyor | Harici dataLayer köprüsü ve manuel push aynı olayı gönderiyor, ya da script iki kez eklenmiş. Tek kaynağı esas alın |
| Müşteriler birleşmiyor | `identify` çağrılmıyor ya da kimlik her girişte değişiyor: [Kullanıcı Kimliklendirme](/docs/integration/identify) |
| Sunucu taraflı render içeriği görünmüyor | [Sunucu Taraflı Render](/docs/product-enrichment/server-side#sorun-giderme) sayfasındaki sorun giderme tablosu |
| İçerik görünmüyor | [Widget Görünmüyor](/docs/troubleshooting/widget-not-showing) |

## Test modu

Yalnızca "test" işaretli kampanya ve kuralları görmek için:

```js
localStorage.setItem('selwise_test_mode', 'true');
location.reload();
```

ya da adrese `?selwise_test_mode=true` ekleyin.
