0saas

Job ticket 635978 · SMB · intake desk · no subscription

Typeform won't even say what its free plan caps. Here is the desk that designs the form anyway.

This page is an intake desk. You feed it a purpose, a free-tier model returns the form architecture, the branch-logic map, or the per-path confirmation copy as strict JSON, and your browser prints it as stacked intake cards you export as Markdown. No form is hosted, no response is collected, nothing is stored — the design is what you build in Typeform Free, Tally, Google Forms, or by hand. The prompts are printed at the bottom of this page so you keep them even if this site disappears.

Typeform is a trademark of Typeform Inc. This is an independent, unaffiliated comparison built on Typeform's own published pricing page, linked below. We are not Typeform, and nothing here is endorsed by them.

Intake desk — rendered in this browser

Source: noneRendered: 0Uploaded to 0saas: nothing

Sample data is illustrative, not a claim about Typeform. Every Typeform figure on this page comes from the linked pricing page, read 2026-09-17.

The prompt pack

Three prompts, each mapped one-to-one onto a Typeform feature you are currently rationed on. Run them from this page with a free key, or copy them into any free chat model — the text is identical either way, and it is printed in full at the bottom of this section so it survives this site.

Loading the pack from tools.json… If this fails, the full prompt text is still readable below.

What Typeform's own pricing page says

Read from typeform.com/pricing on 2026-09-17. Fields we could not read are marked unconfirmed rather than filled in with a plausible number.

Typeform Free vs Basic vs this page — verified 2026-09-17
The jobFree (caps unstated)Basic (from US$28/mo)This page + a free-tier model
PriceUS$0 — caps not stated on the pricing pagefrom US$28 / month (billed annually), 100 responsesUS$0 forever. A free-tier key costs nothing; the prompts are yours.
Form designBuild by handBuild by handUnmetered by us — Prompt 01 returns the full question list with renderable answer types and a computed read time. Your ally's free allowance is the only ceiling: OpenRouter's free variants run 50 requests/day.
Conditional logicNot stated on FreeIncluded on paid plansPrompt 02 returns the branch map with every path terminating and every condition referencing a real question — the logic exists as a document before it is hosted anywhere.
Confirmation screensBasicIncludedPrompt 03 writes one confirmation per path with a real deadline or trigger — never an invented SLA, which is the single most common form lie.
Response collectionHosted (free caps unstated)Hosted, 100 responsesNone here. The design is built in whatever hosts the form — Typeform Free, Tally, Google Forms, or a paper intake on the desk.
Who sees your form designTypeformTypeformOnly the inference provider you choose for the design — the questions and the routing rules, never a single respondent.

What this replaces, and what it does not

A displacement claim you cannot substantiate is a lie with good typography. This is the whole scope, including the parts where Typeform wins.

Replaced: the paid form-creation assist

Prompt 01 returns the complete question list — typed, ordered, identity questions last — as a document you build in any form tool.

Replaced: conditional logic as a gated feature

Prompt 02 returns the branch map: every gate, every if → to path, the path count, and the missing questions filed honestly.

Replaced: the confirmation screen editor

Prompt 03 returns per-path confirmations with what happened, who has it, and the next step with a real deadline or trigger.

Not replaced: hosting and collection

No form is hosted, no response is collected, no submission is stored. The design is built where the form lives.

Not replaced: integrations and webhooks

No Zapier-style piping. The form's destination is the reader's ESP, CRM or inbox — deliberately, like a paper intake.

Not replaced: analytics on responses

No open rates, no drop-off charts. The branch map is the design-time analytics: it tells you what the form will do before it does it.

The prompts, in full, as text

Copy these into any model. They are the product; the page around them is convenience. Each block is the exact system prompt the interactive runner sends, plus the user-message template.

Prompt 01 — 1. Form architect · typeform-form-architect v1.0.0 · best ally: OpenRouter — :free model variants · openai/gpt-oss-120b:free (any :free id works; runtime discovers live models)

Replaces: Typeform's AI-assisted form creation on paid plans — the full form architecture, question by question, written as a file instead of a metered feature.

Why this model: A form is an ordered list of typed questions where each question's job must be stated; a large open model in JSON mode keeps the types honest and the order logical. Fallback ally: Google Gemini API — Free usage tier.

System prompt (2037 chars):

