Lifecycle · Article 2.13
Eventos de la línea de tiempo: cada tipo de evento explicado
El componente de línea de tiempo de cada página de detalle de propuesta registra más de 21 tipos de evento. Esta es la lista canónica con descripciones y disparadores, útil al auditar qué ha sucedido en una propuesta.
La línea de tiempo es su rastro de auditoría. Cada webhook, cada clic y cada envío de correo produce un evento. Los conservamos durante toda la vida de la propuesta (10 años por conservación legal). Cuando esté intentando averiguar "un momento, ¿cuándo firmó realmente el cliente?" o "¿llegó a salir la factura de anticipo?", la línea de tiempo es la fuente de verdad — incluso cuando la insignia de la interfaz o el correo de confirmación den una impresión distinta.
Why this works this way
Los eventos de la línea de tiempo se almacenan en el modelo ProposalTimelineEvent con los campos: event_type (enum), created_by (User o null si lo dispara el cliente), data (JSON: IPs, importes, pruebas de firma, etc.), created_at (marca de tiempo UTC). Son de solo añadir — nunca editamos ni borramos un evento. Si se deshace un proceso (p. ej., un estado revertido), registramos un evento nuevo que explica el deshacer, dejando intacto el original.
### Referencia: todos los tipos de evento
| Evento | Disparador | Metadatos clave |
|---|---|---|
created | Primera vez que se guarda la propuesta | created_by user |
sent | El autónomo hace clic en Enviar | to_email, sent_from_ip |
viewed | El cliente abre el enlace por primera vez con un PIN válido | viewer_ip, user_agent |
signed | El cliente hace clic en Firmar en la página pública | signer_name, signer_ip, ua, signed_at, consent |
pdf_generated | El render asíncrono del PDF termina | doc_type (PRO/AGR/CON/DEP/INV/STR/DCR/CRN/REC), r2_key |
deposit_paid | Webhook de Stripe o marca manual | method, amount, payment_intent_id |
final_invoice_issued | El autónomo emite la factura final | invoice_number, total |
payment_received (final) | Webhook de Stripe o marca manual | method, amount |
completed | El autónomo marca como completada | notes |
declined | El cliente rechaza en la página pública | decline_reason |
expired | Cron de 90 días | days_since_sent |
archived | El autónomo archiva | reason |
amendment_proposed | Anexo creado | amendment_id, delta_total |
amendment_viewed | El cliente abre el enlace del anexo | viewer_ip |
amendment_signed | El cliente firma el anexo | signer_name, ip, evidence_stack |
amendment_declined | El cliente rechaza el anexo | decline_reason |
amendment_cancelled | El autónomo cancela el anexo antes de la firma | cancelled_by |
amendment_expired | Caducidad del anexo a 90 días | — |
refund_initiated | Flujo de reembolso disparado | credit_note_number, amount |
refund_completed | Webhook de Stripe o marca manual | method, completed_at |
Troubleshooting
Keep reading
Lifecycle
The proposal lifecycle, end to end
Every proposal goes through up to nine status transitions, with two actors (you and your client) handing off control along the way. This is the canonical map.
Lifecycle
Status: Signed — legally binding, audit trail captured
The client clicked Sign. Clozo collects an eIDAS-compliant evidence stack, generates the signed Service Agreement PDF, fires confirmation emails to both parties, and queues the deposit invoice. The proposal is now a contract.