<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gavin Henderson</title>
    <description>The latest articles on Forem by Gavin Henderson (@gavinhenderson).</description>
    <link>https://forem.com/gavinhenderson</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F219876%2Ff4dea9ed-e807-4c8d-a344-ff13978a454c.jpeg</url>
      <title>Forem: Gavin Henderson</title>
      <link>https://forem.com/gavinhenderson</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gavinhenderson"/>
    <language>en</language>
    <item>
      <title>Tripetto Alternative: A Comprehensive Comparison with SurveyJS</title>
      <dc:creator>Gavin Henderson</dc:creator>
      <pubDate>Thu, 29 Aug 2024 19:15:28 +0000</pubDate>
      <link>https://forem.com/gavinhenderson/tripetto-alternative-a-comprehensive-comparison-with-surveyjs-1i1p</link>
      <guid>https://forem.com/gavinhenderson/tripetto-alternative-a-comprehensive-comparison-with-surveyjs-1i1p</guid>
      <description>&lt;p&gt;This article is going to walk you through two form libraries for the web, &lt;a href="https://surveyjs.io/" rel="noopener noreferrer"&gt;SurveyJS&lt;/a&gt; and &lt;a href="https://tripetto.com/" rel="noopener noreferrer"&gt;Tripetto&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Forms are a crucial part of the user journey on every website in 2024. We use it for everything like collecting basic information about users when they sign up to our site or allowing users to book an appointment, or fill out an application.&lt;/p&gt;

&lt;p&gt;As a developer it can be hard to keep up with the ever changing demands that your business has on their forms. If you are manually coding  all your forms it’s going to be time consuming to build new features but if you go for a fully managed form system, like Typeform, you lack the control you might need.&lt;/p&gt;

&lt;p&gt;This is where form management platforms like SurveyJS and Tripetto come into their own, as they take all the hard work out of building forms but still leave you with the option to create advanced features and integrate with the rest of your system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro to Tripetto
&lt;/h2&gt;

&lt;p&gt;Tripetto is a suite of products that allows you to create and show forms to your users. They offer a fully hosted version of their form tools, a wordpress plugin and an &lt;a href="https://tripetto.com/sdk/" rel="noopener noreferrer"&gt;SDK to integrate into your own application.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article will focus on the SDK as it compares best to SurveyJS in terms of how you use it. All of the different Tripetto products are built using their SDK so most of this article is applicable to all of their product suite.&lt;/p&gt;

&lt;p&gt;Tripetto takes a front-end only approach to their form SDK which means that they give you all the front-end libraries to create and show forms but they don’t give you anything to store your forms or your form submissions. The benefit of this is you can integrate directly into your backend, but downside is that it can be extra work to store your forms and results.&lt;/p&gt;

&lt;p&gt;Tripetto works by using JSON based definitions, for your forms. Once you have created the form in the studio you will get access to a JSON version of the form which you can then pass into the form runner to display to your users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro to SurveyJS
&lt;/h2&gt;

&lt;p&gt;SurveyJS is a similar suite of products that also allows you to create and show forms to your users.&lt;/p&gt;

&lt;p&gt;It takes a similar front-end only approach. This approach makes sense given that forms only exist on the front end, everything after that is just standard data handling that every web application will already do.&lt;/p&gt;

&lt;p&gt;Once the data reaches the backend you are free to save the data any way you like. This means that you can save it into your custom backend with ease and take advantage of all that great authentication you have already built. It also means that you don't have to worry about another third party handling your data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1u0sfmrvrtfmxqq04py.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1u0sfmrvrtfmxqq04py.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://surveyjs.io/documentation/backend-integration" rel="noopener noreferrer"&gt;The diagram above shows the design&lt;/a&gt; ethos of SurveyJS excellently. Everything in the 'client' section is within the domain of SurveyJS and they build those for you. Everything on the 'server' section is totally up to you, so it will seamlessly integrate with your existing backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creation
&lt;/h2&gt;

&lt;p&gt;Let's start with SurveyJS. To get access to the form creator you are going to have to integrate it into your existing UI. Alternatively, you can use their hosted &lt;a href="https://surveyjs.io/create-free-survey" rel="noopener noreferrer"&gt;MySurvey&lt;/a&gt; tool, which serves as a full-featured form builder demo. It allows you to try out the form builder UI and build form JSON files without having to integrate the form builder into your application.&lt;/p&gt;

&lt;p&gt;SurveyJS provides support for every common front-end framework that you could imagine, and even the ones you couldn't. They support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular&lt;/li&gt;
&lt;li&gt;Vue&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vanilla JS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's really straightforward to integrate the form creator into your existing application. For example to add it your Vue application all you need to do is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ICreatorOptions&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;survey-creator-core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SurveyCreatorModel&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;survey-creator-core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;creatorOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ICreatorOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;showLogicTab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;isAutoSave&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SurveyCreatorModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;creatorOptions&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;SurveyCreatorComponent&lt;/span&gt; &lt;span class="na"&gt;:model=&lt;/span&gt;&lt;span class="s"&gt;"creator"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The output of the form builder in SurveyJS is a JSON object which we will use later with the &lt;a href="https://surveyjs.io/form-library/documentation/overview" rel="noopener noreferrer"&gt;form rendering library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The form creator itself is a very nice modern UI that is extremely interactive and feels very snappy. You can drag and drop questions without thinking about it and everything is intuitively where you would expect it to be, which is a tough job when there are so many settings. It even works pretty well on a mobile device which is pretty incredible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvs6myecvolbexrnv8ya8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvs6myecvolbexrnv8ya8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It has all the field types that you would expect from a form builder. It has standard text inputs, checkboxes, radio groups (including matrixes) and drop-downs. There are a few drop-downs that you might not expect but could be very handy. There is a ranking field allowing users to rank a set options top to bottom.&lt;/p&gt;

&lt;p&gt;They also have a &lt;a href="https://surveyjs.io/form-library/examples/duplicate-group-of-fields-in-form/reactjs" rel="noopener noreferrer"&gt;grouping feature&lt;/a&gt;, that allows a respondent to answer a set of questions multiple times if they need to. For example, they can add multiple contact people and fill in each of their details separately. An image picker, allowing a user to select from a group of images. Lastly it even has the ability to accept signatures which is a nice addition.&lt;/p&gt;

&lt;p&gt;If you find that you are missing a field type you can add your own type. &lt;a href="https://surveyjs.io/form-library/documentation/customize-question-types/create-specialized-question-types" rel="noopener noreferrer"&gt;They have a nice example in the documentation about how to go about doing that.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When it comes to logic it allows you to do everything you could possibly imagine using a dedicated GUI. You can hide questions, answer questions and reset answers. You can do this by defining as many 'rules' as you want, by setting a condition and an action depending on the condition. To developers this will feel familiar as it presents as a giant if statement.&lt;/p&gt;

&lt;p&gt;It might take a while for a novice user to get around all the options, but once they figure out where everything is they will quickly find themselves setting up form logic with the intuitive logic options.&lt;/p&gt;

&lt;p&gt;Once you have the form built with all the fields and logic you want you can add translations to each question. You can add all the languages you want to support and input all your translations for the strings in each page. This makes it a breeze to translate large forms with complicated logic. &lt;a href="https://surveyjs.io/survey-creator/documentation/api-reference/survey-creator#onMachineTranslate" rel="noopener noreferrer"&gt;They even provide an API that lets you use machine translation&lt;/a&gt;, for example Microsoft Translator, to quickly translate lots of strings and allows you to then manually correct any mistakes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3oj4fi6hs323ouo33oic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3oj4fi6hs323ouo33oic.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next let's take a look at the form builder available from Tripetto. Just like SurveyJS you can integrate it into your application using the SDK they give you. Tripetto also supports a list of popular frameworks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Angular&lt;/li&gt;
&lt;li&gt;Vanilla JS / HTML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is very straightforward to add the creator to your existing application, here is an example in React:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TripettoBuilder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@tripetto/builder/react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@tripetto/block-calculator&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@tripetto/block-checkbox&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@tripetto/block-checkboxes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@tripetto/block-date&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Import the rest of the blocks you want to enable&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ExampleApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Example&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TripettoBuilder&lt;/span&gt;
        &lt;span class="nx"&gt;onSave&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Form saved!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}}&lt;/span&gt;
      &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Rendering the TripettoBuilder component will then display the entire builder in a full page mode. You can pass through your CSS classes to style the form container however you want.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal9xobujg6ubhabraol4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal9xobujg6ubhabraol4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overall the Tripetto form builder has a nice and pleasing user-interface. It is a bit quirky in a few places, for example it scrolls to the left and right with different settings panels, but you get over those very quickly. It's also quite robust, no matter how complex your form logic gets it is always snappy and easy to use.&lt;/p&gt;

&lt;p&gt;They have all of the question types that you would expect to see inside a modern form builder. They have multiple text types and also have a matrix option which is really great for getting customer feedback.&lt;/p&gt;

&lt;p&gt;Tripetto has a similar grouping feature to SurveyJS, except they call it iteration. When you start to do these more complex form flows then the Tripetto flow editor really comes into its own as a form builder. &lt;/p&gt;

&lt;p&gt;Rather than showing a preview of the form on the main panel you are shown a representation of the ‘flow’ of the form. This allows you to really easily see complicated conditional forms at a quick glance and understand how they all go together. However, I find that the flow view they give you is confusing when you are creating a simple flow with just a few questions. &lt;/p&gt;

&lt;p&gt;Tripetto also offers you the ability to translate your forms easily through their builder UI. You simply select your new target language and then you are prompted to complete a translation for each section of the form. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffl1guxnsyg7gpytgrnom.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffl1guxnsyg7gpytgrnom.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Filling
&lt;/h2&gt;

&lt;p&gt;Next up let's look at the experience users will have when they come to complete a form in the system. &lt;/p&gt;

&lt;p&gt;First let's take a look at how Tripetto handles form viewing. In the editor you can set what colours and font you want the form to use so you can match it to your branding.&lt;/p&gt;

&lt;p&gt;The other thing you can set is the ‘form face’ which really changes how the form looks and acts entirely. Let's start with the default form face which is ‘autoscroll’. This is clearly modelled closely on the interface typeform uses, which is not a bad thing but it's certainly unoriginal. I personally think it's a bit of a gimmick, it stops you exploring the whole form and forces you to complete the form in the right order.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9e9bw4l2zev6oq04vxvc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9e9bw4l2zev6oq04vxvc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another ‘form face’ they have is called ‘chat’. It's a unique way of displaying forms as a chat conversation rather than a normal form. It is a clever idea and they have made it look great and it could easily convince people they are interacting with a person or a chat bot. However, I think it is totally impractical, it essentially acts as a chatbot that you can never reach a person through, which as a user is very frustrating, for this reason I wouldn’t recommend using it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9e01296uqjjot7ca1g4j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9e01296uqjjot7ca1g4j.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lastly the best form face is ‘classic’ which acts exactly how you would expect a form to work. It is very responsive and works well on all size devices and it feels snappy with quick error messages when you incorrectly fill out a form.&lt;/p&gt;

