Skip to main content

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

KYCKYB
SubjekIndividu (pemilik/penanggung jawab)Entitas bisnis
Dokumen utamaKTP, PassportNPWP, NIB, akta perusahaan
Bisa di-API-kan sepenuhnyaYa — dokumen digital + biometrikSebagian — foto usaha tetap manual review
Foto tempat usahaBukan bagian KYCBukan bagian KYB formal — manual evidence
Regulasi acuanOJK POJK 12/2017, Permendagri 19/2010OJK 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 VerificationKYB — Business Verification
Pertanyaan utamaSiapa pemiliknya?Apakah usahanya nyata?
DokumenKTP, selfie/livenessFoto usaha, NPWP, rekening bank
SOT (Source of Truth)kyc.submissions di db_kesles_merchant_authmerchant.merchant_registration_requests di db_kesles_merchant
Service ownerauth_servicemerchant_core_api
Dipakai untukFraud detection, re-KYC, dedup lintas akunReview 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 NIK
    • owner_name — nama lengkap sesuai KTP
    • birth_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 akun
    • face_photo_sha256 — hash SHA-256 selfie untuk dedup
    • nik_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:

  1. Bersifat PII sensitif — akses harus di-gate ketat
  2. Bisa dipakai lintas produk (re-KYC, tier upgrade, external API)
  3. 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 / storefront
  • business_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:

  1. Terikat dengan workflow registrasi merchant dan acquirer submission
  2. Bank account dipakai oleh payment service untuk settlement — harus di domain merchant
  3. 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:

  1. Bukan identity document — foto usaha tidak membuktikan siapa pemiliknya, hanya di mana usahanya
  2. Tidak ada kebutuhan dedup — tidak ada fraud signal dari foto usaha yang sama dipakai dua merchant (tidak seperti KTP/wajah)
  3. Tidak perlu re-use — untuk re-KYC atau tier upgrade, foto usaha tidak relevan; yang diulang adalah verifikasi identitas
  4. 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)

KolomDariKeterangan
subject_typehardcoded "user"Pemilik merchant
subject_iduser_id dari JWTUUID pemilik
purposehardcoded "merchant_registration"
nikidentity.users.nikNIK 16-digit
owner_nameidentity.users.full_nameNama sesuai KTP
genderderivasi NIKmale / female
birth_datederivasi NIK digit 7–12Format date
nik_invalid_date_patternderivasi NIKtrue jika NIK valid format tapi tanggal invalid
ktp_photo_urlrequest bodyURL MinIO foto KTP
face_photo_urlrequest bodyURL MinIO foto selfie
ktp_photo_sha256upload phase (nullable sementara)Hash dedup KTP
face_photo_sha256upload phase (nullable sementara)Hash dedup selfie
ktp_nik_confidencerequest bodyOCR score 0–100
ktp_name_confidencerequest bodyOCR score 0–100
ktp_was_edited_after_prefillrequest bodyEdit flag
source_registration_idmerchantRecord.IDCross-DB link ke merchant_registration_requests.id

merchant_registration_requests (db_kesles_merchant) — business verification fields

KolomKeterangan
ktp_photo_urlDuplikasi untuk audit trail registrasi (read-only setelah submit)
face_photo_urlIdem
business_photo_urlFoto tempat usaha — tidak masuk KYC
business_npwpNPWP perusahaan
bank_nameBank settlement
account_numberNomor rekening settlement
account_holder_nameNama 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 extraction
  • merchant-registration-flow.md — flow lengkap 7-step registrasi
  • services/auth_service/internal/store/kyc.go — store layer kyc.submissions
  • merchant_core_api/internal/httpapi/merchant_handlers.go — write path Phase 5.5
  • merchant_database/db_kesles_merchant_auth/migrations/v1/001_initial_schema.sql — DDL kyc.submissions