Product Requirements Document
Table of Contents
Banyak kreator konten digital dan pelaku UMKM di Indonesia kesulitan memasarkan produk digital mereka karena tidak tersedia platform yang menggabungkan kemudahan publikasi, tampilan yang profesional, dan sistem pembayaran yang aman dalam satu ekosistem. Saat ini, mereka mengandalkan kombinasi tools yang terpisah-pisah — seperti Google Drive untuk distribusi file, transfer bank manual untuk pembayaran, dan media sosial untuk promosi — yang tidak hanya tidak efisien, tetapi juga mengurangi kepercayaan pembeli.
Platform marketplace digital ini dirancang untuk menjawab kebutuhan tersebut dengan menyediakan satu tempat di mana penjual dapat membuat etalase produk digital yang menarik, memproses transaksi secara otomatis dan aman, serta memantau performa penjualan melalui laporan yang mudah dibaca. Produk yang dijual mencakup template desain, konten digital, preset, e-book, dan aset kreatif lainnya. Halaman produk dapat diakses publik tanpa login, sehingga memudahkan distribusi dan promosi oleh penjual kepada calon pembeli.
Ekosistem pengguna platform ini mencakup empat segmen utama: content creator pemula yang baru mulai memonetisasi karyanya, designer digital berpengalaman yang membutuhkan kanal distribusi profesional, konsumen umum (B2C) yang mencari produk digital berkualitas, serta bisnis dan tim (B2B) yang membeli lisensi aset kreatif dalam jumlah lebih besar. Di sisi operasional, platform dikelola oleh staff dan manajer/pemilik melalui panel admin dengan hak akses berbeda, memastikan operasional marketplace berjalan terkontrol dan terstruktur.
Tabel berikut mendefinisikan seluruh kebutuhan fungsional platform marketplace produk digital, mencakup alur penjual, pembeli, dan admin.
| ID | Requirement | Priority | Notes |
|---|---|---|---|
| FR-01 | Registrasi & login akun dengan email/password | P0 | Wajib untuk pembeli dan penjual |
| FR-02 | Login via Google OAuth (SSO) | P1 | Mempercepat onboarding kreator & konsumen |
| FR-03 | Penjual dapat membuat toko/storefront sendiri | P0 | Profil toko dengan nama, bio, logo |
| FR-04 | Penjual dapat mengunggah produk digital (file + metadata) | P0 | Mendukung format PDF, ZIP, PNG, MP4, dsb. |
| FR-05 | Penjual dapat menetapkan harga, deskripsi, dan kategori produk | P0 | Kategori: template, e-book, preset, font, dll. |
| FR-06 | Halaman produk dapat diakses publik tanpa login | P0 | SEO-friendly untuk konversi organik |
| FR-07 | Pembeli dapat menambahkan produk ke keranjang | P0 | Single-item checkout juga didukung |
| FR-08 | Checkout dengan payment gateway terintegrasi | P0 | Midtrans/Xendit sebagai prioritas utama |
| FR-09 | Dukungan metode pembayaran: transfer bank, e-wallet (GoPay, OVO, DANA), QRIS, kartu kredit | P0 | Menjangkau segmen B2C dan B2B |
| FR-10 | Pengiriman file digital otomatis setelah pembayaran berhasil | P0 | Via link download terproteksi dengan expiry |
| FR-11 | Pembeli mendapat riwayat transaksi dan akses ulang ke file yang dibeli | P0 | Di halaman "My Purchases" |
| FR-12 | Penjual mendapat notifikasi real-time saat ada penjualan | P1 | Push notifikasi + email |
| FR-13 | Dashboard penjual: ringkasan pendapatan, jumlah penjualan, produk terlaris | P0 | Grafik harian/mingguan/bulanan |
| FR-14 | Sistem pencairan dana (withdrawal) ke rekening penjual | P1 | Jadwal pencairan: manual request atau otomatis mingguan |
| FR-15 | Fitur diskon/kupon promo per produk atau per toko | P1 | Penjual bisa buat kode kupon sendiri |
| FR-16 | Rating & ulasan produk oleh pembeli terverifikasi | P1 | Hanya pembeli yang sudah bertransaksi |
| FR-17 | Fitur pencarian produk dengan filter kategori, harga, dan rating | P1 | Search bar global di seluruh marketplace |
| FR-18 | Admin panel: manajemen user (penjual & pembeli) | P0 | Staff dan manajer dengan role berbeda |
| FR-19 | Admin panel: moderasi produk sebelum tayang | P1 | Approval workflow: pending → approved/rejected |
| FR-20 | Admin panel: laporan transaksi platform secara keseluruhan | P0 | Export ke CSV/Excel |
| FR-21 | Sistem komisi platform per transaksi (configurable by admin) | P1 | Default: persentase dari harga jual |
| FR-22 | Halaman beranda publik dengan produk featured & kategori populer | P1 | Dikurasi manual oleh admin atau by sales rank |
| FR-23 | Penjual B2B dapat membuat akun tim dengan multiple member | P2 | Akses bersama ke satu storefront |
| FR-24 | Affiliate/referral system untuk kreator | P2 | Link unik dengan tracking komisi referral |
| FR-25 | Integrasi analitik toko: sumber traffic, conversion rate per produk | P2 | Bisa di-embed UTM tracking |
| Aspek | Requirement | Target |
|---|---|---|
| Performance | Waktu load halaman produk (publik) | < 2 detik pada koneksi 4G |
| Performance | Waktu proses checkout hingga konfirmasi pembayaran | < 5 detik untuk metode instan (QRIS/e-wallet) |
| Performance | Waktu pengiriman link download setelah pembayaran sukses | < 10 detik |
| Availability | Uptime layanan marketplace | ≥ 99.5% per bulan |
| Scalability | Concurrent user yang dapat dilayani tanpa degradasi | ≥ 1.000 concurrent users pada launch |
| Scalability | Ukuran file produk digital yang dapat diunggah penjual | Maksimal 500 MB per file |
| Security | Semua data transaksi dan file dienkripsi | TLS 1.2+ untuk data in-transit, AES-256 untuk storage |
| Security | Link download produk bersifat token-based dan memiliki expiry | Token expired dalam 24 jam atau setelah 3x unduh |
| Security | Proteksi terhadap brute-force login | Rate limiting: max 5 percobaan/menit per IP |
| Security | Pemisahan role admin: staff (read/moderate) vs manajer (full access) | Role-based access control (RBAC) |
| Compliance | Data pribadi user disimpan sesuai prinsip data minimization | Selaras dengan UU PDP Indonesia |
| Compliance | Rekam jejak transaksi tersimpan untuk keperluan audit | Minimal 5 tahun |
| Usability |
| Fitur | Deskripsi | MVP | Priority |
|---|---|---|---|
| Registrasi & Login | Sign up/login untuk penjual dan pembeli via email + OAuth (Google), dengan verifikasi email | ✓ | P0 |
| Seller Onboarding | Alur pendaftaran toko digital: nama toko, deskripsi, upload logo, kategori produk | ✓ | P0 |
| Upload Produk Digital | Penjual upload file digital (PDF, ZIP, PNG, dll), isi judul, deskripsi, harga, thumbnail, kategori | ✓ | P0 |
| Halaman Produk Publik | Halaman detail produk yang bisa diakses tanpa login: preview thumbnail, deskripsi, harga, rating | ✓ | P0 |
| Keranjang & Checkout | Pembeli bisa tambah produk ke keranjang, review order, lanjut ke pembayaran | ✓ | P0 |
| Payment Gateway | Integrasi Midtrans untuk mendukung transfer bank, QRIS, e-wallet (GoPay, OVO, Dana) | ✓ | P0 |
| Pengiriman File Otomatis | Setelah pembayaran sukses, sistem otomatis kirim link download terproteksi ke pembeli | ✓ | P0 |
| Dashboard Penjual | Ringkasan penjualan, produk aktif, total pendapatan, jumlah transaksi per periode | ✓ | P0 |
| Dashboard Admin | Manajemen user (staff & manajer), moderasi produk, monitoring transaksi platform | ✓ | P0 |
| Laporan & Ringkasan | Laporan penjualan harian/mingguan/bulanan untuk penjual, export CSV, grafik revenue | ✓ | P0 |
| Pencarian & Filter Produk | Cari produk berdasarkan keyword, filter kategori, harga, rating, terbaru | ✓ | P1 |
| Sistem Rating & Ulasan | Pembeli bisa beri rating bintang dan ulasan teks setelah download produk | ✓ | P1 |
| Manajemen Diskon & Kupon | Penjual bisa buat kode kupon diskon persen atau nominal untuk produk tertentu | ✗ | P1 |
| Halaman Storefront Toko | Halaman publik toko penjual: list semua produk, profil toko, statistik toko | ✗ | P1 |
| Affiliate & Referral | Program referral untuk pembeli/kreator yang merekomendasikan produk ke orang lain | ✗ | P2 |
Must have (P0):
Should have (P1):
Could have (P2):
Won't have (v1):
Terdapat empat flow utama yang perlu dimodelkan: registrasi & login, alur penjual mengunggah produk, alur pembeli melakukan pembelian, dan alur admin mengelola platform. Setiap flow dirancang sesuai peran masing-masing aktor.
Pengguna baru (pembeli atau penjual) mendaftar menggunakan email atau akun sosial, lalu memilih peran. Pengguna yang sudah terdaftar langsung masuk ke dashboard sesuai perannya.
Penjual yang sudah login dapat membuat listing produk digital baru, mengatur harga, mengunggah file, lalu mempublikasikannya ke marketplace. Produk masuk status review sebelum tampil publik.
Pengunjung dapat menelusuri produk tanpa login. Untuk membeli, pembeli wajib login, lalu melanjutkan ke pembayaran. Setelah pembayaran berhasil, file produk dapat langsung diunduh.
Staff dan manajer/pemilik mengakses panel admin untuk mereview produk yang disubmit penjual, mengelola pengguna, dan memantau laporan transaksi. Manajer memiliki akses tambahan ke konfigurasi platform.
Penjual dapat memantau performa produk dan ringkasan pendapatan dari dashboard mereka tanpa perlu mengakses panel admin.
Arsitektur menggunakan pendekatan modular monolith pada tahap awal (bukan microservices penuh) untuk mempercepat development dari kondisi "baru ide" — setiap service dipisahkan secara logis di dalam satu codebase, sehingga dapat di-extract menjadi microservice independen saat skala membutuhkan.
| Layer | Technology | Alasan |
|---|---|---|
| Frontend | Next.js 14 (React + TypeScript) | SSR/SSG untuk SEO produk digital yang bisa diakses publik tanpa login; App Router mendukung streaming UI |
| Styling | Tailwind CSS + Shadcn/UI | Komponen siap pakai, tampilan konsisten, mempercepat UI development untuk marketplace |
| State Management | Zustand + React Query | Zustand untuk global state ringan (cart, auth); React Query untuk server state & caching API call |
| Backend | Node.js + NestJS (TypeScript) | Arsitektur modular native, decorator-based, cocok untuk memisahkan domain Marketplace/Order/Payment |
| API Protocol | REST + OpenAPI Spec | Dokumentasi otomatis via Swagger, mudah di-consume frontend dan integrasi third-party |
| Database | PostgreSQL 15 | Relasional kuat untuk transaksi keuangan, ACID compliance, support JSON column untuk metadata produk |
| Caching & Session | Redis 7 | Session JWT blacklist, cache produk populer, rate limiting counter di API Gateway |
| Object Storage | Cloudflare R2 (S3-compatible) | Penyimpanan file produk digital (PDF, template, ZIP) dan aset media; biaya egress nol |
| CDN | Cloudflare | Distribusi aset statis, DDoS protection, edge caching untuk halaman produk publik |
| Auth | JWT + Refresh Token + Google OAuth2 | Stateless auth untuk API; Google OAuth untuk registrasi cepat kreator dan konsumen |
| Payment | Midtrans (primary) + Xendit (alternatif) | Midtrans coverage luas untuk QRIS, VA, kartu; Xendit sebagai fallback dan disbursement penjual |
| SendGrid | Notifikasi transaksi, verifikasi akun, pengiriman link download produk digital | |
| Deploy — Frontend | Vercel | Zero-config Next.js deployment, preview per branch, global edge network |
| Deploy — Backend | Railway / Fly.io | Container-based, auto-scale, managed PostgreSQL & Redis addon tersedia |
| CI/CD | GitHub Actions | Pipeline otomatis: lint → test → build → deploy ke staging/production |
| Monitoring | Sentry (error) + Grafana + Loki | Tracking error runtime, log aggregation, alerting untuk payment failure |
Catatan Arsitektur Kritis:
| Keputusan | Pilihan | Alasan |
|---|---|---|
| File delivery produk digital | Pre-signed URL dengan expiry 15 menit dari R2 | Mencegah sharing link langsung; pembeli hanya bisa download setelah payment confirmed |
| Payment webhook | Endpoint terpisah dengan signature verification | Validasi payload Midtrans/Xendit sebelum update status order di DB |
| Multi-role access | RBAC via guard NestJS (Consumer, Creator, Staff, Manager) | Manager/pemilik akses penuh laporan; Staff akses terbatas; Creator hanya kelola produk sendiri |
| Konten publik tanpa login | Next.js SSG/ISR untuk halaman produk | Halaman produk terindeks mesin pencari tanpa perlu autentikasi, mendukung visibilitas UMKM |
| Kategori | Constraint | Dampak ke Development |
|---|---|---|
| Performance | Halaman listing produk harus load < 2 detik pada koneksi 4G Indonesia (rata-rata 10 Mbps) | Wajib implementasi lazy loading, image compression (WebP), dan CDN untuk aset digital |
| Performance | Proses checkout & konfirmasi pembayaran maksimal 5 detik end-to-end | API payment gateway harus async dengan fallback timeout handler dan antrian transaksi |
| Security | Tidak ada compliance eksplisit yang ditetapkan — adopsi standar minimum PCI-DSS Level 1 untuk pemrosesan kartu dan UU PDP (UU No. 27/2022) untuk data pengguna Indonesia | Wajib enkripsi data sensitif at-rest (AES-256) dan in-transit (TLS 1.3), tidak boleh simpan raw card data di server sendiri |
| Security | File produk digital harus terlindungi dari akses tidak sah setelah pembelian | URL download wajib pakai signed URL dengan expiry (maks 24 jam), bukan direct public link ke storage |
| Security | Multi-role access: Konsumen, Penjual (Kreator/UMKM), Staff, Manajer/Pemilik | Sistem RBAC wajib diimplementasi sejak awal — perubahan permission di tengah development sangat costly |
| UX/UI | Konten marketplace harus bisa dilihat tanpa login (public browsing) | Routing dan rendering harus mendukung dua mode: authenticated dan unauthenticated, termasuk SEO meta tag untuk halaman produk publik |
| UX/UI | Target user mencakup kreator pemula yang belum familiar teknologi dan desainer berpengalaman | UI harus bersih dan low-friction — onboarding penjual maksimal 3 langkah, tanpa jargon teknis |
| UX/UI | Platform melayani segmen B2C (konsumen umum) dan B2B (bisnis/tim) sekaligus | Dashboard penjual dan tampilan produk harus adaptif — B2B butuh fitur seperti pembelian lisensi multiple, B2C butuh flow impulse-buy yang cepat |
| Timeline | Proyek baru pada tahap ide, belum ada codebase atau infrastruktur existing | Tidak ada technical debt yang bisa diwarisi, tapi seluruh setup infrastruktur (repo, CI/CD, environment, DB) harus dibangun dari nol sebelum sprint pertama |
| Timeline | Tidak ada target tanggal rilis yang ditetapkan, namun MVP harus cukup untuk validasi pasar | Scope MVP harus dikunci sebelum development dimulai — feature creep adalah risiko utama mengingat tidak ada deadline eksternal yang memaksa |
| Budget/Infra | Payment gateway belum dipilih — integrasi multi-gateway (Midtrans, Xendit, dll.) belum dikonfirmasi | Arsitektur payment service harus dibuat abstrak (payment adapter pattern) agar bisa swap atau tambah gateway tanpa refactor besar |
| Budget/Infra | Produk digital (file template, konten) membutuhkan storage yang skalabel | Wajib gunakan object storage terpisah (bukan local disk server) — estimasi biaya storage harus masuk dalam perencanaan infra dari awal |
| Budget/Infra | KPI dan metrik sukses belum didefinisikan | Analytics dan event tracking (minimal page view, conversion rate, GMV) harus dibangun sejak MVP agar data tersedia saat evaluasi — bukan ditambahkan belakangan |
Schema detail entitas utama:
Tabel: USERS
| Column | Type | Constraint | Keterangan |
|---|---|---|---|
| id | uuid | PK | Identitas unik user |
| full_name | varchar(100) | NOT NULL | Nama lengkap user |
| varchar(255) | UNIQUE, NOT NULL | Email untuk login | |
| password_hash | varchar(255) | NOT NULL | Bcrypt hash password |
| role | enum | NOT NULL | buyer, seller, admin, staff |
| avatar_url | varchar(500) | NULLABLE | URL foto profil |
| is_verified | boolean | DEFAULT false | Status verifikasi email |
| created_at | timestamp | NOT NULL | Waktu registrasi |
| updated_at | timestamp | NOT NULL | Waktu update terakhir |
Tabel: PRODUCTS
| Column | Type | Constraint | Keterangan |
|---|---|---|---|
| id | uuid | PK | Identitas unik produk |
| seller_id | uuid | FK → seller_profiles | Penjual produk |
| category_id | uuid | FK → categories | Kategori produk |
| title | varchar(200) | NOT NULL | Judul produk |
| slug | varchar(220) | UNIQUE, NOT NULL | URL-friendly identifier |
| description | text | NOT NULL | Deskripsi lengkap produk |
| price | decimal(12,2) | NOT NULL | Harga dalam Rupiah |
| thumbnail_url | varchar(500) | NOT NULL | Gambar utama produk |
| status | enum | NOT NULL | draft, published, suspended |
| download_count | integer | DEFAULT 0 | Total unduhan |
| rating_avg | decimal(3,2) | DEFAULT 0.00 | Rata-rata rating (1–5) |
| published_at | timestamp | NULLABLE | Waktu produk dipublikasikan |
| created_at | timestamp | NOT NULL | Waktu produk dibuat |
| updated_at | timestamp | NOT NULL | Waktu update terakhir |
Tabel: ORDERS
| Column | Type | Constraint | Keterangan |
|---|---|---|---|
| id | uuid | PK | Identitas unik order |
| buyer_id | uuid | FK → users | Pembeli yang melakukan order |
| order_code | varchar(20) | UNIQUE, NOT NULL | Kode order untuk referensi (e.g. ORD-20240801-0001) |
| subtotal | decimal(12,2) | NOT NULL | Total sebelum fee platform |
| platform_fee | decimal(12,2) | NOT NULL | Potongan platform |
| total_amount | decimal(12,2) | NOT NULL | Total yang dibayar pembeli |
| status | enum | NOT NULL | pending, paid, completed, cancelled, refunded |
| paid_at | timestamp | NULLABLE | Waktu konfirmasi pembayaran |
| created_at | timestamp | NOT NULL | Waktu order dibuat |
| updated_at | timestamp | NOT NULL | Waktu update status terakhir |
Tabel: PAYMENTS
| Column | Type | Constraint | Keterangan |
|---|---|---|---|
| id | uuid | PK | Identitas unik payment record |
| order_id | uuid | FK → orders | Order yang dibayar |
| gateway_provider | varchar(50) | NOT NULL | Nama penyedia (e.g. Midtrans, Xendit) |
| gateway_transaction_id | varchar(100) | UNIQUE | ID transaksi dari gateway |
| payment_method | varchar(50) | NOT NULL | QRIS, transfer bank, e-wallet, kartu kredit |
| amount | decimal(12,2) | NOT NULL | Nominal pembayaran |
| status | enum | NOT NULL | pending, success, failed, expired |
| gateway_response | jsonb | NULLABLE | Raw response dari payment gateway |
| paid_at | timestamp | NULLABLE | Waktu pembayaran dikonfirmasi |
| expired_at | timestamp | NULLABLE | Batas waktu pembayaran |
| created_at | timestamp | NOT NULL | Waktu record dibuat |
Tabel: PAYOUTS
| Column | Type | Constraint | Keterangan |
|---|---|---|---|
| id | uuid | PK | Identitas unik payout |
| seller_id | uuid | FK → seller_profiles | Penjual yang menerima payout |
| amount | decimal(12,2) | NOT NULL | Total pendapatan kotor periode ini |
| platform_commission | decimal(12,2) | NOT NULL | Komisi platform yang dipotong |
| net_amount | decimal(12,2) | NOT NULL | Dana bersih yang ditransfer ke penjual |
| status | enum | NOT NULL | requested, processing, completed, rejected |
| bank_account_name | varchar(100) | NOT NULL | Nama pemilik rekening |
| bank_account_number | varchar(30) | NOT NULL | Nomor rekening tujuan |
| bank_name | varchar(50) | NOT NULL | Nama bank tujuan |
| reference_code | varchar(50) | NULLABLE | Kode referensi transfer bank |
| requested_at | timestamp | NOT NULL | Waktu pengajuan payout |
| processed_at | timestamp | NULLABLE | Waktu payout diproses admin |
Tabel: SALES_REPORTS
| Column | Type | Constraint | Keterangan |
|---|---|---|---|
| id | uuid | PK | Identitas unik laporan |
| seller_id | uuid | FK → seller_profiles | Penjual pemilik laporan |
| report_date | date | NOT NULL | Tanggal laporan (agregat harian) |
| total_orders | integer | DEFAULT 0 | Jumlah order yang selesai pada hari itu |
| total_items_sold | integer | DEFAULT 0 | Jumlah item terjual |
| gross_revenue | decimal(12,2) | DEFAULT 0 | Pendapatan kotor |
| platform_fee_total | decimal(12,2) | DEFAULT 0 | Total fee platform |
| net_revenue | decimal(12,2) | DEFAULT 0 | Pendapatan bersih penjual |
| generated_at | timestamp | NOT NULL | Waktu laporan di-generate |
| Fase | Periode | Deliverable | Milestone |
|---|---|---|---|
| Phase 1 — Foundation | Week 1–4 | Repo tersetup, skema database final, sistem autentikasi & role (Consumer, Seller, Staff, Manager) berjalan | ✅ Auth & role system live di staging |
| Phase 2 — Core Marketplace | Week 5–9 | Seller dapat upload produk digital, halaman listing & detail produk aktif, flow checkout end-to-end tersambung ke payment gateway | ✅ Transaksi pertama berhasil diproses di staging |
| Phase 3 — Transaksi & Konten | Week 10–13 | Order management buyer/seller fungsional, sistem unduhan produk digital aman post-payment, halaman produk dapat diakses publik tanpa login | ✅ Full purchase-to-download flow tervalidasi |
| Phase 4 — Dashboard & Laporan | Week 14–17 | Dashboard seller (omzet, produk terlaris), dashboard admin/staff (manajemen pengguna & transaksi), laporan ringkasan dapat diekspor | ✅ Semua role dapat mengakses data relevan masing-masing |
| Phase 5 — QA & Launch | Week 18–20 | UAT selesai, zero critical bug, hasil security audit terdokumentasi, platform live di production dengan monitoring aktif | 🚀 Go-live MVP Marketplace Produk Digital |
Catatan Prioritas per Fase:
Made with PRD Pro
✦Create your own PRD — free