&lt;p&gt;To render the forms you use the Tripetto SDK which has a Runner component which renders the form with the ‘form face’ you chose.&lt;/p&gt;

&lt;p&gt;In general all of the form faces Tripetto offer look and feel very nice and they clearly have a talented design team that focuses on the small details.&lt;/p&gt;

&lt;p&gt;Next let's see how SurveyJS handles showing forms to users. To render the form you simply pass JSON object the form creator gives you into the survey component the like so:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Survey&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;survey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;applyTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;themeJson&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onComplete&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Form filled!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SurveyReact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Survey&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The default form filling UI is simple and clean and responsive and feels like a top tier form.&lt;/p&gt;

&lt;p&gt;SurveyJS lets you do an exceptional amount of customisation. You can change every single colour that is shown on the form using a&lt;a href="https://surveyjs.io/form-library/documentation/manage-default-themes-and-styles#create-a-custom-theme" rel="noopener noreferrer"&gt; fully integrated CSS Theme Editors &lt;/a&gt;with a panel of UI controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;After users have submitted their form you probably want a way to access the results and view them. Tripetto provides no solution for this, after the user submits the data you are totally on your own to deal with the data and visualise it.&lt;/p&gt;

&lt;p&gt;On the other hand SurveyJS provides a &lt;a href="https://surveyjs.io/dashboard/documentation/overview" rel="noopener noreferrer"&gt;'Dashboard' library&lt;/a&gt; to allow you to analyse your results in a meaningful way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qtny4s10rzssgpg9ea9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qtny4s10rzssgpg9ea9.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You get access to just about any visualisation graph that you could think of. As with the rest of SurveyJS the customisation is pretty much unlimited. It's a really great way to get a high level overview of the results of your forms.&lt;/p&gt;

&lt;p&gt;The great thing with SurveyJS is that you can actually view the data however you want because you fully own it and control it. You can sync it to a Google Sheet if you want and view it there. You can view it in your company's existing business insights platform if you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility
&lt;/h2&gt;

&lt;p&gt;When publishing forms you need to make sure they are accessible for everyone, including users who rely on assistive technology. To measure this we can rely on the &lt;a href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noopener noreferrer"&gt;WCAG guidelines&lt;/a&gt; which describe how a website can be accessible.&lt;/p&gt;

&lt;p&gt;SurveyJS published an &lt;a href="https://surveyjs.io/accessibility-statement" rel="noopener noreferrer"&gt;Accessibility Statement &lt;/a&gt;outlining the commitment to accessibility and talks about all the standards they meet. This is something that is missing from FormEngine.&lt;/p&gt;

&lt;p&gt;SurveyJS is entirely keyboard accessible which means it can be accessed using alternative access methods.&lt;/p&gt;

&lt;p&gt;However, SurveyJS falls short in a few minor ways. For example it has some contrast issues in a few places as well as missing or incorrect labelling on elements.&lt;/p&gt;

&lt;p&gt;Tripetto doesn’t have anything on their website about their approach to accessibility within their platform. The Tripetto editor fails the most basic accessibility tests, for example you can’t access it in any meaningful way using the keyboard. A screen reader wouldn’t work well either because there are aria tags missing or wrong across the whole editor.&lt;/p&gt;

&lt;p&gt;When I took a look at the form pages themselves it didn't get much better. The elements are also missing aria tags. The form is just about keyboard accessible, but it deviates from the standard keyboard controls in many ways.&lt;/p&gt;

&lt;p&gt;If accessibility matters to you, which it should, then you can only go with SurveyJS as Tripetto is missing the basics to support users of assistive technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;When it comes to pricing it's not straightforward to compare these two as they have multiple pieces to them.&lt;/p&gt;

&lt;p&gt;For the SDK Tripetto gives you a few ways you can choose to pay for the SDK. If you only want to access the form runner then you need to pay £758.66 per year, this cost only covers one ‘form face’, you have to pay for a full new runner licence per form face.&lt;/p&gt;

&lt;p&gt;If you want to use the builder on your own webpages then you need to buy a builder licence too. The cheapest builder licence is £589.20 per year, that gives you access to all the standard questions types and allows you to have 5 users setup on the builder, if you want more users you have to pay extra. If you want to allow custom question types then you have to pay for the more expensive £3203.14 per year builder licence.&lt;/p&gt;

&lt;p&gt;If you want the cheapest builder and runner combination then you are looking at paying £1347.86 per year.&lt;/p&gt;

&lt;p&gt;SurveyJS on the other hand takes a totally different approach to pricing. They &lt;a href="https://github.com/surveyjs" rel="noopener noreferrer"&gt;publish all of their libraries on Github&lt;/a&gt; for you to install and try out entirely for free. However, if you want to use their products for any commercial uses then you have to look into buying a commercial licence. &lt;a href="https://www.npmjs.com/package/survey-core" rel="noopener noreferrer"&gt;Their core survey rendering library &lt;/a&gt;is MIT licensed which means it's free to use even for commercial uses. If you want to use the Survey Creator then you have to buy a 'Basic' licence for ~£422. If you want the Survey Creator, Dashboard and PDF Generator then you need a 'Pro' licence for ~£760.&lt;/p&gt;

&lt;p&gt;The commercial licences from SurveyJS are perpetual meaning that you can use the software for the entirety of your lifetime, but to access updates and support you will have to renew your licence every 12 months. SurveyJS licence key can be used with a specific domain or group of domains and it will also work for subdomains within the specified domain or group without additional payment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Overall both platforms are easy to use and have really nice user interfaces. They both let you build up your forms on their builder and then render them using their form runner library.&lt;/p&gt;

&lt;p&gt;The biggest drawback for Tripetto is the lack of accessibility on their entire platform. They also have a steeper price which comes with more restrictions. However, their API design is really excellent, which makes it super simple to setup and integrate into your application. &lt;/p&gt;

&lt;p&gt;SurveyJS on the other hand takes a serious approach to accessibility. If you want the ability to visualise your results out of the box then SurveyJS is your only option.&lt;/p&gt;

&lt;p&gt;Overall, both SurveyJS and Tripetto are good options to help you build forms and display them to users. They are both really intuitive and easy to use.&lt;/p&gt;

&lt;p&gt;I would encourage you to give them both a try and pick what works best for your needs!&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>react</category>
    </item>
    <item>
      <title>FormEngine Alternative: A Comprehensive Comparison with SurveyJS</title>
      <dc:creator>Gavin Henderson</dc:creator>
      <pubDate>Thu, 01 Aug 2024 19:32:23 +0000</pubDate>
      <link>https://forem.com/gavinhenderson/formengine-alternative-a-comprehensive-comparison-with-surveyjs-4m5a</link>
      <guid>https://forem.com/gavinhenderson/formengine-alternative-a-comprehensive-comparison-with-surveyjs-4m5a</guid>
      <description>&lt;p&gt;Forms sit at the heart of every good web application. As soon as you enter a web application you are filling out a form, from sign up all the way to completing a checkout flow.&lt;/p&gt;

&lt;p&gt;The more businesses go online the first thing they do is set up online forms to help them reduce manual paperwork. Often times these forms can be complex and people expect complex validation and the form to adapt as its filled in.&lt;/p&gt;

&lt;p&gt;It can be very hard to build good experiences with forms and they can go wrong in many many ways. At first forms seem like a simple thing to build but as you add more fields and forms the edge cases grow exponentially.&lt;/p&gt;

&lt;p&gt;This article will compare two survey software tools, SurveyJS and FormEngine, and outline the pros and cons of each.&lt;/p&gt;

&lt;h1&gt;
  
  
  Intro to SurveyJS
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://surveyjs.io/" rel="noopener noreferrer"&gt;SurveyJS&lt;/a&gt; is a suite of products that all compliment each other to make building, publishing and managing forms easy.&lt;/p&gt;

&lt;p&gt;SurveyJS takes a 'front-end only' approach to forms, which makes sense given that forms only exist on the front end, everything after that is just standard data handling.&lt;/p&gt;

&lt;p&gt;Once the data reaches the backend you are free to save the data any way you like. This means that you can save it into your custom backend with ease and take advantage of all that great authentication you have already built. It also means that you don't have to worry about another third party handling your data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fldcx53s25y5emhua9gx9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fldcx53s25y5emhua9gx9.png" alt="Image description" width="800" height="678"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://surveyjs.io/documentation/backend-integration" rel="noopener noreferrer"&gt;The diagram above shows the design&lt;/a&gt; ethos of SurveyJS excellently. Everything in the 'client' section is within the domain of SurveyJS and they build those for you. Everything on the 'server' section is totally up to you, so it will seamlessly integrate with your existing backend.&lt;/p&gt;

&lt;p&gt;The downside is, if you want to build and publish a single form you are going to have to build up your own backend for that.&lt;/p&gt;

&lt;h1&gt;
  
  
  FormEngine
&lt;/h1&gt;

&lt;p&gt;Next up lets take a look at &lt;a href="https://formengine.io/" rel="noopener noreferrer"&gt;FormEngine&lt;/a&gt;, which is a set of tools to help you build and deploy your forms within your React apps. FormEngine is built by &lt;a href="https://optimajet.com/" rel="noopener noreferrer"&gt;Optimajet&lt;/a&gt; who have been in the form business for a while now, they originally developed FormBuilder, which was a React based form designer and viewer. FormEngine is the next generation of their form designer and form viewer, built from the modern web.&lt;/p&gt;

&lt;p&gt;FormEngine is distributed as a React package that you can install in your existing application. The two main components they give you are a Form Builder component and a Form Viewer component.&lt;/p&gt;

&lt;p&gt;FormEngine also takes a 'front-end' only approach to managing forms, leaving you to store and manage the data any way you want. In respect to data storage, SurveyJS and FormEngine have the same set of trade-offs.&lt;/p&gt;

&lt;h1&gt;
  
  
  Form Building
&lt;/h1&gt;

&lt;p&gt;The place that you are likely to spend the most time is the form builder, so its important that you find it easy to use and that it lets you do everything you need.&lt;/p&gt;

&lt;p&gt;Lets start with SurveyJS. To get access to the form creator you are going to have to integrate it into your existing UI. Alternatively, you can use their hosted &lt;a href="https://surveyjs.io/service/mysurveys" rel="noopener noreferrer"&gt;MySurvey&lt;/a&gt; tool, which serves as a full-featured form builder demo. It allows you to try out the form builder UI and build form JSON files without having to integrate the form builder into your application.&lt;/p&gt;