You are the form clerk at an intake desk. You turn a purpose into a machine-readable form architecture.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "title": string (max 8 words),
  "intro": string (max 40 words),
  "blocks": [
    { "type": "h3", "text": string (max 10 words) },
    { "type": "p", "text": string (max 30 words) },
    { "type": "ul", "items": [ string (max 14 words) ] (2-6 items) }
  ],
  "question_count": integer,
  "est_minutes": integer,
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. "blocks" is the question list in answer order. Each question is an "h3" (the question text, phrased as the respondent would say it) followed by a "p" (the answer type and, for choices, the choices) and, where a question gates a later section, a "ul" (the gate's conditions, one per branch). 5 to 15 questions total.
2. Answer types are exactly these words: text, number, email, phone, date, single choice, multiple choice, file, yes/no, scale 1-5. The "p" under each question states the type first, then the options or range. A question whose type the form tool cannot render is a design failure — if the purpose needs it, split the question and note the split.
3. Every question must earn its place: if removing it would not change the outcome for the respondent or the reader of the form, it is removed. A form that asks for a full address when a city is enough is banned.
4. "intro" is the sentence the respondent reads first: what this is, how long it takes (compute "est_minutes" at ~15 seconds per question and state that number), and who reads the answers. No marketing, no 'quick survey'.
5. "question_count" must equal the number of h3 questions in "blocks" — count them. "est_minutes" must equal the ceiling of question_count x 15 / 60.
6. Order rule: identity questions (name, email) come last, not first — a respondent who gives their name and abandons has a record without a story. Banned: 'please fill in all fields', exclamation marks, emoji. Write in the language of the purpose.

User message template:

The purpose (what this form is for, who fills it, what happens with the answers): {{purpose}}

Variables:

  • {{purpose}} — The purpose (max 700 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "title", "intro", "blocks", "question_count", "est_minutes", "notes" ], "properties": { "title": { "type": "string" }, "intro": { "type": "string" }, "blocks": { "type": "array" }, "question_count": { "type": "integer" }, "est_minutes": { "type": "integer" }, "notes": { "type": "array" } } }

Decoding: temperature 0.5 · max 2200 output tokens · response_format json_object · budget ~800 in / ~1,100 out per run · cost per run: 1 request per form — 2% of OpenRouter's published free allowance (50/day).

Prompt 02 — 2. Branch logic · typeform-branch-logic v1.0.0 · best ally: OpenRouter — :free model variants · openai/gpt-oss-120b:free (any :free id works; runtime discovers live models)

Replaces: Typeform's conditional logic (a paid-plan feature) — the branch map written as a document, so the logic exists before the plan that hosts it.

Why this model: A branch map is a set of (condition → destination) rules where every path must terminate; JSON mode keeps each rule atomic and the completeness check visible. Fallback ally: Google Gemini API — Free usage tier.

System prompt (1707 chars):

You are the logic clerk at an intake desk. You turn a form's purpose and questions into a machine-readable branch-logic map.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "title": string (max 8 words),
  "blocks": [
    { "type": "h3", "text": string (max 10 words) },
    { "type": "p", "text": string (max 30 words) },
    { "type": "ul", "items": [ string (max 16 words) ] (2-5 items) }
  ],
  "path_count": integer,
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. "blocks" lists every branch point in form order. Each branch point is an "h3" (the question that gates), a "p" (the routing rule in one sentence), and a "ul" where each item is one branch: 'if <answer> → <destination>' with the destination being a named section, a named person, or 'end'.
2. Every path must terminate: follow every branch from the first gate to an end. A branch that loops back to a question without a way out is banned. "path_count" is the number of distinct end-to-end paths a respondent can take — enumerate them in your head before writing the number.
3. A branch condition must reference an answer the form actually collects. If the routing needs information the form does not ask, the correct answer is a "notes" entry saying which question is missing — not an invented condition.
4. At most 3 branches per gate; a gate with 5 outcomes is a form with a hidden menu. Merge outcomes that route the same way and state the merge in the gate's "p".
5. Destinations for people use the names from the brief (a partner, a role). A destination that is 'the team' or 'whoever is free' is banned — name the owner or the role.
6. Write in the language of the brief. No exclamation marks, no emoji.

User message template:

The purpose and routing (who gets what, and by what rule): {{routing}} The questions the form asks (from prompt 1, or by hand): {{questions}}

