Dodo Payments provides real-time webhook notifications to keep you informed about critical events related to transactions, subscriptions, refunds, disputes, and license key management. Below is a detailed guide to these events, categorized for clarity, along with implementation tips and considerations.
Payment Events
| Event Name | Event Type | Description |
|---|
| Payment Succeeded | payment.succeeded | Triggered when a payment is successfully processed. |
| Payment Failed | payment.failed | Occurs when a payment attempt fails due to errors, declined cards, or other issues. |
| Payment Processing | payment.processing | Indicates that a payment is currently being processed. |
| Payment Cancelled | payment.cancelled | Triggered when a payment is cancelled before completion. |
Refund Events
| Event Name | Event Type | Description |
|---|
| Refund Succeeded | refund.succeeded | Triggered when a refund is successfully processed. |
| Refund Failed | refund.failed | Occurs when a refund attempt fails due to processing errors or other issues. |
Dispute Events
| Event Name | Event Type | Description |
|---|
| Dispute Opened | dispute.opened | Triggered when a customer initiates a dispute. |
| Dispute Expired | dispute.expired | Indicates that a dispute expired without resolution. |
| Dispute Accepted | dispute.accepted | Triggered when a merchant accepts the dispute. |
| Dispute Cancelled | dispute.cancelled | Occurs when a dispute is cancelled by the customer or system. |
| Dispute Challenged | dispute.challenged | Triggered when a merchant challenges a dispute. |
| Dispute Won | dispute.won | Indicates that the merchant has successfully won a dispute. |
| Dispute Lost | dispute.lost | Occurs when the merchant loses a dispute. |
Subscription Events
| Event Name | Event Type | Description |
|---|
| Subscription Active | subscription.active | Indicates that a subscription is now active and recurring charges are scheduled. |
| Subscription Updated | subscription.updated | Triggered when any subscription field is updated (real-time sync without polling). |
| Subscription On Hold | subscription.on_hold | Triggered when a subscription is temporarily put on hold due to failed renewal. |
| Subscription Renewed | subscription.renewed | Occurs when a subscription is successfully renewed. |
| Subscription Plan Changed | subscription.plan_changed | Triggered when a subscription is upgraded, downgraded, or modified with different addons. |
| Subscription Cancelled | subscription.cancelled | Triggered when a subscription is cancelled by the merchant or customer. |
| Subscription Failed | subscription.failed | Indicates a failed subscription. This means that we were unable to create a mandate. |
| Subscription Expired | subscription.expired | Triggered when a subscription reaches the end of its term and expires. |
License Key Events
| Event Name | Event Type | Description |
|---|
| License Key Created | license_key.created | Triggered when a new license key is created for a product. |
Credit Events
| Event Name | Event Type | Description |
|---|
| Credit Added | credit.added | Triggered when credits are granted to a customer (subscription, one-time, add-on, or API). |
| Credit Deducted | credit.deducted | Occurs when credits are consumed through usage or manual debit. |
| Credit Expired | credit.expired | Triggered when unused credits expire after the configured expiry period. |
| Credit Rolled Over | credit.rolled_over | Occurs when unused credits are carried forward to a new grant at cycle end. |
| Rollover Forfeited | credit.rollover_forfeited | Triggered when credits are forfeited because the max rollover count was reached. |
| Overage Charged | credit.overage_charged | Occurs when overage charges are applied for usage beyond zero balance. |
| Manual Adjustment | credit.manual_adjustment | Triggered when a manual credit or debit adjustment is made. |
| Balance Low | credit.balance_low | Triggered when credit balance drops below the configured threshold. |
These webhook events are designed to provide merchants with critical updates to manage their operations effectively. Implement robust handlers for each relevant event in your webhook integration to ensure smooth and reliable functionality. Last modified on March 2, 2026