Sunucu entegrasyonu
Bazı verileri tarayıcıdan değil, web sitenizin sunucusundan göndermek daha güvenilirdir: verilen ve ödenen siparişler, kayıtlar, durum değişiklikleri, ürün kataloğu. Tarayıcı gönderimden önce kapanabilir veya izleyiciyi engelleyebilir, sunucu ise bunu yapmaz. Hazır örnekler İletişim → Web sitesi bölümündeki Sunucu sekmesinde toplanmıştır.
Bu makale geliştiriciler içindir. Web sitesindeki izleyici yerinde kalır: görüntülemeleri sayar ve widget'ları gösterir, sunucu ise onu önemli olaylarla tamamlar.
“Sunucu” sekmesi
Sekmede bir Dil seçici bulunur: PHP, Go, Node.js ve Python. Örnekler üçüncü taraf kitaplıklar olmadan yazılmıştır; OneTrace.pro adresi, olay adları ve projenizin ayarlarındaki ürün id özelliği zaten eklenmiştir. Seçilen dil tarayıcıda hatırlanır.
PHP için sekme hazır bir kütüphane de sunabilir: tüm API'yi, hatalarda çift kayıt oluşturmadan yeniden denemeyi ve olay arabelleğini içeren bir Composer paketi. Sekmede Hazır PHP kütüphanesi bloğu varsa paketi örnekteki komutla kurun; diğer örnekler aynı çağrıları düz HTTP istekleri olarak gösterir. Aynı blokta bir Laravel paketi de vardır: olaylar yanıttan sonra veya kuyruk üzerinden gönderilir, bir direktif izleyiciyi şablonlara ekler, ürünler modellerden eşitlenir.

Anahtarlar
- Yazma anahtarı (
cdp_wk_…, Write türü): olay göndermek için. İzleyici kodundakiyle aynıdır. - Gizli anahtar (
cdp_sk_…, Secret türü): katalog yüklemek ve projeyi yönetmek için. Katalog için “Ürün yükleme ve silme” (products.write) yetkisine ihtiyaç duyar.
Anahtarlar API anahtarları bölümünde oluşturulur; bunu “Sahip” ve “Yönetici” yapabilir. Gizli anahtarı yalnızca sunucuda saklayın ve asla sayfa koduna eklemeyin.
Adımlar
1. Ortam değişkenleri
Adresi ve anahtarları koda değil, sunucunun ortam değişkenlerine koyun. Değişken adlarını kendiniz seçebilirsiniz:
CDP_URL=https://cdp.onetrace.pro/api/v1
CDP_WRITE_KEY=cdp_wk_…
CDP_SECRET_KEY=cdp_sk_…
2. İstemci
Gönderim fonksiyonu: JSON ile POST, Authorization: Bearer başlığında anahtar, 5 saniyelik zaman aşımı, yanıt 2xx değilse hata.
PHP:
function cdp_send(string $path, array $body, string $keyEnv = 'CDP_WRITE_KEY'): void
{
$ch = curl_init(getenv('CDP_URL') . '/' . $path);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Authorization: Bearer ' . getenv($keyEnv)],
CURLOPT_POSTFIELDS => json_encode(array_filter($body, fn ($v) => $v !== null), JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
]);
curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status >= 300) {
throw new RuntimeException("CDP: HTTP {$status}");
}
}
Node.js:
export async function cdpSend(path, body, key = process.env.CDP_WRITE_KEY) {
const response = await fetch(`${process.env.CDP_URL}/${path}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${key}` },
body: JSON.stringify(body),
signal: AbortSignal.timeout(5000),
});
if (!response.ok) throw new Error(`CDP: HTTP ${response.status}`);
}
3. Giriş ve kayıt
Kullanıcı id'sini ve nitelikleri gönderin. cdp_aid çerezi, izleyicinin verdiği ziyaretçi tanımlayıcısıdır. Bunu anonymousId olarak gönderin; müşterinin profili web sitesine yaptığı ziyaretlerle birleştirilir.
cdp_send('identify', [
'userId' => (string) $user->id,
'anonymousId' => $_COOKIE['cdp_aid'] ?? null,
'traits' => ['email' => $user->email, 'first_name' => $user->first_name],
]);
await cdpSend('identify', {
userId: String(user.id),
anonymousId: req.cookies?.cdp_aid,
traits: { email: user.email, first_name: user.firstName },
});
Boş nitelik göndermeyin: null değeri niteliği profilden siler.
4. Sipariş
Siparişin ürünlerini içeren satın alma olayı. Sipariş numarasından oluşturulan messageId kopyalara karşı korur: aynı messageId ile 24 saat içinde gelen tekrar atılır, bu nedenle gönderimi güvenle yineleyebilirsiniz.
await cdpSend('track', {
messageId: `order-${order.id}`,
userId: String(order.userId),
anonymousId: req.cookies?.cdp_aid,
event: 'order_completed',
properties: {
order_id: String(order.id),
amount: order.total,
products: order.lines.map((line) => ({ product_id: String(line.productId), quantity: line.quantity, price: line.price })),
},
});
PHP'de aynı alanlarla aynı cdp_send('track', [...]) çağrısı kullanılır. Olay adı ve ürün id özelliği Öneriler bölümündeki ayarlarla eşleşmelidir, aksi halde satın almalar modellere dahil edilmez.
5. Ürün kataloğu
Ürünler ve kategoriler gizli anahtarla, istek başına en fazla 1000 adet olarak yüklenir. Aynı id ile yeniden yükleme ürünü günceller.
cdp_send('products', [
'items' => [[
'id' => 'SKU-1', 'name' => 'Spor ayakkabı', 'url' => 'https://shop.example.com/p/sku-1',
'image' => 'https://shop.example.com/i/sku-1.jpg', 'price' => 4990, 'currency' => 'RUB',
'available' => true, 'category_ids' => ['shoes'], 'brand' => 'Brand',
]],
'categories' => [['id' => 'shoes', 'name' => 'Ayakkabı']],
], 'CDP_SECRET_KEY');
Katalog zaten bir feed olarak mevcutsa (YML, Google Merchant, CSV) feed'i Öneriler bölümünde bağlamak daha kolaydır.

İpuçları
- Arka plan kuyruğundan gönderin, müşterinin isteğini işleyen kodun içinden değil: böylece web sitesinin yanıtı ağa bağlı olmaz.
- Hatalarda yeniden deneyin.
202yanıtı, olayın kabul edildiği ve saniyeler içinde işleneceği anlamına gelir.429(istek sınırı veya aylık olay kotası aşıldı) ve5xxdurumlarında isteği daha sonra aynımessageIdile yineleyin. - Sınırlar: mesaj başına en fazla 32 KB,
/batchiçinde en fazla 500 mesaj, istek gövdesi en fazla 1 MB. Yazma anahtarı dakikada en fazla 6000 istek kabul eder. - Web sitesi alan adı kısıtlaması sunucu istekleri için geçerli değildir.
Yöntemlerin tam listesi API başvurusundadır: https://cdp.onetrace.pro/api/v1/openapi.json.