Una causa, quattro codici
| Codice SEPA Core | Testo di 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. |
Le tre righe provengono dalla tabella dei pagamenti falliti (payments · failed) della documentazione di GoCardless per SEPA Core. A differenza di altre cause, nessuna dice che il mandato viene annullato: il cliente resta autorizzato ad addebitarti, anche se questo specifico addebito non è andato a buon fine.

Cosa c'è dietro ogni codice
MS02 è la risposta più chiara: il cliente ha detto alla sua banca di non pagare quella ricevuta. Il connettore annota nel suo codice che è la combinazione che ha visto in un pagamento SEPA di prova della sandbox di GoCardless. MS03 e RR04 sono il contrario: il pagamento fallisce e la banca non fornisce il motivo, di solito per ragioni normative, quindi l'unico modo per saperlo è chiederlo al cliente. SL01 riguarda il conto: la sua banca limita gli addebiti diretti che possono essergli addebitati, e questo può cambiarlo solo il titolare con la propria banca.
Con MS02, RR04 e SL01, ripresentare l'addebito senza prima parlare con il cliente di solito finisce allo stesso modo e può costare un'altra commissione. MS03 ha un'eccezione: secondo la guida di Success+, in Austria, Belgio, Germania, Lussemburgo e Slovacchia MS03 viene considerato come fondi insufficienti, e Success+ può riprovare. In tal caso l'evento arriva con will_attempt_retry impostato a true.
Cosa fa Odoo con il connettore
La transazione si apre dalla fattura, con il pulsante «Transazione di pagamento» in alto; il menu delle transazioni compare solo in modalità sviluppatore e in Odoo 20 non esiste. Il connettore salva la causa nel campo «GoCardless Cause», non il codice SEPA, e mostra «GoCardless could not collect this payment (refer_to_payer).». Poi segue quanto indicato dall'evento:
- Se
will_attempt_retryètrue, la transazione passa a «In sospeso», la casella «Success+ Will Retry» viene spuntata e il messaggio dice «Success+ will retry it automatically; there is nothing to do.». Il pulsante per riprovare non compare. - Altrimenti la transazione passa a «Errore» e compare il pulsante «Retry collection», se restano dei tentativi. Se Odoo considerava già il pagamento incassato, il connettore annulla il suo pagamento e la fattura torna da incassare.
- Il mandato non viene toccato.
refer_to_payernon è tra le cause per cui il connettore archivia un mandato, quindi il metodo di pagamento del cliente resta disponibile per il successivo addebito.
Quest'ultimo punto è voluto: archiviare il mandato per un rifiuto puntuale costringerebbe il cliente a firmarne un altro senza motivo.
I due messaggi li scrive il connettore nell'applicare l'evento, senza che nessuno intervenga. Il connettore non è tradotto in italiano: questi testi compaiono sempre in inglese, anche in un Odoo in italiano, sia che li avvii un utente sia un'azione pianificata: «GoCardless could not collect this payment (refer_to_payer).» e «Success+ will retry it automatically; there is nothing to do.».
Cosa fare in base al codice
Odoo non ti dice quale dei quattro codici è arrivato: il connettore salva solo la causa. Il codice lo vedi in GoCardless. Secondo il loro centro di assistenza, il motivo di ogni fallimento compare nella cronologia del pagamento, nella Dashboard («You are able to view the reason for a payment failure in the status timeline of the payment in your GoCardless dashboard.»). In modalità avanzata, il codice esatto è anche nell'evento (details.reason_code), e la Dashboard conserva gli invii degli ultimi 3 mesi in Developers > Webhooks, con il loro contenuto.
| Codice | Primo passo |
|---|---|
| MS02 | Chiedi al cliente perché ha rifiutato la ricevuta: importo, data o disaccordo con la fattura. |
| MS03 | Controlla «Success+ Will Retry»: in Austria, Belgio, Germania, Lussemburgo e Slovacchia, Success+ può riprovare MS03 come fondi insufficienti. Se non è spuntata, chiedi al cliente di rivolgersi alla sua banca. |
| RR04 | Chiedi al cliente di rivolgersi alla sua banca: GoCardless non riceve il motivo. |
| SL01 | Il cliente deve rimuovere la limitazione sugli addebiti del suo conto, oppure fornirti un altro conto. |
Quando il cliente conferma che l'addebito andrà a buon fine, usa «Retry collection» sulla transazione e conferma l'avviso sulla commissione. Il connettore risponde «Retry requested. GoCardless will confirm the new charge date.» e la lascia in sospeso. Ricorda il limite: un pagamento può essere riprovato al massimo 3 volte («Payments can be retried up to 3 times.»).
Il mandato viene annullato se il cliente rifiuta un addebito?
No. Né la documentazione di GoCardless lo dice per questa causa né il connettore archivia il mandato con refer_to_payer. Se il cliente vuole smettere di pagarti tramite addebito diretto, annullerà il mandato con la sua banca e questo arriva con un'altra causa, mandate_cancelled.

