As a victim, I want to start without paying upfront, so cost is never the reason I don't act.
Happy path · client → convex → integration → data
Client · 1Open envelope form/scan · destination + incident type
→
Convex · 2envelopes.createunauthenticated mutation
→
Convex · 3Return caseCodecapability token MER-XXXX-XXXX
→
Client · 4createCheckoutSessionlegacy name · no longer charges
→
Convex · 5markPaid {waived,$0}status → tracing
→
Data · 6envelopes rowawaiting_payment → tracing
→
Client · 7Redirect /envelope/sealedconfirmation
Optimize
- On seal, actually enqueue a trace job · today seal only flips status, nothing runs
Polish
- Rename createCheckoutSession → sealEnvelope
- Drop awaiting_payment / paymentStatus enum (no billing exists)
- Reconcile '90 seconds' copy with real flow
Harden
- envelopes.create + generateUploadUrl + attachFile are fully open · add rate-limit + captcha
- Spam / storage-fill abuse vector with no throttle