Lojistik ve Kargo Sektöründe KVKK Kabusu ve Veribenim Çözümü: Konum Verisi, Sürücü Takibi ve Veri Minimizasyonu
Lojistik ve kargo şirketleri her gün milyonlarca veri noktası toplarlar. Ancak bu verilerin çoğu **üst düzey gizlilik riskini** barındırır: 1. **Müşteri Konum Verisi**: "Paketim nerede?" sorusu, gerçek zamanlı koordinatlar anlamına gelir 2. **Sürücü Takibi**: Hareket halindeki çalışanların konum, hız, rota verileri 3. **Teslimat Adresleri & Tercih Verisi**: İş saatleri, telefon, dönem özel adresler (örn. tatil evi) KVKK Madde 4'ün tanımı gereği bu veriler **"kişiye ilişkin veri"** kategorisine girer. Eğer bir kişi bir konum ile özdeş konuma getirilirse, o konum verisi de kişiye ilişkin sayılır.

Kargo Sektöründe Üç Kritik Veri Akışı
Lojistik ve kargo şirketleri her gün milyonlarca veri noktası toplarlar. Ancak bu verilerin çoğu üst düzey gizlilik riskini barındırır:
Müşteri Konum Verisi: "Paketim nerede?" sorusu, gerçek zamanlı koordinatlar anlamına gelir
Sürücü Takibi: Hareket halindeki çalışanların konum, hız, rota verileri
Teslimat Adresleri & Tercih Verisi: İş saatleri, telefon, dönem özel adresler (örn. tatil evi)
KVKK Madde 4'ün tanımı gereği bu veriler "kişiye ilişkin veri" kategorisine girer. Eğer bir kişi bir konum ile özdeş konuma getirilirse, o konum verisi de kişiye ilişkin sayılır.
🚨 İHLAL RİSKİ: Birçok kargo firması, müşteri rızası olmaksızın teslimatçı konum verilerini analitik platformlara gönderir. Bu tek başına KVKK Madde 5 ihlalidir ve 15 milyon TL'ye kadar para cezası yol açabilir.
Bu makalede, Veribenim'in SDK ve API'si kullanarak kargo sektöründe yasal kalkan nasıl oluşturulur, göstereceğiz.
1. Konum Verisi Hukuki Statüsü — KVKK Madde 4 ve 5
KVKK Madde 4: Kişiye İlişkin Verinin Tanımı
"Tanımlanmış veya tanımlanabilir gerçek kişiye ilişkin her türlü bilgi"
Kargo sektöründe bu kapsamda:
Veri Türü | Hukuki Statü | KVKK Madde | Gerekli Rıza |
|---|---|---|---|
GPS Koordinat + Timestamp | Kişiye ilişkin veri | 4 | EVET |
Sürücü Ad + ID | Kişiye ilişkin veri | 4 | EVET |
Teslimat Adresi | Kişiye ilişkin veri | 4 | EVET |
Başarısız Teslimat Notu | Kişiye ilişkin veri | 4 | EVET |
Hareket Geçmişi (30 gün) | Hassas veri (konum) | 6/3 | EVET + Ek Rıza |
Sürücü Elektronik Takip Sistemi | Çalışan Verisi + Konum | 12/7 | İşveren Onayı |
KVKK Madde 5 — Hukuki Uygunluk Nedenleri
Bir kargo firması konum verisi işleyebilecek tek yasal neden, müşterinin/sürücünün açık rızası almak ve sözleşmeyi yerine getirmektir:
Madde 5(a): Rıza — Müşteri "teslimat takibi" için açıkça onay vermiş
Madde 5(c): Sözleşme Yerine Getirme — "Teslimatını yapacağız" sözleşmesinin yürütülmesi
Ancak kritik nokta: Bu rıza, işleme amacından geniş olamaz. Müşteri "teslimat takibi" için rıza vermişse, o konum verisi pazarlama, araştırma veya davranışsal analitike kullanılamaz.
⚖️ HUKUKİ NOT: GDPR Article 6(1) da aynı mantığı barındırır. Avrupalı müşterilere hizmet veren kargo firmaları çift uyumluluk sağlamalıdır: KVKK + GDPR.
2. SMS/Push Bildirimi Öncesi Consent Yönetimi
Müşteri, paketinin "yaklaşıyor" olduğunu bilmek isteyebilir. Ancak bu, otomatik bir sürüç değildir. Tercihler yönetimi gerekir:
İdeal Tercih Yapısı
{
"session_id": "cust_abc123xyz",
"preferences": {
"location_tracking": false, // "Paketim nerede?" takibi
"eta_push": true, // "Çıktı yolda" bildirimi (konum YOK)
"eta_sms": true, // SMS ile ETA gönder
"delivery_window": "08:00-18:00", // İş saati tercihi
"signature_required": false, // İmza gerekli mi?
"photo_consent": false // Teslimat fotoğrafı çekilebilir mi?
},
"last_updated": "2026-04-02T14:30:00Z",
"expires_at": "2027-04-02T14:30:00Z" // 1 yıl validite
}
Burada kritik fark:
location_tracking: true→ Gerçek konum verisi işlenireta_push: true+location_tracking: false→ Sadece status güncellemeleri gönderilir ("Sürücü yaklaşıyor" = konum PAYLAŞILMAZ)
3. Veri Minimizasyonu Pratikte Nasıl Uygulanır?
KVKK Madde 4'ün en önemli ilkesi Privacy by Design / Veri Minimizasyonu'dur:
💡 PRO TIP: Sadece işleme amacı için gerekli minimum veriyi toplayın. Müşteri "teslimat takibi" için rıza vermişse, koordinatları şehir/ilçe seviyesine aşağıladığında, muğlak bir harita gösterebilir ve yine de hizmet sunabilirsiniz.
Örnek 1: Tam Koordinat vs. İlçe Bilgisi
Müşteri perspektifi:
"Sürücü Beyoğlu'nda" — Yeterli (konum hassasiyeti düştü)
Kargo şirketi perspektifi:
- Rota optimizasyonuna engel değil
- Müşteri mahremiyeti korundu
- KVKK Madde 4 uyumluluk arttı
Örnek 2: Konum Verisi Retention
KVKK Madde 7'ye göre, konum verisi işleme amacı bitince silinmelidir. Teslimat tamamlandıktan 30 gün sonra, o rota verisi kalıcı olarak silinmelidir.
⚠️ DİKKAT: Pek çok kargo firması, "istatistik tutmak için" 2-3 yıl konum verisi saklarlar. Bu KVKK Madde 7 ihlalidir ve çeşitli ceza yol açabilir.
4. Nasıl Entegre Edilir? — Laravel SDK
Veribenim Laravel SDK, kargo uygulamalarında hızlı, hukuki ve ölçeklenebilir çözüm sunar.
Adım 1: Laravel SDK Kurulumu
composer require veribenim/laravel-sdk
php artisan vendor:publish --provider="Veribenim\Laravel\VeribenimServiceProvider"
Adım 2: ENV Konfigürasyonu
VERIBENIM_TOKEN=pk_live_xyzabc123... # Admin panelden
VERIBENIM_BASE_URL=https://api.veribenim.com
Adım 3: Teslimat Bildirimi — Consent Kontrolü
<?php
namespace App\Services;
use Veribenim\Laravel\VeribenimFacade as Veribenim;
use App\Models\Order;
use App\Models\DeliveryLocation;
class DeliveryNotificationService
{
/**
* Teslimat güncellemesi gönder — Rıza kontrol edilir
*/
public function sendLocationUpdate(Order $order, float $lat, float $lng): void
{
// 1. Müşteri tercihlerini al
$prefs = Veribenim::getPreferences($order->customer_session_id);
// 2. location_tracking onayı yoksa, sadece status gönder
if (!$prefs || !$prefs['preferences']['location_tracking']) {
$this->sendStatusOnly($order, 'Teslimatınız yolda, yaklaşmaktadır.');
return;
}
// 3. Rıza varsa, veri minimizasyonu: tam koordinat yerine ilçe
$location = $this->minimizeLocation($lat, $lng);
// 4. Bildirimi gönder
$this->sendWithLocation($order, $location);
// 5. Veribenim'e log kaydet (denetçi katı)
$this->logLocationProcessing($order, $location, 'eta_push');
}
/**
* Konum verisi minimizasyonu: Koordinat → İlçe bilgisi
*/
private function minimizeLocation(float $lat, float $lng): array
{
$districtName = $this->getDistrictByCoordinates($lat, $lng);
return [
'district' => $districtName, // "Beyoğlu" (veri minimizasyonu)
'timestamp' => now()->toIso8601String(),
'map_url' => "https://maps.google.com/?q={$districtName}",
];
}
/**
* Sürücü consent log — Çalışan verisi işlemesi
*/
public function logDriverConsent(Driver $driver, Request $request): void
{
Veribenim::logFormConsent(
formName: 'driver_location_consent',
consented: $request->boolean('konum_onay'),
consentText: 'Çalışma saatlerim süresince konum verimin işlenmesini, teslimat rota optimizasyonu amacıyla kullanılmasını onaylıyorum. Verilerim 30 gün sonra silinecektir.',
metadata: [
'driver_id' => $driver->id,
'shift_start' => $driver->shift_start->toIso8601String(),
'shift_end' => $driver->shift_end->toIso8601String(),
'vehicle_type' => $driver->vehicle_type,
'retention_days' => 30,
]
);
}
/**
* DSAR (Data Subject Access Request) — Müşteri silme talebi
*/
public function handleCustomerErasure(Request $request): void
{
// Veribenim'e resmî talep bildir
Veribenim::submitDsar(
requestType: 'erasure',
fullName: $request->full_name,
email: $request->email,
description: 'Geçmiş teslimat adreslerimin, konum geçmişimin (son 6 ay), iletişim tercihlerimin ve fotoğraf kayıtlarımın sistemden kalıcı olarak silinmesini talep ediyorum. KVKK Madde 11/e ve GDPR Article 17 kapsamında hakkımı kullanıyorum.'
);
// Yerel silme işlemleri
DeliveryLocation::where('customer_id', $request->customer_id)
->where('created_at', '>', now()->subMonths(6))
->delete();
}
}
Adım 4: Otomatik Veri Temizleme
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Models\DeliveryLocation;
class CleanupOldLocationDataJob implements ShouldQueue
{
use Queueable;
/**
* 30 günden eski teslimat konum verilerini sil (KVKK Madde 7)
*/
public function handle(): void
{
$cutoffDate = now()->subDays(30);
$deleted = DeliveryLocation::where('created_at', '<', $cutoffDate)
->where('delivery_status', 'completed')
->delete();
\Log::info('[Veribenim Compliance] Eski konum verileri temizlendi', [
'records_deleted' => $deleted,
'cutoff_date' => $cutoffDate,
'reason' => 'KVKK Madde 7 Retention Policy',
]);
}
}
app/Console/Kernel.php dosyasında schedule tanımla:
protected function schedule(Schedule $schedule)
{
// Her gün saat 02:00'de çalışmayan eski konum verilerini sil
$schedule->job(new CleanupOldLocationDataJob)
->dailyAt('02:00')
->onOneServer();
}
5. Nasıl Entegre Edilir? — JS SDK (Kargo Takip Sayfası)
Müşteri mobil uygulamanızda veya web sitesinde "paketim nerede?" diye bakıyor. Veribenim @veribenim/core SDK'sı bu tercihler yönetimini client-side'da yapar.
Kurulum
npm install @veribenim/core @veribenim/react
Tercih Kontrolü ile Takip Sayfası
// pages/track/[trackingId].tsx
'use client';
import { useEffect, useState } from 'react';
import { init } from '@veribenim/core';
import LiveMap from '@/components/LiveMap';
import StatusOnlyView from '@/components/StatusOnlyView';
const veribenim = init({
token: process.env.NEXT_PUBLIC_VERIBENIM_TOKEN,
lang: 'tr',
});
export default function TrackingPage({ params }) {
const [preferences, setPreferences] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const getPrefs = async () => {
try {
const prefs = await veribenim.getPreferences();
setPreferences(prefs);
} catch (error) {
console.error('Tercihler yüklenemedi:', error);
// Default: hiçbir konum verisi gösterme
setPreferences(null);
}
setLoading(false);
};
getPrefs();
}, []);
if (loading) return <div>Yükleniyor...</div>;
// Konum takibi onaylı mı?
const showLiveLocation = preferences?.preferences?.location_tracking === true;
return (
<div className="tracking-page">
<h1>Paket Takibi #{params.trackingId}</h1>
{showLiveLocation ? (
<LiveMap trackingId={params.trackingId} />
) : (
<StatusOnlyView trackingId={params.trackingId} />
)}
{/* Tercihler değiştir */}
<PreferencesManager onUpdate={() => window.location.reload()} />
</div>
);
}
SMS/Push Notification Consent Kontrolü
// lib/notificationService.ts
import { init } from '@veribenim/core';
const veribenim = init({
token: process.env.VERIBENIM_TOKEN,
lang: 'tr',
});
export async function checkNotificationConsent(sessionId: string): Promise<boolean> {
try {
const prefs = await veribenim.getPreferences(sessionId);
return prefs?.preferences?.eta_push === true || prefs?.preferences?.eta_sms === true;
} catch (error) {
console.error('Consent kontrolü başarısız:', error);
return false; // Varsayılan: gönderme
}
}
export async function sendDeliveryNotification(
sessionId: string,
trackingId: string,
status: string
): Promise<void> {
const hasConsent = await checkNotificationConsent(sessionId);
if (!hasConsent) {
console.log('SMS/Push için rıza yok, bildirim gönderilmedi');
return;
}
// Gönder (SMS, Push vb.)
await fetch('/api/notifications/send', {
method: 'POST',
body: JSON.stringify({ trackingId, status, sessionId })
});
}
Tercih Yönetim Bileşeni
// components/PreferencesManager.tsx
'use client';
import { useVeribenim } from '@veribenim/react';
import { useState } from 'react';
export default function PreferencesManager({ onUpdate }) {
const { preferences, savePreferences, loading } = useVeribenim();
const [saved, setSaved] = useState(false);
if (loading) return <div>Tercihler yükleniyor...</div>;
const handleToggle = async (key: string, value: boolean) => {
const updated = {
...preferences,
preferences: {
...(preferences?.preferences || {}),
[key]: value,
}
};
await savePreferences(updated);
setSaved(true);
setTimeout(() => setSaved(false), 3000);
};
return (
<div className="preferences-card">
<h3>Gizlilik Tercihleri</h3>
<label>
<input
type="checkbox"
checked={preferences?.preferences?.location_tracking ?? false}
onChange={(e) => handleToggle('location_tracking', e.target.checked)}
/>
Gerçek zamanlı konum takibine izin ver
<small>Paketimin tam konumunu haritada görmek istiyorum</small>
</label>
<label>
<input
type="checkbox"
checked={preferences?.preferences?.eta_push ?? false}
onChange={(e) => handleToggle('eta_push', e.target.checked)}
/>
Varış tahmini push bildirimi
<small>"Sürücü yaklaşmaktadır" tipinde bildirim al</small>
</label>
<label>
<input
type="checkbox"
checked={preferences?.preferences?.photo_consent ?? false}
onChange={(e) => handleToggle('photo_consent', e.target.checked)}
/>
Teslimat fotoğrafı çekilebilir
<small>Teslim anında fotoğraf veya video kaydı yapılabilir</small>
</label>
{saved && <p className="success">✓ Tercihler kaydedildi</p>}
</div>
);
}
6. Data Sovereignty: Konum Verisi Sınır Ötesi Transferi Riski
GDPR Article 44 ve KVKK Madde 9, kişiye ilişkin verilerin yurt dışına aktarılmasını kısıtlar.
Kargo Şirketleri İçin Sorun Alanları
Senaryo | Hukuki Durum | Çözüm |
|---|---|---|
Konum verisi AWS Frankfurt'a gönder | ✅ İzin — AB veri saklama | Cloud seçeneği: EU region |
Konum verisi Hindistan analitik şirketine gönder | ❌ İzin YOK — Yetersiz Veri Koruması | Veribenim'in Türkiye altyapısı |
Sürücü verisi ABD'li tedarikçiye gönder | ❌ İzin YOK — Standard Sözleşme gerekli | Veri İşlem Sözleşmesi imzala |
Veribenim Advantage: Bütün konum verisi Türkiye'de saklanır, sınır ötesi transfer olmaz.
7. Automated Privacy: Otomatik Veri Retention ve Temizlik
Compliance as a Service — Veribenim, veri silme işlemlerini otomatize eder.
// config/veribenim.php (Laravel projede)
return [
'retention_policies' => [
'delivery_locations' => [
'enabled' => true,
'days' => 30, // 30 gün sonra sil
'batch_size' => 10000, // Günde max 10k record sil
],
'driver_tracking' => [
'enabled' => true,
'days' => 60, // Sürücü verisi 60 gün
'batch_size' => 5000,
],
'customer_addresses' => [
'enabled' => true,
'days' => 365, // 1 yıl tutabilir (sözleşme gerekçesi)
'anonymize_after' => 180, // 6 aydan sonra anonimize et
],
],
];
Veribenim otomatik olarak bu politikaları uygular ve audit log tuttuğu için, KVKK denetçisinin sorgusu durumunda yanıt hazırdır:
Audit Çıktısı:
2026-04-01 02:05:23 | CleanupJob | delivery_locations | 8,432 kayıt silindi | Retention: 30 days
2026-04-02 02:06:12 | CleanupJob | driver_tracking | 3,215 kayıt silindi | Retention: 60 days
8. Zero-Knowledge Architecture — Veribenim'in Felsefesi
Veribenim, kargo verileri işlerken sizin veriyi asla görmez:
Encryption-at-Rest: Bütün konum verisi TDE (Transparent Data Encryption) ile şifreli
Encryption-in-Transit: TLS 1.3 ile gönderilir, man-in-the-middle imkansız
Automated Deletion: Silme işlemi, silinmiş veri asla okunmaz, sadece disk bloğundan fiziksel olarak kaldırılır
Audit-Only Access: Veribenim mühendisleri, yalnızca denetim ve hata ayıklama amaçlı (enkripte) logları görür
9. Pratik Örnek: Tami POS Entegrasyonu
Türkiye'nin yeni POS protokolü (Tami), kargo şirketleri için adres ve telefon bilgisi aktarımında zorunlu hale geldi.
Tami Taşıyıcı Arayüzü + Veribenim
// app/Http/Controllers/TamiCarrierController.php
namespace App\Http\Controllers;
use Veribenim\Laravel\VeribenimFacade as Veribenim;
use Illuminate\Http\Request;
class TamiCarrierController extends Controller
{
/**
* Tami'ye gönderilen adres verisi — Rıza kontrolü
*/
public function submitDeliveryToTami(Request $request)
{
$order = Order::find($request->order_id);
// 1. Müşteri Tami veri paylaşımını onayladı mı?
$prefs = Veribenim::getPreferences($order->customer_session_id);
if (!$prefs?->preferences?->tami_integration) {
return response()->json([
'error' => 'Müşteri Tami entegrasyonunu onaylamadı'
], 403);
}
// 2. Tami'ye gönder
$tamiPayload = [
'order_id' => $order->id,
'recipient_name' => $order->recipient_name,
'phone' => $order->phone,
'address' => $order->address,
'timestamp' => now()->toIso8601String(),
];
$this->sendToTamiGateway($tamiPayload);
// 3. Veribenim'e log kaydet (denetim)
Veribenim::logFormConsent(
formName: 'tami_carrier_integration',
consented: true,
consentText: 'Teslimatım için gerekli bilgilerim Tami sistemi aracılığıyla taşıyıcıya gönderilmesini onaylıyorum.',
metadata: [
'order_id' => $order->id,
'carrier' => 'Veribenim Demo Carrier',
'retention_days' => 90, // Tami 90 gün tutar
]
);
return response()->json(['status' => 'submitted']);
}
}
10. Sık Yapılan Hatalar ve Çözümleri
Hata 1: Konum Verisi Hiçbir Rıza Olmaksızın Gönderme
Durum: Kargo firması GPS verisini analitik şirketine real-time gönderir, müşteri bilmez. Sorun: KVKK Madde 5(a) ihlali — Rızasız veri işleme Ceza: Her kişi başına 1,000 TL-50,000 TL (toplamda 15 milyona kadar)
Çözüm: Veribenim tercihlerini kontrol edin:
if (!Veribenim::getPreferences($sessionId)?->preferences?->location_tracking) {
// Analitik şirketine GÖNDERME
}
Hata 2: Teslimat Sonrası 2 Yıl Konum Verisi Tutma
Durum: "İstatistik tutmak için" konum verilerini saklı tutar Sorun: KVKK Madde 7 ihlali — Aşırı veri tutma Ceza: 100,000 TL - 1,000,000 TL
Çözüm: Otomatik silme politikası:
'retention_policies' => [
'delivery_locations' => [
'enabled' => true,
'days' => 30, // MAX 30 gün
],
]
Hata 3: Sürücü Konum Verisi Çalışan Rızası Olmaksızın Toplama
Durum: İşveren, teslimatçı hızı ve konum verisi kaydeder, işçi bilmez Sorun: İş Kanunu + KVKK ihlali (çalışan verisi) Ceza: 200,000 TL - 2,000,000 TL + mahkeme cezası
Çözüm: Açık rıza formu + Veribenim logging:
Veribenim::logFormConsent(
formName: 'driver_tracking_consent',
consented: true,
consentText: '...'
);
11. Özet ve En İyi Uygulamalar
Checklist: KVKK Uyumlu Kargo Sistemi
Müşteri tercihlerini sakla (location_tracking, eta_push vb.)
Bütün konum işlemelerini Veribenim ile log et
30 günden eski konum verilerini otomatik sil
Sürücülere açık rıza formu göster (Madde 7/a)
SMS/Push öncesi consent kontrolü yap
Konum verisi analitik şirketine değil, sadece müşteriye göster
DSAR isteklerine 30 gün içinde yanıt ver
Tami entegrasyonu rıza-aware yap
Yıllık audit raporu al ve dosyala
Veribenim Tümleşik Avantajları
Özellik | Sağlanan Avantaj |
|---|---|
SDK (Laravel + JS) | Hızlı entegrasyon, 2-3 gün |
Otomatik Retention | KVKK Madde 7 uyumluluk garantisi |
Denetim Logları | Denetçiye cevap hazır |
Veri Minimizasyonu | Privacy-by-Design built-in |
Tercih Yönetimi | Müşteri kontrolü, rıza kanıtı |
Zero-Knowledge | Verileriniz asla görmez, yalnızca yönetim |
Kaynaklar ve Linkler
KVKK Madde 4: Kişiye ilişkin veri tanımı
KVKK Madde 5: Veri işlemenin hukuki uygunluk nedenleri
KVKK Madde 7: Veri tutma ve silme ilkesi
KVKK Madde 11: Veri Sahibinin Hakları (DSAR)
GDPR Article 6: Lawfulness of Processing
GDPR Article 17: Right to Erasure
📚 Teknik Dokümantasyon: Tüm SDK referans dökümanlarına veribenim.com/documents adresinden ulaşabilirsiniz.
Sonraki Adım
Veribenim'in bu sektör için sunduğu çözümleri görmek ve KVKK/GDPR uyumlu pazarlama başlamak için aşağıdaki butona tıklayın.
Ücretsiz Hesap Oluştur