Ce que dit GoCardless
| Événement | Cause | Codes | Texte de GoCardless |
|---|---|---|---|
| payments · failed | direct_debit_not_enabled | AG01, AC06 | The bank account for this payment does not support SEPA Direct Debit. The mandate will also be cancelled. |
| payments · failed | account_blocked_for_any_financial_transaction | AC06 | This payment failed because the payer's account was blocked. |
| mandates · cancelled | direct_debit_not_enabled | AG01, AC06 | The bank account for this mandate does not support SEPA direct debit. Any subscriptions and pending payments will also be cancelled. |
| mandates · cancelled | account_blocked_for_any_financial_transaction | AC06 | The bank account for this mandate was blocked. Any subscriptions and pending payments will also be cancelled. |
Les deux causes apparaissent aussi dans payments · cancelled : ce sont les encaissements qui attendaient encore d'être présentés avec ce mandat et que GoCardless annule en même temps que lui.

D'où cela vient
Ici, ce n'est pas la signature qui échoue, c'est le compte. Le mandat existe, mais quand GoCardless présente le prélèvement, la banque du client répond que ce compte n'accepte pas les prélèvements SEPA, ou qu'il est bloqué. C'est pourquoi ces événements ont pour origine bank : ils sont décidés par la banque du payeur.
direct_debit_not_enabled entraîne le mandat. GoCardless l'annule, et avec lui tombent les abonnements et les encaissements en attente. Avec account_blocked_for_any_financial_transaction, le compte est bloqué ; quand GoCardless annule aussi le mandat pour ce motif, il le communique dans son propre événement, avec la même cause.
Ce que fait Odoo pour chaque événement
| Événement reçu | Ce que fait le connecteur |
|---|---|
| payments · failed | La transaction passe à « Erreur » avec « GoCardless could not collect this payment (direct_debit_not_enabled). », ou avec la cause du compte bloqué. Si cet encaissement avait déjà payé la facture, il annule le paiement et la facture redevient à encaisser. |
| payments · cancelled | Identique à un paiement échoué. |
| mandates · cancelled | Archive le mode de paiement, note dans la fiche du client que ce mandat n'est plus valable et crée l'activité « GoCardless mandate lost ». |
Attention à l'ordre : l'événement du paiement ne retire pas le mandat, car ces causes ne figurent pas parmi les quatre qui font que le connecteur l'archive à la réception d'un paiement. C'est l'événement du mandat qui le fait. Et s'il n'arrivait pas par le webhook, la tâche horaire qui recherche les événements manqués le récupère.
Le connecteur n'est pas traduit en français : ces textes apparaissent toujours en anglais, même dans un Odoo en français, qu'ils soient déclenchés par un utilisateur ou par une action planifiée : « GoCardless could not collect this payment (direct_debit_not_enabled). » et « GoCardless mandate lost ».
N'attendez rien non plus de Success+ : son guide indique qu'il ne retente que les paiements qui échouent faute de fonds. Le connecteur, de toute façon, regarde à chaque échec le champ will_attempt_retry de l'événement, et s'il ne vaut pas true, il laisse la transaction en erreur.
Et le bouton de nouvel essai
Pour voir le message, ouvrez la facture et cliquez en haut sur « Transaction de paiement ». Le menu des transactions n'apparaît qu'en mode développeur et, dans Odoo 20, il n'existe plus.
Sur un paiement échoué, tant qu'Odoo n'a pas archivé le mandat, cette transaction propose « Retry collection » ; sur un paiement annulé, non. Cela sert à peu de chose : GoCardless ne retente que les paiements dont le mandat est encore actif, et avec direct_debit_not_enabled il vient de l'annuler. Si la réponse est retry_failed ou mandate_is_inactive, le connecteur interroge le mandat, l'archive s'il est mort et le consigne dans la transaction : « The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate. ». À partir de là, le bouton disparaît.