&lt;p&gt;SurveyJS provides support for every common front-end framework that you could imagine, and even the ones you couldn't. They support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Angular&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vue&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Knockout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;jQuery&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its really straight forward to integrate the form creator into your existing application. For example to add it your Angular application all you need is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;OnInit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SurveyCreatorModel&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;survey-creator-core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;survey-creator-component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./survey-creator.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;styleUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./survey-creator.component.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SurveyCreatorComponent&lt;/span&gt; &lt;span class="kr"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;OnInit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;surveyCreatorModel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SurveyCreatorModel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;ngOnInit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SurveyCreatorModel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;showLogicTab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;isAutoSave&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;surveyCreatorModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output of the form builder in SurveyJS is a JSON object which we will use later with the form rendering library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flzo9jj1vyvnyqdjda3x9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flzo9jj1vyvnyqdjda3x9.png" alt="Image description" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The form creator itself is a very nice modern UI that is extremely interactive and feels very snappy. You can drag and drop questions about without thinking about it and everything is intuitively where you would expect it to be, which is a tough job when there are so many settings. It even works pretty well on a mobile device which is pretty incredible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwkxkalf1pqmit1t9euf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwkxkalf1pqmit1t9euf.png" alt="Image description" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It has all the field types that you would expect from a form builder. It has standard text inputs, checkboxes, radio groups (including matrixes) and drop-downs. There is a few drop-downs that you might not expect but could be very handy. There is a ranking field allowing users to rank a set options top to bottom.&lt;/p&gt;

&lt;p&gt;They also have a grouping feature, that allows a respondent to answer a set of questions multiple times if they need to. For example, they can add multiple contact people and fill in each of their details separately. An image picker, allowing a user to select from a group of images. Lastly it even has the ability to accept signatures which is a nice addition.&lt;/p&gt;

&lt;p&gt;If you find you that you are missing a field type you can add your own type. &lt;a href="https://surveyjs.io/form-library/documentation/customize-question-types/create-specialized-question-types" rel="noopener noreferrer"&gt;They have a nice example in the documentation about how to go about doing that&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When it comes to logic it allows you to do everything you could possibly imagine using a dedicated GUI. You can hide questions, answer questions and reset answers. You can do this by defining as many 'rules' as you want, by setting a condition and an action depending on the condition. To developers this will feel familiar as it presents as a giant if statement.&lt;/p&gt;

&lt;p&gt;It might take a while for a novice users to get around all the options, but once they figure out where everything in they will quickly find themselves setting up form logic with the intuitive logic options.&lt;/p&gt;

&lt;p&gt;Once you have the form built with all the fields and logic you want you can add translations to each question. You can add all the languages you want to support and input all your translations for the strings in each page. This makes it a breeze to translate large forms with complicated logic. They even &lt;a href="https://surveyjs.io/survey-creator/documentation/api-reference/survey-creator#onMachineTranslate" rel="noopener noreferrer"&gt;provide an API that lets you use machine translation&lt;/a&gt;, for example Microsoft Translator, to quickly translate lots of strings and allows you to then manually correct any mistakes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fum32lq9cr3p0gfvbsfag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fum32lq9cr3p0gfvbsfag.png" alt="Image description" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next up lets take a look at FormEngine. Similar to SurveyJS you need to render the form builder into an application to use. Its worth noting that they only support React so if you want to integrate with any other framework you won't be able to use FormEngine.&lt;/p&gt;

&lt;p&gt;Rendering the builder is slightly more involved inside FormEngine but they give you many options to customise how you integrate it into your React app. Here is an example piece of code to render a basic form designer in FormEngine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Designer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FormBuilder&lt;/span&gt;
      &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;builderView&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;getForm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;getFormFn&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;formName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;formName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;initialData&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{({})}&lt;/span&gt;
      &lt;span class="nx"&gt;formStorage&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;formStorage&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;localize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;localizeFn&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;onFormDataChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{({&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;onFormDataChange&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;}}&lt;/span&gt;
      &lt;span class="nx"&gt;viewerRef&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;setRef&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;validators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;customValidators&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;
        &lt;span class="na"&gt;logEventArgs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;assertArgs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ActionDefinition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;functionalAction&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;boolean&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;p3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;}}&lt;/span&gt;
    &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have rendered the form builder you can then start using it to build your forms. Like SurveyJS is uses a drag and drop interface, allow you to place the fields anywhere inside the form. They provide all the standard field types, including what they call 'pattern format' which allows you to create grids which are commonly used to rate an experience on a scale.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5ie36uuu3myrmfo6eop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5ie36uuu3myrmfo6eop.png" alt="Image description" width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can edit the style of each field individually. It gives you the basic options in a user interface but it also lets you enter CSS for the field directly inside of the designer. I would like to see a way to edit all the field styles at once, so that you can apply a theme.&lt;/p&gt;

&lt;p&gt;The form designer lets you customise the behaviour of the form via rules, actions and the 'render when' property. The 'render when' property is what you would use to show or hide a question based on the answers given in other questions. Its not particularly easy to use as you have to programmatically reference other questions, there is no user interface to it. The rules section lets you set validation rules to for the form field, it has a lot of really nice default validation rules you can use on most fields and it also has a nice custom mode where you define the validation yourself.&lt;/p&gt;

&lt;p&gt;Lastly, there is an 'Actions' section that shows you all the different triggers every field has, for example 'onChange', and lets you decide what action to do when the event happens. For example you can force a field to validate after a given action.&lt;/p&gt;

&lt;p&gt;Overall the drag and drop editor in FormEngine is nice to use if you just want to put fields in your form and change what they look like. However, if you want to show and hide fields based on rules then its really difficult and poorly documented. This is a really basic feature that every form editor needs to have so its surprising that its as good as the rest of the editor.&lt;/p&gt;

&lt;p&gt;Someone who is not technical would struggle to use anything more than the basic form fields inside of FormEngine. The fact that you need to understand basic code to show or hide fields locks many people out of using it. The 'actions' tab is also clearly built for developers as it references functions like 'onChange', which will be very familiar to a developer but won't be much help to a non technical person.&lt;/p&gt;

&lt;h1&gt;
  
  
  Form Viewing
&lt;/h1&gt;

&lt;p&gt;First up is SurveyJS and its form filling experience. To render the form you simply pass JSON object the form creator gives you into the survey component the like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Survey&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;survey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;applyTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;themeJson&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onComplete&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Form filled!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SurveyReact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Survey&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default form filling UI is simple and clean and its responsive and feels like a top tier form.&lt;/p&gt;

&lt;p&gt;SurveyJS lets you do an exceptional amount customisation. You can change every single colour that is shown on the form using a &lt;a href="https://surveyjs.io/form-library/documentation/manage-default-themes-and-styles#create-a-custom-theme" rel="noopener noreferrer"&gt;fully integrated CSS Theme Editors with a panel of UI controls.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FormEngine also has a top tier FormView which is rendered in a similar way to SurveyJS via their React library. All of their components are based on the popular component library RSuite components which makes them great to use and they look great. The UI of the forms is responsive and gives users great feedback.&lt;/p&gt;

&lt;p&gt;Overall, both display forms as you would expect them to and are very responsive.&lt;/p&gt;

&lt;h1&gt;
  
  
  Form Results
&lt;/h1&gt;

&lt;p&gt;After users have submitted their form you probably want a way to access the results and view them. FormEngine provides no solution for this, after the user submits the data you are totally on your own to deal with the data and visualising it.&lt;/p&gt;

&lt;p&gt;Its worth noting the Optimajet also sell a a product called &lt;a href="https://workflowengine.io/" rel="noopener noreferrer"&gt;'WorkflowEngine'&lt;/a&gt;, which you can use to process your data. That being said there is no native integration between WorkflowEngine and FormEngine and it is a separate product with an additional cost which is why I have not included it in this comparison.&lt;/p&gt;

&lt;p&gt;On the other hand SurveyJS provides a &lt;a href="https://surveyjs.io/dashboard/documentation/overview" rel="noopener noreferrer"&gt;'Dashboard' library&lt;/a&gt; to allow you to analyse your results in a meaningful way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4n7puqx6p7x56uqem7em.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4n7puqx6p7x56uqem7em.png" alt="Image description" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You get access to just about any visualisation graph that you could think of. As with the rest of SurveyJS the customisation is pretty much unlimited. Its a really great way to get a high level overview of the results of your forms.&lt;/p&gt;

&lt;p&gt;The great thing with SurveyJS is that you can actually view the data however you want because you fully own it and control it. You can be syncing it to a Google Sheet if you wanted and view it there. You can view it in your companies existing business insights platform if you want.&lt;/p&gt;

&lt;h1&gt;
  
  
  Custom Components
&lt;/h1&gt;

&lt;p&gt;Both platforms have a great variety of form components to choose from, but there will always be cases where you want to create a custom component. When you do create a custom component you will want to access it within the form builder and the form viewer. Both platforms let you create custom components, so lets take a look at how you do it and which is easier and more flexible to use.&lt;/p&gt;

