Geliştiriciler · API v1.0.0
Shopify Mağaza Uygulamaları İçin Entegrasyon
Bu rehber, Shopify mağazası için mobil uygulaması olan ekipler içindir. Uygulama Storefront API, Customer Account API veya Checkout Kit ile Expo, React Native, Flutter ya da native olarak geliştirilmiş olabilir. Genel API referansı için Genel bakış.
Bu rehber, platform kurulumunun üzerine Shopify'a özel adımları anlatır: müşteri eşleştirme, e-ticaret attributes'ları, backend (webhook) güncellemeleri ve kampanya kurguları.
Desteklenen sürümler: Shopify Storefront API ve Customer Account API'nin desteklenen tüm sürümleri (örnekler 2025-01 ve sonrası ile uyumludur) · Mobil taraf için ilgili platform rehberindeki sürümler.
Uygulamanız Tapcart, Shopney, Plobal gibi kodsuz bir uygulama oluşturucu ile yapıldıysa, NotiPilot entegrasyonu için uygulamaya özel kod ekleyebilmeniz gerekir. Bu platformların özel kod/SDK desteği olup olmadığını sağlayıcınıza danışın.
1. Önce platform entegrasyonu
Mobil uygulamanızın teknolojisine göre cihaz kaydını kurun:
| Uygulama teknolojisi | Rehber |
|---|---|
| Expo | expo.md |
| React Native | react-native.md |
| Flutter | flutter.md |
| Ionic / Capacitor | ionic.md |
| Android (Kotlin / Java) | kotlin.md · android.md |
| iOS (Swift / Objective-C) | swift.md · ios.md |
Bu adım bittiğinde her cihaz NotiPilot'ta kayıtlı ve "Tüm kullanıcılar" gönderimlerini alıyor olmalıdır.
2. Müşteriyi cihazla eşleştirme
Müşteri uygulamada giriş yaptığında identify-device çağırın. external_id olarak Shopify müşteri ID'sini önekle birlikte kullanın:
gid://shopify/Customer/7234567890123 → external_id: "shopify:7234567890123"
Önek (shopify:), ileride başka kaynaklardan gelen kullanıcı ID'leriyle çakışmayı önler.
Storefront API ile müşteri bilgisini almak
query Customer($token: String!) {
customer(customerAccessToken: $token) {
id
acceptsMarketing
defaultAddress { city countryCodeV2 }
}
}
Yeni Customer Account API kullanıyorsanız:
customer { id defaultAddress { city territoryCode } emailAddress { marketingState } }
identify-device çağrısı (TypeScript örneği)
async function identifyShopifyCustomer(customer: {
id: string;
acceptsMarketing: boolean;
defaultAddress?: { city?: string | null; countryCodeV2?: string | null } | null;
}) {
const numericId = customer.id.split('/').pop(); // "gid://shopify/Customer/123" → "123"
await fetch('https://app.notipilot.com/api/v1/identify-device', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
app_id: 'EXPO-PROJE-ID-NIZ',
device_uid: await getDeviceUid(), // platform rehberindeki fonksiyon
external_id: `shopify:${numericId}`,
consent_marketing: customer.acceptsMarketing,
attributes: {
customer_type: 'registered',
country: customer.defaultAddress?.countryCodeV2 ?? null, // "TR"
city: customer.defaultAddress?.city ?? null, // "Istanbul"
},
}),
});
}
Müşteri çıkış yaptığında register-device isteğini "external_id": null ve "attributes": { "customer_type": "guest" } ile tekrar gönderin.
Konum segmentleri için önemli: Müşterinin varsayılan teslimat adresindeki
cityvecountryCodeV2, NotiPilot'taki konum segmentlerinin en güvenilir kaynağıdır. Giriş yapmamış kullanıcılar için en azından cihaz bölgesindencountrygönderin.
3. Önerilen e-ticaret attributes'ları
NotiPilot paneli her attribute değeri için otomatik segment üretir. Bu yüzden sınırlı sayıda farklı değer alan alanlar kullanın; sayıları aralıklara bölün.
| Attribute | Örnek değerler | Kaynak |
|---|---|---|
customer_type |
guest, registered, vip |
Uygulama / müşteri tag'leri |
country |
TR, DE |
defaultAddress.countryCodeV2 |
city |
Istanbul, Izmir |
defaultAddress.city |
locale |
tr, en |
Cihaz dili |
orders_bucket |
0, 1, 2-5, 6+ |
Backend (webhook) |
spend_bucket |
0-500, 500-2000, 2000+ |
Backend (webhook) |
cart_status |
empty, active, abandoned |
Uygulama / backend |
last_order_month |
2026-09 |
Backend (webhook) |
❌ orders_count: 17, total_spent: 1234.56, e-posta, telefon gibi değerleri göndermeyin: ya çok sayıda anlamsız segment oluşturur ya da kişisel veridir.
tags alanını müşteri tag'lerinden türetilmiş kısa etiketler için kullanabilirsiniz (ör. ["vip", "wholesale"]). tags gönderildiğinde mevcut listenin yerine geçer.
4. Backend'den güncelleme (Shopify webhook'ları)
NotiPilot API'si sade bir HTTP API'dir; mobil uygulamanın yanı sıra kendi backend'inizden de çağrılabilir. Bunun için müşteri giriş yaptığında device_uid değerini kendi backend'inizde müşteriyle birlikte saklayın. Bir müşterinin birden fazla cihazı olabilir.
Örnek: orders/create webhook'u geldiğinde müşterinin tüm cihazlarını güncelleyin (Node.js):
app.post('/webhooks/orders-create', verifyShopifyHmac, async (req, res) => {
const order = req.body;
const customerId = order.customer?.id;
if (!customerId) return res.sendStatus(200);
const ordersCount = order.customer.orders_count ?? 1;
const bucket = ordersCount >= 6 ? '6+' : ordersCount >= 2 ? '2-5' : String(ordersCount);
const devices = await db.devicesForCustomer(customerId); // [{ device_uid }, ...]
await Promise.all(devices.map((d) =>
fetch('https://app.notipilot.com/api/v1/identify-device', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
app_id: process.env.NOTIPILOT_APP_ID,
device_uid: d.device_uid,
external_id: `shopify:${customerId}`,
attributes: {
orders_bucket: bucket,
last_order_month: new Date().toISOString().slice(0, 7),
cart_status: 'empty',
},
}),
})
));
res.sendStatus(200);
});
Faydalı webhook konuları:
| Webhook | Güncellenecek attribute |
|---|---|
orders/create |
orders_bucket, spend_bucket, last_order_month, cart_status: empty |
customers/update |
city, country, customer_type (tag'lere göre), consent_marketing |
checkouts/update |
cart_status: active |
Rate limit IP başına dakikada 300 istektir. Toplu güncellemelerde istekleri sıraya koyun ve
429yanıtındaretry_afterkadar bekleyin.
5. Bildirim içeriği ve derin bağlantı
Panelden gönderirken Data alanına uygulamanızın tanıdığı bir yönlendirme bilgisi koyun:
{ "screen": "product", "handle": "kirmizi-elbise" }
{ "screen": "collection", "handle": "yeni-sezon" }
{ "screen": "cart" }
Uygulamada bildirime tıklanma olayında bu alanları okuyup ilgili ekrana yönlendirin (platform rehberlerindeki "bildirime tıklandı" örneklerine bakın). Ürün sayfasını handle ile Storefront API'den çekebilirsiniz: product(handle: "kirmizi-elbise") { ... }.
6. Kampanya örnekleri
| Kampanya | Segment |
|---|---|
| Şehre özel kargo kampanyası | city: Istanbul |
| Yurt dışı müşterilere duyuru | country: DE, country: NL … |
| İlk siparişe teşvik | orders_bucket: 0 |
| Sadık müşteri indirimi | orders_bucket: 6+ veya customer_type: vip |
| Sepet hatırlatma | cart_status: abandoned |
7. Yasal notlar
- Pazarlama bildirimleri için Shopify'daki pazarlama onayını (
acceptsMarketing/marketingState)consent_marketingalanına aktarın. - Kişisel verileri (e-posta, telefon, adres satırı) attributes'a koymayın; eşleştirme için yalnızca
external_idkullanın. - KVKK / GDPR kapsamında silme talebi gelen müşterinin cihazları için
external_id: nullgönderip ilgili attributes'larınullile temizleyin.
Kontrol listesi
- Platform entegrasyonu tamamlandı (cihazlar kayıtlı)
- Girişte
external_id: "shopify:<id>"ileidentify-deviceçağrılıyor -
countryvecityvarsayılan adresten gönderiliyor -
consent_marketingShopify pazarlama onayından besleniyor - Sayısal değerler aralıklara (bucket) bölünüyor
- (İsteğe bağlı)
device_uidbackend'de saklanıyor ve webhook'larla güncelleme yapılıyor