Server orqali integratsiya
Maʼlumotlarning bir qismini brauzerdan emas, balki saytingiz serveridan yuborish ishonchliroq: rasmiylashtirilgan va toʻlangan buyurtmalar, roʻyxatdan oʻtishlar, holatlar oʻzgarishi, mahsulotlar katalogi. Brauzer yuborishdan oldin yopilishi yoki trekerni bloklashi mumkin, server esa — yoʻq. Tayyor misollar Kommunikatsiyalar → Sayt boʻlimidagi Server yorligʻida jamlangan.
Ushbu maqola dasturchilar uchun. Bunda saytdagi treker saqlanib qoladi: u koʻrishlarni hisoblaydi va vidjetlarni koʻrsatadi, server esa uni muhim hodisalar bilan toʻldiradi.
«Server» yorligʻi
Yorliqda Til almashtirgichi bor: PHP, Go, Node.js va Python. Misollar uchinchi tomon kutubxonalarisiz yozilgan, ularga OneTrace.pro manzili, hodisa nomlari va loyihangiz sozlamalaridagi mahsulot id si xossasi allaqachon qoʻyilgan. Tanlangan til brauzerda eslab qolinadi.
PHP uchun yorliq tayyor kutubxonani ham taklif qilishi mumkin — butun API, nosozliklarda takrorlanishsiz qayta urinishlar va hodisalar buferiga ega Composer paketi. Agar yorliqda PHP uchun tayyor kutubxona bloki boʻlsa, paketni namunadagi buyruq bilan oʻrnating; qolgan namunalar xuddi shu chaqiruvlarni oddiy HTTP soʻrovlari sifatida koʻrsatadi. Oʻsha blokda Laravel uchun paket ham bor: hodisalar javobdan keyin yoki navbat orqali yuboriladi, direktiva trekerni shablonlarga qoʻshadi, mahsulotlar modellardan sinxronlanadi.

Kalitlar
- Yozish kaliti (
cdp_wk_…, Write turi) — hodisalarni yuborish uchun. Treker kodidagi bilan bir xil. - Maxfiy kalit (
cdp_sk_…, Secret turi) — katalogni yuklash va loyihani boshqarish uchun. Katalog uchun unga «Mahsulotlarni yuklash va oʻchirish» (products.write) ruxsati kerak.
Kalitlar API kalitlari boʻlimida yaratiladi — buni «Egasi» va «Administrator» bajara oladi. Maxfiy kalitni faqat serverda saqlang va hech qachon sahifalar kodiga qoʻymang.
Qadamlar
1. Muhit oʻzgaruvchilari
Manzil va kalitlarni kodga emas, server muhit oʻzgaruvchilariga joylang. Oʻzgaruvchilar nomlarini oʻzingiz tanlashingiz mumkin:
CDP_URL=https://cdp.onetrace.pro/api/v1
CDP_WRITE_KEY=cdp_wk_…
CDP_SECRET_KEY=cdp_sk_…
2. Mijoz
Yuborish funksiyasi: JSON bilan POST, Authorization: Bearer sarlavhasidagi kalit, 5 soniyalik taymaut, 2xx boʻlmagan javobda xato.
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. Kirish va roʻyxatdan oʻtish
Foydalanuvchi id si va xususiyatlarni uzating. cdp_aid cookie fayli — treker bergan tashrif buyuruvchi identifikatori. Uni anonymousId sifatida uzating, shunda xaridor profili uning saytga tashriflari bilan birlashadi.
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ʻsh xususiyatlarni uzatmang: null qiymati xususiyatni profildan oʻchiradi.
4. Buyurtma
Buyurtma mahsulotlari bilan xarid hodisasi. Buyurtma raqamidan olingan messageId dublikatlardan himoya qiladi: 24 soat ichida xuddi shu messageId bilan takrorlangan hodisa rad etiladi, shuning uchun yuborishni xavfsiz takrorlash mumkin.
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 da — xuddi shu maydonlar bilan oʻsha cdp_send('track', [...]) chaqiruvi. Hodisa nomi va mahsulot id si xossasi Tavsiyalar boʻlimi sozlamalariga mos kelishi kerak, aks holda xaridlar modellarga tushmaydi.
5. Mahsulotlar katalogi
Mahsulotlar va kategoriyalar maxfiy kalit bilan, har bir soʻrovda 1000 tagacha yuklanadi. Xuddi shu id ni qayta yuklash mahsulotni yangilaydi.
cdp_send('products', [
'items' => [[
'id' => 'SKU-1', 'name' => 'Krossovkalar', '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' => 'Poyabzallar']],
], 'CDP_SECRET_KEY');
Agar katalog allaqachon fid koʻrinishida boʻlsa (YML, Google Merchant, CSV), fidni Tavsiyalar boʻlimida ulash osonroq.

Maslahatlar
- Fon navbatidan yuboring, xaridor soʻrovi ishlovchisida emas: shunda sayt javobi tarmoqqa bogʻliq boʻlmaydi.
- Xatolarda takrorlang.
202javobi hodisa qabul qilinganini va bir necha soniyada qayta ishlanishini bildiradi.429(soʻrovlar limiti yoki oylik hodisalar kvotasi oshib ketgan) va5xxda soʻrovni keyinroq xuddi shumessageIdbilan takrorlang. - Cheklovlar: xabar 32 KB gacha,
/batchda 500 tagacha xabar, soʻrov tanasi 1 MB gacha. Yozish kaliti daqiqasiga 6000 tagacha soʻrov qabul qiladi. - Sayt domenlari boʻyicha cheklov server soʻrovlariga taʼsir qilmaydi.
Metodlarning toʻliq roʻyxati — API maʼlumotnomasida: https://cdp.onetrace.pro/api/v1/openapi.json.