Satış Ortaklığı Atamaları

1.7k görüntülenme Markdown

Müşteri ve hizmetleri satış ortağına bağlayan, listeleyen ve ayıran altı uç.

Genel Bakış

Bir satış ortağı iki yoldan kazanır. Müşteri bağlantısı "bu müşteriyi o getirdi" der; hizmet bağlantısı ise belirli bir satıştan komisyon yazar.

İki yol ayrı yerlerde durur. Müşteri bağlantısı müşteri kaydında bir alandır, hizmet bağlantısı ise kendi komisyon kaydını açar. Bu yüzden kaldırma uçları da farklı numaralarla konuşur.

Hizmet bağlaması beş koşul arar: program açık olmalı, hizmet türü uygun olmalı, ürün komisyona kapalı olmamalı, ortak devre dışı olmamalı ve hizmet başka bir ortağa bağlı olmamalı.

Referans

Bağlı Müşterileri Listeleme

get/api/v1/admin/affiliates/assigned-clients
Affiliates/GetAssignedClients admin

Bir satış ortağına bağlanmış müşterileri döndürür.

Sorgu 3
pageintKaçıncı sayfa.
limitintSayfa başına kayıt. En çok 100.
searchstringMüşteri ve ortak adı ile şirket adında arar.
Dönen alanlar data[] — 8 + meta — 4
idintMüşterinin numarası.
full_namestringMüşterinin adı soyadı.
company_namestringMüşterinin şirket adı.
emailstringMüşterinin e-postası.
aff_idintBağlı olduğu ortağın müşteri numarası. Ortak kayıt numarası değil.
aff_namestringOrtağın adı soyadı.
aff_companystringOrtağın şirket adı.
aff_user_idintOrtağın müşteri numarası.
totalintToplam bağlı müşteri. Meta altında döner.
pageintBulunulan sayfa.
limitintSayfa boyutu.
next_pageintSonraki sayfa. Son sayfada sıfır.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/affiliates/assigned-clients?search=jane' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch('https://panel.ornek.com/api/v1/admin/affiliates/assigned-clients', {
  headers: { Authorization: `Bearer ${apiKey}` },
});

const { data } = await res.json();
const perPartner = Object.groupBy(data, (c) => c.aff_user_id);
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/assigned-clients');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// aff_id ORTAGIN MUSTERI numarasidir; ortak kayit numarasiyla eslestirmeye calismayin.
$rows = Api::Affiliates()->GetAssignedClients()['data'];
$mine = array_filter($rows, fn ($c) => (int) $c['aff_user_id'] === $partnerClientId);

Müşteriyi Ortağa Bağlama

post/api/v1/admin/affiliates/assigned-clients
Affiliates/AssignClient admin

Bir müşteriyi satış ortağının yönlendirmesi olarak işaretler.

Gövde 2
affiliate_idintreqSatış ortağının kayıt numarası.
client_idintreqBağlanacak müşterinin numarası.
Dönen alanlar data — 3
assignedboolBağlama çalıştı mı.
affiliate_idintSatış ortağının numarası.
client_idintMüşterinin numarası.
Hatalar 4
missing_params422Ortak ya da müşteri numarası eksik.
assign_self422Müşteri kendi ortaklığına bağlanamaz.
not_found404Ortak ya da müşteri bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/affiliates/assigned-clients' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"affiliate_id":7,"client_id":88}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/affiliates/assigned-clients', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ affiliate_id: 7, client_id: 88 }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/assigned-clients');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['affiliate_id' => 7, 'client_id' => 88]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Baska bir ortaga bagli musteri SESSIZCE devralinir; onceki ortak yonlendirmeyi kaybeder.
$rows = Api::Affiliates()->GetAssignedClients()['data'];
$owned = array_column($rows, 'aff_user_id', 'id');
if (! isset($owned[$clientId])) Api::Affiliates()->AssignClient(['affiliate_id' => $aid, 'client_id' => $clientId]);

