Bölüm 4 / 9
Veri Amplitude'a nasıl girer, nereye çıkar?
Amplitude'a veri birkaç kapıdan girer ama hepsi aynı event modeline ve aynı kullanıcı kimliğine yazılır. Kapı seçimi, Adjust'taki SDK ile S2S ayrımının neredeyse birebir karşılığıdır.
- SDK, HTTP API, entegrasyon ve warehouse yollarının ne zaman kullanıldığını bileceksin.
- Mobil, web ve backend için temel kod kalıplarını okuyabileceksin.
- Aynı sinyali iki yoldan gönderip çift saymanın nasıl önleneceğini bileceksin.
Genel akış
SDK ve S2S: iki aracın aynı ayrımı
Adjust'ta bildiğin kural burada da geçerli: davranış event'leri cihazdan, doğrulanmış para event'leri ve uygulama kapalıyken olan event'ler sunucudan gelir.
| Event türü | Önerilen yol | Neden |
|---|---|---|
| Ekran görüntüleme, tıklama, arama | SDK | Oturum ve cihaz bağlamı otomatik gelir |
| Onboarding adımları | SDK | Login öncesi anonim davranış ölçülür |
| Satın alma (doğrulanmış) | HTTP API, backend doğruladıktan sonra | Sahte veya iptal edilen işlemler sayılmaz |
| Abonelik yenileme, iade | HTTP API | Kullanıcı uygulamada değilken olur |
| CRM'den gelen durum değişikliği (ör. plan yükseltme) | HTTP API veya identify çağrısı | Kaynağı backend'dir |
Aynı satın almayı hem SDK'dan Purchase, hem backend'den Purchase olarak gönderirsen iki event olur. Ya tek yol seç, ya da adlarını ayır (Purchase Attempted cihazdan, Purchase Completed sunucudan). Sunucu tarafında aynı event'in yeniden gönderilmesine karşı her event'e benzersiz bir insert_id ver.
Kod kalıpları
Her SDK'da aynı dört temel işlem vardır: başlat, event gönder, kullanıcıyı tanımla, user property güncelle. Aşağıdaki örnekler bu dördünü yan yana gösterir.
import * as amplitude from '@amplitude/analytics-browser';
// 1. Initialize once, as early as possible
amplitude.init('YOUR_API_KEY');
// 2. Track an event with properties
amplitude.track('Product Viewed', {
product_id: 'SKU-1042',
category: 'headphones',
price: 49.9,
});
// 3. Identify the user after login
amplitude.setUserId('cust_88231');
// 4. Update persistent user properties
const identify = new amplitude.Identify();
identify.set('plan', 'premium');
identify.setOnce('signup_date', '2026-11-04');
identify.add('orders_count', 1);
amplitude.identify(identify);
// Revenue as a dedicated call
const revenue = new amplitude.Revenue()
.setProductId('SKU-1042')
.setPrice(49.9)
.setQuantity(1);
amplitude.revenue(revenue);import { init, track, setUserId, identify, Identify } from '@amplitude/analytics-react-native';
// 1. Initialize once at app start
init('YOUR_API_KEY');
// 2. Track an event
track('Product Viewed', { product_id: 'SKU-1042', category: 'headphones', price: 49.9 });
// 3. Identify after login
setUserId('cust_88231');
// 4. User properties
const event = new Identify();
event.set('plan', 'premium');
identify(event);import AmplitudeSwift
// 1. Initialize once, e.g. in AppDelegate
let amplitude = Amplitude(configuration: Configuration(apiKey: "YOUR_API_KEY"))
// 2. Track an event
amplitude.track(eventType: "Product Viewed",
eventProperties: ["product_id": "SKU-1042", "price": 49.9])
// 3. Identify after login
amplitude.setUserId(userId: "cust_88231")
// 4. User properties
let identify = Identify()
identify.set(property: "plan", value: "premium")
amplitude.identify(identify: identify)import com.amplitude.android.Amplitude
import com.amplitude.android.Configuration
import com.amplitude.core.events.Identify
// 1. Initialize once, e.g. in Application.onCreate
val amplitude = Amplitude(Configuration(apiKey = "YOUR_API_KEY", context = applicationContext))
// 2. Track an event
amplitude.track("Product Viewed", mutableMapOf("product_id" to "SKU-1042", "price" to 49.9))
// 3. Identify after login
amplitude.setUserId("cust_88231")
// 4. User properties
amplitude.identify(Identify().set("plan", "premium"))# Server-side event after the backend has verified the renewal
curl -X POST https://api2.amplitude.com/2/httpapi \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"events": [{
"user_id": "cust_88231",
"event_type": "Subscription Renewed",
"time": 1762243200000,
"insert_id": "renewal-cust_88231-2026-11",
"event_properties": { "plan": "premium", "period": "monthly" },
"revenue": 9.99
}]
}'SDK paket adları, metot imzaları ve başlatma seçenekleri sürümden sürüme değişir; özellikle eski (legacy) ve yeni nesil SDK'lar arasında fark büyüktür. Bir müşteri entegrasyonunda kullanmadan önce projedeki SDK sürümünün dokümanına bak. HTTP API'de EU veri yerleşimi için farklı bir endpoint kullanılır; büyük hacimler için ayrı bir batch endpoint'i vardır.
Sunucu event'lerinde dikkat edilecekler
- Kimlik: Sunucu event'ini doğru kişiye bağlamak için cihazdaki
user_idile aynı değeri gönder. Sadece login olmuş kullanıcıların sunucu event'i doğru bağlanır. - Zaman:
timealanı event'in gerçekleştiği andır (milisaniye). Gönderdiğin an değil. - Tekrar gönderim: Hata sonrası tekrar denemelerde aynı
insert_idkullan; Amplitude belirli bir süre içinde aynıinsert_id'yi tek event sayar. - Oturum: Sunucu event'leri kullanıcının uygulama oturumuna ait değildir; oturum süresi gibi metrikleri etkilememeleri beklenir.
Adjust S2S'de event'i doğru cihaza bağlamak için cihaz tanımlayıcıları (ADID, IDFA/GAID vb.) gerekir; kimlik olmayan S2S event'i eşleşmez. Amplitude HTTP API'de bunun karşılığı user_id veya device_id'dir. Aynı backend her iki araca da gönderiyorsa, iki farklı kimlik setini birlikte saklaması gerekir.
SDK event'leri ne zaman görünür?
SDK'lar event'leri anında göndermez; cihazda kuyruğa alır ve belirli bir sayıya ya da süreye ulaşınca toplu gönderir. İnternet yoksa bekletir. Bu yüzden bir event'in Amplitude'a ulaşması saniyeler, çevrimdışı senaryoda saatler sürebilir; ama time alanı her zaman event'in gerçekleştiği anı taşır.
Entegrasyon testinde event'i chart'larda aramak yerine user lookup ve ingestion debugger ekranlarını kullan. Bunlar Adjust Testing Console'un karşılığıdır ve event'in gelip gelmediğini, hangi property'lerle geldiğini neredeyse anında gösterir.
Ortamlar: sandbox nerede?
Adjust'ta sandbox ve production aynı uygulamanın içinde, bir filtreyle ayrılır. Amplitude'da yaygın uygulama, geliştirme ve production için ayrı projeler açmaktır. Her projenin kendi API key'i vardır; build konfigürasyonu hangi key'in kullanılacağını belirler.
Geliştirme build'inin production API key'iyle çıkması. Test event'leri gerçek veriye karışır ve geri temizlemek zordur. Key'i build ortamına göre seçen bir yapı kur ve yayından önce kontrol et.
Warehouse ile çalışma
Veri zaten bir warehouse'ta varsa (ör. backend event'leri BigQuery'de), Amplitude oradan veri içeri alabilir. Ters yönde, Amplitude'daki ham event'ler analiz ve yedekleme için warehouse'a aktarılabilir. Ryze'ın API-to-warehouse connector işleriyle en çok kesişen kısım burasıdır.
Desteklenen warehouse kaynak ve hedefleri, senkronizasyon sıklığı ve hangi planda olduğu değişebilir. Güncel listeyi Amplitude'un entegrasyon kataloğundan kontrol et.
Ücretsiz bir test projesi aç. Basit bir HTML sayfasına Web SDK'yı ekle, bir butona track, bir "giriş yap" butonuna setUserId bağla. Sonra aynı kullanıcı için terminalden yukarıdaki HTTP API örneğiyle bir sunucu event'i gönder. User lookup ekranında üç event'in de aynı kişinin akışında göründüğünü doğrula.