Que faire
- Parlez au client. Si le compte n'accepte pas les prélèvements, il vous faut un autre compte qui les accepte ; s'il est bloqué (AC06), le client devra d'abord régler cela avec sa banque.
- Avec le bon compte, le client signe un nouveau mandat, qui apparaîtra dans Odoo comme un autre mode de paiement.
- Encaissez de nouveau avec ce mode de paiement les factures ouvertes. Les encaissements annulés par GoCardless ne seront pas présentés d'eux-mêmes.
- Si vous avez besoin du code exact, cherchez-le dans GoCardless, car Odoo ne conserve que la cause : le connecteur ne garde pas le code SEPA. Son centre d'aide l'explique ainsi : « You are able to view the reason for a payment failure in the status timeline of the payment in your GoCardless dashboard. ».
Pourquoi AC06 apparaît-il dans les deux causes ?
GoCardless utilise le même code AC06 pour le compte qui n'accepte pas les prélèvements et pour le compte bloqué. En pratique, cela revient au même : aujourd'hui ce compte ne permet pas d'encaisser, et il faut un autre compte ou que la banque le débloque.
Puis-je réactiver le mandat ?
Si le compte n'accepte pas les prélèvements, cela n'a pas de sens : il continuerait à ne pas les accepter. Il faut un nouveau mandat avec un autre compte.
Avec notre connecteur
Avec Odoo 17, 18, 19 et 20, cet échec ne reste pas caché : la transaction affiche la cause de GoCardless, la facture est rouverte si elle était payée et, dès que l'annulation du mandat arrive, le client est marqué pour lui demander un autre compte avant la prochaine facture.
À lire aussi
Vérifié dans le code du connecteur (version 17.0, 18.0, 19.0 et 20.0) et dans les sources citées
Sources
- Code du module : flexigo_payment_gocardless: const.py, ligne 15 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/events/payment
- docs.gocardless.com/docs/api-reference/events/mandate
- Code du module : flexigo_payment_gocardless: const.py, ligne 76 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: const.py, ligne 33 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_token.py, ligne 83 en 17.0 (d203ee6), ligne 83 en 18.0 (e2ab18b), ligne 83 en 19.0 (ce7f5a3) et ligne 82 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_token.py, ligne 131 en 17.0 (d203ee6), ligne 131 en 18.0 (e2ab18b), ligne 131 en 19.0 (ce7f5a3) et ligne 130 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 725 en 17.0 (d203ee6), ligne 725 en 18.0 (e2ab18b), ligne 724 en 19.0 (ce7f5a3) et ligne 748 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 754 en 17.0 (d203ee6), ligne 754 en 18.0 (e2ab18b), ligne 753 en 19.0 (ce7f5a3) et ligne 777 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: const.py, ligne 117 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: const.py, ligne 74 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 435 en 17.0 (d203ee6), ligne 435 en 18.0 (e2ab18b), ligne 434 en 19.0 (ce7f5a3) et ligne 449 en 20.0 (688d86b)
- docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 436 en 17.0 (d203ee6), ligne 436 en 18.0 (e2ab18b), ligne 436 en 19.0 (ce7f5a3) et ligne 438 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1148 en 17.0 (d203ee6), ligne 1148 en 18.0 (e2ab18b), ligne 1148 en 19.0 (ce7f5a3) et ligne 1155 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 495 en 17.0 (d203ee6), ligne 495 en 18.0 (e2ab18b), ligne 495 en 19.0 (ce7f5a3) et ligne 497 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: views/payment_transaction_views.xml, ligne 13 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 63 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 418 en 17.0 (d203ee6), ligne 418 en 18.0 (e2ab18b), ligne 417 en 19.0 (ce7f5a3) et ligne 432 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1016 en 17.0 (d203ee6), ligne 1016 en 18.0 (e2ab18b), ligne 1016 en 19.0 (ce7f5a3) et ligne 1031 en 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/payment
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 469 en 17.0 (d203ee6), ligne 469 en 18.0 (e2ab18b), ligne 468 en 19.0 (ce7f5a3) et ligne 487 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1233 en 17.0 (d203ee6), ligne 1233 en 18.0 (e2ab18b), ligne 1233 en 19.0 (ce7f5a3) et ligne 1240 en 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/fr.po
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- support.gocardless.com/hc/en-gb/articles/360001467265
- Code du module : flexigo_payment_gocardless: const.py, ligne 66 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: __manifest__.py, ligne 31 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/responses-and-errors
