Most form builders want you to drag inputs around a canvas, configure validation rules, and fiddle with styling before you collect a single response. If you just need a feedback form or a beta signup with four fields, that is twenty minutes of ceremony for a two-minute job.
OperatorStack takes a different approach. You POST data to a public endpoint, and the schema builds itself from whatever you send. No builder UI. No field definitions. No backend code.
Create a form in the OperatorStack dashboard, get a form_key, and submit data via plain HTML or the SDK to POST /v1/f/{form_key}. Field types are auto-inferred on first submission. All responses land in your dashboard with unified contact records. No form builder required.
Why Schema-on-Write Beats a Form Builder
Traditional form tools follow a schema-on-read model. You define every field, pick types, set validation, then collect submissions that match the schema. That works for complex multi-step flows. For a four-field feedback form, it is overkill.
Schema-on-write flips this. You submit data, and OperatorStack infers the structure. Send {"name": "Jane", "email": "jane@example.com", "plan": "pro"}, and three fields appear. Add a field next time, and the schema expands. Remove one, and old submissions keep their data. You iterate by changing your HTML, not reconfiguring a dashboard.
Schema-on-write is ideal for early-stage data collection: beta signups, feature requests, feedback forms, and surveys. You can always add validation later once you know which fields matter.
Step-by-Step Setup
Create a form in your project dashboard. Go to the Forms tab and create a new form. Name it something descriptive like "Beta Feedback" or "Feature Request." OperatorStack generates a unique form key like frm_abc123.
Build a plain HTML form. Point a standard HTML form at the public endpoint. No SDK, no JavaScript, no API key:
<form method="POST" action="https://api.operatorstack.com/v1/f/frm_abc123">
<input type="text" name="name" placeholder="Your name" />
<input type="email" name="email" placeholder="Email" />
<textarea name="feedback" placeholder="What should we build?"></textarea>
<input type="hidden" name="_redirect" value="https://yoursite.com/thanks" />
<button type="submit">Submit</button>
</form>
The _redirect field tells OperatorStack where to send the visitor after submission. Without it, the API returns a JSON response.
Or submit with the SDK. If you already have the OperatorStack script tag on your page, use JavaScript for a smoother experience:
await OperatorStack.submitForm("frm_abc123", {
name: "Jane",
email: "jane@example.com",
feedback: "I want dark mode",
});
This avoids a full page redirect and lets you handle success messages and errors in your own UI.
Submit your first entry. Fill out the form and submit it. Open the Forms tab in your dashboard. You will see the submission with auto-detected field types. The schema view shows every field OperatorStack has seen across all submissions.
Iterate freely. Need a "company" field? Add the HTML input and submit again. The field appears automatically. Old submissions without it show that field as empty. No dashboard reconfiguration needed.
Supported Submission Formats
The endpoint at POST /v1/f/{form_key} accepts three content types:
- JSON (
application/json) — best for SDK and JavaScript submissions - Form-urlencoded (
application/x-www-form-urlencoded) — default HTML form behavior - Multipart (
multipart/form-data) — for forms with file inputs
You can also test from the command line:
curl -X POST https://api.operatorstack.com/v1/f/frm_abc123 \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com", "feedback": "Ship it"}'
Reserved Fields
Fields with an underscore prefix are metadata, stripped from stored data:
_redirect— URL to redirect the visitor to after submission (HTTP 303)_subject— a label for the submission, useful for categorizing responses
Reserved fields are never stored in your form data. If you name a real field _notes, it will be treated as metadata and discarded. Use notes instead.
Unified Contacts
When a form submission includes an email field, OperatorStack creates or updates a unified contact record. A visitor who joined your waitlist and later submitted a feedback form appears as a single contact with both interactions linked. You can see the full history in the Audience tab: waitlist signups, form submissions, chat conversations — one person, one record.
Unified contacts work automatically. You do not need to configure matching rules or merge duplicates. OperatorStack keys on project and email and handles the rest.
When to Use This
Schema-on-write forms work best when you need to collect data fast and iterate on the structure. Beta signups, feature requests, survey responses, contact forms — if you want submissions in your dashboard within five minutes, this beats any form builder.
Frequently Asked Questions
What is schema-on-write and how does it work?
Schema-on-write means OperatorStack infers your form's field structure from the data you submit, rather than requiring you to define fields up front. Send any JSON payload to the form endpoint, and field names and types are detected automatically. The schema expands as you add new fields.
Do I need the OperatorStack SDK to submit forms?
No. The public form endpoint at POST /v1/f/{form_key} accepts standard HTTP POST requests with JSON, form-urlencoded, or multipart bodies. You can submit from a plain HTML form, a fetch call, curl, or any HTTP client.
How are form submissions linked to contacts?
When a submission includes an email field, OperatorStack automatically creates or updates a unified contact record. That submission is linked to the contact, so you can see all interactions from one person — waitlist signups, form submissions, chat conversations — in a single view.
What are reserved fields like \_redirect?
Fields prefixed with an underscore are treated as metadata and stripped from stored data. The _redirect field sends the visitor to a URL after submission. The _subject field sets a label for categorizing responses. Everything else is stored as form data.