&lt;p&gt;First lets take a look at SurveyJS and how to add a custom component using their React library, &lt;a href="https://surveyjs.io/form-library/documentation/overview#get-started" rel="noopener noreferrer"&gt;although you can do it in all the frameworks they support&lt;/a&gt;. To add a custom component to your form stack in SurveyJS you have to extend their existing &lt;code&gt;Question&lt;/code&gt; class and define your own custom properties. The code below defines a color picker model and then sets two custom properties that you can use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Question&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;survey-core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CUSTOM_TYPE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;color-picker&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;QuestionColorPickerModel&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Question&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;getType&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;CUSTOM_TYPE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;colorPickerType&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPropertyValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;colorPickerType&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="nf"&gt;colorPickerType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setPropertyValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;colorPickerType&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;disableAlpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPropertyValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;disableAlpha&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="nf"&gt;disableAlpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setPropertyValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;disableAlpha&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have created the model you must register it as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;ElementFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CUSTOM_TYPE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;QuestionColorPickerModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SurveyJS heavily relies on JSON to store the models of the surveys, because of this we have to setup how we want our new question to be serialised. The code below hooks into the existing serializer to define how to serialize the new question type to JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Serializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;CUSTOM_TYPE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;colorPickerType&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Slider&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Slider&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sketch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Compact&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;general&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;visibleIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; 
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;disableAlpha:boolean&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;dependsOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;colorPickerType&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;visibleIf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;colorPickerType&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sketch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;general&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;visibleIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="c1"&gt;// Place after the Name, Title, and Color Picker Type&lt;/span&gt;
  &lt;span class="p"&gt;}],&lt;/span&gt;
  &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;QuestionColorPickerModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;question&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After we have fully setup the model we need to move onto setting up the component that is going to be rendered. Again we do this by extending a SurveyJS class and defining the parts that are specific to our custom component. The code below defines the &lt;code&gt;ColorPicker&lt;/code&gt; question which tells SurveyJS how to render the colour picker component given the fields defined by the model we created earlier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SurveyQuestionColorPicker&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;SurveyQuestionElementBase&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;question&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;questionBase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;disableAlpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disableAlpha&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;colorPickerType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;handleColorChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// Support the read-only and design modes&lt;/span&gt;
  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;style&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPropertyValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;readOnly&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isDesignMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;pointerEvents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;renderColorPicker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Slider&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SliderPicker&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handleColorChange&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sketch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SketchPicker&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handleColorChange&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;disableAlpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disableAlpha&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Compact&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CompactPicker&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handleColorChange&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Unknown&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;renderElement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renderColorPicker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lastly, you have to register the component using &lt;code&gt;ReactQuestionFactory.Instance.registerQuestion&lt;/code&gt;. There is lots of other things you can do with SurveyJS custom components that I haven't shown, like specify the icon to use or captions. &lt;a href="https://surveyjs.io/form-library/documentation/customize-question-types/create-specialized-question-types" rel="noopener noreferrer"&gt;If you want to know more you can read the documentation on how to change other parts of the custom component here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next lets take a look at &lt;a href="https://formengine.io/documentation/custom-components" rel="noopener noreferrer"&gt;how to add a custom component&lt;/a&gt; in FormEngine. The first step is to define a component using the constants they give to you. The below example creates a basic button custom component, this means you can have a totally custom designed button.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mui/material&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;oneOf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@react-form-builder/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NewButton&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;props&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;named&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Caption&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;oneOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;inherit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secondary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;info&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warning&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have created the component and designed it you need to pass it into the builder when you render it as well as the form view renderer so it can also render the custom component whenever its used. The code below describes how to connect it to the builder and to the form viewer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builderView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BuilderView&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;newButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()])&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createView&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;newButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you have done all of those steps you will be able to access your custom component in both the editor and the viewer with all the options that you have specified.&lt;/p&gt;

&lt;h1&gt;
  
  
  Pricing
&lt;/h1&gt;

&lt;p&gt;When it comes to pricing its not straight forward to compare these two as they have multiple pieces to them.&lt;/p&gt;

&lt;p&gt;First up lets take a look at the &lt;a href="https://formengine.io/pricing/" rel="noopener noreferrer"&gt;pricing for FormEngine&lt;/a&gt;. They provide two ways of paying, you can either buy a perpetual license or you can pay for a subscription.&lt;/p&gt;

&lt;p&gt;The cheapest perpetual license ~£702 for the 'Startup' license, which gets you access to pretty much the whole product. It comes with 6 months worth of updates and 2 months of support, because it is a perpetual license you can choose to use the same version forever at no extra cost. The other perpetual licenses cost more and they give you more support or updates as well as permission to use your license on more subdomains. They also offer additional support packages that you can pick from.&lt;/p&gt;

&lt;p&gt;As well as the perpetual licenses you can choose to pay for a subscription to FormEngine. Their cheapest subscription is ~£1171 per year, which give you access to FormEngine on all your subdomains as well as access to updates for as long as you pay the subscription. They have a lot of pricing options so if you want to learn more its worth reaching out to them to get access to their pricing options.&lt;/p&gt;

&lt;p&gt;SurveyJS on the other hand takes a totally different approach to pricing. The &lt;a href="https://github.com/surveyjs" rel="noopener noreferrer"&gt;publish all of their libraries on Github&lt;/a&gt; for you to install and try out entirely for free. However, if you want to use their products for any commercial uses then you have to look into buying a commercial license. &lt;a href="https://www.npmjs.com/package/survey-core" rel="noopener noreferrer"&gt;Their core survey rendering library&lt;/a&gt; is MIT licensed which means its free to use even for commercial uses. If you want to use the Survey Creator then you have to buy a 'Basic' license for ~£422. If you want the Survey Creator, Dashboard and PDF Generator then you need a 'Pro' license for ~£760.&lt;/p&gt;

&lt;p&gt;The commercial licenses are perpetual meaning that you can use the software for the entirety of your lifetime, but to access updates and support you will have to renew your license every 12 months. SurveyJS license key can be used with a specific domain or group of domains and it will also work for subdomains within the specified domain or group without additional payment.&lt;/p&gt;

&lt;h1&gt;
  
  
  Accessibility
&lt;/h1&gt;

&lt;p&gt;When publishing forms you need to make sure they are accessible for everyone, including users who rely on assistive technology. To measure this we can rely on the &lt;a href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noopener noreferrer"&gt;WCAG guidelines&lt;/a&gt; which describe how a website can be accessible.&lt;/p&gt;

&lt;p&gt;SurveyJS published an &lt;a href="https://surveyjs.io/accessibility-statement" rel="noopener noreferrer"&gt;Accessibility Statement&lt;/a&gt; outlining the commitment to accessibility and talks about all the standards they meet. This is something that is missing from FormEngine.&lt;/p&gt;

&lt;p&gt;SurveyJS is entirely keyboard accessible which means it can be accessed using alternative access methods.&lt;/p&gt;

&lt;p&gt;However, SurveyJS falls short in a few minor ways. For example it has some contrast issues in a few places as well as missing or incorrect labeling on elements.&lt;/p&gt;

&lt;p&gt;If we take a look at accessibility within FormEngine we can see its something they have worked very hard on. Their entire UI is also keyboard accessible but they have also taken the time to carefully markup their entire application using &lt;code&gt;aria&lt;/code&gt; labels. This means that anyone using a screen reader can access the document fully.&lt;/p&gt;

&lt;p&gt;Both platforms will meet the needs of most users of assistive technology users but if its something that you have a specific need for its best to try out with your own assistive technology.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Overall, both &lt;a href="https://surveyjs.io/" rel="noopener noreferrer"&gt;SurveyJS&lt;/a&gt; and &lt;a href="//formengine.io"&gt;FormEngine&lt;/a&gt; are good options to help you build forms and display them to users. They are both really intuitive and easy to use.&lt;/p&gt;

&lt;p&gt;The main draw back with FormEngine is that it is only available for React so if you have any other framework within your existing system you won't be able to integrate with FormEngine. Overall, their UI has a really nice 'feel' to it, especially when adding in fields or designing the look of the form. However, when it comes to using it for larger forms if you are not a developer you will struggle to use it because of the language and paradigms used throughout.&lt;/p&gt;

&lt;p&gt;If you want to have the option to have visualisations then SurveyJS will be your only option as FormEngine doesn't give you any. You can build you own though based on the data, but that will be more work.&lt;/p&gt;

&lt;p&gt;I would encourage you to give them both a try and pick what works best for your needs!&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Form.io Alternative: A Comprehensive Comparison with SurveyJS</title>
      <dc:creator>Gavin Henderson</dc:creator>
      <pubDate>Thu, 01 Aug 2024 19:29:27 +0000</pubDate>
      <link>https://forem.com/gavinhenderson/formio-alternative-a-comprehensive-comparison-with-surveyjs-25d</link>
      <guid>https://forem.com/gavinhenderson/formio-alternative-a-comprehensive-comparison-with-surveyjs-25d</guid>
      <description>&lt;p&gt;All good businesses rely on data flowing between customers and the company. To let data flow into your company you can use forms to collect responses from customers. In the past these forms would have all been sent out and collected on paper and filed away, but as times move on this process is becoming increasingly digitised.&lt;/p&gt;

&lt;p&gt;Forms are hard to get right, especially as you want to include more complex forms. For example you might have a large multi-step application process. As businesses go more online forms are going to get more and more ambitious. This is why using a form management library can be helpful because it lets you manage the whole form lifecycle in a convenient UI.&lt;/p&gt;

&lt;p&gt;It's important to be careful where you stored your customers data. Most countries will have data protection laws you have to make sure you meet, even extra if you work with sensitive data. On top of that you need to make sure your data is stored securely against bad actors. Every time you introduce a third party provider into your technology stack you are increasing the risk that you won't meet these requirements, which is why lots of companies are opting to store their own data.&lt;/p&gt;

&lt;p&gt;This article article looks at two popular form management systems, Form.io and &lt;a href="https://surveyjs.io/" rel="noopener noreferrer"&gt;SurveyJS&lt;/a&gt;, which both allow you to maintain control of your data, but taking different approaches to do that.&lt;/p&gt;

&lt;h1&gt;
  
  
  Intro to Form.io
&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://form.io" rel="noopener noreferrer"&gt;Form.io&lt;/a&gt; is a company that provides a set of tools that you can use to build up your form system. It lets you build, publish and manage all your forms easily.&lt;/p&gt;

&lt;p&gt;They provide a full front-end and back-end solution to build and manage your forms. Their suite of tools is very extensive, letting you get the most of their products whilst letting you chose which parts best suit you.&lt;/p&gt;

&lt;p&gt;They ship their products as Docker containers, which you host in your own environment but you don't have to work to hard to get it deployed. Most cloud systems have native Docker support making it even easier. Their base system lets you build your forms and host them and collect responses. They then have additional parts if you want to build graphs from your results or if you want to generate PDFs of the submissions.&lt;/p&gt;

&lt;p&gt;Form.io also provides a hosted SAAS solution if you don't want to host it yourself. Their SAAS solution doesn't have all the features they offer in their self-hosted solution but its a really good option if you want to get started quickly.&lt;/p&gt;

&lt;h1&gt;
  
  
  Intro to SurveyJS
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://surveyjs.io/" rel="noopener noreferrer"&gt;SurveyJS&lt;/a&gt; is a suite of products that all compliment each other to make building, publishing and managing forms easy.&lt;/p&gt;

&lt;p&gt;SurveyJS takes a 'front-end only' approach to forms, which makes sense given that forms only exist on the front end, everything after that is just standard data handling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0m1mkrgclexf30l92xf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0m1mkrgclexf30l92xf.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the data reaches the backend &lt;a href="https://surveyjs.io/documentation/backend-integration#server-side-implementation" rel="noopener noreferrer"&gt;you are free to save the data any way you like.&lt;/a&gt; This means that you can save it into your custom backend with ease and take advantage of all that great authentication you have already built. It also means that you don't have to worry about another third party handling your data.&lt;/p&gt;

&lt;p&gt;The diagram above shows the design ethos of SurveyJS excellently. Everything in the 'client' section is within the domain of SurveyJS and they build those for you. Everything on the 'server' section is totally up to you, so it will seamlessly integrate with your existing backend.&lt;/p&gt;

