Refunds & Notifications · Article 6.1
Quand les remboursements ont lieu : les branches d'avenant Δ_REFUND
Un remboursement dans Clozo est toujours lié à une branche d'avenant Δ_REFUND — partiel (total révisé inférieur à l'acompte payé) ou complet (total révisé à zéro). L'avenant est le déclencheur légal ; le remboursement est la conséquence financière.
Clozo ne dispose pas d'un bouton « rembourser le client » déconnecté du contrat. Chaque remboursement est le volet financier d'un avenant signé qui a réduit le total en dessous de ce que le client a déjà payé comme acompte. Cette conception est délibérée — les remboursements sans modification de contrat correspondante sont un cauchemar lors d'un contrôle fiscal ; lier chaque remboursement à un avenant signé garantit que les documents juridiques (Stornorechnung, Berichtigung, Gutschrift) et le mouvement financier sont toujours synchronisés.
Quick visual tour

Step 1: Demande de remboursement reçue. Ne paniquez pas — il existe un chemin clair.

Step 2: Vérifiez l'éligibilité sur l'arbre de décision. La plupart des cas sont valides.

Step 3: Cliquez sur Rembourser. Stripe gère le mouvement réel d'argent.

Step 4: Regardez les fonds revenir de votre coffre vers le client.

Step 5: Émettez une note de crédit. La comptabilité se clôture proprement.
Step by step
Décidez du montant du remboursement.
Ce n'est pas un chiffre que vous tapez — c'est la conséquence de la modification des lignes dans un avenant. Nouveau total inférieur à l'acompte collecté → remboursement. Nouveau total à zéro → acompte entièrement remboursé.
Ouvrez l'assistant d'avenant.
/proposals/{id}/amend. Réduisez les lignes à l'étape 1 jusqu'à ce que la bannière de contexte d'acompte de l'assistant affiche « Remboursement : €X ».Définissez la raison à l'étape 2.
Minimum 30 caractères (le minimum plus long reflète le fait que vous réduisez — soyez explicite). La raison apparaît sur l'avenant, sur le récit de la note de crédit et fait partie de la piste d'audit.
Envoyez et attendez que le client signe.
L'avenant passe par le flux standard protégé par PIN (article 7.4). À la signature, le pipeline de remboursement s'exécute.
Surveillez la chronologie du remboursement.
Une bannière « Remboursement en cours » apparaît sur la page du devis une fois signé. Étapes : émis → demandé (Stripe accepté) → réglé (webhook Stripe confirmé) — voir article 8.4.
Après que le client signe l'avenant Δ_REFUND, la bannière du devis bascule vers « Remboursement en cours » avec le numéro de note de crédit et une fenêtre estimée. Le menu déroulant Documents reçoit les nouveaux documents (Storno, Berichtigung, Gutschrift). Le refund_status de la note de crédit pilote l'interface : requested → « Remboursement en cours, prévu dans 3 à 5 jours ouvrés » ; failed → « Remboursement échoué » avec des options de nouvelle tentative / manuel ; succeeded / manual → « Remboursement effectué le [date] ».
Why this works this way
Le flux de remboursement est enraciné dans process_amendment_signed (backend/apps/proposals/amendment_postsign.py). Au moment de la signature, la fonction vérifie amendment.triggers_refund. Si vrai, elle calcule refund_gross = deposit_paid − revised_total (plafonné à zéro) et :
1. Crée une DepositInvoiceCorrection (Berichtigung der Anzahlungsrechnung) avec correction_type=partial_refund ou full_cancellation.
2. Crée une CreditNote (Gutschrift) avec refund_status=pending, les montants brut/net/TVA divisés via _split_refund_vat, et des références à la facture d'acompte originale (numéro + date) conformément à l'art. 219 de la directive TVA européenne.
3. Appelle _trigger_stripe_refund pour tenter le volet financier via l'API Stripe sur le compte connecté du freelancer.
Deux « déclencheurs » différents produisent un remboursement :
| Déclencheur | Branche | Documents créés | Volet financier |
|---|---|---|---|
Avenant avec revised_total < deposit_paid, acompte original payé via Stripe | Δ_REFUND partiel OU complet | Storno + Berichtigung + Gutschrift (+ FinalInvoice annulée sur complet) | Remboursement Stripe (article 8.2) |
Avenant avec revised_total < deposit_paid, acompte original payé via SEPA / hors canal | Δ_REFUND partiel OU complet | Mêmes documents | SEPA manuel (articles 8.3 + 8.9) |
Il n'existe pas de chemin « rembourser le paiement final » car le paiement final n'est pas un acompte — une fois Payé, le contrat est réglé. Pour rembourser partiellement un contrat payé, vous créez un avenant qui réduit la portée (Δ−), le signez ; le devis revient à En attente du paiement final avec un solde réduit, et tout montant perçu en trop est géré via le pipeline post-signature comme un Δ_REFUND. L'avenant est toujours la porte d'entrée.
Note : depuis le 07/05/2026, la suppression directe d'un devis in_work est également interdite — le backend rejette le DELETE avec HTTP 409 in_work_requires_amendment. L'encart rouge « Rembourser tout » de l'assistant d'avenant (étape 1) est le seul chemin d'interface pour rembourser un acompte payé ; en cliquant dessus, toutes les quantités de lignes sont mises à 0, l'assistant affiche la branche Δ_REFUND complet, et à la signature du client, le pipeline de cet article s'exécute (conformément à [D-125]).
Troubleshooting
Keep reading
Proposals & Invoices
The 4 delta branches: Δ+, Δ−, Δ=0, Δ_REFUND
Every signed amendment falls into one of four branches based on (a) the sign of the cost change and (b) whether the proposal was already paid. Each branch fires a different document chain. This is the central conceptual map for the entire amendment system.
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
SEPA / out-of-band refund: when automation can't help
When the original deposit was paid via SEPA bank transfer (or any non-Stripe channel), Clozo can't refund automatically — Stripe API has nothing to refund. You issue the SEPA transfer manually from your bank, then click `Mark refunded` to update the credit note and notify the client.
Refunds & Notifications
Refund stages: issued → requested → succeeded (or manual)
The credit note moves through up to four states from creation to settled. Each state corresponds to a specific point in the refund lifecycle, with predictable UI badges and email triggers.