Eén oorzaak, vier codes
| SEPA Core-code | Tekst van 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. |
De drie rijen komen uit de tabel met betalingsfouten (payments · failed) in de documentatie van GoCardless voor SEPA Core. Anders dan bij andere oorzaken staat er bij deze nergens dat het mandaat wordt opgezegd: de klant blijft gemachtigd om je te laten incasseren, ook al is deze specifieke incasso niet doorgegaan.

Wat er achter elke code zit
MS02 is het duidelijkst: de klant heeft zijn bank gevraagd die incasso niet uit te voeren. De connector noteert in zijn code dat dit de combinatie is die hij zag in een SEPA-testbetaling in de sandbox van GoCardless. MS03 en RR04 zijn het tegenovergestelde: de betaling mislukt en de bank geeft geen reden, meestal om regelgevende redenen, dus de enige manier om het te weten te komen is de klant vragen. SL01 wijst naar de rekening: zijn bank beperkt de incasso's die op hem afgeschreven kunnen worden, en alleen de rekeninghouder kan dat met zijn bank wijzigen.
Bij MS02, RR04 en SL01 leidt een nieuwe incasso zonder eerst met de klant te praten meestal tot hetzelfde resultaat en kan er extra kosten bij komen. Bij MS03 is er een uitzondering: volgens de gids van Success+ telt MS03 in Oostenrijk, België, Duitsland, Luxemburg en Slowakije als ontoereikend saldo, en Success+ kan het opnieuw proberen. Als dat zo is, komt de gebeurtenis binnen met will_attempt_retry op true.
Wat Odoo met de connector doet
De transactie open je vanuit de factuur, met de knop "Betalingstransactie" bovenaan; het menu met transacties is alleen zichtbaar in de ontwikkelaarsmodus en bestaat niet in Odoo 20. De connector slaat de oorzaak op in het veld "GoCardless Cause", niet de SEPA-code, en toont "GoCardless could not collect this payment (refer_to_payer).". Daarna volgt wat de gebeurtenis aangeeft:
- Staat
will_attempt_retryoptrue, dan krijgt de transactie de status "In behandeling", wordt het vinkje "Success+ Will Retry" gezet en zegt het bericht "Success+ will retry it automatically; there is nothing to do.". De knop om opnieuw te proberen verschijnt niet. - Anders gaat de transactie naar "Fout" en verschijnt de knop "Retry collection", zolang er nog pogingen over zijn. Als Odoo de betaling al als geslaagd had beschouwd, annuleert de connector de betaling en staat de factuur weer open.
- Het mandaat blijft ongemoeid.
refer_to_payerhoort niet bij de oorzaken waarmee de connector een mandaat archiveert, dus de betaalmethode van de klant blijft beschikbaar voor de volgende incasso.
Dit laatste punt is bewust: een mandaat archiveren na een eenmalige weigering zou de klant zonder reden een nieuw laten tekenen.
De twee berichten schrijft de connector bij het verwerken van de gebeurtenis, zonder dat iemand erbij is. De connector is niet in het Nederlands vertaald: deze teksten verschijnen altijd in het Engels, ook in een Nederlandstalige Odoo: "GoCardless could not collect this payment (refer_to_payer)." en "Success+ will retry it automatically; there is nothing to do.".
Wat te doen per code
Odoo laat niet zien welke van de vier codes is binnengekomen: de connector slaat alleen de oorzaak op. De code zie je bij GoCardless. Volgens hun helpcentrum staat de reden van elke fout in de tijdlijn van de betaling, in het Dashboard ("You are able to view the reason for a payment failure in the status timeline of the payment in your GoCardless dashboard."). In de geavanceerde modus staat de exacte code ook in de gebeurtenis (details.reason_code), en het Dashboard bewaart de verzonden webhooks van de afgelopen 3 maanden onder Developers > Webhooks, met hun inhoud.
| Code | Eerste stap |
|---|---|
| MS02 | Vraag de klant waarom hij de incasso heeft geweigerd: bedrag, datum of onenigheid over de factuur. |
| MS03 | Kijk naar "Success+ Will Retry": in Oostenrijk, België, Duitsland, Luxemburg en Slowakije kan Success+ MS03 opnieuw proberen als ontoereikend saldo. Staat het vinkje niet aan, vraag de klant zijn bank te raadplegen. |
| RR04 | Vraag de klant zijn bank te raadplegen: GoCardless krijgt de reden niet. |
| SL01 | De klant moet de incassobeperking op zijn rekening opheffen, of je een andere rekening geven. |
Zodra de klant bevestigt dat de incasso kan doorgaan, gebruik je "Retry collection" in de transactie en bevestig je de melding over de kosten. De connector antwoordt "Retry requested. GoCardless will confirm the new charge date." en laat de transactie in behandeling. Let op de limiet: een betaling kan maximaal 3 keer opnieuw worden geprobeerd ("Payments can be retried up to 3 times.").
Wordt het mandaat opgezegd als de klant een incasso weigert?
Nee. Voor deze oorzaak zegt de documentatie van GoCardless dat niet, en de connector archiveert het mandaat niet bij refer_to_payer. Als de klant niet meer via automatische incasso wil betalen, zegt hij het mandaat op bij zijn bank, en dat komt binnen met een andere oorzaak: mandate_cancelled.