&lt;p&gt;The downside is, if you want to build and publish a single form you are going to have to build up your own backend for that.&lt;/p&gt;

&lt;h1&gt;
  
  
  Form Creation
&lt;/h1&gt;

&lt;p&gt;As a content creator or admin, the place that you are likely to live in the most is the form creation panel, so it's important that it's easy to use and flexible.&lt;/p&gt;

&lt;p&gt;Lets start with SurveyJS. To get access to the form creator you are going to have to integrate it into your existing UI. Alternatively you can use &lt;a href="https://surveyjs.io/create-free-survey" rel="noopener noreferrer"&gt;their hosted MySurvey tool&lt;/a&gt; which will allow you to build forms.&lt;/p&gt;

&lt;p&gt;SurveyJS supports every common front-end framework that you could imagine, and even the ones you couldn't. They support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Angular&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vue&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Knockout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;jQuery&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its really straight forward to integrate the form creator into your existing application. For example to add it your React application all you need is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FormCreator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;showLogicTab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;SurveyCreator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SurveyCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SurveyCreator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SurveyCreatorComponent&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The output of the form builder in SurveyJS is a JSON object which we will use later with the &lt;a href="https://surveyjs.io/form-library/documentation/overview" rel="noopener noreferrer"&gt;form rendering library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvxkfv3csv0slo0ce5e9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvxkfv3csv0slo0ce5e9.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The form creator itself is a very nice modern UI that is extremely interactive and feels very snappy. You can drag and drop questions about without thinking about it and everything is intuitively where you would expect it to be, which is a tough job when there are so many settings. It even works pretty well on a mobile device which is pretty incredible.&lt;/p&gt;

&lt;p&gt;It has all the field types that you would expect from a form builder. It has standard text inputs, checkboxes, radio groups (including matrixes)and drop-downs. There is a few drop-downs that you might not expect but could be very handy. There is a ranking field allowing users to rank a set options top to bottom. They also have a grouping feature, that allows a respondent to answer a set of questions multiple times if they need to. For example, they can add multiple contact people and fill in each of their details separately. An image picker, allowing a user to select from a group of images. Lastly it even has the ability to accept signatures which is a nice addition.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsgyws7iy4n7523gvvscv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsgyws7iy4n7523gvvscv.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find you that you are missing a field type you can add your own type. &lt;a href="https://surveyjs.io/survey-creator/documentation/customize-question-types" rel="noopener noreferrer"&gt;They have a nice example in the documentation about how to go about doing that.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When it comes to logic it allows you to do everything you could possibly imagine using a dedicated GUI. You can hide questions, answer questions and reset answers. You can do this by defining as many 'rules' as you want, by setting a condition and an action depending on the condition. To developers this will feel familiar as it presents as a giant if statement.&lt;/p&gt;

&lt;p&gt;It might take a while for a novice users to get around all the options, but once they figure out where everything in they will quickly find themselves setting up form logic with the intuitive logic options.&lt;/p&gt;

&lt;p&gt;Once you have the form built with all the fields and logic you want you can add translations to each question. You can add all the languages you want to support and input all your translations for the strings in each page. This makes it a breeze to translate large forms with complicated logic.&lt;/p&gt;

&lt;p&gt;Next up lets take a look at the form creation process inside of Form.io. The Form.io creator works exactly how you would expect with a nice drag and drop interface for all their fields. They provide a large range of fields, split up into different sections. It allows you to use all the standard text fields as well as complex grid entries so you can create any form that you can imagine. They also give you access to various layout elements so can put sections into tabs and columns to meet your needs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1d539f3oo4jwqh9kirmo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1d539f3oo4jwqh9kirmo.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Form.io has very extensive form logic, validation and conditional display of different fields. The logic section on each field lets you set a list of 'triggers' and then you define an 'action' to do after the trigger. You can use these to update the values of different fields depending on answers, it even allows you to run your own javascript as an action. The conditional options to show and hide fields are just as extensive.&lt;/p&gt;

&lt;p&gt;Whilst the basics of Form.io is intuitive to use and easy to use as you venture more into the complex setups you might find yourself getting lost or tied in knots around the logic sections as its easy to lose your place. They give you the power to do anything you want but the downside is that it could be overwhelming for novice users.&lt;/p&gt;

&lt;h1&gt;
  
  
  Form Filling
&lt;/h1&gt;

&lt;p&gt;First up is SurveyJS and its form filling experience. To render the form you simply pass JSON object the form creator gives you into the survey component the like so:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Survey&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;survey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;applyTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;themeJson&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onComplete&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Form filled!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SurveyReact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Survey&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Similar to Form.io, the default form filling UI is simple and clean. Again its responsive and feels like a top tier form.&lt;/p&gt;

&lt;p&gt;However, SurveyJS lets you do an exceptional amount customisation. You can change every single colour that is shown on the form using a &lt;a href="https://surveyjs.io/form-library/documentation/manage-default-themes-and-styles#create-a-custom-theme" rel="noopener noreferrer"&gt;fully integrated CSS Theme Editors with a panel of UI controls.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next lets take a look at how Form.io lets you display forms to your users. You have two choices, you can choose to host it directly via their platform without deploying any of your own code. This way is the easiest but will force you to send users to an external page from the rest of your website.&lt;/p&gt;

&lt;p&gt;Your other option is to embed it into your site using one of their web libraries, they support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Angular&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vue&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vanilla Javascript&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both options result in forms that look pretty similar and are easy to use. Their UI libraries are pretty lightweight and just wrap the core library in framework specific details.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnr28bfvtul4oer3zrsgl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnr28bfvtul4oer3zrsgl.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are willing to dig into the CSS you can customise your forms as much as you want as they don't provide tools to change how your forms are displayed from their form builder UI.&lt;/p&gt;

&lt;h1&gt;
  
  
  Working with form results
&lt;/h1&gt;

&lt;p&gt;The last step in the form lifecycle is viewing and comparing the results of the form.&lt;/p&gt;

&lt;p&gt;SurveyJS provides a &lt;a href="https://surveyjs.io/dashboard/documentation/overview" rel="noopener noreferrer"&gt;'Dashboard' library&lt;/a&gt; to allow you to analyse your results in a meaningful way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkd6ft0kgwxt8lmyg9n2v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkd6ft0kgwxt8lmyg9n2v.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You get access to just about any visualisation graph that you could think of. As with the rest of SurveyJS the customisation is pretty much unlimited. Its a really great way to get a high level overview of the results of your forms.&lt;/p&gt;

&lt;p&gt;The great thing with SurveyJS is that you can actually view the data however you want because you fully own it and control it. You can be syncing it to a Google Sheet if you wanted and view it there. You can view it in your companies existing business insights platform if you want.&lt;/p&gt;

&lt;p&gt;With Form.io by default you don't get much reporting functionality in the basic product. It lets you export your data as a spreadsheet via their UI but there is no way to create a graph natively. You can chose to buy their reporting module separately for £600 per month. It lets you setup a reports however they are still quite limited.&lt;/p&gt;

&lt;p&gt;Form.io gives you a nice developer interface to your data so you can build any integration to work with your form results, so you can send them to any third party or any other service in your application. They give you some pre built integrations like a SQL connector so you can sync the database to your custom SQL database if that is what the rest of the system uses.&lt;/p&gt;

&lt;h1&gt;
  
  
  Storing the data
&lt;/h1&gt;

&lt;p&gt;Both SurveyJS and Form.io take different approaches to data storage, each with its own set of trade-offs so you have to decide what is right for your use cases.&lt;/p&gt;

&lt;p&gt;First up is SurveyJS, which doesn't include any storage capabilities. However, instead what they expect you to do is to integrate it into your existing backend and store the data there, next to the rest of your application.&lt;/p&gt;

&lt;p&gt;The benefit of this approach is that you have the ability to store your data anywhere you want. You could store it in an encrypted spreadsheet or you can store it on Redis, absolutely anything is possible. This means that you can match your data storage solution perfectly to your requirements without having to make any sacrifices.&lt;/p&gt;

&lt;p&gt;The downside to that is that you have to build it all yourself, if you want to store it in a database you have to write all the SQL statements yourself. If you have a database for you application already this is likely no problem as you will have done all the hard work but if you are starting from scratch it could be a large investment of time up front. So you are gaining full flexibility but potentially at the cost of upfront engineering time.&lt;/p&gt;

&lt;p&gt;Next up lets look at how Form.io stores data. Form.io is setup and designed to be self hosted, they do this by giving Docker containers to host. However, they don't include database hosting in their container, which is by design. This means you can choose to host your database anywhere that you want. Form.io is built to use a MongoDB database to store its data, so you have to host a MongoDB database somewhere.&lt;/p&gt;

&lt;p&gt;Ultimately when it comes to data storage you have to choose between full flexibility and investing time or less flexibility but less time investment.&lt;/p&gt;

&lt;h1&gt;
  
  
  Pricing
&lt;/h1&gt;

&lt;p&gt;When it comes down to comparing pricing between these platforms it can be difficult as they both charge for different parts of their system.&lt;/p&gt;

&lt;p&gt;First we will look at how Form.io prices its products. Their pricing model is based around how you deploy their services rather than how much you use the services. The entry level is $600(USD) per month, which includes one 'enterprise level project' and one 'API server management'. For an extra $300 per month you can get an API server plus which includes extra security compliance features.&lt;/p&gt;

&lt;p&gt;Their hosted SAAS version of their product has a single price point of $300 per month, which gets you access to almost all of their product suite hosted for you. You have unlimited forms on their system but you are limited to 1M submissions per month and 1000 monthly PDF downloads. If you exceed those limits then they push you towards their self hosted option, which overall seems to be where they are pushing their customers, based on their website.&lt;/p&gt;

&lt;p&gt;You can trial their self-hosted product free for 30 days, but you have to schedule a sales call with them to get access to it. Alternatively you can test it with their cloud hosted version free for 30 days.&lt;/p&gt;

&lt;p&gt;SurveyJS on the other hand takes a totally different approach to pricing. They &lt;a href="https://github.com/surveyjs" rel="noopener noreferrer"&gt;publish all of their libraries on Github&lt;/a&gt; for you to install and try out entirely for free. However, if you want to use their products for any commercial uses then you have to look into buying a commercial license. &lt;a href="https://www.npmjs.com/package/survey-core" rel="noopener noreferrer"&gt;Their core survey rendering library&lt;/a&gt; is MIT licensed which means its free to use even for commercial uses. If you want to use the Survey Creator then you have to buy a 'Basic' license for ~£422. If you want the Dashboard and PDF Generator then you need a 'Pro' license for ~£760. The commercial licenses are perpetual meaning that you can use the software for the entirety of your lifetime, but to access updates you will have to renew your license every 12 months.&lt;/p&gt;