Müşteri Bağlantısını Kaldırma

delete/api/v1/admin/affiliates/assigned-clients
Affiliates/UnassignClients admin

Bir ya da daha çok müşterinin ortak bağlantısını kaldırır.

Gövde 1
idsint[]reqMüşteri numaraları. Atama numarası değil.
Dönen alanlar data — 1
unassignedint[]Gönderdiğiniz müşteri numaraları.
Hatalar 2
ids_required422Müşteri numarası verilmedi.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/affiliates/assigned-clients' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"ids":[88,90]}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/affiliates/assigned-clients', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ ids: [88, 90] }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/assigned-clients');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['ids' => [88, 90]]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Hicbir denetim YOK: gonderilen her musterinin bagi silinir, bagli olmayanlar da yaniti doldurur.
Api::Affiliates()->UnassignClients(['ids' => [88, 90]]);

Bağlı Hizmetleri Listeleme

get/api/v1/admin/affiliates/assigned-services
Affiliates/GetAssignedServices admin

Ortaklara komisyon getiren hizmet kayıtlarını döndürür.

Sorgu 4
pageintKaçıncı sayfa.
limitintSayfa başına kayıt. En çok 100.
searchstringMüşteri, ortak, hizmet adı ve kayıt numarasında arar.
statusstringKayıt durumu süzgeci.
Dönen alanlar data[] — 15 + meta — 4
idintKomisyon kaydının numarası. Kaldırma ucu bu numarayı ister.
affiliate_idintSatış ortağının kayıt numarası.
service_idintHizmetin numarası.
service_namestringHizmetin adı.
user_idintHizmet sahibi müşterinin numarası.
full_namestringMüşterinin adı soyadı.
company_namestringMüşterinin şirket adı.
amountstringHizmetin tutarı. Komisyonun hesaplandığı taban.
currencyintTutarın para birimi numarası.
commissionstringOrtağa yazılan komisyon. Ortağın cüzdan para biriminde (aff_currency), currency'de değil.
statusstringKaydın durumu. Tamamlanmış kayıt bakiyeye geçmiştir.
aff_namestringOrtağın adı soyadı.
aff_companystringOrtağın şirket adı.
aff_user_idintOrtağın müşteri numarası.
aff_currencyintOrtağın cüzdan para birimi numarası. Komisyon bu birimdedir.
ctimestringKaydın açıldığı an.
totalintToplam kayıt. Meta altında döner.
pageintBulunulan sayfa.
limitintSayfa boyutu.
next_pageintSonraki sayfa. Son sayfada sıfır.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/affiliates/assigned-services?limit=50' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch('https://panel.ornek.com/api/v1/admin/affiliates/assigned-services', {
  headers: { Authorization: `Bearer ${apiKey}` },
});

const { data } = await res.json();
const earned = data.reduce((s, t) => s + Number(t.commission), 0);
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/assigned-services');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Kaldirma ucu HIZMET numarasini degil, buradaki KAYIT numarasini (id) ister.
$rows = Api::Affiliates()->GetAssignedServices()['data'];
$recordId = array_column($rows, 'id', 'service_id')[$serviceId] ?? 0;

Hizmeti Ortağa Bağlama

post/api/v1/admin/affiliates/assigned-services
Affiliates/AssignService admin beş koşul

Bir hizmeti ortağa bağlar ve komisyon kaydını açar.

