Lifecycle · Article 2.13
Tijdlijngebeurtenissen: elk gebeurtenistype uitgelegd
De tijdlijncomponent op elke offerte-detailpagina registreert 21+ gebeurtenistypen. Dit is de canonieke lijst met beschrijvingen en triggers, nuttig bij het controleren wat er is gebeurd op een offerte.
De tijdlijn is uw audittraject. Elke webhook, elke klik, elke e-mailverzending produceert een gebeurtenis. We bewaren ze gedurende de levensduur van de offerte (10 jaar voor wettelijke retentie). Wanneer u probeert te achterhalen "wacht, wanneer heeft de klant eigenlijk ondertekend?" of "is de aanbetalingsfactuur ooit uitgegaan?", is de tijdlijn de bron van waarheid — zelfs als de UI-badge of e-mailbevestiging u een andere indruk geeft.
Why this works this way
Tijdlijngebeurtenissen worden opgeslagen in het model ProposalTijdlijnGebeurtenis met velden: event_type (enum), created_by (Gebruiker of null voor door-klant-geïnitieerde), data (JSON: IP's, bedragen, handtekeningbewijs, enz.), created_at (UTC tijdstempel). Ze zijn alleen-aanvoegen — we bewerken of verwijderen nooit een gebeurtenis. Als een proces ongedaan wordt gemaakt (bijv. status teruggedraaid), registreren we een nieuwe gebeurtenis die de ongedaanmaking uitlegt, waarbij het origineel intact blijft.
### Referentie: alle gebeurtenistypen
| Gebeurtenis | Trigger | Sleutelmetadata |
|---|---|---|
created | Offerte voor het eerst opgeslagen | created_by gebruiker |
sent | Freelancer klikt op Verzenden | to_email, sent_from_ip |
viewed | Klant opent de koppeling voor het eerst met geldige PIN | viewer_ip, user_agent |
signed | Klant klikt op Ondertekenen op openbare pagina | signer_name, signer_ip, ua, signed_at, consent |
pdf_generated | Async PDF-render voltooid | doc_type (PRO/SOV/CON/DEP/FAC/STR/DCR/CRN/BON), r2_key |
deposit_paid | Stripe-webhook of handmatige markering | method, amount, payment_intent_id |
final_invoice_issued | Freelancer geeft eindafrekening uit | invoice_number, total |
payment_received (eindafrekening) | Stripe-webhook of handmatige markering | method, amount |
completed | Freelancer markeert als voltooid | notes |
declined | Klant weigert op openbare pagina | decline_reason |
expired | 90-daags cron-taak | days_since_sent |
archived | Freelancer archiveert | reason |
amendment_proposed | Addendum aangemaakt | amendment_id, delta_total |
amendment_viewed | Klant opent addendum-koppeling | viewer_ip |
amendment_signed | Klant ondertekent addendum | signer_name, ip, evidence_stack |
amendment_declined | Klant weigert addendum | decline_reason |
amendment_cancelled | Freelancer annuleert addendum voor ondertekening | cancelled_by |
amendment_expired | Addendum 90-daags verloop | — |
refund_initiated | Terugbetalingsstroom geactiveerd | credit_note_number, amount |
refund_completed | Stripe-webhook of handmatige markering | 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.