Membership and Billing Rules — Central Membership & SSO Hub
1. Tujuan Dokumen
Dokumen ini menjelaskan seluruh aturan bisnis utama yang harus diterapkan dalam sistem Central Membership & SSO Hub.
Dokumen ini menjadi pedoman bagi:
- product owner,
- programmer,
- UI/UX designer,
- tester,
- dan tim operasional.
Programmer tidak boleh membuat asumsi tentang aturan yang belum didefinisikan di sini.
2. Prinsip Umum
- Satu akun member dapat berlangganan beberapa produk SaaS secara bersamaan.
- Setiap produk memiliki paket dan harga yang independen.
- Lisensi hanya aktif setelah aktivasi yang sah (gratis atau pembayaran dikonfirmasi).
- Data member bersifat privat dan hanya dapat diakses oleh member pemilik dan Super Admin dengan alasan yang sah.
- Proses pembayaran bersifat atomic: lisensi tidak boleh aktif jika pembayaran belum dikonfirmasi.
- Data member tidak dihapus permanen karena status lisensi berubah.
- Semua tindakan penting harus dapat diaudit.
3. Aturan Akun Member
3.1 Registrasi
- Email wajib unik di seluruh sistem.
- Email dinormalisasi menjadi huruf kecil (lowercase) dan ditrim spasi sebelum disimpan.
- Kata sandi tidak boleh disimpan dalam bentuk teks asli (harus di-hash).
- Akun berstatus
unverifiedhingga email diverifikasi. - Akun
unverifiedtidak dapat mengaktifkan lisensi atau login ke aplikasi SaaS. - Tautan verifikasi email memiliki masa berlaku (misal: 24 jam).
- Member dapat meminta kirim ulang tautan verifikasi.
3.2 Login
- Login menggunakan email dan kata sandi.
- Email dinormalisasi sebelum proses validasi.
- Percobaan login gagal berulang harus dibatasi (rate limiting).
- Akun dengan status
suspendedtidak dapat login. - Akun dengan status
unverifiedtidak dapat login ke aplikasi SaaS melalui SSO.
3.3 Profil
- Member hanya dapat mengubah data profilnya sendiri.
- Perubahan email memerlukan verifikasi ulang ke email baru.
- Perubahan kata sandi mengakhiri semua sesi aktif lainnya.
4. Aturan Produk dan Paket
- Setiap produk SaaS diidentifikasi dengan kode produk unik (contoh:
NTO). - Setiap produk mendefinisikan paketnya sendiri secara independen.
- Harga paket disimpan dalam mata uang IDR.
- Paket gratis tidak memiliki durasi dan tidak akan kedaluwarsa.
- Paket berbayar memiliki durasi dalam satuan hari.
- Super Admin dapat menambah, mengubah, atau menonaktifkan paket.
- Perubahan harga paket tidak memengaruhi langganan yang sudah aktif.
- Paket yang dinonaktifkan tidak dapat dipilih oleh member baru, tetapi langganan lama tetap berjalan hingga selesai.
5. Aturan Lisensi
5.1 Pembuatan Lisensi
- Satu member hanya boleh memiliki satu lisensi aktif per produk pada satu waktu.
- License-ID dibuat satu kali saat pertama kali mengaktifkan produk tersebut.
- Perpanjangan tidak mengubah License-ID.
- License-ID hanya dibuat ulang jika lisensi sebelumnya berstatus
cancelled. - License-ID harus unik secara global di seluruh sistem.
5.2 Aktivasi Lisensi
- Aktivasi paket gratis langsung menghasilkan lisensi berstatus
active. - Aktivasi paket berbayar hanya terjadi setelah webhook konfirmasi pembayaran sukses diterima dan diverifikasi.
- Sistem tidak boleh mengaktifkan lisensi berbayar tanpa konfirmasi pembayaran yang valid.
5.3 Format License-ID
[PREFIX_PRODUK]-[XXXX]-[XXXX]-[XXXX]
- Prefix: 2–4 huruf kapital sesuai kode produk.
- Segmen: 4 karakter alfanumerik kapital, digenerate secara acak.
- Contoh:
NTO-A1B2-C3D4-E5F6
5.4 Status Lisensi
active: Lisensi aktif.grace_period: Berbayar, sudah expired, dalam masa tenggang.suspended: Grace Period habis, akses diblokir.cancelled: Dibatalkan.
Perpindahan status:
active → grace_period (hanya paket berbayar, ketika expired_at tercapai)
grace_period → active (jika perpanjangan berhasil)
grace_period → suspended (jika Grace Period habis)
suspended → active (jika member membayar kembali)
6. Aturan Pembayaran
6.1 Order
- Setiap sesi checkout membuat satu
orderdengan statuspending_payment. - Order memiliki
order_idunik yang digunakan sebagai referensi ke payment gateway. - Order yang tidak diselesaikan dalam batas waktu tertentu otomatis kedaluwarsa.
6.2 Konfirmasi Pembayaran via Webhook
- Sistem hanya mengaktifkan lisensi setelah menerima webhook konfirmasi sukses dari payment gateway.
- Webhook harus diverifikasi menggunakan mekanisme signature yang disediakan payment gateway.
- Satu order_id tidak boleh memicu aktivasi lebih dari satu kali (idempotency).
- Webhook dari payment gateway yang tidak dapat diverifikasi harus diabaikan dan dicatat di log.
6.3 Kegagalan Pembayaran
- Pembayaran gagal tidak mengaktifkan lisensi.
- Member dapat mencoba checkout ulang untuk order baru.
6.4 Riwayat Transaksi
- Setiap transaksi pembayaran disimpan secara permanen.
- Invoice tersedia untuk diunduh oleh member.
- Riwayat transaksi tidak dapat diubah atau dihapus.
7. Aturan Grace Period
- Grace Period hanya berlaku untuk paket berbayar.
- Panjang Grace Period dikonfigurasi per produk (default: 7 hari).
- Grace Period dimulai tepat setelah
expired_attercapai. - Selama Grace Period:
- member masih dapat mengakses aplikasi,
- sistem menampilkan banner peringatan di dashboard member,
- dan sistem menampilkan banner peringatan di dalam aplikasi SaaS (melalui JWT yang menyertakan status
grace_period).
- Notifikasi email dikirim sesuai jadwal yang telah ditetapkan.
- Setelah Grace Period habis, lisensi berubah ke status
suspended. - Perpanjangan selama Grace Period memperbarui
expired_atdari tanggal expired asli.
8. Aturan SSO dan Token
- JWT diterbitkan hanya untuk member dengan akun aktif dan lisensi berstatus
active,active_free, ataugrace_period. - JWT tidak diterbitkan untuk member dengan status
unverified,suspended, atau lisensicancelled. - JWT memiliki masa berlaku singkat (misal: 1 jam).
- Refresh Token memiliki masa berlaku lebih panjang (misal: 30 hari).
- JWT berisi informasi:
sub,name,email,product,license_id,tier,license_status,expires_at. - Aplikasi SaaS wajib memverifikasi JWT menggunakan public key Hub.
- Aplikasi SaaS tidak boleh mempercayai klaim dalam JWT tanpa memverifikasi signature-nya.
- Saat lisensi suspend, Refresh Token tidak dapat digunakan untuk menghasilkan Access Token baru.
9. Aturan Notifikasi
- Email konfirmasi aktivasi wajib terkirim setelah lisensi aktif.
- Email invoice wajib terkirim setelah pembayaran berhasil.
- Jadwal notifikasi reminder expired dan Grace Period wajib diikuti.
- Kegagalan pengiriman email harus dicatat di log.
- Member dapat mengatur preferensi notifikasi (aktifkan/nonaktifkan jenis notifikasi tertentu).
10. Aturan Keamanan
- Kata sandi disimpan menggunakan algoritma hashing yang aman (bcrypt atau Argon2).
- API Key payment gateway tidak boleh disimpan di frontend atau repository publik.
- Webhook payment gateway harus diverifikasi sebelum diproses.
- JWT ditandatangani menggunakan RS256 (asymmetric).
- Private key JWT hanya tersimpan di server Hub.
- Seluruh komunikasi menggunakan HTTPS.
- Rate limiting diterapkan pada endpoint login dan registrasi.
- Data sensitif tidak boleh ditulis ke log secara utuh.
11. Aturan Audit Log
Aktivitas berikut wajib dicatat:
- registrasi akun baru,
- login berhasil dan gagal,
- verifikasi email,
- aktivasi lisensi,
- pembayaran berhasil,
- pembayaran gagal,
- Grace Period dimulai,
- lisensi suspend,
- lisensi dipulihkan,
- perubahan status akun oleh Super Admin,
- penerbitan JWT,
- dan tindakan administratif sensitif.
Audit log minimal menyimpan:
- actor_id,
- actor_role,
- action,
- object_type,
- object_id,
- timestamp,
- ip_address,
- dan hasil (berhasil / gagal).
12. Aturan Penambahan Produk Baru
Ketika produk SaaS baru bergabung ke ekosistem:
- Produk didaftarkan ke sistem dengan kode produk unik.
- Paket-paket produk dikonfigurasi oleh Super Admin.
client_iddanclient_secretOAuth2 diterbitkan untuk produk.- Format License-ID prefix ditetapkan (contoh:
APBuntuk Aplikasi B). - Produk mengimplementasikan integrasi SSO sesuai dokumen sso-auth-flow.
13. Definition of Done
Implementasi dianggap sesuai jika:
- member dapat mendaftar, verifikasi email, dan mengaktifkan paket gratis dalam satu sesi,
- License-ID digenerate, ditampilkan, dan dikirim ke email,
- SSO menerbitkan JWT yang dapat diverifikasi oleh aplikasi SaaS,
- pembayaran mengaktifkan lisensi secara otomatis melalui webhook,
- Grace Period berjalan dan notifikasi terkirim sesuai jadwal,
- lisensi suspend setelah Grace Period habis,
- data member tidak hilang meskipun lisensi suspend,
- webhook yang sama tidak memicu aktivasi dua kali,
- seluruh tindakan penting tercatat di audit log,
- dan seluruh aturan keamanan diterapkan.