A client intake form template that's live before your next call

Build & score

Most client intake form templates are a document you copy, reformat, and then retype into some form builder. This one skips all of that: it's a complete, valid QuizGen definition. POST it as-is and you get a hosted, mobile-friendly, autosaving intake form at a short URL — or hand it to an AI assistant and say "take this intake template and adapt it for a wedding photographer" before posting.

The template

{
  "schema_version": 1,
  "kind": "form",
  "title": "New client intake",
  "description": "Three minutes now saves the first twenty of our call.",
  "sections": [
    {
      "key": "contact",
      "title": "About you",
      "questions": [
        { "id": "welcome", "type": "statement",
          "title": "Before we talk",
          "body": [
            "A few questions about you and the project so our first call starts at step two.",
            "Answers autosave — you can close the tab and pick up later."
          ] },
        { "id": "full_name", "type": "short_text", "prompt": "What's your name?",
          "required": true, "placeholder": "Jordan Smith" },
        { "id": "work_email", "type": "email", "prompt": "Best email to reach you?",
          "required": true, "placeholder": "you@company.com" }
      ]
    },
    {
      "key": "project",
      "title": "The project",
      "questions": [
        { "id": "service_type", "type": "choice",
          "prompt": "What do you need help with?", "required": true,
          "options": [
            { "value": "new_website", "label": "A new website",
              "detail": "Design and build from scratch" },
            { "value": "redesign", "label": "A redesign",
              "detail": "Existing site, new direction" },
            { "value": "ongoing_support", "label": "Ongoing support",
              "detail": "Retainer or maintenance" }
          ] },
        { "id": "current_site", "type": "short_text",
          "prompt": "What's the current site's address?",
          "placeholder": "https://",
          "show_if": { "question": "service_type", "op": "eq", "value": "redesign" } },
        { "id": "budget", "type": "number", "prompt": "Rough budget?",
          "help": "A ballpark is fine — it tells us which options to bring.",
          "min": 0, "unit": "USD" },
        { "id": "goals", "type": "long_text",
          "prompt": "What does success look like six months in?", "rows": 5,
          "examples": [
            "Double demo signups by Q4",
            "Stop losing mobile visitors at checkout"
          ] },
        { "id": "referral_source", "type": "multi_choice",
          "prompt": "How did you hear about us?", "min": 1, "max": 2,
          "options": [
            { "value": "search", "label": "Search" },
            { "value": "referral", "label": "A referral" },
            { "value": "social", "label": "Social media" },
            { "value": "other", "label": "Somewhere else" }
          ] }
      ]
    }
  ],
  "settings": {
    "completion": { "message": "Thanks — we'll review this before the call." }
  }
}

Why it's shaped this way

The statement at the top isn't a question — it's an info panel with a title and a body array of paragraphs, and it collects nothing. Use it to set expectations ("this is short, it autosaves") so people actually finish.

The current_site question only appears when someone picks the redesign option, via show_if: one condition referencing an earlier question (question / op / value). New-build and retainer clients never see it, and hidden questions are never required — so nobody gets stuck on a field that doesn't apply to them.

The two sections — contact, then project — each render as their own page, so the easy identity questions come first and the thinking questions get a screen of their own.

Customize it with an AI assistant

Because the template is plain JSON against a documented schema, any AI assistant that has read quizgen.dev/llms.txt can reshape it reliably: swap service_type options for photography packages, add a date question for the event, change the budget unit — then POST the result. That's the whole point of a headless form service: the template is data, not screenshots of someone else's form builder.

Want it to qualify leads too?

Intake gathers the details; qualification scores them. If you want this form to also sort respondents into "book a call now" vs. "nurture," add an outcomes block with points per answer and score buckets — we've written that up separately in the lead-qualification form that scores itself, and the two combine cleanly in one definition.

Try it without an account

POST the template to https://quizgen.dev/api/v1/quizzes with no Authorization header and it goes live immediately as a sandbox quiz: 72-hour lifetime, capped at 10 responses, no updates or read-back. The response includes a claim_url — keep it, it's the only way to claim the quiz into a free account and keep its answers (you can also have it emailed by passing your address in an X-Creator-Email header). When you're ready for a permanent form, sign up free at quizgen.dev/login — then open the claim_url to keep this one, or connect https://quizgen.dev/mcp and authorize so every new form is permanent.


Full schema, question types, and endpoints: quizgen.dev/llms.txt.

$ curl quizgen.dev/blog/client-intake-form-template.md

This guide as raw markdown — no HTML for your agent to parse.

View .md

Keep reading