Gövde 2
affiliate_idintreqSatış ortağının kayıt numarası.
service_idintreqBağlanacak hizmetin numarası.
Dönen alanlar data — 3
assignedboolBağlama çalıştı mı.
affiliate_idintSatış ortağının numarası.
service_idintHizmetin numarası.
Hatalar 8
missing_params422Ortak ya da hizmet numarası eksik.
system_disabled422Satış ortaklığı programı kapalı.
type_unsupported422Hizmet türü komisyona uygun değil. Barındırma, sunucu, yazılım ve özel türler geçer.
product_disabled422Ürün için satış ortaklığı kapatılmış.
affiliate_disabled422Satış ortağı devre dışı.
already_assigned422Hizmet başka bir ortağa bağlı.
not_found404Ortak ya da hizmet bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/affiliates/assigned-services' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"affiliate_id":7,"service_id":305}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/affiliates/assigned-services', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ affiliate_id: 7, service_id: 305 }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/assigned-services');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['affiliate_id' => 7, 'service_id' => 305]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Bes kosul birden aranir; en cok atlanan ikisi kapali program ve zaten bagli hizmettir.
try     { Api::Affiliates()->AssignService(['affiliate_id' => $aid, 'service_id' => $sid]); }
catch   (\Throwable $e) { $skipped[$sid] = $e->getMessage(); }

Hizmet Bağlantısını Kaldırma

delete/api/v1/admin/affiliates/assigned-services/{tid}
Affiliates/UnassignService admin bakiyeye dokunur

Komisyon kaydını kaldırır ve gerekiyorsa komisyonu geri alır.

Dönen alanlar data — 2
unassignedboolKaldırma çalıştı mı.
idintKaldırılan kaydın numarası.
Hatalar 2
not_found404Komisyon kaydı bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/affiliates/assigned-services/12' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/admin/affiliates/assigned-services/${tid}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/assigned-services/' . $tid);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Tamamlanmis kayitta komisyon bakiyeden DUSER; odeme talepleri silmesinin tam TERSI yonde.
Api::Affiliates()->UnassignService(['tid' => $recordId]);

Tuzaklar

İki kaldırma ucu iki farklı numara ister

Müşteri bağlantısını kaldıran uç gövdede müşteri numaraları ister; hizmet bağlantısını kaldıran uç ise adreste komisyon kaydının numarasını ister. İkincisine hizmet numarası vermek ya bulunamadı der ya da yanlış kaydı siler. Kayıt numarasını listeleme ucundan alın.

Müşteri bağlantısını kaldırma hiçbir şey denetlemez

Bu uç gönderdiğiniz her müşteri numarasının bağlantısını siler. Numaranın bir ortağa bağlı olup olmadığına, hatta o müşterinin var olup olmadığına bakmaz; hepsini yanıtta kaldırıldı diye sayar. Yanlış bir liste sessizce başka müşterilerin bağlantılarını koparır.

Bağlama, var olan bağı sessizce devralır

Bir müşteri zaten başka bir ortağa bağlıysa yeni bağlama hata vermez; bağı üstüne yazar ve önceki ortak o yönlendirmeyi kaybeder. Hizmet tarafında aynı durum already_assigned ile reddedilir. Müşteri bağlamadan önce mevcut bağı listeleme ucundan denetleyin.

Komisyon kaydını silmek bakiyeden düşer

Tamamlanmış bir komisyon kaydını kaldırmak tutarı ortağın bakiyesinden düşürür. Ödeme talebi silmenin bakiyeyi artırdığını hatırlayın: iki silme ters yönlerde çalışır. Bakiye sıfırın altına inmez, yani düşülemeyen fark sessizce kaybolur.

Bağlantı alanı ortak numarası değil müşteri numarası tutar

Listedeki aff_id ortağın arkasındaki müşteri numarasıdır, ortak kaydının numarası değil. Bağlama ucu ise gövdede ortak kaydının numarasını ister. Bir listeden okuduğunuz numarayı doğrudan bağlama ucuna vermek başka bir ortağa atama yapar.

Hizmet türü ve ürün ayarı sessiz bir kapıdır

Komisyon yalnız barındırma, sunucu, yazılım ve özel türdeki hizmetlere yazılır; alan adı gibi diğer türler type_unsupported alır. Ürünün kendi ayarı da komisyonu kapatabilir. Toplu bir bağlama işinde bu iki durumu ayrı toplayın.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.