Merchant Verification — Scope & Pemisahan Domain
Dibuat: 2026-06-07
Konteks: Keputusan arsitektur saat Phase 5.5 KYC write cutover diimplementasi.
1. KYC vs KYB — Terminologi Industri
Industri verifikasi digital membedakan dua istilah yang sering dicampur:
KYC — Know Your Customer
Verifikasi identitas individu (pemilik / penanggung jawab akun).
"Siapa kamu?"
Produk KYC API (Verihubs, Privy, Sumsub, dll.) mencakup:
- OCR dokumen identitas — ekstrak data dari KTP/Passport/SIM
- Face match — cocokkan selfie dengan foto di dokumen
- Liveness detection — pastikan selfie bukan foto dari foto (anti-spoofing)
- Dukcapil check — validasi NIK ke database kependudukan pemerintah (Indonesia)
KYC menjawab pertanyaan: apakah orang ini adalah siapa yang mereka klaim?
KYB — Know Your Business
Verifikasi entitas bisnis yang diwakili individu tersebut.
"Apakah usahamu nyata dan sah?"
Produk KYB API mencakup:
- NPWP check — validasi ke database DJP
- NIB check — validasi Nomor Induk Berusaha ke OSS
- SIUP / izin usaha check — verifikasi legalitas operasional
- Rekening bank check — verifikasi nama pemilik rekening sesuai data usaha
KYB menjawab pertanyaan: apakah entitas bisnis ini terdaftar secara legal?
Perbedaan kunci
| KYC | KYB | |
|---|---|---|
| Subjek | Individu (pemilik/penanggung jawab) | Entitas bisnis |
| Dokumen utama | KTP, Passport | NPWP, NIB, akta perusahaan |
| Bisa di-API-kan sepenuhnya | Ya — dokumen digital + biometrik | Sebagian — foto usaha tetap manual review |
| Foto tempat usaha | Bukan bagian KYC | Bukan bagian KYB formal — manual evidence |
| Regulasi acuan | OJK POJK 12/2017, Permendagri 19/2010 | OJK POJK 12/2017, UU Cipta Kerja |
Catatan: Foto tempat usaha (
business_photo_url) tidak masuk KYC maupun KYB formal berbasis API. Ini adalah manual evidence — reviewer manusia yang menilai, bukan sistem otomatis.
2. Dua Domain Verifikasi di Kesles
Proses onboarding merchant Kesles melibatkan dua jenis verifikasi yang secara konsep berbeda dan disimpan di tempat yang berbeda:
| KYC — Identity Verification | KYB — Business Verification | |
|---|---|---|
| Pertanyaan utama | Siapa pemiliknya? | Apakah usahanya nyata? |
| Dokumen | KTP, selfie/liveness | Foto usaha, NPWP, rekening bank |
| SOT (Source of Truth) | kyc.submissions di db_kesles_merchant_auth | merchant.merchant_registration_requests di db_kesles_merchant |
| Service owner | auth_service | merchant_core_api |
| Dipakai untuk | Fraud detection, re-KYC, dedup lintas akun | Review kelayakan usaha, acquirer submission |
3. KYC — Identity Verification
Scope
KYC di Kesles adalah verifikasi identitas pemilik merchant. Cakupannya:
- Dokumen identitas: foto KTP (
ktp_photo_url) - Liveness check: selfie pemilik (
face_photo_url) - Data yang di-extract dari KTP via OCR:
nik— 16-digit NIKowner_name— nama lengkap sesuai KTPbirth_date— tanggal lahir (derivasi dari NIK digit 7–12, Permendagri 19/2010)gender— jenis kelamin (derivasi dari NIK digit 7)
- Kualitas OCR:
ktp_nik_confidence— confidence score NIK hasil scan (0–100)ktp_name_confidence— confidence score nama hasil scan (0–100)ktp_was_edited_after_prefill— apakah user mengedit data setelah OCR prefill
- Fraud signal:
ktp_photo_sha256— hash SHA-256 foto KTP untuk dedup lintas akunface_photo_sha256— hash SHA-256 selfie untuk dedupnik_invalid_date_pattern— flag NIK 16-digit numeric tapi tanggal tidak valid (dokumen mencurigakan)
Storage
Database: db_kesles_merchant_auth
Schema/Table: kyc.submissions
Dikelola oleh: auth_service via POST /internal/kyc/submissions
KYC disimpan terpisah dari data merchant karena:
- Bersifat PII sensitif — akses harus di-gate ketat
- Bisa dipakai lintas produk (re-KYC, tier upgrade, external API)
- Dedup check butuh query lintas registrasi — lebih efisien jika terisolasi
Write path (sejak Phase 5.5, 2026-06-07)
mobile_user
→ POST /merchant/registration (core_api)
→ CreateMerchantRegistration() [tulis ke db_kesles_merchant]
→ [best-effort] POST /internal/kyc/submissions (auth_service)
→ INSERT INTO kyc.submissions
4. KYB — Business Verification
Scope
Business verification adalah verifikasi bahwa usaha merchant nyata dan layak. Cakupannya:
business_photo_url— foto tampak depan tempat usaha / storefrontbusiness_npwp— NPWP perusahaan (untuk badan usaha)bank_name,account_number,account_holder_name— rekening bank untuk settlement
Field-field ini bukan KYC. Foto usaha tidak dipakai untuk verifikasi identitas dan tidak memiliki nilai dedup cross-account seperti foto KTP/wajah.
Storage
Database: db_kesles_merchant
Schema/Table: merchant.merchant_registration_requests
Dikelola oleh: merchant_core_api
Business verification tetap di main DB karena:
- Terikat dengan workflow registrasi merchant dan acquirer submission
- Bank account dipakai oleh payment service untuk settlement — harus di domain merchant
- Tidak perlu dedup atau re-use lintas produk
Kolom di merchant_registration_requests
business_photo_url text -- foto tempat usaha
business_npwp varchar -- NPWP perusahaan
bank_name varchar -- nama bank settlement
account_number varchar -- nomor rekening
account_holder_name varchar -- nama pemilik rekening
5. Mengapa business_photo_url Tidak Masuk kyc.submissions
kyc.submissions di db_kesles_merchant_auth secara eksplisit tidak punya kolom business_photo_url. Ini keputusan desain:
- Bukan identity document — foto usaha tidak membuktikan siapa pemiliknya, hanya di mana usahanya
- Tidak ada kebutuhan dedup — tidak ada fraud signal dari foto usaha yang sama dipakai dua merchant (tidak seperti KTP/wajah)
- Tidak perlu re-use — untuk re-KYC atau tier upgrade, foto usaha tidak relevan; yang diulang adalah verifikasi identitas
- Acquirer dependency — bank acquirer butuh bukti tempat usaha sebagai bagian submission merchant, bukan sebagai data KYC
6. Field Map Lengkap — Mana ke Mana
kyc.submissions (db_kesles_merchant_auth)
| Kolom | Dari | Keterangan |
|---|---|---|
subject_type | hardcoded "user" | Pemilik merchant |
subject_id | user_id dari JWT | UUID pemilik |
purpose | hardcoded "merchant_registration" | |
nik | identity.users.nik | NIK 16-digit |
owner_name | identity.users.full_name | Nama sesuai KTP |
gender | derivasi NIK | male / female |
birth_date | derivasi NIK digit 7–12 | Format date |
nik_invalid_date_pattern | derivasi NIK | true jika NIK valid format tapi tanggal invalid |
ktp_photo_url | request body | URL MinIO foto KTP |
face_photo_url | request body | URL MinIO foto selfie |
ktp_photo_sha256 | upload phase (nullable sementara) | Hash dedup KTP |
face_photo_sha256 | upload phase (nullable sementara) | Hash dedup selfie |
ktp_nik_confidence | request body | OCR score 0–100 |
ktp_name_confidence | request body | OCR score 0–100 |
ktp_was_edited_after_prefill | request body | Edit flag |
source_registration_id | merchantRecord.ID | Cross-DB link ke merchant_registration_requests.id |
merchant_registration_requests (db_kesles_merchant) — business verification fields
| Kolom | Keterangan |
|---|---|
ktp_photo_url | Duplikasi untuk audit trail registrasi (read-only setelah submit) |
face_photo_url | Idem |
business_photo_url | Foto tempat usaha — tidak masuk KYC |
business_npwp | NPWP perusahaan |
bank_name | Bank settlement |
account_number | Nomor rekening settlement |
account_holder_name | Nama pemilik rekening |
7. Diagram Singkat
mobile_user (submit registrasi)
│
├─► merchant_core_api
│ │
│ ├─► merchant.merchant_registration_requests (db_kesles_merchant)
│ │ business_photo_url ✓
│ │ business_npwp ✓
│ │ bank_name / account_number ✓
│ │ ktp_photo_url (copy untuk audit trail)
│ │ face_photo_url (copy untuk audit trail)
│ │
│ └─► [best-effort] auth_service
│ │
│ └─► kyc.submissions (db_kesles_merchant_auth)
│ ktp_photo_url ✓
│ face_photo_url ✓
│ nik / owner_name / birth_date / gender ✓
│ ktp_nik_confidence / ktp_name_confidence ✓
│ ktp_was_edited_after_prefill ✓
│ source_registration_id → link ke merchant_registration_requests
8. Referensi
kyc-saas-evolution-plan.md— roadmap Phase 5–8 KYC extractionmerchant-registration-flow.md— flow lengkap 7-step registrasiservices/auth_service/internal/store/kyc.go— store layerkyc.submissionsmerchant_core_api/internal/httpapi/merchant_handlers.go— write path Phase 5.5merchant_database/db_kesles_merchant_auth/migrations/v1/001_initial_schema.sql— DDLkyc.submissions