Refunds & Notifications · Article 6.3
Remboursement SEPA / hors canal : quand l'automatisation ne peut pas aider
Lorsque l'acompte original a été payé par virement bancaire SEPA (ou tout autre canal hors Stripe), Clozo ne peut pas rembourser automatiquement — l'API Stripe n'a rien à rembourser. Vous effectuez le virement SEPA manuellement depuis votre banque, puis cliquez sur `Marquer comme remboursé` pour mettre à jour la note de crédit et notifier le client.
Les virements bancaires SEPA sont courants dans l'UE, notamment en Allemagne, aux Pays-Bas et en Autriche où le paiement de compte à compte est habituel en B2B. Clozo prend en charge SEPA pour l'acompte original via le QR code EPC sur la facture d'acompte — mais Stripe n'intervient pas dans cette transaction, donc quand un remboursement est nécessaire sur un acompte payé par SEPA, Stripe ne peut rien faire. Le flux revient au manuel : vous transférez les fonds, puis enregistrez le transfert dans Clozo pour que la note de crédit reflète la réalité et que le client reçoive une confirmation.
Step by step
Recevez le déclencheur post-signature.
Après que le client signe l'avenant Δ_REFUND, la note de crédit apparaît avec le statut
pendinget la raison « Paiement manuel du freelancer requis ».Recherchez l'IBAN du client.
Soit depuis vos dossiers (si vous l'avez enregistré lors de l'acompte SEPA original), soit depuis l'e-mail de facture d'acompte (le client vous a envoyé les fonds ; son IBAN figure sur le relevé bancaire), soit en envoyant un e-mail au client pour confirmer que l'IBAN de destination est le même que celui utilisé pour le paiement.
Effectuez le virement SEPA depuis votre banque.
Utilisez le numéro de note de crédit comme référence (ex. « Remboursement CRN-2026-0007 »). La plupart des banques européennes traitent les virements SEPA le jour même ou le lendemain ouvré ; le SEPA Instant transfrontalier est souvent en quelques secondes.
Cliquez sur
Marquer comme remboursésur la note de crédit.Depuis la bannière de remboursement de la page du devis, la page des notes de crédit (
/credit-notes) ou la ligne de note de crédit dans le menu déroulant Documents.Fournissez une raison.
Minimum 1 caractère ; typiquement : numéro de référence bancaire (« Référence Sparkasse 9XK7-2026-0511 ») ou une courte note. Cette information est stockée définitivement sur la ligne de note de crédit.
Confirmez — la note de crédit passe à
manual.L'e-mail est envoyé au client ; le devis se ferme à
Payési applicable.
La bannière de remboursement indique « Remboursement manuel initié » avec les détails de la note de crédit, votre compte bancaire masqué et un bouton Confirmer le remboursement effectué. Après avoir cliqué et fourni une raison, la bannière bascule vers « Remboursement effectué par virement manuel le [date] » avec le texte de raison en ligne.
Why this works this way
La bascule se produit dans _trigger_stripe_refund (amendment_postsign.py:472) :
``
if not payment:
credit_note.refund_status = REFUND_PENDING
credit_note.refund_failure_reason = (
"No Stripe PaymentIntent found — likely SEPA flow. "
"Manual freelancer payout required."
)
``
Cela configure la note de crédit pour afficher l'interface de remboursement manuel. La bannière du devis indique « Remboursement manuel initié — confirmez le virement bancaire » avec les détails de la note de crédit et un CTA pour marquer le remboursement comme effectué.
L'action côté freelancer (CreditNoteMarkRefundedView dans amendment_views.py:686) :
1. Vérifier que la note de crédit n'est pas déjà à l'état succeeded (idempotent — renvoie 409 si c'est le cas).
2. Exiger un champ reason dans le corps (1 à 500 caractères) — typiquement un numéro de référence bancaire, une date de paiement ou une courte note. Stocké comme manual_refund_reason pour l'audit.
3. Définir refund_status=manual, refund_completed_at=now, enregistrer.
4. Appeler close_proposal_if_settled pour faire passer le devis à Payé si aucune autre obligation ne reste.
5. Mettre en file send_credit_note_refund_completed_email — même modèle d'e-mail que le chemin de remboursement Stripe complété ; l'expérience du client est identique.
L'état manual (vs succeeded) préserve la distinction d'audit : succeeded signifie que le webhook Stripe a confirmé ; manual signifie que le freelancer atteste que le remboursement a été émis hors canal. Les deux ferment la note de crédit à des fins comptables ; seule la piste d'audit enregistre la différence.
Troubleshooting
Keep reading
Refunds & Notifications
When refunds happen: the Δ_REFUND amendment branches
A refund in Clozo is always tied to a Δ_REFUND amendment branch — partial (revised total smaller than deposit paid) or full (revised total at zero). The amendment is the legal trigger; the refund is the cash consequence.
Refunds & Notifications
Mark refunded manually — for SEPA and out-of-band proof
When a refund is issued outside Stripe — SEPA bank transfer, cash, PayPal, mailed cheque — `Mark refunded` is how you record it in Clozo. Reason field is mandatory (typically a bank reference). The credit note moves to `manual` status and the client receives a confirmation email.
Refunds & Notifications
Stripe automatic refund (Direct Charges via Connect)
When the original deposit was paid via Stripe, the refund is automatic. Clozo issues a Refund on the freelancer's connected account, watches for the `refund.updated` webhook, and flips the credit note to `succeeded` once Stripe confirms — typically within 3–5 business days for the cash to reach the client.
Refunds & Notifications
Failed refunds & recovery — common Stripe failure reasons
A `failed` credit note has a `refund_failure_reason` string from Stripe. Most reasons fall into a small set; here's what each means and the recommended recovery.