Con il nostro connettore
In Odoo 17, 18, 19 e 20 il connettore trasforma refer_to_payer in una fattura da incassare con la causa in vista e un mandato che resta valido. Non deduce il codice SEPA: Odoo salva la causa nella transazione, e il codice lo consulti in GoCardless. La decisione di riprovare a incassare spetta a te, dopo aver parlato con il cliente.
Continua a leggere
Verificato nel codice del connettore (versione 17.0, 18.0, 19.0 e 20.0) e nelle fonti collegate
Fonti
- docs.gocardless.com/docs/api-reference/events/payment
- docs.gocardless.com/docs/api-reference/payment
- Codice del modulo: flexigo_payment_gocardless: const.py, riga 15 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: const.py, riga 79 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: const.py, riga 76 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: const.py, riga 71 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 725 in 17.0 (d203ee6), riga 725 in 18.0 (e2ab18b), riga 724 in 19.0 (ce7f5a3) e riga 748 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 729 in 17.0 (d203ee6), riga 729 in 18.0 (e2ab18b), riga 728 in 19.0 (ce7f5a3) e riga 752 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 754 in 17.0 (d203ee6), riga 754 in 18.0 (e2ab18b), riga 753 in 19.0 (ce7f5a3) e riga 777 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: const.py, riga 122 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: views/payment_transaction_views.xml, riga 13 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, riga 436 in 17.0 (d203ee6), riga 436 in 18.0 (e2ab18b), riga 436 in 19.0 (ce7f5a3) e riga 438 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, riga 356 in 17.0 (d203ee6), riga 356 in 18.0 (e2ab18b), riga 356 in 19.0 (ce7f5a3) e riga 358 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, riga 1016 in 17.0 (d203ee6), riga 1016 in 18.0 (e2ab18b), riga 1016 in 19.0 (ce7f5a3) e riga 1031 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, riga 1022 in 17.0 (d203ee6), riga 1022 in 18.0 (e2ab18b), riga 1022 in 19.0 (ce7f5a3) e riga 1037 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: __manifest__.py, riga 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 63 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 418 in 17.0 (d203ee6), riga 418 in 18.0 (e2ab18b), riga 417 in 19.0 (ce7f5a3) e riga 432 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: views/payment_transaction_views.xml, riga 27 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/it.po
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- Codice del modulo: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, riga 1083 in 17.0 (d203ee6), riga 1083 in 18.0 (e2ab18b), riga 1083 in 19.0 (ce7f5a3) e riga 1090 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, riga 1063 in 17.0 (d203ee6), riga 1063 in 18.0 (e2ab18b), riga 1063 in 19.0 (ce7f5a3) e riga 1070 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, riga 567 in 17.0 (d203ee6), riga 567 in 18.0 (e2ab18b), riga 567 in 19.0 (ce7f5a3) e riga 569 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 461 in 17.0 (d203ee6), riga 461 in 18.0 (e2ab18b), riga 460 in 19.0 (ce7f5a3) e riga 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
- Codice del modulo: flexigo_payment_gocardless: const.py, riga 66 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
