Ce que dit GoCardless
| Événement | Cause | Code SEPA Core | Texte de GoCardless |
|---|---|---|---|
| payments · failed | insufficient_funds | AM04 | The customer's account had insufficient funds to make this payment. |
La documentation de l'événement failed ajoute un élément essentiel : GoCardless retente le paiement de sa propre initiative lorsque le champ will_attempt_retry de l'événement vaut true (« GoCardless will automatically retry the payment if event's will_attempt_retry field is true. »). Cette nouvelle tentative automatique correspond à Success+, et pour en bénéficier, il faut l'avoir activée dans le Dashboard GoCardless.
D'après le guide de Success+, ce service ne retente que les paiements échoués faute de provision. En SEPA, il s'agit de deux codes : AM04 et MS03, et MS03 uniquement en Autriche, en Belgique, en Allemagne, au Luxembourg et en Slovaquie. GoCardless précise néanmoins que ses critères peuvent évoluer : ce qui vaut pour chaque échec, c'est le champ will_attempt_retry.

Pourquoi elle arrive alors que la facture semblait encaissée
Un prélèvement SEPA ne se règle pas immédiatement : selon GoCardless, l'encaissement d'un paiement peut prendre jusqu'à 5 jours ouvrés. Le plus souvent, la banque du client signale l'échec un jour ouvré après la date de prélèvement, avant que le paiement ne passe à confirmed. Dans de rares cas, elle le signale plus tard, alors que le paiement est déjà marqué confirmed : c'est un échec tardif (late failure), et le guide de Success+ cite comme exemple un échec pour insuffisance de provision. C'est pourquoi AM04 peut apparaître alors que l'encaissement était déjà confirmé dans Odoo et la facture rapprochée. Le connecteur en tient compte : si un encaissement qu'Odoo considérait comme acquis échoue, il annule son paiement et la facture redevient en attente.
Le connecteur GoCardless pour Odoo ne traite que les prélèvements SEPA Core et en euros, et pour un paiement SEPA Core échoué, la documentation de GoCardless ne donne qu'un seul code associé à insufficient_funds : AM04. Dans Odoo, vous verrez la cause et non le code, car le connecteur enregistre la cause de l'événement et non le code SEPA. Le connecteur note par ailleurs dans son code que la combinaison insufficient_funds avec AM04 est celle observée sur de vrais paiements SEPA du sandbox GoCardless.
Ce que vous voyez dans Odoo avec le connecteur
Chaque encaissement envoyé par le connecteur demande à GoCardless retry_if_possible, l'option de Success+. Lorsque l'échec survient, deux situations sont possibles, et la transaction vous indique laquelle dans son groupe GoCardless : « GoCardless Cause » et la case « Success+ Will Retry ». La transaction s'ouvre depuis la facture, avec le bouton « Transaction de paiement » situé en haut ; le menu des transactions n'apparaît qu'en mode développeur, et il n'existe pas dans Odoo 20.
will_attempt_retry | État | « Message » de la transaction | Bouton « Retry collection » |
|---|---|---|---|
| true | « En attente » | « GoCardless could not collect this payment (insufficient_funds). Success+ will retry it automatically; there is nothing to do. » | N'apparaît pas |
| false | « Erreur », et la facture redevient en attente | « GoCardless could not collect this payment (insufficient_funds). » et, si GoCardless fournit le motif, « It will not be retried automatically (…). » | Apparaît, s'il reste des tentatives et si le mandat est actif |
Ces messages sont rédigés par le connecteur lors de l'application de l'événement, sans personne devant l'écran. 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 (insufficient_funds). Success+ will retry it automatically; there is nothing to do. », « GoCardless could not collect this payment (insufficient_funds). » et « It will not be retried automatically (…). ».
La transaction reste volontairement en attente lorsque Success+ va retenter : l'argent peut encore arriver, et un état d'erreur donnerait l'impression que l'encaissement est perdu. À chaque nouvelle présentation du prélèvement par GoCardless, un événement resubmission_requested est envoyé, et le connecteur incrémente « GoCardless Retries », que la nouvelle tentative provienne de Success+ ou que vous l'ayez demandée vous-même.
Que faire
- Ouvrez la transaction depuis la facture et regardez « GoCardless Cause » et « Success+ Will Retry ».
- Si Success+ va retenter, ne faites rien : le bouton de nouvelle tentative n'apparaît même pas. GoCardless demande de ne pas encaisser le client par un autre moyen dans l'intervalle, car il pourrait payer deux fois.
- Si Success+ ne retentera pas, parlez d'abord au client pour savoir quand il disposera des fonds, puis cliquez sur « Retry collection » lorsqu'il vous le confirme. Le bouton ne permet pas de choisir la date : la nouvelle date de prélèvement est fixée par GoCardless, et la transaction passe à « Retry requested. GoCardless will confirm the new charge date. ».
- Tenez le compte : GoCardless accepte au maximum 3 nouvelles tentatives par paiement (« Payments can be retried up to 3 times. »), et le connecteur compte aussi celles de Success+ dans « GoCardless Retries ».
Un AM04 annule-t-il le mandat du client ?
Non. La cause insufficient_funds ne figure pas parmi celles qui conduisent le connecteur à archiver le mandat, à savoir mandate_cancelled, bank_account_closed, mandate_expired et authorisation_disputed. Le client conserve donc son moyen de paiement pour la prochaine facture.
Pourquoi Success+ ne retente-t-il pas tous les échecs ?
Parce que son guide le limite aux paiements sans provision : en SEPA, AM04 et, dans cinq pays seulement, MS03. Un client qui refuse le prélèvement ou un compte clôturé ne se régularisent pas en présentant de nouveau le prélèvement. Le connecteur ne tranche pas lui-même : il suit le champ will_attempt_retry de chaque échec.

Avec notre connecteur
Le connecteur GoCardless pour Odoo 17, 18, 19 et 20 transforme l'événement en éléments gérables depuis la facture : il laisse la transaction en attente pendant que Success+ travaille, la passe en erreur et rouvre la facture lorsqu'aucune nouvelle tentative ne sera effectuée, et compte les nouvelles tentatives pour ne pas vous proposer une action inutile. Il ne peut en revanche pas alimenter le compte de votre client : si l'AM04 se répète, c'est l'échange avec lui qui permettra de régler l'encaissement.
À 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
- docs.gocardless.com/docs/api-reference/events/payment
- docs.gocardless.com/docs/api-reference/payment
- docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
- Code du module : flexigo_payment_gocardless: const.py, ligne 15 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- 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 71 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 260 en 17.0 (d203ee6), ligne 260 en 18.0 (e2ab18b), ligne 260 en 19.0 (ce7f5a3) et ligne 271 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 729 en 17.0 (d203ee6), ligne 729 en 18.0 (e2ab18b), ligne 728 en 19.0 (ce7f5a3) et ligne 752 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 746 en 17.0 (d203ee6), ligne 746 en 18.0 (e2ab18b), ligne 745 en 19.0 (ce7f5a3) et ligne 769 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 732 en 17.0 (d203ee6), ligne 732 en 18.0 (e2ab18b), ligne 731 en 19.0 (ce7f5a3) et ligne 755 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: models/payment_transaction.py, ligne 680 en 17.0 (d203ee6), ligne 680 en 18.0 (e2ab18b), ligne 679 en 19.0 (ce7f5a3) et ligne 703 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 430 en 17.0 (d203ee6), ligne 430 en 18.0 (e2ab18b), ligne 429 en 19.0 (ce7f5a3) et ligne 444 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: const.py, ligne 122 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: const.py, ligne 119 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 461 en 17.0 (d203ee6), ligne 461 en 18.0 (e2ab18b), ligne 460 en 19.0 (ce7f5a3) et ligne 479 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 484 en 17.0 (d203ee6), ligne 484 en 18.0 (e2ab18b), ligne 483 en 19.0 (ce7f5a3) et ligne 502 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: views/payment_transaction_views.xml, ligne 22 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: views/payment_transaction_views.xml, ligne 27 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: views/payment_transaction_views.xml, ligne 28 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/fr.po
- 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 1083 en 17.0 (d203ee6), ligne 1083 en 18.0 (e2ab18b), ligne 1083 en 19.0 (ce7f5a3) et ligne 1090 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 703 en 17.0 (d203ee6), ligne 703 en 18.0 (e2ab18b), ligne 703 en 19.0 (ce7f5a3) et ligne 710 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 356 en 17.0 (d203ee6), ligne 356 en 18.0 (e2ab18b), ligne 356 en 19.0 (ce7f5a3) et ligne 358 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1063 en 17.0 (d203ee6), ligne 1063 en 18.0 (e2ab18b), ligne 1063 en 19.0 (ce7f5a3) et ligne 1070 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 408 en 17.0 (d203ee6), ligne 408 en 18.0 (e2ab18b), ligne 408 en 19.0 (ce7f5a3) et ligne 410 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)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1022 en 17.0 (d203ee6), ligne 1022 en 18.0 (e2ab18b), ligne 1022 en 19.0 (ce7f5a3) et ligne 1037 en 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)
- 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)
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