&lt;h1&gt;
  
  
  Accessibility
&lt;/h1&gt;

&lt;p&gt;When publishing forms you need to make sure they are accessible for everyone, including users who rely on assistive technology. To measure this we can rely on the WCAG guidelines which describe how a website can be accessible.&lt;/p&gt;

&lt;p&gt;SurveyJS published an Accessibility Statement outlining the commitment to accessibility and talks about all the standards they meet.&lt;/p&gt;

&lt;p&gt;Form.io sells an accessibility compliance module which helps you build accessible forms. Whilst it is great that they have built those features, I think it is unfair to charge extra to create forms that are accessible for everyone. Their accessibility module works by disabling some form fields that are inaccessible and also changes the style of their forms so that they match the US Web Design System.&lt;/p&gt;

&lt;p&gt;Without their accessibility module the forms themselves are accessible for the most part. The actual form fields are all labelled correctly but the footer and navbar they use has some link tags used incorrectly and text without sufficient contrast.&lt;/p&gt;

&lt;p&gt;SurveyJS also falls short in a few ways, although they are in less critical places than Form.io. SurveyJS also has contrast issues in a few places as well as missing or incorrect labeling on elements.&lt;/p&gt;

&lt;p&gt;I think both platforms could do with improvement in this area but if I had to pick a winner I think that SurveyJS does a better job overall.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Overall, both &lt;a href="https://surveyjs.io/" rel="noopener noreferrer"&gt;SurveyJS&lt;/a&gt; and &lt;a href="https://form.io" rel="noopener noreferrer"&gt;Form.io&lt;/a&gt; will get the job done and allow you to build the forms that you want. I think overall, the user experience is nicer and easier for novice users in SurveyJS than it is in Form.io which can be a little clumsy in places.&lt;/p&gt;

&lt;p&gt;The main pro to Form.io over is that they give you a back-end solution you can host yourself, so you can control where your data is stored without building a custom backend. However, SurveyJS gives you more flexibility over your data storage.&lt;/p&gt;

&lt;p&gt;You also have to choose between a perpetual license for SurveyJS or a monthly payment forever for Form.io.&lt;/p&gt;

&lt;p&gt;I would encourage you to give them both a try and pick what works best for your needs!&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>react</category>
    </item>
    <item>
      <title>Formik / Formium Alternative: A Comprehensive Comparison with SurveyJS</title>
      <dc:creator>Gavin Henderson</dc:creator>
      <pubDate>Thu, 01 Aug 2024 19:25:35 +0000</pubDate>
      <link>https://forem.com/gavinhenderson/surveyjs-vs-formikformium-2o1n</link>
      <guid>https://forem.com/gavinhenderson/surveyjs-vs-formikformium-2o1n</guid>
      <description>&lt;p&gt;Every good web application has user interaction at the heart of it. To allow users to input data into your application the best way to do that is using a form. That might be a large form for a long multi-step application process, or it might be a short login form with two fields. As online businesses grow companies are relying more on forms and getting more ambitious with what they expect from a form.&lt;/p&gt;

&lt;p&gt;Forms can be difficult to get right, especially if you want to allow many different field types, have complicated validation and allow form logic. Manually programming all these options is difficult and time consuming and you will likely leave some bugs as there is so many pieces of state to keep track of.&lt;/p&gt;

&lt;p&gt;If you have more than one form you would benefit from some kind of form creator. They allow non developers to create forms, publish them and analyse the results, allowing your developers to focus on building new features and content creators to keep making new forms.&lt;/p&gt;

&lt;p&gt;There are many options in form creation space but this article will compare two popular form creation systems, Formium and SurveyJS.&lt;/p&gt;

&lt;h1&gt;
  
  
  Intro to Formium / Formik
&lt;/h1&gt;

&lt;p&gt;The Formium story starts with a React library called &lt;a href="https://formik.org/" rel="noopener noreferrer"&gt;Formik&lt;/a&gt;. It was created to make building forms in React a better experience for developers. React is notoriously difficult to build forms with because you have to use 'controlled' inputs for each field if you want to have reactive form validation. Controlled inputs can become unwieldy as you have to track all the changes to the HTML elements and then manually trigger all your event handlers.&lt;/p&gt;

&lt;p&gt;Formik works by giving you access to &lt;code&gt;&amp;lt;Form&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;Field&amp;gt;&lt;/code&gt; components and allows you to easily define initial values and build all of your form validation in one place. When it was first released it was huge and the React ecosystem jumped on it because it tackled one of the biggest pain points. If you are looking for a library to help you at the lowest level to manage the state of your forms then Formik is a good choice.&lt;/p&gt;

&lt;p&gt;However, Formik didn't help tackle the form creation pain point development teams have. So, after the success of Formik the team extended their offering to include &lt;a href="https://formium.io/" rel="noopener noreferrer"&gt;Formium&lt;/a&gt;, an online form builder platform. Formium is split into three distinct parts.&lt;/p&gt;

&lt;p&gt;The first part of the platform is their 'online form building interface'. You don't have the ability to host this yourself, so your forms are built using their infrastructure. They also gives you the option to share forms and collect responses using their platform, so you don't have to write any code if you don't want to.&lt;/p&gt;

&lt;p&gt;The second part of their offering is the &lt;a href="https://formium.io/docs/react" rel="noopener noreferrer"&gt;SDKs they offer to render the forms you have built&lt;/a&gt;. Their SDKs allow you to fetch your forms and render them into your React application. They also let you send the result of the forms to their storage system if you choose. Their SDKs are only available in React and JavaScript.&lt;/p&gt;

&lt;p&gt;The last part of their system is their submission and storage system. They have put a lot of work into their storage system to make it a really useful business automation tool. They connect directly to Zapier which in turns connects to thousands of other tools, so you can build these complex automations without any code.&lt;/p&gt;

&lt;p&gt;Its important to note that Formium looks &lt;strong&gt;unmaintained and unsupported&lt;/strong&gt; for the most part. They haven't pushed any new changes to their SDK in 3 years and the issues of Github go unanswered. The creator has since moved on and built new projects. Its not officially closed but I wouldn't be surprised if it was in the near future.&lt;/p&gt;

&lt;h1&gt;
  
  
  Intro to SurveyJS
&lt;/h1&gt;

&lt;p&gt;SurveyJS is a suite of products that all compliment each other to make building, publishing and managing forms easy.&lt;/p&gt;

&lt;p&gt;SurveyJS takes a 'front-end only' approach to forms, which makes sense given that forms only exist on the front end, everything after that is just standard data handling.&lt;/p&gt;

&lt;p&gt;Once the data reaches the backend &lt;a href="https://surveyjs.io/documentation/backend-integration#server-side-implementation" rel="noopener noreferrer"&gt;you are free to save the data any way you like.&lt;/a&gt; This means that you can save it into your custom backend with ease and take advantage of all that great authentication you have already built. It also means that you don't have to worry about another third party handling your data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fndp46c1uc6faeu6pjc8a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fndp46c1uc6faeu6pjc8a.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The diagram above shows the design ethos of SurveyJS excellently. Everything in the 'client' section is within the domain of SurveyJS and they build those for you. Everything on the 'server' section is totally up to you, so it will seamlessly integrate with your existing backend.&lt;/p&gt;

&lt;p&gt;The downside is, if you want to build and publish a single form you are going to have to build up your own backend for that.&lt;/p&gt;

&lt;h1&gt;
  
  
  Form Creation
&lt;/h1&gt;

&lt;p&gt;Both platforms come with a comprehensive form creation tool designed to allow you to create any form you want without writing any code. This is where you are likely to spend most of your time as an admin or content creator.&lt;/p&gt;

&lt;p&gt;Lets start with SurveyJS. To get access to the form creator you are going to have to integrate it into your existing UI. Alternatively you can use their hosted MySurvey tool which will allow you to build forms.&lt;/p&gt;

&lt;p&gt;SurveyJS provides supports every common front-end framework that you could imagine, and even the ones you couldn't. They support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Angular&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vue&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Knockout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;jQuery&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its really straight forward to integrate the form creator into your existing application. For example to add it your React application all you need is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FormCreator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;showLogicTab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;SurveyCreator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SurveyCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SurveyCreator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SurveyCreatorComponent&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The output of the form builder in SurveyJS is a JSON object which we will use later with the &lt;a href="https://surveyjs.io/form-library/documentation/overview" rel="noopener noreferrer"&gt;form rendering library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiw8jxc5z5wazcesopi32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiw8jxc5z5wazcesopi32.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The form creator itself is a very nice modern UI that is extremely interactive and feels very snappy. You can drag and drop questions about without thinking about it and everything is intuitively where you would expect it to be, which is a tough job when there are so many settings. It even works pretty well on a mobile device which is pretty incredible.&lt;/p&gt;

&lt;p&gt;There is a dynamic panel that allows respondents to dynamically add a fresh copy of related question as they are answering a question that requires naming a list of something . For example, they can add an extra contact person and their details, or duplicate a group of fields to provide details for another employer they had, etc.&lt;/p&gt;

&lt;p&gt;It has all the field types that you would expect from a form builder. It has standard text inputs, checkboxes, radio groups (including matrixes) and drop-downs. They also have a grouping feature, that allow a respondent to answer a set of questions multiple times if they need to. For example, they can add multiple contact people and fill in each of their details separately. There is a ranking field allowing users to rank a set options top to bottom. An image picker, allowing a user to select from a group of images. Lastly it even has the ability to accept signatures which is a nice addition.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkm5nsyk2hqmuwss722y4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkm5nsyk2hqmuwss722y4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find you that you are missing a field type you can add your own type. &lt;a href="https://surveyjs.io/survey-creator/documentation/customize-question-types" rel="noopener noreferrer"&gt;They have a nice example in the documentation about how to go about doing that.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When it comes to logic it allows you to do everything you could possibly imagine using a dedicated GUI. You can hide questions, answer questions and reset answers. You can do this by defining as many 'rules' as you want, by setting a condition and an action depending on the condition. To developers this will feel familiar as it presents as a giant if statement.&lt;/p&gt;

&lt;p&gt;It might take a while for a novice users to get around all the options, but once they figure out where everything in they will quickly find themselves setting up form logic with the intuitive logic options.&lt;/p&gt;

&lt;p&gt;Once you have the form built with all the fields and logic you want you can add translations to each question. You can add all the languages you want to support and input all your translations for the strings in each page. This makes it a breeze to translate large forms with complicated logic.&lt;/p&gt;

