Refunds & Notifications · Article 6.1
Cuándo se producen los reembolsos: las ramas de enmienda Δ_REEMBOLSO
Un reembolso en Clozo siempre está vinculado a una rama de enmienda Δ_REEMBOLSO — parcial (total revisado inferior al anticipo pagado) o total (total revisado en cero). La enmienda es el detonante legal; el reembolso es la consecuencia monetaria.
Clozo no tiene un botón de «devolver dinero al cliente» desvinculado del contrato. Cada reembolso es la parte monetaria de una enmienda firmada que redujo el total por debajo de lo que el cliente ya pagó como anticipo. Este diseño es deliberado — los reembolsos sin el correspondiente cambio de contrato son una pesadilla de auditoría fiscal; vincular cada reembolso a una enmienda firmada garantiza que los documentos legales (Stornorechnung, Berichtigung, Gutschrift) y el movimiento de efectivo estén siempre sincronizados.
Quick visual tour

Step 1: Llega la solicitud de reembolso. No se preocupe — hay un camino claro.

Step 2: Compruebe la elegibilidad en el árbol de decisión. La mayoría de los casos son válidos.

Step 3: Pulse Reembolso. Stripe gestiona el movimiento real del dinero.

Step 4: Observe cómo las monedas vuelan de vuelta desde su cuenta a la del cliente.

Step 5: Emita una nota de crédito. La contabilidad se cierra de forma limpia.
Step by step
Decida el importe del reembolso.
No es un número que usted escriba — es la consecuencia de editar las líneas en una enmienda. Nuevo total inferior al anticipo cobrado → reembolso. Nuevo total en cero → anticipo total reembolsado.
Abra el asistente de enmiendas.
/proposals/{id}/amend. Reduzca las líneas en el Paso 1 hasta que el banner de contexto del anticipo del asistente muestre «Reembolso: €X».Establezca el motivo en el Paso 2.
Mínimo 30 caracteres (el mínimo más largo refleja que está reduciendo — sea explícito). El motivo aparece en el addendum, en el texto narrativo de la nota de crédito, y forma parte del registro de auditoría.
Envíe y espere a que el cliente firme.
La enmienda pasa por el flujo estándar protegido por PIN (artículo 7.4). Al firmar, se ejecuta el pipeline de reembolso.
Siga la línea de tiempo del reembolso.
Un banner «Reembolso en progreso» aparece en la página de la propuesta una vez firmado. Etapas: emitido → requested (Stripe aceptado) → liquidado (webhook de Stripe confirmado) — consulte el artículo 8.4.
Después de que el cliente firma la enmienda Δ_REEMBOLSO, el banner de la propuesta cambia a «Reembolso en progreso» con el número de la nota de crédito y una ventana esperada. El menú desplegable de Documentos obtiene los nuevos documentos (Storno, Berichtigung, Gutschrift). El refund_status de la nota de crédito impulsa la interfaz: requested → «Reembolso en progreso, esperado en 3–5 días hábiles»; failed → «Reembolso fallido» con opciones de reintento / manual; succeeded / manual → «Reembolso completado el [fecha]».
Why this works this way
El flujo de reembolso está arraigado en process_amendment_signed (backend/apps/proposals/amendment_postsign.py). En el momento de la firma, la función comprueba amendment.triggers_refund. Si es verdadero, calcula refund_gross = deposit_paid − revised_total (mínimo cero) y:
1. Crea una DepositInvoiceCorrection (Berichtigung der Anzahlungsrechnung) con correction_type=partial_refund o full_cancellation.
2. Crea una CreditNote (Gutschrift) con refund_status=pending, los importes bruto/neto/IVA divididos mediante _split_refund_vat, y referencias a la factura de anticipo original (número + fecha) según el Art. 219 de la Directiva del IVA de la UE.
3. Llama a _trigger_stripe_refund para intentar la parte monetaria a través de la API de Stripe en la cuenta conectada del autónomo.
Dos «disparadores» diferentes producen un reembolso:
| Disparador | Rama | Documentos creados | Parte monetaria |
|---|---|---|---|
Enmienda con revised_total < deposit_paid, anticipo original pagado vía Stripe | Δ_REEMBOLSO parcial O total | Storno + Berichtigung + Gutschrift (+ FinalInvoice cancelada en total) | Reembolso de Stripe (artículo 8.2) |
Enmienda con revised_total < deposit_paid, anticipo original pagado vía SEPA / fuera de plataforma | Δ_REEMBOLSO parcial O total | Mismos documentos | SEPA manual (artículo 8.3 + 8.9) |
No existe una ruta de «reembolso del pago final» porque el pago final no es un anticipo — una vez en Pagada, el contrato está liquidado. Para reembolsar parcialmente un contrato pagado, cree una enmienda que reduzca el alcance (Δ−), fírmela; la propuesta vuelve a Esperando pago final con un saldo menor, y cualquier importe cobrado en exceso se gestiona a través del pipeline post-firma como un Δ_REEMBOLSO. La enmienda es siempre la puerta de entrada.
Nota: a partir del 2026-05-07, la eliminación directa de una propuesta in_work también está prohibida — el backend rechaza DELETE con HTTP 409 in_work_requires_amendment. El aviso rojo de «Reembolso total» del asistente de enmiendas (Paso 1) es el único camino de interfaz para reembolsar un anticipo pagado; al hacer clic, establece la cantidad de todas las líneas en 0, el asistente muestra la rama Δ_REEMBOLSO total, y al firmar el cliente se ejecuta el pipeline de este artículo (según [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.