Skip to content
All templates

Surveys 3 steps · 9 fields

Product-market fit survey

The Sean Ellis “how disappointed would you be” survey, plus a short exit path for people who stopped.

Get a hosted link and a responses inbox in a minute. No backend, no credit card.

Or set it up yourself

Live preview

Form definition JSON · 99 lines
{  "id": "product-market-fit-survey",  "title": "Help us improve",  "submit": { "label": "Send answers" },  "steps": [    {      "id": "fit",      "title": "Your experience",      "fields": [        {          "key": "disappointment",          "type": "radio",          "label": "How would you feel if you could no longer use the product?",          "options": [            { "value": "very", "label": "Very disappointed" },            { "value": "somewhat", "label": "Somewhat disappointed" },            { "value": "not", "label": "Not disappointed" },            {              "value": "stopped",              "label": "I already stopped using it"            }          ],          "validation": { "required": true }        },        {          "key": "role",          "type": "select",          "label": "What best describes your role?",          "options": [            { "value": "engineering", "label": "Engineering" },            { "value": "product", "label": "Product" },            { "value": "design", "label": "Design" },            { "value": "marketing", "label": "Marketing" },            { "value": "sales", "label": "Sales" },            { "value": "support", "label": "Customer support" },            { "value": "operations", "label": "Operations" },            { "value": "executive", "label": "Founder or executive" },            { "value": "other", "label": "Other" }          ]        }      ]    },    {      "id": "value",      "title": "What it does for you",      "show": [{ "field": "disappointment", "neq": "stopped" }],      "fields": [        {          "key": "idealUser",          "type": "textarea",          "label": "What type of people do you think would benefit most from it?",          "rows": 2        },        {          "key": "benefit",          "type": "textarea",          "label": "What is the main benefit you get from it?",          "rows": 3,          "validation": { "required": true }        },        {          "key": "improve",          "type": "textarea",          "label": "How could we make it better for you?",          "rows": 3        },        {          "key": "alternative",          "type": "text",          "label": "What would you use instead if it were gone?"        },        {          "key": "discovery",          "type": "text",          "label": "How did you discover the product?"        }      ]    },    {      "id": "stopped",      "title": "Why you stopped",      "show": [{ "field": "disappointment", "eq": "stopped" }],      "fields": [        {          "key": "stopReason",          "type": "textarea",          "label": "Why did you stop using it?",          "rows": 3,          "validation": { "required": true }        },        {          "key": "replacement",          "type": "text",          "label": "What do you use now?"        }      ]    }  ]}

Use it with the npm packages ​

Copy the JSON into a file in your app, install the renderer and pass the definition to it. The same JSON works with @formhaus/vue.

sh
npm i @formhaus/core @formhaus/react
tsx
import { FormRenderer } from '@formhaus/react';
import '@formhaus/core/style.css';
import definition from './form.json';

export function Form() {
  return (
    <FormRenderer
      definition={definition}
      onSubmit={(values) => console.log(values)}
    />
  );
}

See Getting started for validation, steps and custom components.

Formhaus is MIT licensed. Legal