Refunds & Notifications · Article 6.9
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.
The vast majority of refunds in Clozo are Stripe-driven and automatic. But three common cases break that pattern: (1) SEPA-paid deposits, where Stripe has nothing to refund; (2) Stripe refunds that fail for non-transient reasons (closed card, insufficient balance — see article 8.10) and the freelancer issues an out-of-band transfer instead; (3) refunds the freelancer chooses to handle manually for business reasons (e.g., consolidating with a separate goodwill payment in one bank transfer). All three end at the same place: the freelancer issues the actual refund through their own banking, then clicks Mark refunded to keep Clozo's records straight.
Step by step
Issue the refund through your own banking.
SEPA transfer, cheque, cash, whatever fits. Use the credit note number (CRN-2026-NNNN) as the reference so the client can match it.
Confirm the transfer left your account.
Double-check via online banking before you mark refunded — once you click, the client gets an email saying it's done.
Open the credit note.
From the proposal Refund banner, the Credit Notes page, or the Documents dropdown.
Click
Mark refunded.A modal appears asking for a reason.
Enter a reason.
Bank reference number is the convention ("Sparkasse ref XYZ-789", "PayPal txn 7K9N", "Bank cheque #4521"). Whatever lets you reconstruct the actual transfer years later.
Confirm.
Status moves to
manual; banner switches to "Refund completed on [date] via manual transfer"; client receives confirmation email; proposal closes if applicable.
Refund banner with Mark refunded button. After clicking and confirming, banner flips to "Refund completed on [date] via manual transfer — [reason]". The credit note PDF (regenerated) carries the same reason text in its body.
Why this works this way
Implementation (CreditNoteMarkRefundedView in amendment_views.py:686):
1. Authorise. IsAuthenticated, owner-scoped.
2. Idempotency guard. Already-succeeded returns 409 with completed_at — you can't mark refunded a refund Stripe already completed.
3. Require reason. If body lacks non-empty reason, return 400 with details.field=reason.
4. Update the credit note. refund_status=manual, refund_completed_at=now, manual_refund_reason=reason (truncated to 500 chars).
5. Try to close the proposal. close_proposal_if_settled flips proposal to Paid if no other obligations remain (no other pending refunds, no outstanding active invoices with amount_due > 0).
6. Fire the "refund completed" email. send_credit_note_refund_completed_email.delay(credit_note_id). Same template as Stripe-succeeded; the client doesn't see the difference.
7. Return updated credit note state + whether the proposal closed.
The manual status (vs succeeded) preserves the audit distinction. For accounting and tax purposes, manual is treated identically to succeeded — both mean the cash leg has settled and the credit note is closed. The audit trail keeps the channel separate so disputes years later can trace exactly how the refund was issued.
Troubleshooting
Keep reading
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.
Refunds & Notifications
The Credit Notes page
A first-class section in the freelancer dashboard that lists every credit note across all your proposals, with status, refund amount, linked proposal, and action buttons. Use this when you want to manage refunds without drilling into each proposal individually.
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.