Lifecycle · Article 2.13
Timeline-Ereignisse: Jeder Ereignistyp erklärt
Die Timeline-Komponente auf jeder Angebotsdetailseite verzeichnet 21+ Ereignistypen. Dies ist die kanonische Liste mit Beschreibungen und Auslösern — nützlich, wenn Sie nachvollziehen wollen, was bei einem Angebot passiert ist.
Die Timeline ist Ihr Audit-Trail. Jeder Webhook, jeder Klick, jeder E-Mail-Versand erzeugt ein Ereignis. Wir bewahren sie über die gesamte Lebensdauer des Angebots auf (10 Jahre gesetzliche Aufbewahrung). Wenn Sie herausfinden möchten „Wann hat der Kunde tatsächlich unterschrieben?" oder „Ist die Anzahlungsrechnung jemals rausgegangen?", ist die Timeline die maßgebliche Quelle — auch dann, wenn UI-Badge oder E-Mail-Bestätigung einen anderen Eindruck vermitteln.
Why this works this way
Timeline-Ereignisse werden im Modell ProposalTimelineEvent gespeichert, mit Feldern: event_type (Enum), created_by (User oder null bei kundeninitiierten Aktionen), data (JSON: IPs, Beträge, Signaturbeweise usw.), created_at (UTC-Zeitstempel). Sie sind nur anhängbar — wir bearbeiten oder löschen kein Ereignis. Wird ein Vorgang rückgängig gemacht (z. B. Status zurückgesetzt), verzeichnen wir ein neues Ereignis, das die Rücknahme erläutert, und lassen das Original unverändert.
### Referenz: alle Ereignistypen
| Ereignis | Auslöser | Wichtigste Metadaten |
|---|---|---|
created | Angebot zum ersten Mal gespeichert | created_by user |
sent | Freelancer klickt Send | to_email, sent_from_ip |
viewed | Kunde öffnet Link erstmals mit gültiger PIN | viewer_ip, user_agent |
signed | Kunde klickt Sign auf öffentlicher Seite | signer_name, signer_ip, ua, signed_at, consent |
pdf_generated | Asynchrones PDF-Rendering abgeschlossen | doc_type (PRO/AGR/CON/DEP/INV/STR/DCR/CRN/REC), r2_key |
deposit_paid | Stripe-Webhook oder manuelle Markierung | method, amount, payment_intent_id |
final_invoice_issued | Freelancer stellt Schlussrechnung aus | invoice_number, total |
payment_received (final) | Stripe-Webhook oder manuelle Markierung | method, amount |
completed | Freelancer markiert als abgeschlossen | notes |
declined | Kunde lehnt auf öffentlicher Seite ab | decline_reason |
expired | 90-Tage-Cron-Job | days_since_sent |
archived | Freelancer archiviert | reason |
amendment_proposed | Nachtrag erstellt | amendment_id, delta_total |
amendment_viewed | Kunde öffnet Nachtrags-Link | viewer_ip |
amendment_signed | Kunde unterschreibt Nachtrag | signer_name, ip, evidence_stack |
amendment_declined | Kunde lehnt Nachtrag ab | decline_reason |
amendment_cancelled | Freelancer bricht Nachtrag vor Unterschrift ab | cancelled_by |
amendment_expired | 90-Tage-Ablauf des Nachtrags | — |
refund_initiated | Erstattungsablauf gestartet | credit_note_number, amount |
refund_completed | Stripe-Webhook oder manuelle Markierung | 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.