Desain sistem kredit rujukan untuk langganan SaaS
Desain sistem kredit rujukan untuk SaaS: lacak rujukan, cegah penyalahgunaan, dan terapkan kredit ke langganan dengan aturan jelas dan buku besar yang dapat diaudit.

Apa itu sistem kredit rujukan (dan apa yang bukan)
Program kredit rujukan adalah fitur penagihan, bukan fitur pembayaran. Hadiahnya adalah kredit akun yang mengurangi tagihan di masa depan (atau memperpanjang waktu). Bukan uang yang dikirim ke bank, bukan kartu hadiah, dan bukan janji bahwa seseorang akan “dibayar” nanti.
Sistem yang baik selalu menjawab satu pertanyaan: "Mengapa faktur berikutnya akun ini turun?" Jika Anda tidak bisa menjelaskannya dalam satu atau dua kalimat, tiket dukungan dan sengketa akan muncul.
Sistem kredit rujukan punya tiga bagian: seseorang mengundang pelanggan baru, aturan jelas menentukan kapan undangan itu dihitung (konversi), dan kredit diperoleh serta diterapkan ke tagihan langganan di masa depan.
Apa yang bukan: pembayaran tunai, diskon samar yang mengubah angka tanpa catatan, atau sistem poin yang tidak pernah terhubung ke faktur.
Beberapa tim bergantung pada detail ini. Pengundang ingin melihat apa yang mereka peroleh dan kapan itu akan berlaku. Pengguna yang dirujuk ingin tahu apa yang mereka dapat dan apakah ini memengaruhi paket mereka. Dukungan perlu menyelesaikan “kredit saya hilang” dengan cepat. Finance perlu total yang cocok dengan faktur dan dapat diaudit.
Contoh: Sam merujuk Priya. Priya memulai paket berbayar. Sam mendapatkan $20 dalam bentuk kredit yang mengurangi faktur Sam berikutnya sampai $20. Jika tagihan berikutnya Sam $12, sisa $8 tetap sebagai kredit untuk nanti, dengan catatan yang jelas tentang asalnya.
Keberhasilan bukan hanya “lebih banyak rujukan.” Ini adalah penagihan yang dapat diprediksi dan lebih sedikit perselisihan. Anda tahu ini berhasil ketika saldo kredit mudah dijelaskan, faktur cocok dengan buku besar, dan dukungan bisa menjawab pertanyaan tanpa menebak atau perbaikan manual.
Aturan yang harus diputuskan sebelum membangun apapun
Program rujukan terdengar sederhana sampai tiket pertama datang: "Mengapa saya tidak dapat kredit?" Sebagian besar pekerjaan adalah kebijakan, bukan kode.
Mulai dengan trigger. "Undangan dikirim" terlalu dini. "Mendaftar" mudah disalahgunakan dengan akun sekali pakai. Titik manis umum adalah "konversi memenuhi syarat": email terverifikasi ditambah faktur berbayar pertama, atau pembayaran sukses pertama setelah trial. Pilih satu trigger dan pertahankan konsistensi agar buku besar tetap rapi.
Selanjutnya, tetapkan nilai dan batasan. Kredit harus terasa nyata, tetapi tidak menjadi mesin diskon tak terbatas. Putuskan apakah Anda memberi jumlah tetap (misal $20 kredit) atau persentase dari tagihan, dan batasi dengan cara yang bisa Anda jelaskan dalam satu kalimat.
Keputusan yang mencegah kebingungan di kemudian hari adalah:
- Peristiwa apa yang memenuhi syarat (pembayaran pertama, perpanjangan pertama, dll.)
- Berapa banyak kredit yang diberikan (tetap vs persentase, dan apakah bervariasi menurut paket)
- Batas (per rujukan, per bulan, dan seumur hidup)
- Paket dan tipe penawaran mana yang dihitung
- Apakah kredit kedaluwarsa
Aturan kelayakan lebih penting daripada yang diperkirakan orang. Jika hanya paket berbayar yang dihitung, katakan. Jika beberapa wilayah dikecualikan (pajak, kepatuhan, promo), katakan. Jika paket tahunan memenuhi syarat tetapi bulanan tidak, katakan. Untuk platform seperti Koder.ai dengan banyak tier, putuskan sejak awal apakah upgrade dari gratis ke pro memenuhi syarat, dan apakah kontrak enterprise ditangani secara manual.
Tulis kata-kata yang muncul untuk pengguna sebelum Anda rilis. Jika Anda tidak bisa menjelaskan setiap aturan dalam dua kalimat pendek, pengguna akan salah paham. Jaga kalimat tetap tegas tapi tenang: "Kami dapat menahan kredit untuk aktivitas yang mencurigakan" lebih jelas (dan kurang konfrontatif) daripada daftar ancaman panjang.
Cara melacak rujukan dari undangan hingga konversi yang memenuhi syarat
Pilih satu pengenal utama dan anggap semua lainnya sebagai bukti pendukung. Pilihan paling bersih adalah token tautan rujukan (mudah dibagikan), kode singkat (mudah diketik), dan undangan yang dikirim ke email spesifik (terbaik untuk undangan langsung). Pilih satu sebagai sumber kebenaran agar atribusi tetap dapat diprediksi.
Tangkap pengenal itu sedini mungkin dan bawa sepanjang perjalanan. Token tautan biasanya ditangkap di landing page, disimpan di first-party storage, lalu diserahkan kembali saat signup. Untuk mobile, teruskan token melalui alur instalasi aplikasi bila memungkinkan, tetapi asumsikan Anda kadang kehilangan token.
Lacak seperangkat kecil peristiwa yang sesuai aturan bisnis Anda. Jika tujuan Anda adalah "apakah ini menjadi pelanggan yang membayar" (bukan hanya "apa dia mengklik"), set minimal cukup:
referral_click(token terlihat)account_signup(pengguna baru dibuat)account_verified(email/telepon terverifikasi)first_paid_invoice(pembayaran pertama sukses)qualification_locked(konversi diterima dan tidak berubah lagi)
Pergantian perangkat dan cookie diblokir itu normal. Untuk menanganinya tanpa pelacakan invasif, tambahkan langkah klaim saat signup: jika pengguna datang dengan token, lampirkan ke akun baru; jika tidak, izinkan memasukkan kode rujukan singkat sekali selama onboarding. Jika keduanya hadir, simpan nilai yang tertangkap paling awal sebagai primer dan simpan yang lain sebagai bukti sekunder.
Akhirnya, simpan timeline sederhana per rujukan yang bisa dibaca dukungan dalam satu menit: pengundang, akun yang dirujuk (saat diketahui), status saat ini, dan peristiwa bermakna terakhir dengan timestamp. Ketika seseorang bertanya "mengapa saya tidak dapat kredit?" Anda bisa menjawab dengan fakta seperti "signup terjadi, tetapi faktur berbayar pertama tidak terjadi," alih-alih menebak.
Model data yang tetap bisa dibaca dan di-debug
Program rujukan biasanya rusak ketika model data kabur. Dukungan bertanya "siapa merujuk siapa?" Penagihan bertanya "apakah kredit sudah diterbitkan?" Jika Anda tidak bisa menjawab tanpa menggali log, model perlu diperketat.
Simpan relasi rujukan sebagai rekaman kelas-satu, bukan tebakan turunan dari klik.
Rekaman inti yang harus disimpan
Setup sederhana dan mudah di-debug terlihat seperti:
- referrals:
id,referrer_user_id,referred_user_id,created_at,source(invite link, coupon, manual),status,status_updated_at - referral_attribution (opsional):
referral_id,invite_code_idataucampaign_id,first_seen_ip_hash,first_seen_user_agent_hash - workspaces (jika Anda punya tim):
workspace_id,owner_user_id,created_at - workspace_members:
workspace_id,user_id,role,joined_at
Jaga tabel referrals tetap kecil. Apa pun yang mungkin Anda sesali mengumpulkannya nanti (IP mentah, user agent penuh, nama) harus dihindari atau hanya disimpan sebagai hash sementara dengan kebijakan retensi yang jelas.
Buat status eksplisit dan saling eksklusif: pending (terdaftar, belum eligible), qualified (memenuhi aturan), credited (kredit diterbitkan), rejected (gagal pemeriksaan), reversed (kredit ditarik kembali setelah refund/chargeback).
Aturan yang mencegah penghitungan ganda
Putuskan presedensi sekali, lalu tegakkan di database sehingga aplikasi tidak secara tidak sengaja memberi kredit dua kali. Minimal:
- Hanya satu pengundang per akun yang dirujuk (unique pada
referred_user_id) - Hanya satu rujukan yang bisa mencapai
creditedper akun yang dirujuk - Jika banyak sentuhan terjadi, pilih first-touch atau last-touch dan simpan
referral_idyang dipilih
Jika Anda mendukung tim, putuskan apakah rujukan melekat ke signup personal atau ke pembuatan workspace. Jangan coba lakukan keduanya. Pendekatan yang bekerja adalah mengaitkan rujukan ke akun pengguna, sementara cek kelayakan melihat apakah pengguna itu (atau workspace mereka) menjadi pelanggan yang membayar.
Dasar buku besar kredit: akurat, dapat diaudit, bisa dijelaskan
Jika Anda ingin lebih sedikit bug penagihan dan lebih sedikit tiket dukungan, gunakan ledger, bukan satu field "saldo kredit". Nilai saldo bisa ditimpa, dibulatkan, atau diupdate dua kali. Ledger adalah sejarah entri yang selalu bisa Anda jumlahkan.
Batasi tipe entri agar jelas: earn (grant), spend (apply to invoice), expire, reversal (clawback), dan manual adjustment (dengan catatan dan approver).
Setiap entri harus bisa dibaca oleh engineer dan dukungan. Simpan field konsisten: amount, credit type (bukan "USD" jika kredit bukan uang tunai), teks alasan, sumber peristiwa (mis. referral_signup_qualified), source IDs (user, referred user, subscription atau invoice), timestamp, dan created_by (system atau admin).
Idempotensi lebih penting daripada yang diperkirakan. Webhook atau job latar yang sama bisa berjalan dua kali. Perlukan kunci idempoten unik per peristiwa sumber agar Anda bisa retry dengan aman tanpa memberi kredit ganda.
Jadikan ini bisa dijelaskan ke pengguna. Ketika seseorang bertanya "kenapa saya dapat 20 kredit?" Anda harus bisa menunjukkan rujukan mana yang memicunya, kapan diposting, apakah akan kedaluwarsa, dan apakah ada pembalikan kemudian. Jika teman upgrade, tambahkan entri earn yang terkait ke peristiwa upgrade itu. Jika pembayaran direfund, posting entri reversal yang terkait ke peristiwa refund itu.
Mencegah self-referral dan penyalahgunaan umum tanpa bersikap keras
Asumsikan kebanyakan orang jujur dan beberapa akan mencoba trik sederhana. Tujuannya menghentikan penyalahgunaan mudah, membuat aturan jelas, dan menghindari memblokir pelanggan nyata yang berbagi Wi-Fi atau kartu keluarga.
Blok self-referral dengan aturan sederhana dan dapat dijelaskan
Mulai dengan blok keras yang bisa Anda legitimasi. Jangan berikan kredit ketika pengundang dan yang dirujuk jelas orang yang sama, seperti user ID sama, email terverifikasi sama, atau fingerprint metode pembayaran sama. Aturan domain email bisa membantu, tetapi batasi penggunaannya. Memblokir semua signup dari domain perusahaan bisa merugikan tim yang sah.
Lalu tambahkan deteksi ringan untuk loop dan signup massal. Anda tidak perlu skor fraud sempurna pada hari pertama. Beberapa sinyal kuat menangkap sebagian besar penyalahgunaan: banyak signup dari perangkat sama dalam jangka waktu singkat, penggunaan berulang dari rentang IP yang sama dalam menit, kartu yang sama dipakai di banyak akun "baru", banyak akun yang tidak memverifikasi email, atau pola batal-dan-berlanggan-ulang cepat setelah kredit diterapkan.
Persyaratkan aksi kualifikasi sebelum kredit bisa dipakai (misalnya: verifikasi email plus faktur berbayar, opsional setelah masa tenggang singkat). Itu menghentikan bot dan churn tier gratis dari menghasilkan noise.
Memperlambat penyalahgunaan tanpa menghukum pengguna normal
Tambahkan rate limit dan cooldown di sekitar tautan rujukan dan penebusan, tapi simpan itu tersembunyi sampai diperlukan. Jika sebuah tautan digunakan 20 kali dalam satu jam dari jaringan yang sama, jeda reward dan tandai.
Saat Anda intervensi, jaga pengalaman tetap tenang. Tandai kredit sebagai pending sampai pembayaran clear, tunjukkan alasan sederhana ketika reward ditunda (hindari menyalahkan), tawarkan cara mudah menghubungi dukungan, dan rujuk kasus tepi ke review manual daripada auto-ban.
Contoh: tim startup berbagi satu IP kantor. Tiga rekan kerja mendaftar melalui rujukan yang sama pada hari yang sama. Dengan verifikasi + pembayaran dan cooldown dasar, mereka tetap memperoleh kredit setelah faktur dibayar, sementara lonjakan seperti bot ditahan untuk review.
Kasus nyata yang berantakan: refund, reversal, dan perubahan akun
Program rujukan terasa sederhana sampai uang bergerak "salah": refund, chargeback, faktur yang dibatalkan, atau akun yang berubah pemilik. Jika Anda rancang kasus ini di awal, Anda menghindari pengguna marah dan thread dukungan panjang.
Kapan membalikkan kredit (dan bagaimana)
Perlakukan kredit sebagai sesuatu yang diperoleh berdasarkan hasil berbayar, bukan hanya signup. Lalu definisikan kebijakan pembalikan terkait peristiwa penagihan.
Aturan yang bisa dijelaskan dukungan:
- Jika faktur berbayar asli sepenuhnya direfund atau chargeback, balikkan kredit rujukan yang diberikan untuk itu.
- Jika faktur dibatalkan sebelum pembayaran ditangkap, jangan berikan kredit.
- Jika kredit diberikan lebih awal (mis. pada "invoice paid"), pembalikan harus otomatis dan meninggalkan jejak yang jelas.
Refund parsial biasanya membuat tim buntu. Pilih satu pendekatan dan tetap konsisten: pembalikan proporsional (balikkan 30% kredit untuk refund 30%) atau pembalikan penuh (setiap refund membalikkan seluruh kredit). Proporsional lebih adil tapi lebih sulit dijelaskan dan diuji. Pembalikan penuh lebih sederhana, tapi bisa terasa keras.
Transisi trial-ke-bayar juga harus eksplisit. Pendekatan umum adalah menahan kredit selama trial, lalu menguncinya setelah faktur berbayar pertama berhasil (dan opsional setelah masa tenggang singkat).
Merge akun dan perubahan kepemilikan
Orang mengganti email, menggabungkan akun, atau pindah dari penggunaan personal ke workspace tim. Putuskan apa yang mengikuti orang dan apa yang mengikuti akun yang membayar. Jika workspace adalah pelanggan, kredit seringkali milik workspace itu, bukan anggota yang mungkin pergi.
Jika Anda mendukung merge akun atau transfer kepemilikan tim, catat event penyesuaian alih-alih menulis ulang sejarah. Setiap pembalikan atau koreksi manual harus menyertakan catatan yang ramah dukungan seperti "Chargeback pada invoice 10482" atau "Transfer pemilik workspace disetujui oleh dukungan." Di platform seperti Koder.ai di mana kredit diterapkan ke langganan, catatan-catatan itu yang memungkinkan Anda menjawab "kenapa kredit saya berubah?" dengan satu pencarian.
Menerapkan kredit ke langganan dengan rapi
Bagian tersulit bukan melacak rujukan. Ini membuat kredit berperilaku sama di seluruh perpanjangan, upgrade, downgrade, dan pajak.
Pertama, putuskan dimana kredit bisa dipakai. Beberapa tim menerapkan kredit hanya ke faktur baru berikutnya. Lainnya mengizinkan kredit menutup faktur terbuka manapun. Pilih satu aturan dan tampilkan di UI agar orang tidak kaget.
Selanjutnya, kunci urutan operasi. Pendekatan yang dapat diprediksi: hitung biaya langganan (termasuk proration), terapkan diskon, hitung pajak, lalu terapkan kredit terakhir. Menerapkan kredit terakhir menjaga logika pajak konsisten dan menghindari perdebatan apakah kredit mengurangi dasar kena pajak di setiap yurisdiksi. Jika aturan hukum/pajak Anda mensyaratkan urutan berbeda, dokumentasikan dan tulis tes.
Prorasi adalah tempat bug penagihan biasanya muncul. Jika seseorang upgrade di tengah siklus, buat line item proration (biaya atau kredit) dan perlakukan seperti line item lain. Lalu terapkan kredit rujukan ke total faktur, bukan ke line item individual.
Jaga aturan faktur tetap ketat:
- Kredit mengurangi apa yang pelanggan harus bayar, tetapi tidak pernah membuat jumlah terutang kurang dari $0.
- Kredit yang tidak terpakai tetap tersedia untuk faktur berikutnya.
- Terapkan kredit dengan urutan tetap (terlama dulu) sehingga hasil bisa direproduksi.
- Jika faktur dibatalkan atau direfund, balikkan hanya kredit yang benar-benar terpakai oleh faktur itu.
Contoh: pengguna upgrade pertengahan bulan dan mendapat biaya prorata $12. Total faktur menjadi $32 setelah diskon dan pajak. Jika mereka punya $50 kredit rujukan, Anda terapkan $32, set faktur jadi $0, dan simpan $18 untuk perpanjangan berikutnya.
Rencana implementasi langkah demi langkah (MVP ke v1)
Perlakukan program rujukan sebagai fitur penagihan kecil, bukan widget pemasaran. Tujuannya konsistensi yang membosankan: setiap kredit punya alasan, timestamp, dan jalur jelas ke faktur berikutnya.
MVP (rilis dalam hari, bukan minggu)
Pilih satu peristiwa konversi dan satu aturan kredit. Contoh: rujukan hanya memenuhi syarat ketika pengguna yang diundang menjadi pelanggan berbayar dan pembayaran pertama mereka clear.
Bangun MVP di sekitar path end-to-end: tangkap token atau kode rujukan saat signup, jalankan kualifikasi saat pembayaran sukses (bukan saat pengguna memasukkan kartu), tulis entri ledger dengan kunci idempoten unik, dan terapkan kredit ke faktur berikutnya dengan urutan yang dapat diprediksi.
Putuskan sumber kebenaran sejak awal. Entah penyedia penagihan Anda adalah sumber kebenaran dan aplikasi Anda memirornya, atau buku besar internal Anda adalah sumber kebenaran dan penagihan hanya menerima "apply X credits on this invoice." Mencampur keduanya biasanya menciptakan tiket "kredit saya hilang."
v1 (buat bisa didukung)
Tambahkan alat admin sebelum menambah lebih banyak aturan rujukan. Dukungan perlu mencari berdasarkan user, kode rujukan, dan invoice, lalu melihat timeline: invite, signup, qualification, credits granted, credits spent, dan reversals. Sertakan penyesuaian manual dan selalu minta catatan singkat.
Lalu tambahkan UX untuk pengguna: halaman rujukan, bar status untuk setiap undangan (pending, qualified, credited), dan riwayat kredit yang cocok dengan faktur.
Terakhir, tambahkan monitoring: alert pada lonjakan tiba-tiba rujukan, tingkat pembalikan tinggi (refund atau chargeback), dan pola tidak biasa seperti banyak akun berbagi device atau metode pembayaran yang sama. Itu menjaga kontrol abuse kuat tanpa menghukum pengguna normal.
Contoh: jika seseorang membagikan rujukan Koder.ai ke tim mereka, mereka harus melihat kredit muncul hanya setelah langganan berbayar pertama berhasil, dan kredit itu otomatis mengurangi perpanjangan berikutnya, bukan sebagai kupon manual.
Kesalahan umum yang menciptakan bug penagihan dan beban dukungan
Kebanyakan program rujukan gagal di penagihan, bukan pemasaran. Cara tercepat membuat tiket adalah membuat kredit terasa tidak dapat diprediksi: pengguna tidak bisa menjelaskan kenapa mereka mendapatkannya, kapan akan diterapkan, atau kenapa faktur terlihat berbeda.
Perangkap umum adalah membangun sebelum aturan jelas. Jika "rujukan memenuhi syarat" samar (trial dimulai, pembayaran pertama, paket berbayar bertahan 30 hari), Anda akan berakhir menegosiasikan kredit kasus per kasus dan mengeluarkan refund untuk membuat orang puas.
Masalah sering lain adalah menggunakan satu field "saldo" yang dapat diubah. Terlihat sederhana sampai ada retry, refund, perubahan paket, atau penyesuaian manual. Lalu angkanya melenceng dan Anda tak bisa jelaskan asal-usulnya.
Idempoten sering diabaikan. Penyedia pembayaran retry webhook, worker retry job, pengguna klik ganda. Jika aksi "beri kredit" tidak idempoten, Anda akan mencetak kredit duplikat dan hanya menyadarinya saat revenue terlihat aneh.
Matematika kredit juga bisa salah meskipun total benar. Menerapkan kredit sebelum pajak, atau mengabaikan aturan prorata, bisa menghasilkan faktur yang tidak cocok dengan yang diharapkan penyedia pembayaran. Itu menyebabkan tanda terima tidak cocok, pembayaran gagal, dan rekonsiliasi menyakitkan.
Pemeriksaan fraud juga bisa terlalu ketat. Memblokir berdasarkan IP, device, atau domain tanpa jalur banding menghentikan rujukan nyata (teman sekamar, rekan kerja, tim di jaringan yang sama) dan diam-diam merugikan pertumbuhan.
Lima tanda bahaya yang harus diawasi:
- Aturan kualifikasi hanya ada di kode dan tidak terlihat di tampilan admin/dukungan.
- Kredit tidak punya kunci peristiwa unik (
invite_id,conversion_id) untuk mencegah duplikat. - "Balance" disimpan dengan menimpa satu field alih-alih menambah entri ledger.
- Faktur menerapkan kredit dalam urutan berbeda dari yang diharapkan penyedia penagihan (pajak, prorata, diskon).
- Pencegahan fraud tidak punya jalur banding atau override manual.
Contoh: pengguna Koder.ai di Pro upgrade pertengahan bulan, mendapat kredit rujukan, lalu downgrade. Jika sistem Anda pakai satu field saldo dan menerapkan kredit sebelum prorata, faktur berikutnya bisa terlihat salah meski totalnya mendekati. Ledger plus urutan aplikasi tetap mencegah ini menjadi thread dukungan panjang.
Daftar periksa cepat, contoh sederhana, dan langkah selanjutnya
Sebelum rilis, jalankan beberapa cek yang menangkap sebagian besar masalah penagihan dan dukungan lebih awal.
- Satu pengundang per akun: setelah pengguna diatributkan, jangan biarkan berubah diam-diam.
- Kualifikasi jelas: definisikan peristiwa tepat yang memberi kredit (misalnya: faktur berbayar pertama sukses dan tidak direfund).
- Ledger, bukan "balance": simpan setiap kredit dan debit sebagai entri.
- Pembalikan ada: refund, chargeback, dan trial yang dibatalkan membuat entri pembalikan.
- Penyesuaian admin tercatat: pemberian dan penghapusan manual terlihat seperti entri ledger normal dengan alasan.
Contoh: Maya mengundang Noah. Noah mendaftar dari undangan Maya, memulai trial, lalu upgrade ke Pro dan membayar $30. Sistem Anda menandai faktur itu sebagai qualified dan membuat entri kredit untuk Maya (misalnya: $10 kredit langganan).
Pada perpanjangan Maya berikutnya, subtotal fakturnya $30. Langkah penagihan menerapkan hingga $10 dari kredit yang tersedia, jadi faktur menunjukkan subtotal $30, -$10 kredit, dan $20 terhutang. Buku besar Maya punya satu entri untuk earn (+$10) dan satu untuk spend (-$10 diterapkan ke invoice #1234).
Jika Noah kemudian meminta refund untuk pembayaran pertama itu, sistem menambah entri reversal yang menghapus kredit yang diperoleh Maya (atau memposting debit yang sesuai). Jika ada kredit yang sudah terpakai, faktur berikutnya menagih selisihnya daripada menulis ulang sejarah.
Dua langkah berikut yang menjaga momentum tanpa merusak kepercayaan:
-
Prototype alur penuh dalam dokumen perencanaan singkat: atribusi, kualifikasi, entri ledger, penerapan ke faktur, dan pembalikan.
-
Uji skenario tetap di sandbox: trial ke berbayar, refund setelah kredit dipakai, upgrade dan downgrade mid-cycle, dan penyesuaian admin.
Jika Anda ingin bergerak cepat tanpa kehilangan kontrol logika penagihan, Koder.ai termasuk Planning Mode plus snapshot dan rollback, yang dapat membantu Anda iterasi alur rujukan sampai matematika faktur tetap konsisten. Anda bisa melakukan seluruh proses di dalam platform di koder.ai, lalu ekspor kode ketika siap.
Pertanyaan umum
Are referral credits the same as getting paid cash?
Referral credits mengurangi jumlah yang Anda bayar pada faktur mendatang (atau memperpanjang waktu langganan Anda).
Mereka bukan uang tunai ke rekening bank, bukan kartu hadiah, dan bukan janji pembayaran di kemudian hari. Anggap saja seperti kredit toko yang muncul di penagihan.
What event should count as a “qualified referral”?
Default umum adalah: rujukan memenuhi syarat setelah pengguna yang dirujuk menyelesaikan faktur berbayar pertama yang sukses (seringkali setelah verifikasi email, dan kadang setelah masa tenggang singkat).
Hindari menjadikan “undangan dikirim” atau hanya “mendaftar” sebagai kualifikasi, karena itu mudah disalahgunakan dan sulit dipertahankan dalam sengketa.
How do you reliably track who referred who?
Gunakan satu sumber kebenaran utama, biasanya token tautan rujukan atau kode singkat.
Praktik terbaik:
- Tangkap token di landing page
- Simpan di first-party storage
- Lampirkan ke akun saat signup
- Opsional: izinkan memasukkan kode sekali selama onboarding jika token hilang
What referral statuses should we store?
Gunakan status yang eksplisit dan saling tunggal sehingga dukungan bisa menjawab cepat:
pending: signup ada, belum memenuhi syaratqualified: memenuhi aturan (mis. faktur berbayar pertama)credited: kredit telah dikeluarkanrejected: gagal pemeriksaan atau tidak memenuhi syaratreversed: kredit ditarik kembali setelah refund/chargeback
Simpan juga timestamp untuk perubahan status terakhir.
Why use a credit ledger instead of just storing a credit balance?
Satu field “balance” mudah tertimpa, di-retry, atau terupdate ganda dan jadi tidak dapat diaudit.
Ledger adalah daftar entri yang selalu bisa Anda jumlahkan:
- earn (grant)
- spend (applied to invoice)
- expire
- reversal
- manual adjustment (dengan catatan dan approver)
Itu membuat penagihan dapat dijelaskan dan mudah di-debug.
How do we prevent double-crediting when webhooks retry?
Buat aksi “beri kredit” idempoten dengan menggunakan kunci unik per peristiwa sumber (misalnya ID faktur berbayar pertama).
Jika webhook atau pekerjaan latar yang sama berjalan dua kali, eksekusi kedua harus tidak melakukan apa-apa daripada menerbitkan kredit ganda.
How do we prevent self-referrals and obvious abuse?
Mulai dengan blok sederhana yang bisa dijelaskan:
- Akun pengguna sama
- Email terverifikasi sama
- Fingerprint metode pembayaran sama
Lalu tambahkan kontrol ringan tanpa menghukum pengguna normal:
- Persyaratkan verifikasi + faktur berbayar sebelum kredit bisa dipakai
- Batasi laju lonjakan (banyak signup dalam waktu singkat)
- Tahan reward yang mencurigakan sebagai “pending review” alih-alih auto-ban
What happens to credits if the referred user gets a refund or chargeback?
Tentukan kebijakan pembalikan yang terkait dengan peristiwa penagihan:
- Jika faktur kualifikasi sepenuhnya direfund atau chargeback, tarik kembali kredit rujukan
- Jika faktur dibatalkan sebelum capture, jangan berikan kredit
Untuk pengembalian sebagian, pilih satu aturan dan konsisten:
- Pembalikan proporsional (lebih adil, lebih kompleks), atau
- Pembalikan penuh (lebih sederhana, bisa terasa tegas)
How should credits apply to renewals, upgrades, proration, and taxes?
Default yang dapat diprediksi:
- Hitung biaya langganan (termasuk proration)
- Terapkan diskon
- Hitung pajak
- Terapkan kredit paling akhir
Aturan yang mengurangi kebingungan:
- Kredit tidak dapat membuat jumlah terutang < $0
- Kredit yang tidak terpakai bergulir ke depan
- Terapkan kredit berdasarkan urutan (terlama dulu) sehingga hasil dapat direproduksi
What’s the simplest MVP for a referral credits system that won’t create support chaos?
MVP minimal yang masih bisa didukung:
- Satu aturan konversi (mis. faktur berbayar pertama yang sukses)
- Satu aturan reward (jumlah tetap paling mudah dijelaskan)
- Rekor rujukan disimpan sebagai objek kelas satu (bukan ditebak dari klik)
- Entri ledger untuk earn/spend/reversal dengan kunci idempoten
- Tampilan dukungan dasar: timeline invite → signup → payment → credit
Setelah itu, tambahkan UI dan alat admin sebelum menambah tier reward yang rumit.