Fornisci automaticamente chiavi di licenza, file scaricabili, flag delle funzionalità e accesso a piattaforme come Discord, GitHub, Telegram, Framer e Notion quando i clienti pagano.
Le autorizzazioni trasformano un pagamento avvenuto o un abbonamento attivo in vero accesso: una chiave di licenza nella casella di posta del cliente, un flag delle funzionalità che la tua app controlla, un ruolo Discord, un repository GitHub, un modello Notion, un link remix di Framer, un invito alla chat di Telegram o un pacchetto di file scaricabili. Dodo Payments emette, traccia e revoca automaticamente tale accesso in base ai cambiamenti del ciclo di pagamento.
The Entitlements dashboard. Each entitlement is a reusable template; the right pane shows individual customer grants.
Un’entitlement è una definizione riutilizzabile di qualcosa che fornisci a un cliente: una chiave di licenza Pro, un ruolo “Patrons” su Discord, accesso al tuo repository GitHub privato, un pacchetto di e-book scaricabile. Le entitlements si associano ai prodotti, e Dodo Payments si occupa del resto.Quando un cliente acquista il prodotto, Dodo Payments crea una grant, un’emissione singola di quella entitlement al cliente. Le grants passano attraverso una piccola serie di stati: pending mentre la consegna è in corso, delivered una volta che il cliente ha accesso, failed se la consegna non è stata completata, e revoked quando l’accesso viene ritirato.
Le entitlements controllano il fulfillment (il cliente ha accesso?). I crediti controllano il consumo (quanto possono utilizzare?). Entrambi possono essere collegati allo stesso prodotto. Vedi Credit-Based Billing per i crediti.
Le concessioni sono generate dagli stessi eventi di pagamento e abbonamento che già ricevi come webhook. Non è necessario chiamare l’API delle concessioni per gli acquisti. Dodo Payments crea e revoca le concessioni automaticamente in base al ciclo di vita del pagamento sottostante.
Una concessione viene creata quando un pagamento è completato o un abbonamento diventa attivo. Le chiavi di licenza e i flag delle funzionalità passano direttamente a delivered. Ogni altra integrazione inizia in pending. Le integrazioni basate su OAuth (Discord, GitHub, Notion) includono un oauth_url che il cliente deve visitare per completare il consenso. Le integrazioni dirette alla piattaforma (Telegram, Framer, Digital Files) rimangono in pending solo brevemente mentre la consegna viene fornita, quindi passano a delivered.
2
Delivered
Una volta completata la consegna (chiave di licenza generata, ruolo assegnato, accesso al repository concesso, link ai file risolto, OAuth completato), la concessione passa a delivered e delivered_at viene impostato.
3
Failed
Se la chiamata di integrazione restituisce un errore non ripetibile (token OAuth revocato, permesso negato, file non più esistente), la concessione passa a failed. I campi error_code e error_message catturano il motivo.
4
Revoked
Quando l’accesso viene ritirato (abbonamento cancellato, rimborso emesso o revoca avviata dal commerciante), la concessione passa a revoked. Il campo revocation_reason registra il trigger.
Nessuna operazione. Le concessioni sono gestite dall’evento di abbonamento qui sotto.
subscription.active
Emissione di concessioni per tutti i diritti allegati che non ne hanno già una. Concessione di nuovo eventuali concessioni precedentemente revocate per lo stesso abbonamento.
subscription.renewed
Nessuna operazione. Le concessioni esistenti persistono nei rinnovi.
subscription.on_hold
Revoca di tutte le concessioni consegnate e in sospeso. revocation_reason: subscription_on_hold.
subscription.cancelled
Revoca di tutto. revocation_reason: subscription_cancelled.
subscription.expired
Revoca di tutto. revocation_reason: subscription_expired.
subscription.plan_changed
Revoca di tutte le concessioni correnti, quindi emissione di concessioni per i diritti del nuovo piano. revocation_reason: plan_changed.
refund.succeeded (pagamento una tantum)
Revoca delle concessioni per quel pagamento. revocation_reason: refund.
Revoca manuale API
Revoca con revocation_reason: manual. Le revoche manuali non vengono riassegnate automaticamente alla rinnovazione dell’abbonamento.
Chiave di licenza disabilitata
Per le concessioni con chiave di licenza, disabilitare la chiave sottostante revoca la concessione con revocation_reason: license_key_disabled. La concessione è riattivata automaticamente se la chiave è riattivata.
Drift della piattaforma rilevato
Se il lato piattaforma di un’integrazione si disallinea (un ruolo Discord rimosso manualmente, l’app GitHub perde l’accesso al repository o un passaggio di riconciliazione rileva un target mancante), la concessione è revocata con revocation_reason: platform_external. Non viene riassegnata automaticamente alla rinnovazione dell’abbonamento fino a quando il problema sottostante della piattaforma non viene risolto.
Le concessioni basate su abbonamento sono idempotenti per (entitlement, customer, subscription); i rinnovi e le riattivazioni non creano concessioni duplicate. Le concessioni una tantum sono idempotenti per (entitlement, customer, payment).
Vai su Diritti nel tuo pannello di Dodo Payments e fai clic su + per creare un nuovo diritto.
2
Pick an integration
Scegli il tipo di integrazione: Chiave di licenza, File digitali, Flag delle funzionalità, Discord, GitHub, Telegram, Framer o Notion. Per le integrazioni sulla piattaforma, connetti prima il tuo account se non lo hai già fatto.
3
Configure delivery
Compila i campi specifici dell’integrazione. Ad esempio, GitHub chiede un repository e un livello di autorizzazione; Discord chiede un server e un ruolo opzionale; la Chiave di licenza chiede limiti di attivazione e scadenza.
Creating a GitHub entitlement. Each integration shows the fields it needs.
4
Save
Salva il diritto. Ora puoi allegarlo a qualsiasi prodotto.
Apri un prodotto, espandi Impostazioni avanzate → Diritti e Crediti e seleziona i diritti che devono essere consegnati quando il prodotto viene acquistato. Un singolo prodotto può consegnare più diritti contemporaneamente. Ad esempio, un piano Pro può includere una chiave di licenza, l’accesso a GitHub e un ruolo Discord.
Attaching entitlements to a product. Selected entitlements are delivered on every successful purchase or active subscription.
I clienti ricevono un’email di consegna dopo l’acquisto contenente la chiave di licenza, i link per il download, i link di invito OAuth o inviti alla piattaforma, a seconda di ciò che si applica ai diritti sul prodotto. Gli stessi dettagli rimangono disponibili indefinitamente dal Portale Clienti sotto la loro cronologia ordini.
L’accesso ai sottoscrittori di Discord, GitHub e Notion richiede che il cliente autorizzi Dodo Payments a concedergli l’accesso. Queste concessioni rimangono in stato pending fino a quando il cliente non completa il flusso OAuth utilizzando il link dalla loro email o portale clienti. Una volta autorizzati, la concessione passa a delivered e l’accesso alla piattaforma viene fornito immediatamente.
Le concessioni revocate vengono rimosse a livello di piattaforma: il ruolo Discord viene rimosso, il collaboratore GitHub viene rimosso, la chiave di licenza viene disabilitata. I clienti vedono il cambiamento riflesso nel portale clienti.
Per i file digitali, la revoca rimuove l’accesso agli URL presigned nel futuro ma non invalida le copie già scaricate dal cliente. Pianifica il contenuto del piano di conseguenza.
Apri qualsiasi diritto dalla dashboard per vedere le sue concessioni. Il pannello dettagli concessioni mostra le concessioni totali, i filtri di stato, le informazioni sui clienti, le date di consegna e un’azione di revoca.Puoi anche gestire le concessioni in modo programmatico:
import DodoPayments from 'dodopayments';const client = new DodoPayments({ bearerToken: process.env['DODO_PAYMENTS_API_KEY'],});// List grants for an entitlementconst grants = await client.entitlements.grants.list('ent_abc123', { status: 'Delivered',});// Revoke a single grantawait client.entitlements.grants.revoke('grant_xyz789', { id: 'ent_abc123',});
Dodo Payments attiva quattro eventi webhook per il ciclo di vita delle concessioni. Iscriviti a questi eventi per mantenere la tua applicazione sincronizzata con ciò che ciascun cliente può accedere.
Evento
Si attiva quando
entitlement_grant.created
Viene creata una nuova concessione. Le concessioni con chiave di licenza arrivano delivered; ogni altra integrazione arriva pending e transita a delivered una volta che la chiamata alla piattaforma ha successo (o, per le integrazioni basate su OAuth, una volta che il cliente autorizza).
entitlement_grant.delivered
La concessione passa a consegnata. Il cliente ora ha accesso.
entitlement_grant.failed
La concessione non ha potuto essere consegnata. Controlla error_code e error_message.
entitlement_grant.revoked
L’accesso è stato ritirato. Controlla revocation_reason.
Entitlement Grant Webhook Payloads
Visualizza lo schema del payload completo, eventi di esempio e il riferimento revocation_reason.
Usa un diritto per canale di consegna. Non condividere un solo diritto Discord tra prodotti con diverse intenzioni di ruolo; creane uno per ruolo per una revoca pulita.
Testa prima in modalità test. Crea il diritto, allegalo a un prodotto di test, esegui un checkout e osserva la transizione della concessione tramite pending → delivered. Conferma che la cancellazione dell’abbonamento di test revoca la concessione.
Ascolta entitlement_grant.delivered, non payment.succeeded. Un pagamento può avere successo prima che la consegna finisca (soprattutto per flussi OAuth). Aspetta l’evento consegnato prima di sbloccare le funzionalità dipendenti nei tuoi sistemi.
Tratta entitlement_grant.failed come attuabile. Una concessione fallita significa che un cliente ha pagato ma non ha ottenuto accesso. Metti questi in evidenza al tuo team di supporto o attiva un riesame.
Mappa revocation_reason ai tuoi flussi di conservazione. Una revoca subscription_on_hold è recuperabile (il cliente potrebbe aggiornare la propria carta). Una revoca manual è intenzionale. Trattale diversamente nelle comunicazioni con il cliente.