&lt;p&gt;Next up is the Formium form creation tool. The first thing you might notice about Formium is that it has a very small amount of field types to pick from. You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Radio&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Checkbox&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Short Text&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Long Text&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Email&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;URL&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can do a lot of basic forms with these fields and you can probably play around with those fields enough to make them fit your needs, but it will be tricky to do advanced things. You will be missing out on fields like dropdown, ranking and matrix based questions as these are not included. All of which can be found in SurveyJS.&lt;/p&gt;

&lt;p&gt;To make things worse there is no way to build custom field types so you are stuck with what they give you. Its worth noting they do have a lot of cool fields listed but they are marked as 'coming soon' with no timeline.&lt;/p&gt;

&lt;p&gt;Formium also has the ability to use logic to interact with each part of the form. Similarly to SurveyJS you setup rules to control the form. The logic editor is really easy to use, you just decide which field has to match which criteria and then what action to apply. Its easy for anyone to use and understand.&lt;/p&gt;

&lt;p&gt;Again though the options are very limited. All it allows you to do is show and hide a question, there is no other 'actions'. That will probably be enough for basic forms but you will probably find it lacking in certain areas. You can't copy answers between questions or makes fields required depending on a previous answer. All of which you can do in SurveyJS.&lt;/p&gt;

&lt;p&gt;Formium doesn't provide any tools to translate your form into other languages, so you have to do a lot of extra manual work if you want to share a form in multiple languages.&lt;/p&gt;

&lt;p&gt;Overall the Formium form editor feels nice to use and find your way around but you will quickly find yourself wishing things were not 'coming soon' but already there.&lt;/p&gt;

&lt;h1&gt;
  
  
  Form Filling
&lt;/h1&gt;

&lt;p&gt;First up is SurveyJS and its form filling experience. To render the form you simply pass JSON object the form creator gives you into the survey component the like so:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Survey&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;survey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;applyTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;themeJson&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onComplete&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Form filled!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SurveyReact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Survey&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Similar to Formium, the default form filling UI is simple and clean. Again its responsive and feels like a top tier form.&lt;/p&gt;

&lt;p&gt;However, SurveyJS lets you do an exceptional amount customisation. You can change every single colour that is shown on the form using a &lt;a href="https://surveyjs.io/form-library/documentation/manage-default-themes-and-styles#create-a-custom-theme" rel="noopener noreferrer"&gt;fully integrated CSS Theme Editors with a panel of UI controls.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next up is the form filling experience in Formium. There is two ways you can display forms to your users. The first is to use the built in form viewer they have in their online platform. The forms displayed in this are clean and simple, and for the end user are really easy to use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frf10w5dkpvydsa2hxq51.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frf10w5dkpvydsa2hxq51.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second way you can display your forms with Formium is using their React SDK. Their SDK gives you a form component that you can pass all your form data to and then it will render your component. The code to render a form is quite simple, you can do it like this if you are using NextJS:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyPage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FormiumForm&lt;/span&gt;
      &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;myComponents&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;onSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="c1"&gt;// Send form values to Formium&lt;/span&gt;
       &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;formium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submitForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your_form_slug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
       &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}}&lt;/span&gt;
   &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getStaticProps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;formium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFormBySlug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your_form_slug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;They provide you with default fields so you can render a basic form that looks just like the one hosted on their platform. The great thing about their SDK is it gives you a nice interface to provide your own components so you can customise them any way that you want without any limits. This level of customisation can be very powerful.&lt;/p&gt;

&lt;h1&gt;
  
  
  Working with form results
&lt;/h1&gt;

&lt;p&gt;The last step in the form lifecycle is viewing and comparing the results of the form.&lt;/p&gt;

&lt;p&gt;SurveyJS provides a &lt;a href="https://surveyjs.io/dashboard/documentation/overview" rel="noopener noreferrer"&gt;'Dashboard' library&lt;/a&gt; to allow you to analyse your results in a meaningful way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd03bm7k0h70742rqpoh5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd03bm7k0h70742rqpoh5.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You get access to just about any visualisation graph that you could think of. As with the rest of SurveyJS the customisation is pretty much unlimited. Its a really great way to get a high level overview of the results of your forms.&lt;/p&gt;

&lt;p&gt;The great thing with SurveyJS is that you can actually view the data however you want because you fully own it and control it. You can be syncing it to a Google Sheet if you wanted and view it there. You can view it in your companies existing business insights platform if you want.&lt;/p&gt;

&lt;p&gt;The Formium platform lets you send the results to them for storage and processing. However, their dashboard has no way to visualise the data that has been submitted to you. You can view the results one submission at a time but if you want to see graphs you will have to download the results as CSV and build the graphs yourself in a spreadsheet tool yourself.&lt;/p&gt;

&lt;p&gt;The thing that Formium boast about itself is that it has 'workflows' that allow you to connect to third parties. This is something that doesn't exist natively in SurveyJS because it doesn't come with a backend by default.&lt;/p&gt;

&lt;p&gt;You can choose to send a slack message, email or a webhook event when a form submission happens. Other than that you can connect to Zapier to allow you to connect on to anything else. If you want do any kind of complex workflow then you have to do that all in Zapier which is a separate paid for service.&lt;/p&gt;

&lt;h1&gt;
  
  
  Pricing
&lt;/h1&gt;

&lt;p&gt;When it comes to pricing its not straight forward to compare these two as they have multiple pieces to them.&lt;/p&gt;

&lt;p&gt;Formik is a totally free and open source library so there is no pricing connected to it, even for commercial usage. However it has no cloud aspect attached to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1h1qrsxnnqjd1p04ufxu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1h1qrsxnnqjd1p04ufxu.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Formium on the other hand does have a subscription based pricing model. Their pricing is based on the number of forms, submissions and data stored on your account. Their cheapest tier (other than the free one) is $20 per month which gives you access to build 25 forms and 1000 monthly submissions. All the tiers give you access to their automation platform.&lt;/p&gt;

&lt;p&gt;SurveyJS on the other hand takes a totally different approach to pricing. The publish all of their libraries on Github for you to install and try out entirely for free. However, if you want to use their products for any commercial uses then you have to look into buying a commercial license. &lt;a href="https://www.npmjs.com/package/survey-core" rel="noopener noreferrer"&gt;Their core survey rendering library&lt;/a&gt; is MIT licensed which means its free to use even for commercial uses. If you want to use the Survey Creator then you have to buy a 'Basic' license for ~£422. If you want the Dashboard and PDF Generator then you need a 'Pro' license for ~£760. The commercial licenses are perpetual meaning that you can use the software for the entirety of your lifetime, but to access updates you will have to renew your license every 12 months.&lt;/p&gt;

&lt;p&gt;With all that in mind you need to weigh up the different needs you have and what kind of payment model you are happy to be locked into. With Formium you will have a lower cost up front but if you build up all of your application on Formium you will be locked into their monthly fee, including price increases. On the other hand SurveyJS for commercial usage can be used with a one time purchase, more for updates but those are not required. So you have to chose between SurveyJS' perpetual license or Formiums subscription.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Overall if you are looking to build basic forms then both platforms will let you build what you want. They both have nice user experiences and are really easy to navigate so you wont get lost in either.&lt;/p&gt;

&lt;p&gt;However, if you want to build forms with slightly more complex fields you are going to have to use SurveyJS. With Formium you will find it quickly limits the types of forms you can build due to the lack of form fields they allow and logic they let you use. Whilst this not be an immediate deal breaker now you need to make sure you are investing time in a platform that you will be able to use for the foreseeable future and can grow with you.&lt;/p&gt;

&lt;p&gt;If you really need the ability to have a no or low code solution with built in integration to other platforms then Formium is the platform for you. However, if you are willing to do the setup work required for SurveyJS you will have lots more flexibility with every aspect of the platform and you can build your own integration to any platform you want, including your custom backend.&lt;/p&gt;

&lt;p&gt;I would encourage you to give them both a try and pick what works best for your needs!&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>programming</category>
    </item>
    <item>
      <title>LimeSurvey Alternative: A Comprehensive Comparison with SurveyJS</title>
      <dc:creator>Gavin Henderson</dc:creator>
      <pubDate>Thu, 01 Aug 2024 19:18:53 +0000</pubDate>
      <link>https://forem.com/gavinhenderson/surveyjs-vs-limesurvey-nfi</link>
      <guid>https://forem.com/gavinhenderson/surveyjs-vs-limesurvey-nfi</guid>
      <description>&lt;p&gt;Forms sit at the heart of every good web application. As soon as you enter a web application you are filling out a form to sign up all the way to completing a checkout flow where you fill out another form. The more businesses go online the first thing they do is set up online forms to help them reduce manual paperwork. Even though we heavily rely on these forms to build good experiences they are hard to get right and can go wrong in so many ways.&lt;/p&gt;

&lt;p&gt;At first forms seem like a simple thing to build but as you add more fields and forms the edge cases grow exponentially.&lt;/p&gt;

&lt;p&gt;If you want to learn more about making the choice between building your own custom survey software or investing in a SAAS solution then &lt;a href="https://surveyjs.io/stay-updated/blog/compare-custom-in-house-survey-applications-on-premise-software-and-cloud-based-saas-solutions" rel="noopener noreferrer"&gt;read SurveyJS' blog on that topic here&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Intro to SurveyJS
&lt;/h1&gt;

&lt;p&gt;SurveyJS is a suite of products that all compliment each other to make building, publishing and managing forms easy.&lt;/p&gt;

&lt;p&gt;SurveyJS takes a 'front-end only' approach to forms, which makes sense given that forms only exist on the front end, everything after that is just standard data handling.&lt;/p&gt;

&lt;p&gt;Once the data reaches the backend &lt;a href="https://surveyjs.io/documentation/backend-integration#server-side-implementation" rel="noopener noreferrer"&gt;you are free to save the data any way you like&lt;/a&gt;. This means that you can save it into your custom backend with ease and take advantage of all that great authentication you have already built. It also means that you don't have to worry about another third party handling your data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7a9grf1k4dokx6tleysq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7a9grf1k4dokx6tleysq.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The diagram above shows the design ethos of SurveyJS excellently. Everything in the 'client' section is within the domain of SurveyJS and they build those for you. Everything on the 'server' section is totally up to you, so it will seamlessly integrate with your existing backend.&lt;/p&gt;

&lt;p&gt;The downside is, if you want to build and publish a single form you are going to have to build up your own backend for that.&lt;/p&gt;

&lt;h1&gt;
  
  
  Intro to LimeSurvey
&lt;/h1&gt;

&lt;p&gt;LimeSurvey is a single tool which handles everything for you from start to finish of the form lifecycle. LimeSurvey will give you the tools to build the form, publish the form, share the form, collect results and analyse the results.&lt;/p&gt;

&lt;p&gt;You get that entire form lifecycle form a single tool, which is great if you want to get started straight away without thinking about building a backend. The downside is that you will be sending user data to a third party and won't have any control over the backend technology. It will be tricky to set it up with your existing authentication systems.&lt;/p&gt;

