Asking for a credit card at signup converted 3x better than an opt-in trial on the last SaaS I shipped.
Feels backwards, since the friction's higher up front. But 14 days beat 30, and the real save was the Stripe trial_will_end webhook nudging three days before the charge so...
Your API server has no business touching uploaded file bytes.
Presigned URLs let the browser PUT straight to S3; the server only signs the request. Files pass through three buckets (raw, scanned, clean) so ClamAV clears them before download, and each tenant gets its own prefix.
Three real-time stacks, three different jobs. Supabase Realtime broadcasts DB changes cheaply but chokes on live presence. Liveblocks owns multiplayer pointers and conflict resolution. PartyKit gives you WebSocket rooms on the edge to shape yourself.
What bites you in...
Postgres full-text search lasted longer than I expected. It broke on relevance, not speed.
Past a few hundred thousand rows, ranking got mushy. Typesense gave clean relevance with little tuning; Algolia matched it but costs climb fast. Tenant isolation meant a scoped filter on...
How do you keep one tenant's support email out of another customer's inbox?
Resend's inbound webhooks hand you a parsed message, but threading and routing stay yours. I keyed it off a per-tenant inbound address and stitched replies with In-Reply-To. Attachments needed their own...