Where Your Form Submissions Actually Go
Sitelas's submissions inbox plus optional fan-outs — a per-form webhook, Google Sheets through Claude's own connector, and file uploads stored privately by Sitelas. Plus Turnstile bot protection on every public form.
Usman Haider

Every form on every Sitelas site uses the same form primitive — contact, newsletter, RSVP, quote, application, donation, custom. Submissions always land in three places by default, plus an optional per-form webhook you can point anywhere.
The default destinations
1. The Sitelas inbox (always)
Every submission saves to the form_submissions table with the form's actual field schema. View at /dashboard/sites/[subdomain]/messages. Filter by site, status, or form type. Submissions are never dropped: the monthly allowance (50 on the free tier, 5,000 on Pro) is a soft cap — go over it and Sitelas keeps accepting the submission, recording it, and firing your webhook, then just shows you an upgrade nudge. A lead is never lost to a quota.
2. The site_contacts CRM (always, when email is present)
Submissions with an email field upsert into a unified per-site contact record keyed on (site_id, email). Same person submits twice from different forms — one contact, two activity entries. Counters (total_submissions, last_submission_at, is_subscribed) are denormalized for fast reads.
3. Cloudflare Turnstile, before anything saves
Every public form path verifies a Turnstile token before accepting the submission. Managed mode, interaction-only appearance, fail-open. Bots get a soft block; humans never see a challenge.
The optional fan-outs
Per-form webhook
Each form can declare an integration.webhookUrl. Sitelas POSTs the submission JSON to that URL. HTTPS-only, server-resolved from the published page tree (no SSRF risk). One retry at +300ms on transient 5xx / network failures; 4xx errors short-circuit. Use this for Zapier, n8n, Discord, custom backends — anything that takes an HTTPS POST.
Google Sheets — via Claude's own connector
Sitelas doesn't run its own Google Sheets integration — there's nothing to connect on our side. It doesn't need to: your submissions are already in the inbox and readable by Claude through list_submissions. Ask Claude — which has its own Google Sheets connector — "put this month's submissions in a sheet and keep it updated," and it writes to a workbook in your own Drive. No Sitelas-side login for you or your visitors, and no connection to maintain: every new Claude connector becomes transitively available to Sitelas users at zero cost to us.
File uploads go to private Sitelas storage
Forms with file fields store the uploaded files in a private Sitelas storage bucket — never public, never on a guessable URL. Each file is reachable only through a durable signed permalink (/api/forms/files/{token}), so you (and Claude) can open it but the public can't enumerate it. Uploads are validated by size, MIME type, a blocked-extension list, and a magic-byte sniff, so a renamed evil.exe can't slip through as fake.pdf. Delete a submission → its files are removed; delete the site → the whole folder goes with it.
Reading submissions from Claude
The connector exposes list_submissions, read_submission, draft_reply_to_submission, list_contacts, get_contact, list_contact_activity. Day-to-day:
"Anyone reach out this week? Draft replies to anyone asking about catering."
Claude reads the inbox, drafts replies, and lands them in your dashboard ready to send.
Verifying it works
The surest test is the real thing: submit your own live form once and watch it appear in the inbox at /dashboard/sites/[subdomain]/messages. If you've set a per-form webhook, that same submission fires the POST to your endpoint — so you can confirm it end to end from the receiving side, no synthetic tooling required.

Usman Haider
Founder of Sitelas — the website builder for AI agents.