Variables:

  • {{routing}} — Purpose and routing (max 700 chars) sample data shipped with the tool
  • {{questions}} — Questions (max 1500 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "title", "blocks", "path_count", "notes" ], "properties": { "title": { "type": "string" }, "blocks": { "type": "array" }, "path_count": { "type": "integer" }, "notes": { "type": "array" } } }

Decoding: temperature 0.35 · max 1900 output tokens · response_format json_object · budget ~1,000 in / ~900 out per run · cost per run: 1 request per map — 2% of OpenRouter's published free allowance.

Prompt 03 — 3. Confirmation copy · typeform-confirmation-copy v1.0.0 · best ally: OpenRouter — :free model variants · qwen/qwen3.8-27b:free (any :free id works; runtime discovers live models)

Replaces: Typeform's confirmation screens on paid forms — the outcome copy for every path, written so the respondent knows exactly what happens next.

Why this model: Confirmation copy is a small set of bounded documents, one per path; a 27b-class model in JSON mode writes them at free-tier speed with room to re-run for tone. Fallback ally: Google Gemini API — Free usage tier.

System prompt (1676 chars):

You are the confirmation clerk at an intake desk. You turn a form's paths into the machine-readable confirmation copy for each outcome.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "title": string (max 8 words),
  "blocks": [
    { "type": "h3", "text": string (max 10 words) },
    { "type": "p", "text": string (max 35 words) }
  ],
  "path_count": integer,
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. "blocks" holds one pair per path: an "h3" (the path name, matching the branch map) and a "p" (the confirmation the respondent sees). 2 to 6 paths.
2. Every confirmation states, in order: (a) what just happened ('your intake is in'), (b) who has it now (the named person or role from the routing), (c) the one next step with its deadline or trigger ('Ana will reply by Friday' or 'you will hear back when the scope call is set'). A confirmation that omits (c) is banned — a form that ends in silence loses the lead it just captured.
3. Deadlines must come from the brief. If the brief gives no response time, the confirmation states the trigger instead of a fake deadline ('when the scope call is set', not 'within 48 hours'). Inventing a SLA is the single most common form lie, and it is banned.
4. Tone matches the respondent, not the company: short, warm, zero exclamation marks, zero 'we're excited'. The word 'thank you' is allowed exactly once across all confirmations.
5. "path_count" must equal the number of h3/p pairs. If the branch map (pasted in the brief) has more paths than you can serve honestly, cover the real ones and list the missing paths in "notes" — never pad a confirmation.
6. Write in the language of the brief.

User message template:

The paths (from prompt 2, or by hand) and any response-time promises: {{paths}}

Variables:

  • {{paths}} — Paths (max 1200 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "title", "blocks", "path_count", "notes" ], "properties": { "title": { "type": "string" }, "blocks": { "type": "array" }, "path_count": { "type": "integer" }, "notes": { "type": "array" } } }

Decoding: temperature 0.6 · max 1600 output tokens · response_format json_object · budget ~900 in / ~600 out per run · cost per run: 1 request per set — 2% of OpenRouter's published free allowance.

Questions worth asking before you cancel

Is this actually free, or is there a subscription hiding?

There is no subscription and, right now, no paid tier at all. The whole tool is unmetered. A one-time unlock for form bundle export is planned, but no price is shown anywhere on this site until a real Stripe Payment Link exists and its price is read back from Stripe's API rather than typed by hand.

Do you need an API key?

No. Copy-Paste Relay works with any free chat model you already use: copy the prompt block, paste it in, paste the JSON answer back into the box. A key only removes the copy-paste step. If you do use one, it is stored in your browser's localStorage and sent only to that provider — 0saas has no endpoint that accepts a key.

Which free model is best for this?

OpenRouter's :free variants for the architecture and the branch map — the path count is arithmetic the model has to show its work on. Gemini's free tier is the strict-JSON fallback.

Can I really build this in Typeform Free?

Yes — the question list maps one-to-one onto Typeform's field types, and the branch map is exactly the conditional-logic screen's content. Where Free's unstated caps bite is the volume of responses, not the design; the design documents work in Tally or Google Forms at zero volume cost.

Is 0saas affiliated with Typeform?

No. Typeform is a trademark of Typeform Inc. We name it because a comparison that will not name the thing it compares against is useless. Pricing figures come from Typeform's own pricing page, linked above, with the date we read it and a per-field confidence marker.

Next on the ledger