You open a form builder, drag in eight fields, pick dropdown options, configure validation rules, and save. Then you realize you want to collect one piece of information the tool does not support as a built-in type. You look for a custom field option. It is behind a paid plan. Forty minutes in, you have not collected a single response.

This is the schema-on-read problem: you define the structure first, then collect data that fits it.

OperatorStack forms flip this. Submit data, and the schema builds itself.

Schema-on-write means structure emerges from what you submit, not from a builder UI. POST any JSON payload to POST /v1/f/{form_key}, and OperatorStack infers field names and types automatically. Add a field to your HTML and it appears in the dashboard on the next submission. No reconfiguration, no plan upgrades.

What Schema-on-Write Means

Traditional form tools follow a schema-on-read pattern:

  1. Define fields in a builder (names, types, validation)
  2. Collect submissions that match that schema
  3. Query data that already fits the structure you declared

Schema-on-write reverses steps 1 and 2:

  1. Submit data
  2. The system infers field names and types from what arrived
  3. The schema is stored alongside the data, known and consistent going forward

The first time you submit {"plan": "pro"}, OperatorStack records that plan is a text field. The second time you submit {"plan": "free", "company": "Acme"}, company is added to the schema. Old submissions show it as empty. The schema grows without any dashboard action.

Schema-on-write is not schema-less. Your data is typed and queryable from day one. The difference is who infers the types: a human clicking through a builder UI, or the system reading what you actually sent.

Why This Matters During Pre-Launch

Early-stage data collection has a specific shape: you do not yet know what questions to ask.

You launch a beta signup form with name, email, and "what problem are you trying to solve?" Two weeks in, you want to add "what tool are you using now?" You add the input to your HTML. The next visitor who submits gives you that field automatically. That is the full workflow.

Schema-on-read tools make this a four-step detour: open the builder, add the field, configure validation, deploy. For a founder iterating weekly on their landing page, that friction is not theoretical -- it is twenty minutes of tool maintenance per change.

The speed difference compounds. Over six weeks of validation, schema-on-write lets you run ten field iterations where schema-on-read allows four.

Schema-on-write is ideal when you are still learning what information matters. Once you have settled on a stable form structure that needs validation rules or conditional logic, a dedicated form builder may be the right tool.

How It Works in OperatorStack

Every OperatorStack project gets one endpoint per form: POST /v1/f/{form_key}. The endpoint accepts JSON, form-urlencoded, and multipart.

A plain HTML form submission:

<form method="POST" action="https://api.operatorstack.dev/v1/f/frm_abc123">
  <input type="text" name="name" placeholder="Name" />
  <input type="email" name="email" placeholder="Email" />
  <textarea name="problem" placeholder="What are you trying to do?"></textarea>
  <input type="hidden" name="_redirect" value="https://yoursite.com/thanks" />
  <button type="submit">Submit</button>
</form>

The same submission via the SDK:

await OperatorStack.ready;

await OperatorStack.submitForm("frm_abc123", {
  name: "Jane",
  email: "jane@example.com",
  problem: "I want to track which referrers actually convert",
});

After the first submission, your dashboard shows three columns: name, email, problem. Add a company field to the HTML and submit again. Four columns. No dashboard visit required.

Reserved Fields

Fields prefixed with an underscore are metadata and are not stored:

  • _redirect -- the URL to send the visitor to after submission
  • _subject -- a label for categorizing the submission

Everything else is stored as form data and added to the schema if it is new.

Where the Data Goes

When a submission includes an email field, OperatorStack creates or updates a unified Contact record. A person who joins your waitlist, submits a feedback form, and sends a contact message appears as one contact in your Audience tab, not three separate records across three tools.

The form endpoint and the waitlist endpoint share the same Contact model. Both write to the same unified contact list.

1

Visitor submits a form. The endpoint receives the payload, infers field types from the field names and values, and stores the submission with the inferred schema.

2

Email field detected. OperatorStack calls upsert_contact() with the project ID and email. If the contact already exists, the form submission links to it. If not, a new contact is created.

3

Dashboard updates. The Forms tab shows the new submission with all fields. If a field is new, it appears as a column going forward, and old submissions show it as empty.

Schema-on-Write vs. Traditional Form Builders

Schema-on-Write (OperatorStack)Traditional Form Builder
Add a fieldEdit HTML, submit onceOpen builder, add field, save, deploy
Custom field typesAny JSON-serializable valueLimited to the tool's type list
Cost for custom fieldsIncludedOften gated behind paid plans
Submission formatJSON, form-urlencoded, multipartTool-specific
Contact unificationAutomaticRequires integration or manual export

Schema-on-write does not handle every case. If you need conditional logic, multi-step flows, or strict validation that blocks bad submissions, a dedicated form builder is more appropriate. For early-stage data collection where iteration speed matters more than strict validation, schema-on-write wins.

Frequently Asked Questions

What is schema-on-write?

Schema-on-write means a system infers data structure from what you submit, rather than requiring you to define the structure up front. In OperatorStack's forms, the first submission that includes a field named company causes company to appear as a column in your dashboard. You did not declare it beforehand.

What is the difference between schema-on-write and schema-on-read?

Schema-on-read stores raw data and applies a schema when you query it. Schema-on-write infers and records the schema at write time, so field types are known and queryable in the dashboard immediately. OperatorStack uses schema-on-write so form data is typed and usable without post-processing.

Can I add fields to a form without reconfiguring the dashboard?

Yes. Add an input to your HTML and the next submission automatically adds that field to the schema. Old submissions without the new field show it as empty. No dashboard changes required.

Does schema-on-write work with plain HTML forms?

Yes. The form endpoint at POST /v1/f/{form_key} accepts standard HTML form submissions, JSON, and multipart. No JavaScript or SDK required.

What happens to old submissions when I add a new field?

Old submissions keep their data intact. The new field appears as empty for those records. The schema only grows forward -- fields are never removed when a submission omits them.