Sistema di crediti referral per SaaS: traccia referral, previeni abusi e applica crediti alle sottoscrizioni con regole chiare e un registro contabile verificabile.

Un programma di crediti referral è una funzionalità di fatturazione, non una funzionalità di pagamenti. La ricompensa è credito sull'account che riduce addebiti futuri (o estende il tempo). Non è denaro inviato a una banca, non sono carte regalo e non è la promessa che qualcuno "verrà pagato" in seguito.
Un buon sistema risponde a una domanda ogni volta: "Perché la prossima fattura di questo account è diminuita?" Se non riesci a spiegarlo in una o due frasi, seguiranno ticket di supporto e contestazioni.
Un sistema di crediti referral ha tre parti: qualcuno invita un nuovo cliente, regole chiare decidono quando quell'invito conta (la conversione) e i crediti vengono guadagnati e applicati alle future fatture di sottoscrizione.
Cosa non è: pagamenti in contanti, uno sconto vago che cambia i numeri senza traccia, o un sistema a punti che non si collega mai alle fatture.
Diverse squadre dipendono da questi dettagli. I referrer vogliono vedere cosa hanno guadagnato e quando si applicherà. Gli utenti segnalati vogliono sapere cosa ottengono e se influisce sul loro piano. Il supporto deve risolvere rapidamente "il mio credito è scomparso". La finance ha bisogno di totali che corrispondano alle fatture e che siano verificabili.
Esempio: Sam invita Priya. Priya inizia un piano a pagamento. Sam guadagna $20 in crediti che riducono la prossima fattura di Sam fino a $20. Se la prossima fattura di Sam è $12, i restanti $8 rimangono come credito per dopo, con una registrazione chiara della loro origine.
Il successo non è solo "più referral." È fatturazione prevedibile e meno discussioni. Sai che funziona quando i saldi di credito sono facili da spiegare, le fatture corrispondono al registro e il supporto può rispondere senza indovinare o correggere manualmente.
Un programma referral sembra semplice finché non arrivano i primi ticket: "Perché non ho ricevuto i miei crediti?" Gran parte del lavoro è politica, non codice.
Inizia dal trigger. "Invito inviato" è troppo presto. "Registrato" è facile da abusare con account usa-e-getta. Un punto d'equilibrio comune è una "conversione qualificata": email verificata più prima fattura pagata, o il primo pagamento riuscito dopo una prova. Scegli un trigger e mantienilo coerente così il tuo registro resta pulito.
Poi, stabilisci il valore e i limiti. I crediti dovrebbero sembrare reali, ma non trasformarsi in una macchina di sconti illimitati. Decidi se dare un importo fisso (per esempio $20 in crediti) o una percentuale di una fattura, e metti un tetto che puoi spiegare in una frase.
Le decisioni che prevengono la maggior parte delle confusioni sono:
Le regole di idoneità contano più di quanto ci si aspetti. Se contano solo i piani a pagamento, dillo. Se alcune regioni sono escluse (tasse, compliance, promozioni), dillo. Se i piani annuali si qualificano ma i mensili no, dillo. Per una piattaforma come Koder.ai con più tier, decidi in anticipo se gli upgrade da free a pro qualificano e se i contratti enterprise vengono gestiti manualmente.
Scrivi il testo rivolto all'utente prima di rilasciare. Se non riesci a spiegare ogni regola in due frasi brevi, gli utenti la capiranno male. Mantienilo fermo ma calmo: "Potremmo trattenere i crediti per attività sospette" è più chiaro (e meno ostile) di una lunga lista di minacce.
Scegli un identificatore principale e tratta tutto il resto come evidenza di supporto. Le opzioni più pulite sono un token nel link di referral (facile da condividere), un codice breve (facile da digitare) e un invito inviato a una email specifica (migliore per inviti diretti). Scegline uno come fonte di verità così l'attribuzione resta prevedibile.
Cattura quell'identificatore il prima possibile e portalo attraverso tutto il percorso. Un token nel link viene solitamente catturato nella landing page, salvato in first-party storage e poi reinviato in fase di signup. Per mobile, passalo attraverso il flow di installazione dell'app quando possibile, ma presupponi che a volte lo perderai.
Traccia un piccolo insieme di eventi che corrispondono alle tue regole di business. Se l'obiettivo è "è diventato un cliente pagante" (non solo "ha cliccato"), un set minimale è sufficiente:
referral_click (token visto)account_signup (nuovo utente creato)account_verified (email/telefono verificato)first_paid_invoice (primo pagamento riuscito)qualification_locked (conversione accettata e non più modificabile)I cambi di dispositivo e i cookie bloccati sono normali. Per gestirli senza tracking invasivo, aggiungi un passaggio di claim durante la registrazione: se un utente arriva con un token, allegalo al nuovo account; se no, permetti di inserire un codice referral breve una sola volta durante l'onboarding. Se sono presenti entrambi, conserva il valore catturato per primo come primario e memorizza l'altro come evidenza secondaria.
Infine, mantieni una timeline semplice per ogni referral che il supporto possa leggere in un minuto: referrer, account segnalato (una volta noto), stato corrente e l'ultimo evento significativo con timestamp. Quando qualcuno chiede "perché non ho ricevuto i crediti?" puoi rispondere con fatti come "la registrazione è avvenuta, ma la prima fattura pagata non è mai arrivata," invece di indovinare.
I programmi referral di solito si rompono quando il modello dati è vago. Il supporto chiede "chi ha riferito chi?" La fatturazione chiede "il credito è già stato emesso?" Se non riesci a rispondere senza cercare nei log, il modello ha bisogno di essere più rigoroso.
Memorizza la relazione di referral come un record di prima classe, non come un'ipotesi derivata dai click.
Una configurazione semplice e debugabile assomiglia a:
id, referrer_user_id, referred_user_id, created_at, source (invite link, coupon, manual), status, status_updated_atreferral_id, invite_code_id o campaign_id, first_seen_ip_hash, first_seen_user_agent_hashworkspace_id, owner_user_id, created_atworkspace_id, user_id, role, joined_atTieni la tabella referrals piccola. Qualsiasi cosa potresti rimpiangere di aver raccolto più tardi (IP raw, user agent completo, nomi) dovrebbe essere evitata o memorizzata solo come hash a breve durata con una chiara politica di retention.
Rendi gli stati espliciti e mutuamente esclusivi: pending (registrato, non ancora idoneo), qualified (ha soddisfatto le regole), credited (credito emesso), rejected (controlli falliti), reversed (credito recuperato dopo rimborso/chargeback).
Decidi la precedenza una volta, poi applicala nel database in modo che l'app non possa accreditare due volte per errore. Al minimo:
referred_user_id)credited per account segnalatoreferral_id sceltoSe supporti i team, decidi se il referral si attacca a una registrazione personale o alla creazione del workspace. Non cercare di fare entrambe le cose contemporaneamente. Un approccio pratico è legare il referral all'account utente, mentre i controlli di idoneità guardano se quell'utente (o il suo workspace) è diventato un abbonato pagante.
Se vuoi meno bug di fatturazione e meno ticket di supporto, usa un ledger, non un singolo campo "credito". Un numero di saldo può essere sovrascritto, arrotondato o aggiornato due volte. Un ledger è una cronologia di voci che puoi sempre sommare.
Mantieni i tipi di voce limitati e univoci: earn (concessione), spend (applicato alla fattura), expire (scadenza), reversal (recupero) e manual adjustment (con nota e approvatore).
Ogni voce dovrebbe essere leggibile sia dagli ingegneri che dal supporto. Memorizza campi coerenti: importo, tipo di credito (non "USD" se i crediti non sono contanti), testo motivo, evento sorgente (come referral_signup_qualified), ID sorgente (utente, utente segnalato, sottoscrizione o fattura), timestamp e created_by (system o admin).
L'idempotenza conta più di quanto si pensi. Lo stesso webhook o job in background può essere eseguito due volte. Richiedi una chiave di idempotenza unica per evento sorgente così puoi ritentare in sicurezza senza concedere doppi crediti.
Rendilo spiegabile all'utente. Quando qualcuno chiede "perché ho ricevuto 20 crediti?" dovresti poter mostrare quale referral l'ha scatenato, quando è stato registrato, se scade e se in seguito è avvenuto un reversal. Se un amico effettua un upgrade, aggiungi una voce di earn legata a quell'evento di upgrade. Se il pagamento viene rimborsato, inserisci una voce di reversal legata all'evento di rimborso.
Assumi che la maggior parte delle persone sia onesta e che pochi cercheranno trucchi ovvi. L'obiettivo è fermare gli abusi facili, mantenere le regole chiare e evitare di bloccare clienti reali che condividono una rete Wi‑Fi o una carta di famiglia.
Inizia con blocchi netti che puoi giustificare. Non assegnare crediti quando il referrer e l'account segnalato sono chiaramente la stessa persona, come lo stesso user ID, la stessa email verificata o la stessa impronta del metodo di pagamento. Le regole sul dominio email possono aiutare, ma mantienile ristrette. Bloccare tutte le registrazioni da un dominio aziendale può danneggiare team legittimi.
Aggiungi poi rilevamenti leggeri per loop e registrazioni di massa. Non ti serve un punteggio di frode perfetto dal giorno zero. Alcuni segnali forti catturano la maggior parte degli abusi: molte registrazioni dallo stesso dispositivo in breve tempo, uso ripetuto dalla stessa fascia IP in pochi minuti, la stessa carta usata su più account "nuovi", molti account che non verificano la email o pattern rapidi di annulla-e-riattiva dopo che i crediti sono stati applicati.
Richiedi un'azione qualificante prima che i crediti diventino utilizzabili (per esempio: email verificata più fattura pagata, opzionalmente dopo un breve periodo di grazia). Questo ferma bot e churn su tier gratuito dal generare rumore.
Aggiungi rate limit e cooldown intorno ai link referral e alle redemptions, ma mantienili silenziosi finché non servono. Se un link viene usato 20 volte in un'ora dalla stessa rete, metti in pausa le ricompense e segnalalo.
Quando intervieni, mantieni l'esperienza calma. Segna i crediti come pending finché il pagamento non viene confermato, mostra una ragione semplice quando le ricompense sono sospese (evita di incolpare), offri un modo diretto per contattare il supporto e instrada i casi limite a una revisione manuale invece di un ban automatico.
Esempio: un team di startup condivide un IP dell'ufficio. Tre colleghi si registrano con lo stesso referral lo stesso giorno. Con pagamento qualificante più un cooldown di base, guadagnano comunque i crediti dopo che le fatture sono pagate, mentre burst simili ai bot vengono trattenuti per revisione.
I programmi referral sembrano semplici finché i soldi non si muovono nel modo "sbagliato": un rimborso, un chargeback, una fattura annullata o un account che cambia proprietario. Se progetti questi casi in anticipo eviti utenti arrabbiati e thread di supporto lunghi.
Tratta i crediti come qualcosa che si guadagna in base a un esito pagato, non solo una registrazione. Poi definisci una politica di reversal collegata agli eventi di fatturazione.
Un set di regole che il supporto può spiegare:
I rimborsi parziali sono dove i team si impantanano. Scegli un approccio e mantienilo consistente: reversal proporzionale (inverti il 30% del credito per un rimborso del 30%) o reversal totale (qualsiasi rimborso annulla tutto il credito). Il proporzionale è più equo ma più difficile da spiegare e testare. Il reversal totale è più semplice, ma può risultare severo.
Le transizioni trial→paid devono essere esplicite. Un approccio comune è mantenere i crediti pending durante la trial e poi bloccarli solo dopo che la prima fattura pagata è stata effettivamente incassata (e opzionalmente dopo un breve periodo di grazia).
Le persone cambiano email, uniscono account o passano da uso personale a workspace di team. Decidi cosa segue la persona e cosa segue l'account pagante. Se un workspace è l'abbonato, spesso i crediti appartengono a quel workspace, non a un membro che potrebbe andarsene.
Se supporti merge di account o trasferimenti di proprietà del team, registra un evento di aggiustamento invece di riscrivere la storia. Ogni reversal o correzione manuale dovrebbe includere una nota comprensibile per il supporto come "Chargeback sulla fattura 10482" o "Trasferimento proprietario workspace approvato dal supporto." In piattaforme come Koder.ai dove i crediti si applicano alle sottoscrizioni, quelle note sono ciò che ti permette di rispondere a "perché i miei crediti sono cambiati?" con una sola ricerca.
I crediti referral riducono quanto devi sulle fatture future (o estendono il tempo della sottoscrizione).
Non sono contanti versati su un conto bancario, non sono carte regalo e non sono la promessa di un pagamento futuro. Pensali come credito sull'account che appare nella fatturazione.
Un valore comune è: la referral si qualifica dopo che l'utente segnalato completa la prima fattura pagata con successo (spesso dopo la verifica della email e talvolta dopo un breve periodo di grazia).
Evita di qualificare su "invito inviato" o solo su "registrazione", perché sono facili da sfruttare e difficili da difendere in caso di contestazioni.
Usa una sola fonte primaria di verità, tipicamente un token di referral nel link o un codice breve.
La best practice è:
Usa stati espliciti e mutuamente esclusivi in modo che il supporto possa rispondere rapidamente:
pending: esiste una registrazione, non ancora idoneaqualified: ha soddisfatto le regole (es. prima fattura pagata)Un campo singolo “balance” viene sovrascritto, ritentato o aggiornato due volte e diventa impossibile da verificare.
Un registro (ledger) è una lista di voci che puoi sempre sommare:
Questo rende la fatturazione spiegabile e facilmente debugabile.
Rendi l'azione “assegna credito” idempotente usando una chiave unica per l'evento sorgente (ad esempio l'ID della prima fattura pagata).
Se lo stesso webhook o job viene eseguito due volte, la seconda esecuzione non deve creare crediti duplicati ma non fare nulla.
Inizia con blocchi semplici e giustificabili:
Poi aggiungi controlli leggeri senza punire utenti normali:
Definisci una politica di reversal legata agli eventi di fatturazione:
Per i rimborsi parziali, scegli una regola e mantienila:
Un default prevedibile è:
Regole che riducono la confusione:
Un MVP minimale ma gestibile:
Dopo di che, aggiungi UI e strumenti admin prima di introdurre livelli di ricompensa complessi.
creditedrejected: controlli falliti o non idoneoreversed: credito recuperato dopo rimborso/chargebackTieni un timestamp per l'ultima modifica di stato.