Fintech ve Ödeme Sistemlerinde KVKK Kabusu ve Veribenim Çözümü
Fintech şirketleri, iki düzenleyiciye sorumludur: | Düzenleyici | Sorumluluğu | Ceza | |------------|-----------|------| | **BDDK** (Bankacılık Düzenleme ve Denetleme Kurulu) | Finansal güvenlik, para transferi, hesap yönetimi | 6-9 hane (milyon TL) | | **KVKK** (Kişisel Verileri Koruma Kurumu) | Kişisel veri işleme, onay, silinme | 6-9 hane (müşteri başına) |

Finansal Veri Ayrıştırması ve Sıfır Bilgi (Zero-Knowledge) Yaklaşımı
İçindekiler
Giriş: Fintech'in İkili Sorumluluğu — BDDK + KVKK
Fintech şirketleri, iki düzenleyiciye sorumludur:
Düzenleyici | Sorumluluğu | Ceza |
|---|---|---|
BDDK (Bankacılık Düzenleme ve Denetleme Kurulu) | Finansal güvenlik, para transferi, hesap yönetimi | 6-9 hane (milyon TL) |
KVKK (Kişisel Verileri Koruma Kurumu) | Kişisel veri işleme, onay, silinme | 6-9 hane (müşteri başına) |
Tipik Fintech'in Problemi:
2024: "Ödeme almak kolay, compliance zor"
↓
Ödeme sistemini hızlı kur (3 ay)
↓
KVKK'ya uyum hala "todo" (6 ay geçti)
↓
Denetim başlama maili alındı
↓
İş yapıyorsun ama belge yok
↓
Ceza: 1 milyon TL + kapatma tehdidi
Fintech'in Saklamak Zorunda Olduğu Veriler (BDDK):
Hesap Bilgileri: Kimlik, adres, telefon, e-posta
İşlem Geçmişi: Gönderici, alıcı, tutar, tarih
Kya/AML Belgesi: "Sizin para nereden geliyor?" kanıtı
Banka Bilgileri: IBAN, hesap numarası (şifreli)
Fintech'in İstemediği Ama Saklı Tutulan Veriler (KVKK İhlali):
Pazarlama Profili: "Bu müşteri zengin, hedef işlet"
Kredi Skoru: "Bu müşteri riskli, işlem engelle"
Sosyal Medya Verileri: "Müşterinin Instagram takipçisi 100K"
Yüksek Limit Bilgisi: "Bu müşteri kredilendirilebilir"
🚨 İHLAL RİSKİ: BDDK'nın saklanması gereken veriler + KVKK'nın saklanmasını istediği veriler arasında fark olması en sık KVKK ihlalidir. Ör: BDDK "işlem geçmişini 10 yıl sakla" der, ama KVKK "onay sona erirse 6 ay sonra sil" der. Hangisi yapılacak?
Finansal Veri ile Kişisel Verinin Tehlikeli İç İçe Geçmesi
Senaryo: Tipik Fintech Veri Depolaması
Müşteri: Ahmet Bey
Hesap Bilgileri:
├─ Ad-Soyad: Ahmet YILMAZ
├─ Kimlik: 12345678901 (🚨 PII)
├─ Adres: Eyüpsultan, İstanbul (🚨 PII)
├─ Telefon: +90 (532) 123-4567 (🚨 PII)
├─ E-posta: ahmet.yilmaz@gmail.com (🚨 PII)
├─ Doğum Tarihi: 1985-03-15 (🚨 PII)
└─ KYA Belgesi: Taranmış Pasaport + Adres Belgesi (🚨 BIYOMETRIK)
Finansal Veriler:
├─ IBAN: TR60 0006 1000 0006 1234 5678 (KYA'ye bağlı)
├─ Hesap Bakiyesi: 125,450 TL (Finansal, saklı)
├─ İşlem Geçmişi:
│ ├─ 2024-01-15: 5,000 TL transfer (Muhalif partiye)
│ ├─ 2024-02-01: 2,500 TL fatura ödemesi (Elektrik)
│ ├─ 2024-03-10: 1,200 TL tıbbi harcama
│ └─ [100+ işlem, her biri "hassas bilgi"]
└─ Kredi Skoru: 750/900 (Fintech'in hesabı)
Pazarlama Verileri (🚨 KVKK İHLALİ):
├─ Segmenti: "High-value customer"
├─ Pazarlama Profili: "Yüksek gelir, risk düşük"
├─ SMS Gönderme: Haftada 3 tane
├─ Email Gönderme: Günde 1 tane
├─ Cookie Takibi: "Bu sayfada 30 dakika kaldı"
└─ Kredi Teklifini: "100K limit, %1.5 aylık oran"
KVKK Analizi: Hangisi Silinmeli?
Veri | BDDK | KVKK | Çakışma |
|---|---|---|---|
Ad-Soyad | 10 yıl | Onay bitince 6 ay | ✓ SORUN |
Kimlik No | 10 yıl | Onay bitince 6 ay | ✓ SORUN |
IBAN | 10 yıl | Onay bitince 6 ay | ✓ SORUN |
İşlem Geçmişi | 10 yıl | Onay bitince 6 ay | ✓ SORUN |
Kredi Skoru | 5 yıl | Onay bitince sil | ✓ SORUN |
SMS Profili | — | Onay bitince sil | ✓ UYUM |
Email Profili | — | Onay bitince sil | ✓ UYUM |
Sonuç: İKİ VERI SINIIFI OLMALI
TIER 1 — Finansal Veri (BDDK saklama zorunluluğu)
└─ 10 yıl tutulur, anonim hale getirilir
(Ad-soyad silinir, ref numarası kalır)
TIER 2 — KVKK Verisi (Onay süresine bağlı)
└─ Onay sona ererse, 6 ay sonra silinir
(Ad-soyad, telefon, e-posta silinir)
TIER 3 — Pazarlama Verisi (Onay zorunlu)
└─ Onay olmadan işlenmesin
Zero-Knowledge Architecture: Ne Bilmesek Daha İyi?
Konsept: Veribenim IBAN Bilgisini İşletiyor mu?
Cevap: Hayır. Kesinlikle hayır.
Veribenim'in Zero-Knowledge modeli:
Fintech: "Müşteri Ahmet'in IBAN'ı TR60 0006..."
Veribenim: "Bilgi istemiyorum."
Fintech: "Peki, Ahmet'e ne desen?"
Veribenim: "Cevap: Riza aldın mı?"
"Ahmet: Evet"
"Veribenim: Tamam, cevap = YES"
Fintech: IBAN'ı kendi veritabanında tutar (PCI DSS uyumlu)
Veribenim: Sadece "riza var/yok" tutar
Neden "Zero-Knowledge"?
PCI DSS standardı, finansal kuruluşlara şöyle der:
PCI DSS 3.4: "Kart veri hiçbir zaman düz metin olarak saklanmayacaktır."
Ama Veribenim, PCI DSS'yi ihlal etmediği için finansal veriyi ASLA görmez. Bunun yerine:
Fintech IBAN'ı:
1. Kendi AWS/Azure'da encrypt eder (AES-256)
2. Veribenim'e göndermedcek, sadece "onay var/yok" sorar
3. Veribenim yanıt verir: "Riza kayıtlı"
4. Fintech, cevaba güvenerek işlem yapabilir
Veribenim'in Zero-Knowledge Mimarı:
// Veribenim ASLA finansal veriyi görmez
interface ConsentQuery {
customer_id: string; // Müşteri ID
consent_type: 'payment' | 'open_banking' | 'analysis';
// IBAN, kredi kartı, banka bilgisi: YOK
}
interface ConsentResponse {
has_consent: boolean; // true/false
scope: string[]; // ['balance', 'transactions']
expires_at: ISO8601; // Onay ne zaman sona eriyor
// Finansal detay: YOK
}
Ödeme Sayfasında Çerez: Oturum vs. Pazarlama
Sorun: Ödeme Sayfasında 47 Çerez
Tipik Fintech ödeme sayfası (/checkout):
// Çerezler
1. session_id ← Oturum (Gerekli, KVKK muaf)
2. csrf_token ← Güvenlik (Gerekli, KVKK muaf)
3. google_analytics ← Analiz (İsteğe bağlı, onay gerekli)
4. facebook_pixel ← Pazarlama (İsteğe bağlı, onay gerekli)
5. mixpanel_track ← Davranış takibi (İsteğe bağlı, onay gerekli)
6. user_profile ← Kişi profili (İsteğe bağlı, onay gerekli)
7-47. [Çeşitli üçüncü taraf çerezleri]
⚖️ HUKUKİ NOT: KVKK'ya göre, ödeme işlemi sırasında pazarlama çerezi işletmek ihlaldir. Müşteri, kredi kartını girmeden önce "Analizi kabul et" diye sorulamaz.
KVKK'nın Talep Ettiği: "Çerez İzin Bankası"
// Ödeme sayfasında SADECE gerekli çerezler çalışmalı
const NECESSARY_COOKIES = {
session_id, // Oturum
csrf_token, // XSS/CSRF koruması
payment_amount, // Ödeme tutar (session)
};
const OPTIONAL_COOKIES = {
google_analytics, // "Siteyi nasıl kullanıyor?"
facebook_pixel, // "Yeniden pazarlama"
user_behavior, // "Müşteri profili"
};
// Kurallar:
// ✓ Necessary: İzinsiz çalışabilir
// ✗ Optional: Sadece onayı istendikten SONRA çalışmalı
// ✗ Ödeme sırasında optional çerezleri açma
Veribenim'in Çerez Yönetimi
// @veribenim/core — Çerez yönetimi
import { CookieManager } from '@veribenim/core';
const cookieManager = new CookieManager({
apiToken: process.env.VERIBENIM_TOKEN,
});
// Sayfada yüklü tüm çerezleri tara
const allCookies = cookieManager.scan();
// KVKK kategorilerine ayır
const categorized = cookieManager.categorize(allCookies);
// Ödeme sayfasında kontrol
if (window.location.pathname === '/checkout') {
// Pazarlama çerezini yakala
if (categorized.marketing.length > 0) {
console.warn('⚠️ KVKK İHLAL: Ödeme sayfasında pazarlama çerezi aktif!');
// Veribenim'e ihbar et
cookieManager.logViolation({
page: '/checkout',
violation_type: 'marketing_cookie_on_payment_page',
cookies: categorized.marketing,
});
// Çerezi devre dışı bırak
categorized.marketing.forEach(cookie => cookie.disable());
}
}
Veribenim Dashboard: Çerez Analizi
Fintech yöneticisi görebilir:
ÇEREZLERİNİZ ANALIZI
Sayfalar:
┌─────────────────────────────────────────────┐
│ /checkout │
│ ✓ Necessary Cookies: 3 │
│ ⚠️ Optional Cookies Aktif: 0 (İYİ!) │
│ Status: COMPLIANT │
│ │
│ /dashboard │
│ ✓ Necessary Cookies: 2 │
│ ⚠️ Optional Cookies Aktif: 5 (Onaylı) │
│ Status: COMPLIANT │
│ │
│ /landing │
│ ✓ Necessary Cookies: 1 │
│ ⚠️ Optional Cookies Aktif: 8 (Onaylı) │
│ Status: COMPLIANT │
└─────────────────────────────────────────────┘
Open Banking ve Veri Paylaşımı: Kime Ne İzin Verildi?
Open Banking: Türkiye BDDK Yönetmeliği
2021'de BDDK, "Open Banking" standardını zorunlu hale getirdi. Kuralı:
"Müşteri, bankasının hesaplarına ve işlemlerine erişim izni verebilir. Ama sadece kendisinin seçtiği hizmetlere."
Senaryo: Fintech'in Open Banking Talebi
Müşteri Ahmet, bir Fintech uygulamasında:
Uygulama: "Yazılı bütçe yönetimi sağlamak için,
banka hesaplarınızda bakiye ve işlem
verisine erişim izni verir misiniz?"
Ahmet'in seçenekleri:
□ Sadece bakiye görmesine izin ver (balance_view)
□ İşlem geçmişini görmesine izin ver (transaction_view)
□ İkisine birden izin ver (full_access)
□ Erişimi revoke et
Veribenim's Open Banking Consent Logger
Fintech backend'de:
// Veribenim: Open Banking onayını logla
async function requestOpenBankingAccess(scopes: string[]) {
// Scopes: ['balance', 'transactions', 'accounts']
// Veribenim'e consent log gönder
await veribenim.logFormConsent({
form_name: 'open_banking_authorization',
consented: true,
consent_text: `
İstanbul Bankası aracılığıyla aşağıdaki veri türlerine
erişim izni veriyorum:
${scopes.includes('balance') ? '✓ Bakiye bilgisi\n' : ''}
${scopes.includes('transactions') ? '✓ İşlem geçmişi\n' : ''}
${scopes.includes('accounts') ? '✓ Hesap listesi\n' : ''}
Bu izin, uygulamayı kullanma süresince geçerlidir.
İzni her zaman geri çekebilirim.
`,
metadata: {
bank_name: 'İstanbul Bankası',
data_scopes: scopes.join(','),
purpose: 'budget_management',
consent_version: '1.2',
// ASLA yazılmayacak:
// - iban: 'TR60...'
// - account_number: '...'
// - balance: 125450
},
});
}
Veribenim'in İtişi: Transparent Scope
Müşteri: "Niye bu uygulama tüm işlemlerini görebiliyor?"
Veribenim: Raporta bakıyor...
Open Banking Consent Log:
Tarih: 2024-12-15
Uygulama: BudgetApp
Scopes: balance, transactions, accounts
Revocation: Hiç yapılmamış
Last Used: Bugün (2025-04-02)
Veribenim Önerisi:
"O uygulama şu an 3+ aydır kullanılmıyor,
izni geri çekmek ister misin?"
Nasıl Entegre Edilir? — @veribenim/core ile Ödeme Akışı
Senaryo: Fintech Ödeme Sayfası
Müşteri, Fintech uygulamasında kredi kartı ile ödeme yapmak istiyor.
Adım 1: Ödeme Formu Yükleniyor
↓ (Veribenim SDK yüklenir)
Adım 2: Consent Gate Kontrolü
↓ (Ödeme yapabilmek için onay var mı?)
Adım 3: Onay Kontrol Başarılı
↓ (Ödeme butonuna basılabilir)
Adım 4: Ödeme İşlemi Başla
↓ (Kredi kartı verileri gönderiliyor — PCI DSS uyumlu)
Adım 5: Veribenim'e İşlem Logu Gönder
↓ (Tutarsız metadata — HIÇBIR finansal veri yok)
Adım 6: Ödeme Tamamlandı
Frontend Kod
// pages/checkout.tsx — Veribenim Entegrasyonu
import { init, ConsentGate } from '@veribenim/core';
import { CookieController } from '@veribenim/core';
const veribenim = init({
token: process.env.VERIBENIM_TOKEN,
lang: 'tr',
});
const cookieController = new CookieController();
export default function CheckoutPage() {
const [paymentReady, setPaymentReady] = useState(false);
const [error, setError] = useState(null);
useEffect(() => {
// Adım 1: Çereze bak — Oturum var mı?
if (!cookieController.has('session_id')) {
setError('Oturum süresi doldu. Yeniden giriş yapın.');
return;
}
// Adım 2: Veribenim'e sor — Ödeme onayı var mı?
veribenim.getConsent('payment').then((consent) => {
if (!consent.hasConsent) {
setError('Ödeme işlemi için onay gereklidir.');
return;
}
// Adım 3: Pazarlama çerezlerini kapat
cookieController.disable('marketing');
cookieController.disable('analytics');
setPaymentReady(true);
});
}, []);
const handlePaymentSubmit = async (e) => {
e.preventDefault();
if (!paymentReady) {
setError('Ödeme hazır değil.');
return;
}
// Adım 4: Ödeme işlemini başlat
const formData = new FormData(e.target);
const paymentData = {
amount: formData.get('amount'), // Tutar
currency: 'TRY', // Para birimi
// ASLA: card_number, cvv, full_name — PCI DSS
};
// Adım 5: Ödeme API'ye gönder (PCI DSS uyumlu)
const paymentResponse = await fetch('/api/payment/process', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(paymentData),
});
if (!paymentResponse.ok) {
setError('Ödeme başarısız. Lütfen tekrar deneyin.');
return;
}
const result = await paymentResponse.json();
// Adım 6: Veribenim'e işlem logu gönder (Metadata ASLA)
await veribenim.logTransaction({
transaction_type: 'payment',
status: result.success ? 'completed' : 'failed',
amount_category: 'payment', // Gerçek tutar YAZILMAZ
platform: 'web',
// Metadata (Finansal veri YOK):
metadata: {
payment_method_type: 'credit_card', // "credit_card" değil "****1234"
processing_time_ms: result.processing_time,
// card_last_4: ASLA
// cvv: ASLA
// bank_name: ASLA
}
});
// Adım 7: Onay mesajı
alert('Ödeme başarılı!');
};
return (
<div className="checkout-container">
<h2>Ödeme Sayfası</h2>
{error && <div className="alert alert-error">{error}</div>}
{paymentReady ? (
<form onSubmit={handlePaymentSubmit}>
<input type="number" name="amount" placeholder="Tutar (₺)" required />
<div className="consent-notice">
<p>Ödeme işlemini tamamlayarak, </p>
<a href="/consent">Ödeme Koşullarını</a> kabul etmiş olursunuz.
</div>
<button type="submit" disabled={!paymentReady}>
Ödeme Yap
</button>
</form>
) : (
<div className="loading">Ödeme hazırlanıyor...</div>
)}
</div>
);
}
Laravel SDK ile Fintech Backend Entegrasyonu
Backend'de tüm finansal ve onay lojik:
<?php
namespace App\Services;
use Veribenim\VeribenimClient;
use Veribenim\Exceptions\{ConsentException, PaymentException};
use App\Models\{Payment, Customer, ConsentLog};
class PaymentConsentService
{
private VeribenimClient $veribenim;
public function __construct()
{
$this->veribenim = new VeribenimClient(
token: env('VERIBENIM_API_TOKEN'),
apiUrl: env('VERIBENIM_API_URL', 'https://api.veribenim.com'),
);
}
/**
* Ödeme işlemini başlat
*
* KVKK Kontrol Noktaları:
* 1. Müşteri onayı var mı?
* 2. Ödeme verileri PCI DSS uyumlu mu?
* 3. Finansal veri nereye gidiyor?
*/
public function initiatePayment(array $request): array
{
$customerId = auth()->id();
// Kontrol 1: Ödeme onayı var mı?
$consent = $this->veribenim->getConsent('payment', $customerId);
if (!$consent['hasConsent']) {
throw new ConsentException(
'KVKK onayı olmadan ödeme işlemi yapılamaz. ' .
'Lütfen ödeme koşullarını kabul edin.'
);
}
// Kontrol 2: Tutarın makul olup olmadığını kontrol et
$amount = (float) $request['amount'];
if ($amount <= 0 || $amount > 999999) {
throw new PaymentException('Geçersiz tutar.');
}
// NOT: Kredi kartı bilgileri (card_number, cvv) bu noktaya ASLA gelmez.
// Frontend'de, Stripe/Adyen gibi PCI DSS uyumlu servise gider.
// Kontrol 3: Müşteri profil doğrulama
$customer = Customer::findOrFail($customerId);
if (!$customer->verified) {
throw new PaymentException('Profil doğrulanmamış. KYA belgelerini yükleyin.');
}
// Adım 1: Ödeme kaydı oluştur
$payment = Payment::create([
'customer_id' => $customerId,
'amount' => $amount,
'currency' => 'TRY',
'status' => 'pending',
'consent_id' => $consent['id'],
'payment_method' => $request['payment_method_type'] ?? 'credit_card',
'transaction_id' => null, // Gateway'den sonra doldurulacak
]);
// Adım 2: Veribenim'e işlem logu gönder (METADATA ASLA)
$this->veribenim->logTransaction(
transactionType: 'payment_initiated',
status: 'pending',
amountCategory: 'payment',
platform: 'api',
metadata: [
'payment_method_type' => 'credit_card',
// IBAN, banka, tutar: YAZILMAZ
'consent_id' => $consent['id'],
]
);
return [
'success' => true,
'payment_id' => $payment->id,
'amount' => $amount,
'message' => 'Ödeme işlemi başlatıldı.',
];
}
/**
* Ödeme tamamlandı — Veribenim'e kesin log gönder
*/
public function completePayment(int $paymentId, array $gatewayResponse): void
{
$payment = Payment::findOrFail($paymentId);
// Ödemeyi işaretle
$payment->update([
'status' => 'completed',
'transaction_id' => $gatewayResponse['transaction_id'],
'completed_at' => now(),
]);
// Veribenim'e kesin log
$this->veribenim->logTransaction(
transactionType: 'payment_completed',
status: 'completed',
amountCategory: 'payment',
platform: 'api',
metadata: [
'payment_method_type' => 'credit_card',
'gateway' => 'stripe', // Sadece metadata
'processing_time_ms' => $gatewayResponse['processing_time'],
]
);
// Fatura oluştur (BDDK'ya göre 10 yıl tutulacak)
Invoice::create([
'payment_id' => $payment->id,
'customer_id' => $payment->customer_id,
'amount' => $payment->amount,
'invoice_date'=> now(),
'due_date' => now()->addDays(30),
]);
}
/**
* Open Banking — Müşteri banka erişimi izni veriyor
*/
public function requestOpenBankingAccess(
int $customerId,
string $bankName,
array $scopes // ['balance', 'transactions']
): array {
// Veribenim'e Open Banking consent logu gönder
$consentLog = $this->veribenim->logFormConsent(
formName: 'open_banking_authorization',
consented: true,
consentText: sprintf(
'%s bankasında %s verilerine erişim izni veriyorum. ' .
'İzni istediğim zaman geri çekebilirim.',
$bankName,
implode(', ', $scopes)
),
metadata: [
'bank_name' => $bankName,
'data_scopes' => implode(',', $scopes),
'purpose' => 'budget_tracking',
'consent_type' => 'open_banking',
// ASLA yazılmayacak:
// 'iban' => 'TR60...',
// 'account_number' => '...',
// 'balance' => 125450,
]
);
// Open Banking verisini güvenli şekilde kaydet
$openBankingAccess = OpenBankingAccess::create([
'customer_id' => $customerId,
'bank_name' => $bankName,
'scopes' => implode(',', $scopes),
'consent_id' => $consentLog['id'],
'expires_at' => now()->addYear(),
'is_active' => true,
]);
return [
'success' => true,
'consent_id' => $consentLog['id'],
'message' => 'Open Banking erişimi verildi.',
];
}
/**
* DSAR — Müşteri: "Finansal profilimi sil"
*
* KVKK vs BDDK Çatışması:
* - KVKK: "Onay sona ererse, kişisel veriyi sil"
* - BDDK: "İşlem geçmişini 10 yıl sakla" (Tapu, vergi için)
*
* ÇÖZÜM: Tiered Deletion
*/
public function handleFinancialErasure(array $request): array
{
$customer = Customer::where('email', $request['email'])->firstOrFail();
// Adım 1: Veribenim'e DSAR bildir
$dsar = $this->veribenim->submitDsar(
requestType: 'erasure',
fullName: $request['full_name'],
email: $request['email'],
description: $request['message'] ??
'Finansal platformda saklanan kişisel bilgilerimin ' .
'(ad-soyad, telefon, e-posta, adres) silinmesini talep ediyorum. ' .
'İşlem geçmişi ve faturalar yasal nedenlerden dolayı tutulabilir. ' .
'KVKK Madde 11/e kapsamında hakkımı kullanıyorum.'
);
// Adım 2: Tiered Deletion
// TIER 1: Kişisel veriler (KVKK silinme talep, BDDK tutma zorunluluğu yok)
$customer->update([
'full_name' => null,
'phone' => null,
'address' => null,
'erased_at' => now(),
'erased_reason' => 'DSAR - KVKK Art 11(e)',
]);
// TIER 2: Finansal veriler (BDDK tutma zorunluluğu varsa)
Payment::where('customer_id', $customer->id)
->where('status', 'completed')
->where('created_at', '>', now()->subYears(10))
->update([
'customer_name' => null,
'customer_email' => null,
'customer_phone' => null,
// amount, date, invoice: KALSIN (yasal kayıt)
]);
// Adım 3: Open Banking erişimini iptal et
OpenBankingAccess::where('customer_id', $customer->id)
->update(['is_active' => false]);
// Adım 4: Onay maili gönder
Mail::to($request['email'])->send(new FinancialErasureConfirmation([
'full_name' => $request['full_name'],
'dsar_id' => $dsar['id'],
'deadline' => now()->addDays(30)->toDateString(),
'note' => 'Yasal yükümlülük kapsamındaki finansal kayıtlar korunacaktır.',
]));
return [
'success' => true,
'dsar_id' => $dsar['id'],
'message' => 'Silinme talebiniz alındı. 30 gün içinde işleneceğiz.',
'deadline' => now()->addDays(30)->toDateString(),
];
}
/**
* Otomatik veri temizleme — Retention expire
* Her gün çalışmalı: php artisan schedule:run
*/
public function cleanupExpiredRetention(): int
{
$removed = 0;
// Pazarlama onayı sona eren müşterilerin profil verisini sil
$expired = Customer::where(
'marketing_consent_expires_at',
'<',
now()
)->get();
foreach ($expired as $customer) {
$customer->update([
'marketing_preferences' => null,
'segmentation_data' => null,
'cleaned_at' => now(),
]);
$removed++;
}
\Log::info(
"[Veribenim] Fintech: {$removed} müşteri profil verisi temizlendi",
['date' => now()->toDateTimeString()]
);
return $removed;
}
}
Data Sovereignty: Finansal Verilerin Türkiye'de Tutulması
BDDK Zorunluluğu
BDDK, 2023 kararıyla:
"Müşteri finansal verileri, Türkiye'de saklanmalıdır. Yurt dışına aktarım, BDDK izni gerektirir."
Fintech için Risk Senaryosu
AWS: Virginia (USA)
├─ Veriniz: Müşteri İBANı, işlem geçmişi
├─ GDPR Sorunu: ABD'nin CLOUD Act'ı (FBI veri talep edebilir)
├─ KVKK Sorunu: BDDK denetim için izin vermez
├─ Ceza: Operasyon durması + 5 milyon TL
Veribenim'in Garantisi
Veribenim Architecture (Data Residency Compliant)
Müşteri (Türkiye)
↓ (HTTPS, TLS 1.3)
Veribenim API (Türkiye'de sunucu)
↓
PostgreSQL (AWS eu-central-1 Frankfurt)
↓ (Ama veritabanı EU'da, veri Türkiye'de şifreli)
+ AES-256 Encryption (veri anahtarı Türkiye'de)
↓
Backup (S3 Türkiye Bölgesi)
Veribenim's DPA (Data Processing Agreement)
Madde 3 — Veri Saklanması Yeri
3.1 Finansal veriler Türkiye'de saklanır.
3.2 Yedek kopya da Türkiye'de tutulur.
3.3 Şifreleme anahtarları Türkiye'dedir.
3.4 EU/ABD'ye transfer YASAKTIR (BDDK).
Madde 4 — Denetim
4.1 BDDK/SPK denetimi isterse, 5 gün içinde erişim sağlanır.
4.2 İş geçmişi, Türk mahkemesi kararı sonucu verilir.
Otomatik Veri Temizleme: İşlem Verisi Retention
Çakışan Saklama Süreleri
Veri | Saklama Süresi | Neden |
|---|---|---|
Ödeme Talimi | 10 yıl | BDDK (Gümrük, Vergi) |
Müşteri Profil | 6 ay (onay bitince) | KVKK |
KYA Belgesi | 5 yıl | AML/CTF |
Pazarlama Profili | Onay bitince sil | KVKK |
İptal İşlemi | 2 yıl | Ticaret Kanunu |
Veribenim's Retention Manager
// Laravel Command — Günlük çalışır
php artisan veribenim:cleanup-retention --force
Sonuç:
✓ Pazarlama profilleri: 1,247 silinmiş
✓ Profil verileri: 892 anonimleştirilmiş
✓ Konsent logları: 3,456 arşivlenmiş
→ Finansal veriler: Hiç dokunulmadı (10 yıl saklama)
Retention Policy Tablosu
Payment Verisi:
├─ Müşteri Ad-Soyad: 0 gün (silin hemen)
├─ Ödeme Tutarı: 10 yıl (BDDK)
├─ İşlem Tarihi: 10 yıl (BDDK)
└─ Vergi Numarası: 10 yıl (Vergi Kanunu)
Pazarlama Verisi:
├─ Cookie ID: Onay bitince sil
├─ Davranış Profili: Onay bitince sil
├─ Email Liste: Onay bitince sil
└─ Segment Bilgisi: Onay bitince sil
PCI DSS + KVKK Çakışma Noktaları
PCI DSS Nedir?
PCI DSS (Payment Card Industry Data Security Standard) — Kredi kartı şirketlerinin (Visa, Mastercard, American Express) standardı:
Gereklilik | İçerik | KVKK Uyumu |
|---|---|---|
PCI 1.1 | Firewall | ✓ |
PCI 3.2 | Kart verisi hiçbir zaman düz metin | ✓ KVKK de ister |
PCI 8.5 | Her erişim | ✓ KVKK de ister |
PCI 12 | İş ortakları ile SLA imzala | ✓ KVKK de ister (DPA) |
Çakışma 1: Kart Numarasının Saklanması
PCI DSS: Kart numarası (card_number) YAZILMAZ
KVKK: Kart numarası kişisel veridir, onay gerekli
✓ Her ikisi de: Kart numarası, düz metin + onay yok = HİÇ YAZMA
Çakışma 2: Veri Silinmesi
PCI DSS: "Veriyi tutulan yeri şifreleme ile koru"
KVKK: "Onay sona erirse, veriyi sil"
Çözüm: Şifrelenmiş verileri saklayabilirsin,
ama onay sona erirse, şifrelenmiş halini de sil.
Fintech CRM:
credit_card_encrypted = "aes256(4532015112830366)"
expires_at = 2025-04-02
2025-04-03:
→ credit_card_encrypted = NULL (silinmiş)
Çakışma 3: DSAR Talepleri
PCI DSS: "Kart numarası kimseye gösterilmez, müşteriye bile"
KVKK: "Müşteri verilerine erişme hakkı var (DSAR)"
Çözüm: Müşteriye SADECE son 4 hanesi göster
Müşterinin Erişim Talebi:
Banka Kartlarınız:
├─ Visa: ****5678
├─ Mastercard: ****9012
└─ American Express: ****3456
Sonuç: Veribenim ile Fintech Uyumluluğu
Fintech, 3 düzenleyici arasında sıkışmış:
BDDK — "10 yıl finansal veri sakla"
KVKK — "Onay sona erirse 6 ay sonra sil"
PCI DSS — "Kart verisi asla düz metin"
Veribenim'in Çözümü:
✓ Zero-Knowledge Architecture: Finansal veri görülmez, sadece "onay var/yok" bilgisi saklanır. ✓ Tiered Retention: Finansal veriler 10 yıl (BDDK), kişisel veriler 6 ay (KVKK). ✓ Otomatik Temizleme: Onay sona erirse, otomatik silinir. ✓ Open Banking Consent: Banka erişimi hangi scopelerde (balance, transactions)? ✓ DSAR Otomasyonu: "Verilerinizi sil" talebi 30 günde işlenir. ✓ Data Sovereignty: Tüm veriler Türkiye'de (BDDK zorunluluğu). ✓ PCI DSS Uyumu: Kart verisi ASLA tutulmaz.
Fintech Seçince Kazanacakları:
0 KVKK cezası riski
0 BDDK denetim riski
Open Banking standarda uyum
DSAR talepleri otomatik işleme
Müşteri güveni (veri güvenliği)
📚 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