Model hak akses untuk tingkatan pelanggan: paket, batas, dan flag
Rancang model hak akses dengan skema jelas untuk paket, batas, dan flag sehingga admin dan dukungan bisa menyesuaikan akses pelanggan dengan aman tanpa melibatkan engineering.

Mengapa tim butuh model entitlements
Jika Anda menjual lebih dari satu tingkatan, pada akhirnya Anda akan mendapatkan tiket dukungan yang sama: “Pelanggan X membayar Pro, tapi mereka tidak bisa mengakses Fitur Y.” Tanpa sistem yang jelas, dukungan tidak bisa memperbaikinya langsung. Perubahan akses sederhana berubah menjadi tugas engineering.
Masalah yang lebih besar adalah inkonsistensi. Aturan akses tersebar di seluruh produk: sebuah checkbox di layar admin, pengecekan hardcoded di API, catatan di spreadsheet, dan update database satu-off dari kuartal lalu. Pelanggan melihat perilaku berbeda di tempat yang berbeda, dan tak ada yang yakin mana aturan yang sebenarnya.
Model entitlements memberi Anda satu sumber kebenaran tentang siapa boleh melakukan apa, berdasarkan paket mereka dan pengecualian yang disetujui. Ini menjaga tingkatan tetap dapat diprediksi (sehingga harga tetap kredibel), sambil memberi ruang untuk kondisi nyata: upgrade sementara, kenaikan kuota, atau fitur pilot untuk satu akun.
“Menyesuaikan tanpa engineering” harus konkret. Praktiknya:
- Dukungan mengubah akses di alat admin dengan mengedit data, bukan meminta deploy.
- Produk membaca data entitlements yang sama di mana-mana (backend, web app, mobile).
- Pengecualian bisa berbatas waktu dan dapat dibalik, bukan hacks permanen.
- Perubahan dicatat siapa yang melakukannya, kapan, dan mengapa.
Misalnya, seorang pelanggan di tier Business mencapai batas pengguna aktif selama musim sibuk. Dukungan harus bisa memberikan +10 seat selama 14 hari, dan sistem harus mengembalikannya otomatis saat periode berakhir. Engineering hanya perlu terlibat ketika Anda menambah kapabilitas baru, bukan saat penyesuaian akses rutin.
Komponen dasar: pelanggan, paket, dan entitlements
Model entitlements yang baik dimulai dengan beberapa objek jelas dan kepemilikan yang ditetapkan. Jika dasar-dasar ini kabur, dukungan akan terus meminta engineering untuk “satu pengecualian lagi” setiap minggu.
Berikut blok bangunan sederhana:
- Customer (account/tenant): perusahaan atau orang yang menggunakan produk Anda.
- Subscription: hubungan komersial (trial, aktif, batal), sering terkait sistem penagihan.
- Plan: tier bernama (Free, Pro, Enterprise) yang mendefinisikan akses default.
- Entitlement: perilaku yang diizinkan sebenarnya, diturunkan dari paket plus override.
Evaluasi entitlement bukanlah billing. Billing menjawab “apa yang harus kita tagihkan dan kapan?” Entitlements menjawab “apa yang bisa dilakukan pelanggan ini sekarang?” Seorang pelanggan bisa belum membayar tapi masih dalam masa tenggang, atau sudah membayar penuh tapi sementara diblokir karena kepatuhan. Pisahkan keputusan ini agar finance bisa memperbaiki invoice tanpa secara tidak sengaja mengubah akses produk.
Beberapa kelompok mengandalkan setup ini:
- Product mendefinisikan makna paket.
- Support butuh kontrol aman untuk memberi atau mencabut akses.
- Sales ops butuh aturan konsisten untuk deal dan renewals.
- Finance butuh pemetaan andal antara yang dijual dan akses yang diberikan.
Tetapkan batasan sejak awal. Buat isi paket dan override pelanggan dapat dikonfigurasi (agar dukungan bisa bertindak), tetapi jaga perilaku inti tetap di kode. Contoh “perilaku inti” termasuk bagaimana Anda menghitung sisa kuota, bagaimana menangani trial kedaluwarsa, dan tindakan mana yang harus diaudit.
Flags, limits, dan quotas: pilih tipe yang tepat
Sebagian besar masalah tiering menjadi lebih mudah ketika Anda menamai entitlement dengan benar. Ada tiga tipe umum, dan masing-masing menjawab pertanyaan berbeda:
- Boolean flags: apakah sesuatu menyala atau mati? Contoh: export_enabled = true.
- Numeric limits: berapa banyak yang diizinkan sekaligus? Contoh: max_seats = 10.
- Quotas: berapa banyak yang bisa dipakai selama periode waktu? Contoh: api_calls_per_month = 100000.
Flag terbaik untuk fitur yang tidak boleh bekerja sebagian. Jika export dimatikan, sembunyikan tombol dan blok endpoint juga. Limit cocok untuk pengaturan “kapasitas” yang tidak reset, seperti seat, proyek, atau saved views.
Kuota perlu perhatian ekstra karena waktu penting. Tiket dukungan turun drastis ketika aturan reset ditulis dan terlihat di UI admin.
Scope adalah keputusan lain yang mencegah kebingungan. Flag seperti “SAML SSO enabled” biasanya level akun. “Max projects” mungkin level workspace. “Can run reports” mungkin level pengguna jika Anda menjual add-on berbasis peran.
Untuk kuota, pilih satu aturan reset per kuota dan patuhi itu:
- Never (kredit seumur hidup)
- Monthly (bulan kalender)
- Rolling window (30 hari terakhir)
- Per billing period (cocok dengan siklus invoice)
Jika aturan reset berbeda per paket, anggap aturan itu sendiri sebagai bagian dari entitlement, bukan pengetahuan tersirat.
Skema database praktis untuk entitlements
Model entitlements yang ramah dukungan biasanya bekerja terbaik ketika tetap sederhana: beberapa tabel, kunci jelas, dan catatan berbatas waktu yang bisa diaudit. Tujuannya adalah memungkinkan admin mengubah akses dengan mengedit data, bukan mengirim kode.
Mulai dengan empat tabel inti: plans, plan_entitlements, customers, dan customer_overrides.
- Plans menjelaskan tier (Free, Pro, Enterprise).
- Plan entitlements menjelaskan apa yang termasuk di setiap paket.
- Customers menunjuk ke sebuah plan.
- Overrides menangani pengecualian untuk satu pelanggan tanpa mengubah paket untuk semua orang.
Bentuk relasional ringkas yang bekerja baik:
plans:id,name,description,is_activeplan_entitlements:id,plan_id,key,type,value,unit,reset_policy,effective_from,effective_to,created_bycustomers:id,name,plan_id,status,created_atcustomer_overrides:id,customer_id,key,type,value,unit,reset_policy,effective_from,effective_to,created_by
Field entitlement harus konsisten di semua tabel. Gunakan key yang stabil seperti seats, api_calls, atau sso_enabled. Gunakan type untuk menyederhanakan evaluasi (misalnya: flag, limit, quota). Simpan unit secara eksplisit (seperti users, requests, GB). Untuk kuota, jelaskan reset_policy dengan tidak ambigu (misalnya monthly, daily, never).
Overrides harus berperilaku seperti allowlist dengan tanggal. Jika pelanggan memiliki override aktif untuk sso_enabled=true, itu harus menang atas nilai paket, tetapi hanya dalam rentang effective_from dan effective_to. Inilah yang membuat “memberi 10 seat ekstra selama 14 hari” menjadi satu baris perubahan yang kadaluwarsa otomatis.
Bagaimana evaluasi entitlement harus bekerja
Evaluasi entitlement adalah potongan kecil kode (atau service) yang menjawab satu pertanyaan: “Apakah pelanggan ini diizinkan melakukan ini sekarang?” Jika bagian ini dapat diprediksi, segala sesuatu yang lain lebih mudah dioperasikan.
Gunakan urutan prioritas yang jelas dan jangan menyimpang: override pelanggan > nilai paket > default sistem. Itu memungkinkan dukungan memberi pengecualian sementara tanpa mengubah paket, dan memberi engineering default aman ketika tidak ada yang dikonfigurasi.
Alur evaluasi praktis:
- Identifikasi pelanggan/akun dari sesi yang terautentikasi (bukan dari body request).
- Muat paket aktif pelanggan dan semua override aktif.
- Untuk sebuah key, kembalikan override jika ada; jika tidak, kembalikan nilai paket; jika tidak, kembalikan default sistem.
- Jika key hilang di mana-mana, fail closed untuk pemeriksaan akses (anggap sebagai “tidak diizinkan”) dan gunakan default yang masuk akal untuk UI yang hanya tampil.
- Jika key tidak dikenal (tidak ada di registri Anda), anggap itu sebagai kesalahan konfigurasi, fail closed, dan catat untuk tindak lanjut.
Caching penting karena entitlements diperiksa terus-menerus. Cache entitlements yang ter-resolve per pelanggan dengan TTL pendek dan nomor versi eksplisit. Invalidasi ketika salah satu berubah: penugasan paket, definisi paket, override pelanggan, atau status pelanggan (trial, grace, blocked). Pola sederhana adalah “cache berdasarkan customer_id + entitlements_version,” di mana edit dukungan meningkatkan versi sehingga perubahan muncul cepat.
Keamanan multi-tenant tidak bisa ditawar. Setiap query harus memfilter berdasarkan id customer/akun saat ini, dan setiap entri cache harus diberi kunci oleh id itu. Jangan mengambil entitlements berdasarkan email, domain, atau nama paket saja.
Langkah demi langkah: alur dukungan yang ramah untuk menyesuaikan akses
Alur dukungan yang ramah menjaga model tetap fleksibel tanpa mengubah setiap kasus tepi menjadi tugas engineering. Tujuannya adalah membuat perubahan dengan aman, meninggalkan jejak, dan mengonfirmasi pengalaman pelanggan.
Alur dukungan yang aman
Mulai dengan menemukan record pelanggan yang benar dan konfirmasi apa yang mereka minta, dan mengapa. “Butuh dua seat tambahan selama seminggu” berbeda dari “kita menandatangani amandemen untuk tier yang lebih tinggi.” UI admin yang baik memudahkan melihat, di satu tempat, paket saat ini, status pelanggan, dan semua override aktif.
Sebelum mengubah apa pun, periksa penggunaan aktual terhadap batas atau kuota saat ini. Banyak permintaan hilang setelah Anda melihat akun tidak mencapai cap, atau masalah ada di tempat lain (misalnya pelacakan penggunaan tidak terupdate).
Ketika Anda memang perlu menyesuaikan akses, utamakan membuat override eksplisit daripada mengubah paket. Jaga override sempit (satu flag atau satu limit), sertakan pemilik dan alasan, dan defaultkan ke tanggal kedaluwarsa. Pengecualian sementara umum dan mudah dilupakan.
Checklist sederhana di alat admin biasanya cukup:
- Konfirmasi identitas pelanggan, paket saat ini, dan alasan permintaan.
- Tinjau penggunaan saat ini versus cap terkait.
- Terapkan override terfokus dan atur expiry.
- Tambahkan catatan plus referensi tiket atau kasus.
- Verifikasi hasil di UI produk menggunakan impersonation atau akun uji.
Selalu verifikasi perubahan sebagaimana pelanggan akan mengalaminya. Jika Anda mendukung impersonation, buat jelas ketika itu diaktifkan dan catat penggunaannya.
Upgrade, downgrade, trial, dan masa tenggang
Sebagian besar masalah entitlement muncul saat perubahan: pelanggan upgrade di tengah siklus, kartu gagal, atau trial berakhir saat akhir pekan. Jika aturannya kabur, dukungan menebak dan engineering ditarik masuk.
Untuk upgrade, buat sederhana: akses biasanya berubah segera, sementara detail uang tetap di billing. Model entitlements Anda harus mendengarkan event billing seperti “plan changed” dan menerapkan entitlements paket baru segera. Jika billing melakukan proration, bagus, tapi jangan masukkan matematika proration ke entitlements.
Downgrade adalah tempat kejutan muncul. Pilih perilaku downgrade yang jelas dan buat terlihat untuk dukungan:
- Grace period: pertahankan akses lebih tinggi sampai akhir periode berbayar.
- Read-only: izinkan melihat/mengekspor data tapi blok penulisan baru.
- Hard stop: blokir fitur segera (lebih cocok untuk fitur berisiko).
- Perilaku over-limit: izinkan penggunaan, tapi blok pembuatan ketika pelanggan di atas kuota.
- Retensi data: simpan data tetapi nonaktifkan akses sampai upgrade.
Trial bekerja paling baik sebagai plan tersendiri, bukan boolean di pelanggan. Beri plan trial flag dan batas eksplisit, plus aturan kadaluwarsa otomatis. Saat trial berakhir, pindahkan pelanggan ke plan default (sering “Free”) dan terapkan perilaku downgrade yang Anda definisikan.
Masa tenggang juga berguna untuk kegagalan billing. Jendela singkat “past due” (misalnya 3–7 hari) memberi tim waktu memperbaiki pembayaran tanpa kehilangan akses di tengah hari kerja. Perlakukan masa tenggang sebagai override berbatas waktu, bukan nama plan kustom.
Tip praktis: jangan kaitkan entitlements dengan nama tier marketing seperti “Pro” atau “Enterprise.” Simpan ID plan internal yang stabil (mis. plan_basic_v2) sehingga Anda bisa mengganti nama tier tanpa merusak aturan.
Auditabilitas dan kontrol keselamatan
Jika dukungan bisa mengubah akses tanpa engineering, Anda butuh jejak. Model entitlements yang baik memperlakukan setiap perubahan sebagai keputusan yang dicatat, bukan tweak diam-diam.
Untuk setiap override, tangkap aktor, alasan bisnis, dan cap waktu. Jika organisasi Anda membutuhkan, tambahkan langkah persetujuan untuk perubahan sensitif.
Apa yang dicatat untuk setiap perubahan
Buat log sederhana agar benar-benar dipakai:
created_bydancreated_atapproved_bydanapproved_at(opsional)reason(teks pendek seperti “paid add-on” atau “incident credit”)previous_valuedannew_valueexpires_at
Kontrol keselamatan menghentikan kecelakaan sebelum mencapai produksi. Pasang guardrail di UI admin dan di database: batasi nilai maksimum, blok angka negatif, dan minta tanggal kedaluwarsa saat perubahan besar (misalnya menaikkan API calls 10x).
Rollback dan kesiapan audit
Dukungan akan membuat kesalahan. Beri mereka satu aksi “revert to plan defaults” yang menghapus override level pelanggan dan mengembalikan akun ke paket yang ditugaskan.
Untuk audit, buat riwayat mudah diekspor per pelanggan dan rentang tanggal. Ekspor CSV dasar yang menyertakan alasan dan approver menjawab sebagian besar pertanyaan tanpa perlu intervensi engineering.
Contoh: pelanggan di “Pro” butuh 30 seat ekstra selama satu minggu untuk acara. Dukungan mengatur seats_override=60 dengan expires_at Jumat depan, menambahkan alasan “event,” dan mendapat persetujuan manajer. Setelah expiry, sistem otomatis kembali ke 30, dan seluruh jejak tersedia jika billing keberatan nanti.
Kesalahan umum yang membuat entitlements menyulitkan
Cara tercepat merusak model entitlements adalah membiarkannya tumbuh tanpa kontrol. Beberapa jalan pintas awal bisa berubah menjadi utang teknis berbulan-bulan penuh tiket dukungan dan kebingungan "kenapa pelanggan ini bisa melakukan itu?".
Satu masalah umum adalah menyebarkan pemeriksaan fitur ke mana-mana. Jika bagian aplikasi berbeda memutuskan akses dengan cara berbeda, Anda akan mengirim kontradiksi. Sentralisasi evaluasi entitlement di balik satu fungsi atau service, dan pakai itu untuk semua panggilan UI dan API.
Perangkap lain adalah mencampur state billing dengan akses. “Paid” tidak sama dengan “allowed.” Billing punya retry, chargeback, trial, dan invoice yang terselesaikan belakangan. Pisahkan event billing dan terjemahkan ke entitlements dengan aturan jelas (termasuk grace period) agar kasus tepi tidak mengunci pengguna keluar atau memberi akses selamanya.
Hindari mengandalkan satu string “tier” seperti “basic” atau “pro” sebagai satu-satunya sumber kebenaran. Tier berubah dari waktu ke waktu, dan pengecualian terjadi. Simpan flag dan limit eksplisit sehingga dukungan dapat memberi satu kapabilitas tanpa tak sengaja memberi semua yang datang dengan label tier.
Override manual perlu, tetapi override tanpa batas dan tanpa guardrail menjadi utang yang tak terlihat. Minta pemilik, alasan, dan referensi tiket. Dorong tanggal kedaluwarsa atau tanggal review. Jaga override sempit (satu key pada satu waktu), dan buat mudah diaudit.
Kuota juga sering salah ketika aturan reset kabur. Definisikan apa arti “per bulan” (bulan kalender vs rolling 30 hari), apa yang terjadi saat upgrade, dan apakah kuota tak terpakai bisa dibawa ke bulan berikutnya. Terapkan aturan ini di logika backend, bukan hanya UI, sehingga perubahan dukungan tidak menciptakan perilaku yang tidak konsisten antara web dan mobile.
Daftar periksa cepat sebelum Anda rilis
Sebelum meluncurkan model entitlements, lakukan final check dengan orang yang akan menggunakannya sehari-hari: dukungan, success, dan yang on-call.
Pastikan setiap fitur memetakan ke satu key entitlement stabil dengan pemilik yang jelas. Hindari duplikat seperti reports_enabled vs reporting_enabled. Pastikan setiap paket memiliki default eksplisit untuk kunci yang Anda rilis. Jika sebuah key hilang, fail safe (biasanya tolak akses) dan beri alert internal agar diperbaiki.
Untuk operasi, pastikan alur kerja benar-benar dapat digunakan:
- Dukungan dapat melihat akses efektif (default paket plus override) tanpa SQL.
- Override dicatat siapa mengubah apa, mengapa, dan kapan kedaluwarsa.
- Kuota memiliki aturan reset yang terlihat dan cara jelas menunjukkan penggunaan saat ini.
Tes realitas: minta dukungan memberi add-on 14 hari ke satu pelanggan, lalu hapus. Jika mereka bisa melakukannya percaya diri dalam waktu kurang dari dua menit, Anda sudah dekat.
Contoh skenario: tingkatan dengan pengecualian sementara
Bayangkan Anda menawarkan tiga tier, dan setiap tier menetapkan beberapa entitlements jelas yang muncul di produk dan ditegakkan di backend.
- Free: 1 project, 3 users, 200 exports/bulan, rate limit API dasar, log audit 7 hari.
- Team: 10 projects, 25 users, 2.000 exports/bulan, rate limit API lebih tinggi, log audit 30 hari.
- Business: proyek tanpa batas, 200 users, 10.000 exports/bulan, rate limit API tertinggi, log audit 180 hari, SSO enabled.
Sekarang pelanggan Team mengatakan: “Kami punya dorongan akhir kuartal dan butuh 8.000 ekspor bulan ini. Bisa dibantu selama 30 hari?” Ini tepat tempatnya override sementara lebih baik daripada memindahkan mereka ke paket baru.
Dukungan membuka record pelanggan, menambahkan override seperti export_monthly_limit = 8000, dan mengatur expires_at 30 hari dari hari ini. Mereka menambahkan catatan: “Disetujui oleh Alex (Sales), pengecualian 30 hari untuk laporan Q4.”
Dari sisi pelanggan, dua hal harus terjadi:
- UI mencerminkan batas baru (mis. meter penggunaan dan label “Exports remaining” terupdate).
- Ekspor terus bekerja sampai mencapai 8.000 untuk bulan itu.
Jika mereka melewati, mereka melihat pesan jelas seperti: “Batas ekspor tercapai (8.000/bulan). Hubungi dukungan atau upgrade untuk menambah batas.”
Setelah tanggal kedaluwarsa, override berhenti berlaku otomatis, dan pelanggan kembali ke batas Team tanpa ada yang harus mematikannya secara manual.
Langkah selanjutnya: terapkan dan iterasi tanpa memperlambat dukungan
Mulai dengan mengubah “fitur” menjadi katalog entitlements kecil. Beri setiap item key yang jelas, tipe (flag vs limit vs quota), dan nilai default per paket. Katalog ini menjadi bahasa bersama antara product, dukungan, dan engineering, jadi jaga nama spesifik dan stabil.
Putuskan di mana enforcement berada. Aturan aman: tegakkan di API untuk apa pun yang mengubah data atau menimbulkan biaya, gunakan background job untuk menghentikan pekerjaan jangka panjang ketika limit terlampaui, dan anggap UI sebagai panduan (tombol dinonaktifkan, pesan bantu) tetapi bukan satu-satunya gerbang.
Pertahankan versi pertama ringkas. Fokus pada entitlements yang menghasilkan pertanyaan paling banyak, tambahkan pengecekan pada tindakan risiko tertinggi, dan luncurkan tampilan admin yang menunjukkan pelanggan, paket, override, dan history di satu tempat.
Jika Anda ingin membangun panel admin dan logika dasar dengan cepat tanpa menulis kode manual, AppMaster (appmaster.io) adalah pilihan praktis untuk jenis pekerjaan ini: Anda dapat memodelkan paket dan override sebagai data, menerapkan pengecekan sebagai proses bisnis, dan mengirim UI dukungan yang konsisten di backend dan aplikasi.
FAQ
Model entitlements adalah cara tunggal dan konsisten untuk menentukan apa yang dapat dilakukan pelanggan saat ini berdasarkan paket mereka ditambah pengecualian yang disetujui. Ini mencegah situasi “bekerja di UI tapi gagal di API” dengan membuat setiap bagian produk membaca aturan yang sama.
Dukungan akan terus mengajukan permintaan engineering untuk penyesuaian akses kecil, dan pelanggan akan melihat perilaku yang tidak konsisten antar layar dan endpoint. Seiring waktu, aturan tersebar di kode, checkbox admin, spreadsheet, dan perubahan database satu-off, yang meningkatkan risiko gangguan dan sengketa penagihan.
Billing menjawab “apa yang harus kita tagihkan dan kapan,” sementara entitlements menjawab “apa yang diizinkan sekarang.” Memisahkan keduanya memungkinkan tim finance memperbaiki faktur dan retry tanpa secara tidak sengaja memberikan atau mencabut akses produk.
Gunakan flag ketika kemampuan harus benar-benar aktif atau nonaktif, seperti mengaktifkan SSO. Gunakan limit untuk kapasitas yang tidak reset, seperti maksimal seat atau proyek. Gunakan kuota untuk penggunaan selama waktu tertentu, seperti ekspor per bulan, di mana aturan reset harus eksplisit.
Pilih scope yang sesuai dengan cara produk dijual dan ditegakkan: level akun untuk hal seperti SSO, level workspace untuk sumber bersama seperti proyek, dan level pengguna untuk izin atau add-on yang terkait individu. Kunci utamanya adalah menggunakan scope yang sama di mana pun Anda memeriksa entitlement tersebut.
Aturan umum yang sering dipakai: override pelanggan dulu, lalu nilai paket, lalu default sistem. Jika kunci tidak ada atau tidak dikenal, tolak akses untuk pengecekan enforcement dan catat sebagai kesalahan konfigurasi agar diperbaiki alih-alih memberi akses diam-diam.
Simpan default paket dalam satu tabel dan pengecualian spesifik pelanggan dalam tabel lain, menggunakan kunci dan tipe yang sama di kedua tempat. Buat override berbatas waktu dengan tanggal mulai dan berakhir agar dukungan dapat memberikan akses sementara yang kadaluwarsa otomatis tanpa pekerjaan pembersihan.
Cache entitlements yang telah diselesaikan per pelanggan dengan TTL pendek dan nomor versi. Ketika dukungan mengubah penugasan paket atau sebuah override, tingkatkan versi sehingga pelanggan melihat pembaruan dengan cepat tanpa menunggu cache kedaluwarsa.
Biasakan membuat override sempit dengan tanggal kedaluwarsa dan alasan yang jelas, lalu verifikasi hasilnya dengan melihat produk sebagaimana pelanggan. Hindari mengubah paket untuk permintaan satu-kali karena itu mengubah akses semua orang pada tier tersebut dan lebih sulit diaudit.
Catat siapa yang membuat perubahan, kapan, mengapa, nilai sebelumnya, nilai baru, dan kapan itu berakhir. Sediakan juga aksi “revert to plan defaults” satu-klik sehingga kesalahan dapat dibatalkan cepat tanpa pembersihan manual.