Met onze connector
In Odoo 17, 18, 19 en 20 zet de connector refer_to_payer om in een openstaande factuur met de oorzaak zichtbaar en een mandaat dat nog geldig is. Hij raadt de SEPA-code niet: Odoo slaat de oorzaak op in de transactie, en de code zoek je op in GoCardless. De beslissing om opnieuw te incasseren is aan jou, nadat je met de klant hebt gesproken.
Lees verder
Gecontroleerd in de broncode van de connector (versie 17.0, 18.0, 19.0 en 20.0) en in de gelinkte bronnen
Bronnen
- docs.gocardless.com/docs/api-reference/events/payment
- docs.gocardless.com/docs/api-reference/payment
- Broncode van de module: flexigo_payment_gocardless: const.py, regel 15 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: const.py, regel 79 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: const.py, regel 76 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: const.py, regel 71 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_transaction.py, regel 725 in 17.0 (d203ee6), regel 725 in 18.0 (e2ab18b), regel 724 in 19.0 (ce7f5a3) en regel 748 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_transaction.py, regel 729 in 17.0 (d203ee6), regel 729 in 18.0 (e2ab18b), regel 728 in 19.0 (ce7f5a3) en regel 752 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_transaction.py, regel 754 in 17.0 (d203ee6), regel 754 in 18.0 (e2ab18b), regel 753 in 19.0 (ce7f5a3) en regel 777 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: const.py, regel 122 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: views/payment_transaction_views.xml, regel 13 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, regel 436 in 17.0 (d203ee6), regel 436 in 18.0 (e2ab18b), regel 436 in 19.0 (ce7f5a3) en regel 438 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, regel 356 in 17.0 (d203ee6), regel 356 in 18.0 (e2ab18b), regel 356 in 19.0 (ce7f5a3) en regel 358 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, regel 1016 in 17.0 (d203ee6), regel 1016 in 18.0 (e2ab18b), regel 1016 in 19.0 (ce7f5a3) en regel 1031 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, regel 1022 in 17.0 (d203ee6), regel 1022 in 18.0 (e2ab18b), regel 1022 in 19.0 (ce7f5a3) en regel 1037 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: __manifest__.py, regel 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
- Broncode van de module: flexigo_payment_gocardless: models/payment_transaction.py, regel 63 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_transaction.py, regel 418 in 17.0 (d203ee6), regel 418 in 18.0 (e2ab18b), regel 417 in 19.0 (ce7f5a3) en regel 432 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: views/payment_transaction_views.xml, regel 27 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/nl.po
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- Broncode van de module: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, regel 1083 in 17.0 (d203ee6), regel 1083 in 18.0 (e2ab18b), regel 1083 in 19.0 (ce7f5a3) en regel 1090 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, regel 1063 in 17.0 (d203ee6), regel 1063 in 18.0 (e2ab18b), regel 1063 in 19.0 (ce7f5a3) en regel 1070 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, regel 567 in 17.0 (d203ee6), regel 567 in 18.0 (e2ab18b), regel 567 in 19.0 (ce7f5a3) en regel 569 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_transaction.py, regel 461 in 17.0 (d203ee6), regel 461 in 18.0 (e2ab18b), regel 460 in 19.0 (ce7f5a3) en regel 479 in 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
- Broncode van de module: flexigo_payment_gocardless: const.py, regel 66 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
