Forms
A real form backend, in every site you ship.
Per-site endpoints, presigned file uploads, spam protection, webhooks, and a triage inbox you'll actually use. No more emails-from-an-EC2-script.
What's included
The whole pipeline, owned by you.
Per-site endpoint
Every project gets a unique URL — no shared keys, no leaked secrets in client-side code. Routes by site, not by account.
Presigned uploads
Files go straight from the browser to your R2 bucket via short-lived signed URLs. Receipts, photos, contracts — up to 25MB each.
Spam protection
Rate limiting, honeypots, and a configurable hCaptcha hook. Nothing reaches the inbox unless it passes.
Submission inbox
A real triage UI in the agency dashboard — filter by site, status, or form. Reply, archive, mark as spam, export to CSV.
Webhooks and email
Forward each submission to Slack, Discord, Linear, or any URL. Send the customer an autoresponder via Resend, with templating.
Idempotency built-in
Every POST is keyed. Double-submits from a flaky network become a single row, never two.
Drop-in
Two lines in any frontend.
Install the SDK and call submit(). The endpoint URL is per-site and shipped as an env var.
API
Or just POST to the endpoint.
The SDK is sugar around a JSON endpoint. Use whatever you’d like.
FAQ
Frequently asked.
Do I need a database for forms?
Can clients see their own submissions?
What does the SDK do?
How does spam protection work?
Stop hand-rolling form endpoints.
Your one Caddi plan gives every site a real form backend, an inbox, and uploads. Set up takes about three minutes.
Get started