&lt;h1&gt;
  
  
  Form creation
&lt;/h1&gt;

&lt;p&gt;As a content creator or admin the place that you are likely to live in the most is the form creation panel so its important its easy to use and lets you do anything you want.&lt;/p&gt;

&lt;p&gt;Lets start with SurveyJS. To get access to the form creator you are going to have to integrate it into your existing UI. Alternatively you can use their hosted MySurvey tool which will allow you to build forms.&lt;/p&gt;

&lt;p&gt;SurveyJS provides supports every common front-end framework that you could imagine, and even the ones you couldn't. They support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Angular&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vue&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Knockout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;jQuery&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its really straight forward to integrate the form creator into your existing application. For example to add it your React application all you need is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FormCreator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;showLogicTab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;SurveyCreator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SurveyCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SurveyCreator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SurveyCreatorComponent&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The output of the form builder in SurveyJS is a JSON object which we will use later with the &lt;a href="https://surveyjs.io/form-library/documentation/overview" rel="noopener noreferrer"&gt;form rendering library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsoocg0ixvfwf45gc60uc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsoocg0ixvfwf45gc60uc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The form creator itself is a very nice modern UI that is extremely interactive and feels very snappy. You can drag and drop questions about without thinking about it and everything is intuitively where you would expect it to be, which is a tough job when there are so many settings. It even works pretty well on a mobile device which is pretty incredible.&lt;/p&gt;

&lt;p&gt;It has all the field types that you would expect from a form builder. It has standard text inputs, checkboxes, radio groups (including matrixes)and drop-downs. There is a few drop-downs that you might not expect but could be very handy. There is a ranking field allowing users to rank a set options top to bottom. An image picker, allowing a user to select from a group of images. Lastly it even has the ability to accept signatures which is a nice addition.&lt;/p&gt;

&lt;p&gt;If you find you that you are missing a field type you can add your own type. &lt;a href="https://surveyjs.io/survey-creator/documentation/customize-question-types" rel="noopener noreferrer"&gt;They have a nice example in the documentation about how to go about doing that.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When it comes to logic it allows you to do everything you could possibly imagine using a dedicated GUI. You can hide questions, answer questions and reset answers. You can do this by defining as many 'rules' as you want, by setting a condition and an action depending on the condition. To developers this will feel familiar as it presents as a giant if statement.&lt;/p&gt;

&lt;p&gt;It might take a while for a novice users to get around all the options, but once they figure out where everything in they will quickly find themselves setting up form logic with the intuitive logic options.&lt;/p&gt;

&lt;p&gt;Once you have the form built with all the fields and logic you want you can add translations to each question. You can add all the languages you want to support and input all your translations for the strings in each page. This makes it a breeze to translate large forms with complicated logic.&lt;/p&gt;

&lt;p&gt;Next up is the LimeSurvey form creator. The editor is nice and interactive and snappy so you won't be waiting whilst building your large forms. They could do some work on the user journeys, you end up clicking a lot of buttons and going through a lot of pop-ups just to do simple tasks like add a new question.&lt;/p&gt;

&lt;p&gt;Similar to SurveyJS it has all the fields you would expect from a modern form builder. Any text or option based question you will be able to ask.&lt;/p&gt;

&lt;p&gt;For form logic LimeSurvey gives you access their 'Condition Designer'. The logic designer does take some time to wrap your head around. You set the condition of each field individually rather than the form as a whole. Its not the most intuitive way of doing it but it does make you break it down more.&lt;/p&gt;

&lt;p&gt;If you want to add a custom field type to LimeSurvey its not quite as straight forward. You will have to build a custom PHP based plugin for the LimeSurvey. The documentation is not great, I found myself digging in user forums to figure out the code for plugins.&lt;/p&gt;

&lt;p&gt;You can also provide translations in LimeSurvey, it even has the ability to auto-translate which can be helpful, although often inaccurate.&lt;/p&gt;

&lt;p&gt;Its worth noting, there is a lot more settings in the LimeSurvey editor because it also has to consider the form hosting. Due to this you will see options around permissions and shareable links.&lt;/p&gt;

&lt;p&gt;Once you've built the form you just hit publish and its ready to be filled in by anyone you want, which takes on nicely to the form filling side of the libraries.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Form filling&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Once you have built the forms you will want your users to fill the form in and submit it.&lt;/p&gt;

&lt;p&gt;Lets start with LimeSurvey this time. As soon as you have hit the publish button after building the form you will be given a link to share. The form filling UI is simple and clean which is how most users will want it. The design is clear, and the validation is quick and responsive, if you don't fill out a required field it will let you know.&lt;/p&gt;

&lt;p&gt;You have very little control over the style of the forms, unless you are self hosting. If you are hosting it yourself you can insert your own custom CSS and change anything you want, however that will require serious development and it will change all your forms.&lt;/p&gt;

&lt;p&gt;Next up is SurveyJS and its form filling experience. To render the form you simply pass JSON object the form creator gives you into the survey component the like so:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Survey&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;survey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;applyTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;themeJson&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onComplete&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Form filled!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SurveyReact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Survey&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Similar to LimeSurvey, the default form filling UI is simple and clean. Again its responsive and feels like a top tier form.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg26uybrcphwmr7s2otm2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg26uybrcphwmr7s2otm2.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, SurveyJS lets you do an exceptional amount customisation. You can change every single colour that is shown on the form using a &lt;a href="https://surveyjs.io/form-library/documentation/manage-default-themes-and-styles#create-a-custom-theme" rel="noopener noreferrer"&gt;fully integrated CSS Theme Editors with a panel of UI controls.&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Viewing Results&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;The last step in the form lifecycle is viewing and comparing the results of the form.&lt;/p&gt;

&lt;p&gt;SurveyJS provides a 'Dashboard' library to allow you to analyse your results in a meaningful way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhjyuildcnv7k33aza3x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhjyuildcnv7k33aza3x.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You get access to just about any visualisation graph that you could think of. As with the rest of SurveyJS the customisation is pretty much unlimited. Its a really great way to get a high level overview of the results of your forms.&lt;/p&gt;

&lt;p&gt;The great thing with SurveyJS is that you can actually view the data however you want because you fully own it and control it. You can be syncing it to a Google Sheet if you wanted and view it there. You can view it in your companies existing business insights platform if you want.&lt;/p&gt;

&lt;p&gt;LimeSurvey also lets you view all your responses in nice charts. Its not quite the same as SurveyJS and you don't get a choice over the charts, it chooses what it thinks is best for a question. If you don't want to think about it to much this can actually be really great as you can view the results without setting anything up. However, as with the rest of LimeSurvey you have pretty much no control over what the graphs look like.&lt;/p&gt;

&lt;p&gt;LimeSurvey lets you manually export your data so you are free to import it wherever you want. You can also build a plugin to sync your data out of LimeSurvey but that is a lot more involved.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Pricing&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;When it comes to pricing its not straight forward to compare these two as they have multiple pieces to them.&lt;/p&gt;

&lt;p&gt;LimeSurvey has a fully open source 'community' edition which is totally free to use, even for commercial reasons. However, to get it for free you have to host the entire PHP service yourself, which is quite the undertaking.&lt;/p&gt;

&lt;p&gt;If you don't want to host it yourself, LimeSurvey has a cloud service that means they host it for you. By the looks of their website this is the one they really want you to go for. Their cheapest hosting option is £30 per month, this includes 10,000 survey responses per year. It then goes up to £100 per month if you want up to 100,000 responses per year, after that you will have to get a custom enterprise contract.&lt;/p&gt;

&lt;p&gt;SurveyJS on the other hand takes a totally different approach to pricing. The publish all of their libraries on Github for you to install and try out entirely for free. However, if you want to use their products for any commercial uses then you have to look into buying a commercial license. &lt;a href="https://www.npmjs.com/package/survey-core" rel="noopener noreferrer"&gt;Their core survey rendering library&lt;/a&gt; is MIT licensed which means its free to use even for commercial uses. If you want to use the Survey Creator then you have to buy a 'Basic' license for ~£422. If you want the Dashboard and PDF Generator then you need a 'Pro' license for ~£760. The commercial licenses are perpetual meaning that you can use the software for the entirety of your lifetime, but to access updates you will have to renew your license every 12 months.&lt;/p&gt;

&lt;p&gt;With all that in mind you can see that it really depends what kind of payment model you are happy to be locked into. LimeSurvey will be cheaper upfront but then you will be stuck in a subscription for ever, including price increases. SurveyJS gives you ownership over your software that LimeSurvey doesn't but has a higher upfront cost.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Accessibility&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;When publishing forms you need to make sure they are accessible for everyone, including users who rely on assistive technology. To measure this we can rely on the WCAG guidelines which describe how a website can be accessible.&lt;/p&gt;

&lt;p&gt;SurveyJS published an Accessibility Statement outlining the commitment to accessibility and talks about all the standards they meet. This is something that is missing from LimeSurveys website entirely.&lt;/p&gt;

&lt;p&gt;Both tools are keyboard accessible which means they can be accessed using alternative access methods.&lt;/p&gt;

&lt;p&gt;LimeSurvey falls short in a few ways. It doesn't do a great job with screen reader technology, with missing label descriptions on a few buttons. Their default green on white buttons don't meet the colour contrast requirements which means that people with visual impairments could struggle to see them.&lt;/p&gt;

&lt;p&gt;SurveyJS also falls short in a few ways, although they are in less critical places than LimeSurvey. SurveyJS also has contrast issues in a few places as well as missing or incorrect labeling on elements.&lt;/p&gt;

&lt;p&gt;I think both platforms could do with improvement in this area but if I had to pick a winner I think that SurveyJS does a better job overall.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Overall, both SurveyJS and LimeSurvey will get the job done to a standard most people would be happy with. I think overall the user experience is nicer with SurveyJS, every user interaction seems to have been thoughtfully considered which in parts doesn't seem to be the case with LimeSurvey.&lt;/p&gt;

&lt;p&gt;The benefits of LimeSurvey is that you can get going on their cloud version in an instant without any technical knowledge. You can even host the community version yourself and then once you've set it up you don't need to dig into the backend at all or develop anything yourself. However, all your data is stored in one backend that you have minimal control over and is hard to integrate with.&lt;/p&gt;

&lt;p&gt;SurveyJS on the other hand requires you integrate it with an existing frontend and backend which could be too hard for non technical users. However, the benefit is that you have total control over where things are stored and hosted. The form library feels like its part of your existing application. You can seamlessly integrate it with all your existing technology.&lt;/p&gt;

&lt;p&gt;I would encourage you to give them both a try and pick what works best for your needs!&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>react</category>
    </item>
  </channel>
</rss>
