Une cause, quatre codes
| Code SEPA Core | Texte de GoCardless |
|---|---|
| MS02 | The customer refused to accept this payment. |
| MS03, RR04 | The payment failed but the reason for the failure was not provided, usually for regulatory reasons. |
| SL01 | The payment failed due to a restriction on Direct Debit payments from the payer's bank account. |
Les trois lignes proviennent du tableau des échecs de paiement (payments · failed) de la documentation GoCardless pour SEPA Core. Contrairement à d'autres causes, aucune ne dit que le mandat est annulé : le client vous autorise toujours à le prélever, même si ce prélèvement précis n'a pas abouti.

Ce qui se cache derrière chaque code
MS02 est la réponse la plus claire : le client a demandé à sa banque de ne pas payer cette échéance. Le connecteur indique dans son code qu'il s'agit de la combinaison observée sur un paiement SEPA de test dans le sandbox de GoCardless. MS03 et RR04 sont l'inverse : le paiement échoue et la banque ne donne pas le motif, généralement pour des raisons réglementaires, donc la seule façon de savoir ce qui se passe est de demander au client. SL01 concerne le compte : sa banque limite les prélèvements qui peuvent y être effectués, et seul le titulaire peut modifier cela auprès de sa banque.
Avec MS02, RR04 et SL01, représenter le prélèvement sans avoir d'abord parlé au client aboutit généralement au même échec et peut entraîner des frais supplémentaires. MS03 fait exception : selon le guide de Success+, en Autriche, en Belgique, en Allemagne, au Luxembourg et en Slovaquie, MS03 est considéré comme une insuffisance de provision, et Success+ peut le relancer. Dans ce cas, l'événement arrive avec will_attempt_retry à true.
Ce que fait Odoo avec le connecteur
La transaction s'ouvre depuis la facture, avec le bouton « Transaction de paiement » en haut ; le menu des transactions n'apparaît qu'en mode développeur, et il n'existe pas dans Odoo 20. Le connecteur enregistre la cause dans le champ « GoCardless Cause », et non le code SEPA, et affiche « GoCardless could not collect this payment (refer_to_payer). ». Ensuite, la suite dépend de l'événement :
- Si
will_attempt_retryvauttrue, la transaction passe à « En attente », la case « Success+ Will Retry » est cochée et le message indique « Success+ will retry it automatically; there is nothing to do. ». Le bouton de relance n'apparaît pas. - Sinon, la transaction passe à « Erreur » et le bouton « Retry collection » apparaît, s'il reste des tentatives. Si Odoo considérait déjà le paiement comme encaissé, le connecteur annule son paiement et la facture redevient à encaisser.
- Le mandat n'est pas modifié.
refer_to_payerne fait pas partie des causes pour lesquelles le connecteur archive un mandat, donc le mode de paiement du client reste disponible pour la prochaine échéance.
Ce dernier point est volontaire : archiver le mandat pour un rejet ponctuel obligerait le client à en signer un nouveau sans raison.
Les deux messages sont écrits par le connecteur lors de l'application de l'événement, sans intervention humaine. Le connecteur n'est pas traduit en français : ces messages apparaissent toujours en anglais, y compris dans une base Odoo en français : « GoCardless could not collect this payment (refer_to_payer). » et « Success+ will retry it automatically; there is nothing to do. ».
Quoi faire selon le code
Odoo ne vous indique pas lequel des quatre codes est arrivé : le connecteur enregistre seulement la cause. Vous voyez le code dans GoCardless. D'après leur centre d'aide, le motif de chaque échec figure dans la chronologie du paiement, sur le tableau de bord (« You are able to view the reason for a payment failure in the status timeline of the payment in your GoCardless dashboard. »). En mode avancé, le code exact figure aussi dans l'événement (details.reason_code), et le tableau de bord conserve les envois des 3 derniers mois dans Developers > Webhooks, avec leur contenu.
| Code | Première étape |
|---|---|
| MS02 | Demandez au client pourquoi il a refusé l'échéance : montant, date ou désaccord avec la facture. |
| MS03 | Vérifiez « Success+ Will Retry » : en Autriche, en Belgique, en Allemagne, au Luxembourg et en Slovaquie, Success+ peut relancer MS03 comme insuffisance de provision. Si la case n'est pas cochée, demandez au client de contacter sa banque. |
| RR04 | Demandez au client de contacter sa banque : GoCardless ne reçoit pas le motif. |
| SL01 | Le client doit lever la limitation des prélèvements sur son compte, ou vous en communiquer un autre. |
Lorsque le client confirme que le prélèvement pourra passer, utilisez « Retry collection » sur la transaction et confirmez l'avertissement concernant les frais. Le connecteur répond « Retry requested. GoCardless will confirm the new charge date. » et la laisse en attente. N'oubliez pas la limite : un paiement peut être relancé au maximum 3 fois (« Payments can be retried up to 3 times. »).
Le mandat est-il annulé si le client rejette un prélèvement ?
Non. La documentation GoCardless ne le prévoit pas pour cette cause, et le connecteur n'archive pas le mandat avec refer_to_payer. Si le client veut arrêter de vous payer par prélèvement, il annulera le mandat auprès de sa banque, et cela arrive avec une autre cause, mandate_cancelled.

Avec notre connecteur
Dans Odoo 17, 18, 19 et 20, le connecteur transforme refer_to_payer en facture à encaisser, avec la cause visible et un mandat toujours valable. Il ne devine pas le code SEPA : Odoo enregistre la cause dans la transaction, et vous consultez le code dans GoCardless. La décision de relancer le prélèvement vous appartient, après avoir parlé au client.
À 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
- 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 79 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 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 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 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 122 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 13 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- 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 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 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)
- docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
- 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 27 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/fr.po
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- 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 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 567 en 17.0 (d203ee6), ligne 567 en 18.0 (e2ab18b), ligne 567 en 19.0 (ce7f5a3) et ligne 569 en 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)
- docs.gocardless.com/docs/api-reference/webhooks
- 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)
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
