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.

Bloglar
Lojistik ve Kargo Sektöründe KVKK Kabusu ve Veribenim Çözümü: Konum Verisi, Sürücü Takibi ve Veri Minimizasyonu

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:

  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.

🚨 İ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.


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şlenir

  • eta_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
<?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>
  );
}
// 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:

  1. Encryption-at-Rest: Bütün konum verisi TDE (Transparent Data Encryption) ile şifreli

  2. Encryption-in-Transit: TLS 1.3 ile gönderilir, man-in-the-middle imkansız

  3. Automated Deletion: Silme işlemi, silinmiş veri asla okunmaz, sadece disk bloğundan fiziksel olarak kaldırılır

  4. 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

Benzer Makaleler

Bu sektörle ilgili daha fazla makale yakında yayımlanacak.

Tüm makaleleri görmek için bloğa dön →