{"componentChunkName":"component---src-templates-blog-list-template-js","path":"/105","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"excerpt":"One fairly popular question that got asked on programming bulletin boards has to do with the similarities and differences between React’s…","fields":{"slug":"/engineering/react-constructor-get-initial-state/"},"html":"<p>One fairly popular question that got asked on programming bulletin boards has to do with the similarities and differences between React’s <code>constructor</code> and the built in method <code>getInitialState</code>. While the simple answer to this question is indeed simple: “getInitialState is the ES5 friendly method to define the initial state of a React component,” there are a couple more details around <code>getInitialState</code> as well as React’s ES5 support that are interesting and useful to highlight.</p>\n<h2 id=\"constructor-vs-getinitialstate-with-or-without-classes\" style=\"position:relative;\"><a href=\"#constructor-vs-getinitialstate-with-or-without-classes\" aria-label=\"constructor vs getinitialstate with or without classes permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Constructor vs getInitialState: With or without Classes:</h2>\n<p>One of the fundamental differences between ES5 and ES6 in regards to React implementation is the new <code>class</code> keyword. It allows definition of React components as classes, which is a familiar data structure for anyone who has had experience with more traditional object-oriented languages such as Java or C++. The class structure also allows for natural organization of the component’s elements like state, props, lifecycle methods and member functions. However, ES5 did not provide the same convenience. So instead of defining a React component as a class:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">class</span><span class=\"mtk1\"> </span><span class=\"mtk10\">HelloWorld</span><span class=\"mtk1\"> </span><span class=\"mtk4\">extends</span><span class=\"mtk1\"> </span><span class=\"mtk10\">React</span><span class=\"mtk1\">.</span><span class=\"mtk10\">Component</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk11\">render</span><span class=\"mtk1\">() {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">Hello World</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>You would rely on a helper module called <code>create-react-class</code>:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">var</span><span class=\"mtk1\"> </span><span class=\"mtk12\">createReactClass</span><span class=\"mtk1\"> = </span><span class=\"mtk11\">require</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;create-react-class&#39;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">var</span><span class=\"mtk1\"> </span><span class=\"mtk12\">HelloWorld</span><span class=\"mtk1\"> = </span><span class=\"mtk11\">createReactClass</span><span class=\"mtk1\">({</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk11\">render</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\">() {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">Hello World</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">});</span></span></code></pre>\n<p>And it is within the object passed into <code>create-react-class</code> that you could define an initial state by populating the <code>getInitialState</code> attribute:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">var</span><span class=\"mtk1\"> </span><span class=\"mtk12\">HelloWorld</span><span class=\"mtk1\"> = </span><span class=\"mtk11\">createReactClass</span><span class=\"mtk1\">({</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk11\">getInitialState</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\">() {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> {</span><span class=\"mtk12\">name:</span><span class=\"mtk1\"> </span><span class=\"mtk4\">this</span><span class=\"mtk1\">.</span><span class=\"mtk12\">props</span><span class=\"mtk1\">.</span><span class=\"mtk12\">name</span><span class=\"mtk1\">};</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk11\">render</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\">() {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">Hello </span><span class=\"mtk4\">{this</span><span class=\"mtk1\">.</span><span class=\"mtk12\">state</span><span class=\"mtk1\">.</span><span class=\"mtk12\">name</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">});</span></span></code></pre>\n<p>Which, in ES6 implementation would be the equivalent of:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">class</span><span class=\"mtk1\"> </span><span class=\"mtk10\">HelloWorld</span><span class=\"mtk1\"> </span><span class=\"mtk4\">extends</span><span class=\"mtk1\"> </span><span class=\"mtk10\">React</span><span class=\"mtk1\">.</span><span class=\"mtk10\">Component</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk4\">constructor</span><span class=\"mtk1\">(</span><span class=\"mtk12\">props</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">super</span><span class=\"mtk1\">(</span><span class=\"mtk12\">props</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">this</span><span class=\"mtk1\">.</span><span class=\"mtk12\">state</span><span class=\"mtk1\"> = {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk12\">name:</span><span class=\"mtk1\"> </span><span class=\"mtk12\">props</span><span class=\"mtk1\">.</span><span class=\"mtk12\">name</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk11\">render</span><span class=\"mtk1\">() {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">Hello </span><span class=\"mtk4\">{this</span><span class=\"mtk1\">.</span><span class=\"mtk12\">state</span><span class=\"mtk1\">.</span><span class=\"mtk12\">name</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<h2 id=\"autobinding\" style=\"position:relative;\"><a href=\"#autobinding\" aria-label=\"autobinding permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Autobinding</h2>\n<p>One difference worth noting is that the <code>create-react-class</code> method automatically binds <code>this</code> to every attribute method. This no longer holds true if you define React components using the common ES6 class syntax, making it so that you have to manually bind <code>this</code> to internal methods:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">class</span><span class=\"mtk1\"> </span><span class=\"mtk10\">HelloWorld</span><span class=\"mtk1\"> </span><span class=\"mtk4\">extends</span><span class=\"mtk1\"> </span><span class=\"mtk10\">React</span><span class=\"mtk1\">.</span><span class=\"mtk10\">Component</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk4\">constructor</span><span class=\"mtk1\">(</span><span class=\"mtk12\">props</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">super</span><span class=\"mtk1\">(</span><span class=\"mtk12\">props</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">this</span><span class=\"mtk1\">.</span><span class=\"mtk12\">state</span><span class=\"mtk1\"> = {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk12\">name:</span><span class=\"mtk1\"> </span><span class=\"mtk12\">props</span><span class=\"mtk1\">.</span><span class=\"mtk12\">name</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">this</span><span class=\"mtk1\">.</span><span class=\"mtk12\">changeName</span><span class=\"mtk1\"> = </span><span class=\"mtk4\">this</span><span class=\"mtk1\">.</span><span class=\"mtk12\">changeName</span><span class=\"mtk1\">.</span><span class=\"mtk11\">bind</span><span class=\"mtk1\">(</span><span class=\"mtk4\">this</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk11\">changeName</span><span class=\"mtk1\">() {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">this</span><span class=\"mtk1\">.</span><span class=\"mtk11\">setState</span><span class=\"mtk1\">({ </span><span class=\"mtk12\">name:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;World&quot;</span><span class=\"mtk1\"> });</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  ...</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Or otherwise use the “arrow function” shorthand which takes care of binding:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"5\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">class</span><span class=\"mtk1\"> </span><span class=\"mtk10\">HelloWorld</span><span class=\"mtk1\"> </span><span class=\"mtk4\">extends</span><span class=\"mtk1\"> </span><span class=\"mtk10\">React</span><span class=\"mtk1\">.</span><span class=\"mtk10\">Component</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk4\">constructor</span><span class=\"mtk1\">(</span><span class=\"mtk12\">props</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">super</span><span class=\"mtk1\">(</span><span class=\"mtk12\">props</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">this</span><span class=\"mtk1\">.</span><span class=\"mtk12\">state</span><span class=\"mtk1\"> = {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk12\">name:</span><span class=\"mtk1\"> </span><span class=\"mtk12\">props</span><span class=\"mtk1\">.</span><span class=\"mtk12\">name</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk11\">changeName</span><span class=\"mtk1\"> = () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">this</span><span class=\"mtk1\">.</span><span class=\"mtk11\">setState</span><span class=\"mtk1\">({ </span><span class=\"mtk12\">name:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;World&quot;</span><span class=\"mtk1\"> });</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  ...</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<h2 id=\"parting-words\" style=\"position:relative;\"><a href=\"#parting-words\" aria-label=\"parting words permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Parting Words</h2>\n<p>Since the update to ES6, there have been multiple new React iterations. You could now forgo the <code>constructor</code> declaration altogether and just declare <code>state</code> inline as a class member, or utilize React Hooks as a new way to initialize states. However, the ES5 support remains useful for legacy systems and adds to the overall flexibility of React as a toolset.</p>\n<p>You can read more about React's ES5 support <a href=\"https://reactjs.org/docs/react-without-es6.html\">in the official doc entry here</a>, and <a href=\"https://reactjs.org/blog/2015/01/27/react-v0.13.0-beta-1.html\">the v0.13.0 beta release blog entry here</a>, for the respective ES6 changes.</p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n  .dark-default-dark {\n    background-color: #1E1E1E;\n    color: #D4D4D4;\n  }\n  .dark-default-dark .mtk4 { color: #569CD6; }\n  .dark-default-dark .mtk1 { color: #D4D4D4; }\n  .dark-default-dark .mtk10 { color: #4EC9B0; }\n  .dark-default-dark .mtk11 { color: #DCDCAA; }\n  .dark-default-dark .mtk15 { color: #C586C0; }\n  .dark-default-dark .mtk17 { color: #808080; }\n  .dark-default-dark .mtk12 { color: #9CDCFE; }\n  .dark-default-dark .mtk8 { color: #CE9178; }\n</style>","frontmatter":{"date":"January 05, 2021","updated_date":null,"description":"No ES6? No problem. getInitialState is the ES5 friendly method to define the initial state of a React component.","title":"Constructor vs getInitialState in React","tags":["JavaScript","React"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/4fcf496b1fdd8d1d7ae98e1ab30f19b6/ee604/index.png","srcSet":"/static/4fcf496b1fdd8d1d7ae98e1ab30f19b6/69585/index.png 200w,\n/static/4fcf496b1fdd8d1d7ae98e1ab30f19b6/497c6/index.png 400w,\n/static/4fcf496b1fdd8d1d7ae98e1ab30f19b6/ee604/index.png 800w,\n/static/4fcf496b1fdd8d1d7ae98e1ab30f19b6/efc77/index.png 865w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Nathan Nguyen","github":"nathannguyenn","avatar":null}}}},{"node":{"excerpt":"Engineering as marketing is an especially under-used medium, and when implemented correctly, it has proven to be very useful. It's under…","fields":{"slug":"/growth/engineering-as-marketing/"},"html":"<p>Engineering as marketing is an especially under-used medium, and when implemented correctly, it has proven to be very useful. It's under-used because it's very costly and can not suit traditional marketing or development plans. Imagine two weeks of iterations or tests where the critical route is to create a small project. It just doesn't work, either in terms of time or budget.</p>\n<p>Engineering as Marketing is about using your engineering time (or that of your team) to create useful resources such as calculators, checkers or checklists, widgets, and even micro-sites that bring potential customers in need of your company.</p>\n<p>In the long-term, producing tools that your target audience finds useful will do wonders for your business. Ideally, organizations should expand exponentially to make this tool free for their users.</p>\n<p><strong>Here are some reasons why a business will produce high growth with free tools:</strong></p>\n<ul>\n<li>Engineering, like marketing, is close to content marketing in the sense that you are creating assets. Free instruments can virally expand. And as the years go by, free resources will stay important to your users.</li>\n<li>And if your customers have the money to purchase software, a lucrative choice is still open. </li>\n<li>You have to build trust. It would be best if you showed your clients that you not only appreciate their concerns but are also willing to provide them with tangible value.</li>\n</ul>\n<h2 id=\"five-engineering-as-marketing-strategies\" style=\"position:relative;\"><a href=\"#five-engineering-as-marketing-strategies\" aria-label=\"five engineering as marketing strategies permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Five Engineering as Marketing Strategies</h2>\n<p>There are obstacles when it comes to engineering commercialization. It takes effort to develop and sustain an effective marketing plan for an engineering company, from selecting the correct tactics to writing the best sales copy.</p>\n<p>Digital marketing is a vital part of how an engineering company can be sold. This is how most individuals now find information: for almost all, including businesses to work with, they turn to the Internet. So you could struggle to attract potential leads if your engineering company is not well-represented or easy to find online. Not just that, you're going to lose them to your rivals.</p>\n<p>Create a more robust marketing approach with these five engineering marketing strategies for your engineering company:</p>\n<h3 id=\"1-create-high-quality-content\" style=\"position:relative;\"><a href=\"#1-create-high-quality-content\" aria-label=\"1 create high quality content permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Create High-Quality Content</h3>\n<p>The quality content, which can include anything from blog posts and videos to marketing guides and ebooks, is loved by search engines and social website users.</p>\n<p>You will hit the most eligible prospects as they are already looking online by producing and publishing useful material. And after finding helpful content posted by your business, people will be more likely to want to find more information about your engineering company.</p>\n<h3 id=\"2-utilize-social-evidence\" style=\"position:relative;\"><a href=\"#2-utilize-social-evidence\" aria-label=\"2 utilize social evidence permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Utilize Social Evidence</h3>\n<p>One of the most relevant and frequently ignored tips is to use data from close to your future customers but have started using your device and are super excited about it. People prefer to trust what other individuals have already learned and checked and have something useful to share. Only add a couple of constructive reviews and comments on the website, and your conversion rates will see a boost.</p>\n<p>Many B2B companies wonder why social media accounts should be started. <a href=\"https://www.loginradius.com/blog/identity/2018/11/reconsidering-social-login-security-privacy-angle/\">Social media provides</a> a perfect way to connect with current and future clients, regardless of the industry or business model.</p>\n<h3 id=\"3-leveraging-seo\" style=\"position:relative;\"><a href=\"#3-leveraging-seo\" aria-label=\"3 leveraging seo permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Leveraging SEO</h3>\n<p>One of the easiest ways to boost your engineering company's online exposure is search engine optimization or SEO. It should be one of your top priorities when <a href=\"https://www.visme.co/marketing-plan/\">designing your overall marketing plan</a>.</p>\n<p>SEO requires making improvements to specific items on your website to increase the probability that the phrases you are targeting will rank well. These improvements may include adding keywords to your page names, updating and adding copies to your site, quicker loading of your pages, enhancing the layout of your site, and so on.</p>\n<h3 id=\"4-launch-an-email-newsletter\" style=\"position:relative;\"><a href=\"#4-launch-an-email-newsletter\" aria-label=\"4 launch an email newsletter permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. Launch an Email Newsletter</h3>\n<p>Email newsletters are a perfect way to communicate with prospective customers, keep in contact with current customers, and improve your link with both groups. While past email marketing tactics may have included making hard sales pitches, and you may think of e-commerce emails as being about sales specials or discounts, it is all about adding value to engineering email marketing.</p>\n<h3 id=\"5-the-power-of-online-reviews\" style=\"position:relative;\"><a href=\"#5-the-power-of-online-reviews\" aria-label=\"5 the power of online reviews permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. The Power of Online Reviews</h3>\n<p>An increasingly significant feature of marketing engineering services is online feedback. Reviews are the modern-day word of mouth counterpart, and a successful review will help the company attract new customers. On the opposite, your chances of attracting fresh customers can be hurt by not getting feedback.</p>\n<p>You should track your company's online feedback and respond to the questions people have about them. Try to take the feedback constructively and focus on improving any missed areas of your service.</p>\n<h2 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusion</h2>\n<p>You can incorporate a range of Internet marketing approaches with a little practice and some experimentation into a detailed strategy that increases your company's exposure and credibility, attracting more leads and inspiring more potential customers to select your company for their engineering needs.</p>\n<p>If it blends into the overall story with goal and vision, the use of resources that might already be available in the organization is promising. Marketing as Engineering is at the top of the funnel region in the marketing funnel.</p>\n<p>If you build the lead magnets so that they deliver a quick win and do not give too many possibilities to the consumer, you lay the foundation stone for throwing out a net in which you can attract the long-term attention of prospective customers to yourself.</p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABdElEQVQY002RO0/CUBzFG6PtbZWHCAmRmBB5P8vDII9SSC0omog4oAEGjZMO6OKEuLjoJ2Fx0cSBwUQnXZxcHPwux38LJA7nNvfec8+5v1tOCCiwpbbhye2BxbYgBMtgIRVioDRRsARGXxZUzLlEHmehBaesQ4rrEMPViYf2DR9nDGKkChbVICVqsMt1WJI1sHCFwhUsUIFohJH49TxECvRUjhDW2mAbB5iP6hB8hUkhiRPN5KIZYJdrsEYrcCSpmQqMm6/m9ylUhSulY7N5ivROB3L9GOlGF3Ktbc4zuz341UPw/uIk0ESbBjoSGlYIx8BfzjSwVmyCEYEUUmCPa3Bnd+hwC75yC95S05SxbolU/iEbOCFCpDexEfIioTNCNd6Tp6IlMnNuGeeDe3z//OLx5RWj5zFGT2O8fXxh/P4Ja6w6vSEFCnTIlW2YiDzhzX7ATFKojDlvjpBPcDF4QPdyiG5/iE7/BmfXd+hd3VKpCoG8fzxWw2+c+yTpAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"book-a-demo-loginradius\"\n        title=\"book-a-demo-loginradius\"\n        src=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png\"\n        srcset=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/a6d36/book-a-demo-loginradius.png 650w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png 768w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/63ff0/book-a-demo-loginradius.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"January 05, 2021","updated_date":null,"description":"Engineering as Marketing is about utilising engineering time to build helpful tools such as calculators, checkers or checklists, widgets, and even micro-sites that introduce your business to potential customers.","title":"Engineering As Marketing: 5 Growth Hack Strategies For Modern Businesses","tags":null,"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.7699115044247788,"src":"/static/c5ead7bf487f0f76413f26ceeea4cad2/14b42/engineering-as-marketing.jpg","srcSet":"/static/c5ead7bf487f0f76413f26ceeea4cad2/f836f/engineering-as-marketing.jpg 200w,\n/static/c5ead7bf487f0f76413f26ceeea4cad2/2244e/engineering-as-marketing.jpg 400w,\n/static/c5ead7bf487f0f76413f26ceeea4cad2/14b42/engineering-as-marketing.jpg 800w,\n/static/c5ead7bf487f0f76413f26ceeea4cad2/47498/engineering-as-marketing.jpg 1200w,\n/static/c5ead7bf487f0f76413f26ceeea4cad2/0e329/engineering-as-marketing.jpg 1600w,\n/static/c5ead7bf487f0f76413f26ceeea4cad2/79d1b/engineering-as-marketing.jpg 4206w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},{"node":{"excerpt":"The North Star Metric was invented in business to give companies a singular emphasis on a single target. Everyone should still measure…","fields":{"slug":"/growth/north-star-metrics-nsm/"},"html":"<p>The North Star Metric was invented in business to give companies a singular emphasis on a single target. Everyone should still measure progress by whether or not they are progressing the organization using this metric instead of being distracted by day-to-day matters or individual projects.</p>\n<p>This article is the first in a series of deep dives on the North Star Metric. We hope it serves as a guide to why this metric matters, how to interpret it, and how to use it to drive the long-term product plan and development for product leaders and managers around the globe.</p>\n<p><strong><em>A walk through of the article and topics we’ll cover:</em></strong></p>\n<ol>\n<li>What is a north star metric</li>\n<li>Benefits of north star metric (NSM)</li>\n<li>6 Essential steps to choose your north star metric</li>\n<li>7 examples of a good north star metric</li>\n<li>How to implement the north star metric (NSM)</li>\n</ol>\n<p><strong><em>Let’s dive in!</em></strong></p>\n<h1 id=\"what-is-a-north-star-metric\" style=\"position:relative;\"><a href=\"#what-is-a-north-star-metric\" aria-label=\"what is a north star metric permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What is a North Star Metric?</h1>\n<h4 id=\"companies-use-north-star-metric-nms-as-a-focus-for-their-growth-the-north-star-metric-came-from-silicon-valley-companies-with-explosive-growth-it-helps-teams-to-look-beyond-the-surface-level-growth-and-concentrate-on-long-term-customer-and-product-growth\" style=\"position:relative;\"><a href=\"#companies-use-north-star-metric-nms-as-a-focus-for-their-growth-the-north-star-metric-came-from-silicon-valley-companies-with-explosive-growth-it-helps-teams-to-look-beyond-the-surface-level-growth-and-concentrate-on-long-term-customer-and-product-growth\" aria-label=\"companies use north star metric nms as a focus for their growth the north star metric came from silicon valley companies with explosive growth it helps teams to look beyond the surface level growth and concentrate on long term customer and product growth permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Companies use North Star Metric (NMS) as a focus for their growth. The North Star Metric came from Silicon Valley companies with explosive growth. It helps teams to look beyond the surface-level growth and concentrate on long-term customer and product growth.</h4>\n<p>A north star metric must have these three factors:</p>\n<ul>\n<li><strong>Add Customer Value</strong></li>\n<li><strong>Measure Progress</strong></li>\n<li><strong>Drive Revenue</strong></li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 512px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 42.578125%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAABA0lEQVQoz6WRwXKFIAxF+f9P7OtM23kWFEERdCAQ4KWCznTTTbMKl5PcBFg9A3Mp9VeUJpa/REb5FtBBNgHxkrGL6EjM5TawkF3MNnQvRge9Hetq6LT61DiqBCwBy+IT5ZeYtyNIqX3sIrNQpFoew6x93nxq3sZjwvx4ykkbcvsZuFQazbrjg8/qgF5M0u5hXOxgwdzOkKU2b++fYl7IsIlE0hY0M7VuJKPxCfVYjlRjx2i9amPZaT0oeD1P7GQlMp0kw5S44F/PbyHGGGPjnLXjNEmlJymds704glJq4KMQAvF0pr7Be875vu/3JyAiQKC+ESClvgvdUp6oB0AjWf1HvABtoQ5F+gz3mwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"north-star-metric\"\n        title=\"north-star-metric\"\n        src=\"/static/5b710b75c104cc91cfb2200e12706d3b/01e7c/north-star-metric.png\"\n        srcset=\"/static/5b710b75c104cc91cfb2200e12706d3b/01e7c/north-star-metric.png 512w\"\n        sizes=\"(max-width: 512px) 100vw, 512px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>The metrics with the above factors and contributions from product teams for improvement provide sustainable company growth and improved user experience.</p>\n<h1 id=\"benefits-of-a-north-star-metric-nsm\" style=\"position:relative;\"><a href=\"#benefits-of-a-north-star-metric-nsm\" aria-label=\"benefits of a north star metric nsm permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>Benefits of a North Star Metric (NSM)</strong></h1>\n<p>By now, it's understood that NSM is a metric to drive growth. Let’s see how this metric helps growth hackers and makes sure that the company grows: </p>\n<ul>\n<li><strong>Focused on One Goal:</strong> The entire company is focused on one goal. The numbers and tasks can be different for each department, but the north star metric is the single aspect for everyone to focus.</li>\n<li><strong>Simplified Strategy:</strong> It simplifies the overall company strategy into actions that everyone can understand, remember, and execute.</li>\n<li><strong>Enhanced Customer Value:</strong> Adding value to the customer is one of the crucial factors in NSM. As a result, it improves customer engagement and customer experience.</li>\n</ul>\n<h1 id=\"6-essential-steps-to-choose-your-north-star-metric\" style=\"position:relative;\"><a href=\"#6-essential-steps-to-choose-your-north-star-metric\" aria-label=\"6 essential steps to choose your north star metric permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6 Essential Steps to choose your North Star Metric</h1>\n<p>A good north star metric must indicate future success, and every product should have a north star metric. While the other key metrics like monthly revenue gives you an insight into what happened in the past rather than predicting future revenue.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 155.07692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAfCAIAAABoLHqZAAAACXBIWXMAAAsTAAALEwEAmpwYAAADg0lEQVQ4y21Va3OaUBDthyoXtDGaGNNMk0kUFAV8GxUMiCKaxHcm7Uz//w/p2YtSMM7s3FnhLnv27Nn1m1gehSbIZqI0TJbMJE6Zn+Sb3KdXgmxF738LPaZYhc6iONoWRxucD8OVbO+erI1s7x8Gy0dzXbS2P7uvSHA+OGdM8LrQnt+0/auGR07Lh59vzuDjVa4+xbUvwZUXseYK1UniiBYZkkU4w0SR7DvsaQDk52DrM9ZeC7UpHKk8koKH1bFUcy91N2tMghNwJKSJBFuiagua96OzerTWUmMuGjNR91htkunvss+bJ3NdHn8o9h7151t+WrVPMltM89KGdz/aS3VfDKrCqU1hafUFATDk5Gx9rblMNSfVsRiiQnDNhYEhFj4J3h45i7AtmwJ1ElRZOJk8FKqugM8hG24rJiigcvQZOTz+EIxvZ+tTlIRmZI3pdXMGhjLt90xvzaou4dc90fBZd5vSuV+xY5lzvLEIu254aC+CL7tLECbgHlIBf30uGT7Ek6r77CSYYAOqYpHJFn4ip1CNwK5NRH3KeCNisMk4PdTkygsZ9dmFhU/ojuqgr3HCwCfvitRYUD0KT8UzI4nAh0QoBZK2xJg88UN1BG2a7bxfdJaCMYfIRM2DVK/Mz7y5v2nNfvXf73pvqYg8Yq1idV9qvSMPM3yOzQGfAJJqzH9U7QyY18ZSZXQ22CLqtbAHXEYKYI8JORzUpXDAocVEEnlBOlECtscsKpKKTZODHJTghG1uYBXTA7uoOanmIt16Y+BZdZjqpJuvZfd3urcVQMqJPIN9kK7aGHoYpJLtb3LDvXBUGCi46yxSvR3xwpNHgo+VHJZB6VTbaGdCHbP6glE7rXjN6ARIVqz/IoGSYBHZSIBwnIqISHiTkrpPt+WDSJCWLNikMl9MpQHIj7eq8gLRi+1lvr8RITLEA3DFyfa318MdNonifCjOvjTaqu7n3fMbi2VGsO6l2it9/hesMI4WTbrorjPdZb7h3XYWhc4cdttdZDSXncAOBj2pebyko7YD2If1wKcN2/PM6g03E186jLctmDOiMNinABisqq9L/0BpaPgcgFBX+IYro7TZZdMvPC/pYVRhwIaS8Lfys/d6P1jd95eFlp83P27sP8nqRIKkMG2GfzXY5fpb+qgaF0mg/qgdRp+ScDNmyc460V7RDjyr7ZgpsdEP1jPZ8ck/UXUaXGMJTbcAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"north-star-metric-nsm\"\n        title=\"north-star-metric-nsm\"\n        src=\"/static/4ba2d54367c20fc91a31ae5f1aa392e7/e5715/north-star-metric-nsm.png\"\n        srcset=\"/static/4ba2d54367c20fc91a31ae5f1aa392e7/a6d36/north-star-metric-nsm.png 650w,\n/static/4ba2d54367c20fc91a31ae5f1aa392e7/e5715/north-star-metric-nsm.png 768w,\n/static/4ba2d54367c20fc91a31ae5f1aa392e7/d0143/north-star-metric-nsm.png 1025w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<ol>\n<li>\n<p><strong>Close to the customer’s success moments:</strong> A good NSM is always close to the moment when the customer gets the intended result from your product. </p>\n<p>For Airbnb, the NSM is the <strong>number of nights booked</strong>, close to the ease of trip booking or booking facility in general (customer’s intended result moment).</p>\n</li>\n<li>\n<p><strong>Adds value to your customers:</strong> The NSM should not be just for the company profit; it should add value to your customers. For example, if your NSM is the <strong>number of orders made</strong>, it means you are not focusing on the quality of service.  Hence, the <strong>number of orders delivered without complaints</strong> would be a better NSM than just the number of orders made. </p>\n<p>The satisfied customers will always refer your product or service to their friends resulting in the company’s long-term growth.</p>\n</li>\n<li><strong>Measurable</strong>: Continuing with the above example, you cannot measure ‘satisfaction’ in general. Thus, you will have to figure out a way to measure quality. Reduced number of complaints against X orders or the number of orders delivered before the anticipated time can be considered measurable NSM.</li>\n<li>\n<p><strong>Time-bound</strong>: You NSM should be measurable based on a certain period, which can be an hour, day, week, or month to help you in clearly seeing the growth over time. For example, the <strong>number of orders delivered without complaints in a week</strong> metric helps compare against the previous weeks’ data. Without the <strong>week</strong> parameter, the comparison factor would be missing from the above NSM. </p>\n<p>Never take the year as a period because you should see growth data regularly. Ideally, your NSM should grow every day or week.</p>\n</li>\n<li><strong>Not influenced by external factors</strong>: You NSM should only be influenced by your customers and no other external factors. For example, in the tourism industry, the weather, flight delays, or the local people act as external factors. These factors can influence the customer travel experience and hence the star rating they leave for the entire trip. Thus, the number of 5-star ratings per month is not a good NSM for the tourism industry.</li>\n<li><strong>Reflect your growth</strong>: Your NSM should be directly proportional to your business growth i.e. if the NSM is increasing (positive), your business should grow too, there cannot be an excuse for that. For example, suppose the product or service is related to the reports generation and download. In this case, the NSM should be the <strong>number of reports downloaded by unique customers</strong> instead of the total downloads. Because the total number of downloads can also include scenarios where the customers generated and downloaded the reports multiple times (reason being that the service did not work as expected for the first time).</li>\n</ol>\n<h1 id=\"7-good-examples-of-north-star-metric\" style=\"position:relative;\"><a href=\"#7-good-examples-of-north-star-metric\" aria-label=\"7 good examples of north star metric permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7 good examples of North Star Metric</h1>\n<p>Some of the famous north star metric examples are:</p>\n<ul>\n<li><strong>LinkedIn’s</strong> initial NSM was the <strong>number of endorsements given</strong> because it was a relationship-building factor between the users. But LinkedIn soon realized that endorsements were falsified and they changed their NSM to <strong>monthly active users (MAU)</strong>.</li>\n<li><strong>Spotify’s</strong> NSM is the <strong>time spent listening</strong> on the platform. This NSM measures the value that customers get from the platform.</li>\n<li><strong>Hubspot</strong> is a CRM and its NSM is the <strong>number of weekly active teams</strong>. It captures the new accounts that are getting value and providing a signal of future trial conversion and subscription revenue. Hence this metric indicates or predicts the future revenue.</li>\n<li><strong>Intercom</strong> is a messaging platform with the vision to build a suite of products that makes easy communication with the users of your business. It offers services for both B2B and B2C segments. Their NSM is the <strong>number of customer interactions</strong>.</li>\n<li><strong>Slack</strong> helps in-office collaboration with the mission to keep teams organized and its NSM is <strong>messages sent within the organization</strong>.</li>\n<li><strong>Quora</strong> north star metric is the <strong>number of questions answered</strong>, which is aligned with their mission of being a knowledge-sharing platform.</li>\n<li><strong>Airbnb</strong> has the <strong>number of nights booked</strong> as their NSM because it perfectly combines the booker’s and owner’s value.</li>\n</ul>\n<h1 id=\"how-to-implement-nsm\" style=\"position:relative;\"><a href=\"#how-to-implement-nsm\" aria-label=\"how to implement nsm permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How to Implement NSM?</h1>\n<p>When you are all set with NSM, the next course of action is its execution within the company.</p>\n<p>Every department of the company should have their goals that are aligned with your North Star Metric. So that every department, every team, and every contributor chase their metric, resulting in NSM growth. And then, the requirement is to set up a fertile ground for NSM to grow i.e. nurturing NSM with the right infrastructure and culture.</p>\n<p>Your company will also need to set up the right analytics tools to measure the NSM progress.</p>\n<p>What are you waiting for? Do the exercise to lock your NSM and then see the wonders! Also, feel free to load comment sections with your questions and feedback, I will be happy to address them.</p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABdElEQVQY002RO0/CUBzFG6PtbZWHCAmRmBB5P8vDII9SSC0omog4oAEGjZMO6OKEuLjoJ2Fx0cSBwUQnXZxcHPwux38LJA7nNvfec8+5v1tOCCiwpbbhye2BxbYgBMtgIRVioDRRsARGXxZUzLlEHmehBaesQ4rrEMPViYf2DR9nDGKkChbVICVqsMt1WJI1sHCFwhUsUIFohJH49TxECvRUjhDW2mAbB5iP6hB8hUkhiRPN5KIZYJdrsEYrcCSpmQqMm6/m9ylUhSulY7N5ivROB3L9GOlGF3Ktbc4zuz341UPw/uIk0ESbBjoSGlYIx8BfzjSwVmyCEYEUUmCPa3Bnd+hwC75yC95S05SxbolU/iEbOCFCpDexEfIioTNCNd6Tp6IlMnNuGeeDe3z//OLx5RWj5zFGT2O8fXxh/P4Ja6w6vSEFCnTIlW2YiDzhzX7ATFKojDlvjpBPcDF4QPdyiG5/iE7/BmfXd+hd3VKpCoG8fzxWw2+c+yTpAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"book-a-demo-loginradius\"\n        title=\"book-a-demo-loginradius\"\n        src=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png\"\n        srcset=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/a6d36/book-a-demo-loginradius.png 650w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png 768w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/63ff0/book-a-demo-loginradius.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"January 05, 2021","updated_date":null,"description":"In industry, the North Star Metric was developed to give businesses a singular focus on a single objective. Instead of being distracted by everyday matters or individual tasks, everyone can always evaluate success by whether or not they are advancing the organisation using this metric.","title":"North Star Metric: 6 steps to discover your NSM","tags":null,"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/534f4b37c429182703558f2f3fe71062/14b42/north-star-metrics.jpg","srcSet":"/static/534f4b37c429182703558f2f3fe71062/f836f/north-star-metrics.jpg 200w,\n/static/534f4b37c429182703558f2f3fe71062/2244e/north-star-metrics.jpg 400w,\n/static/534f4b37c429182703558f2f3fe71062/14b42/north-star-metrics.jpg 800w,\n/static/534f4b37c429182703558f2f3fe71062/47498/north-star-metrics.jpg 1200w,\n/static/534f4b37c429182703558f2f3fe71062/0e329/north-star-metrics.jpg 1600w,\n/static/534f4b37c429182703558f2f3fe71062/4a461/north-star-metrics.jpg 2560w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Archna Yadav","github":null,"avatar":null}}}},{"node":{"excerpt":"The marketing funnel's very last step includes some sign-up process if you want to increase your conversion rate, generate leads, or make a…","fields":{"slug":"/growth/sign-up-tips-conversion-rate/"},"html":"<p>The marketing funnel's very last step includes some sign-up process if you want to increase your conversion rate, generate leads, or make a sale. But, just because you got them this far doesn't mean that if your type isn't optimized at least as well as the rest of the funnel, your prospects won't bolt in a second.</p>\n<p>When using your sign up forms, the following tips will help you <a href=\"https://www.loginradius.com/blog/identity/2020/05/customer-experience-retail-industry/\">maximize your prospects' experience</a> and plug in the leaks that arise so frequently at the critical endpoint of your funnel.</p>\n<p>Your sign-up form should be transparent and quick to understand. Avoid using confusing areas that frustrate users. When they fill out the form, tell the users what to do, don't wait until they have made a mistake. Near the area, put specific instructions so that they understand what they have to do.</p>\n<p><strong><em>9 mantras to increase your sign up rates:</em></strong></p>\n<ol>\n<li>Reduce the number of fields for the form </li>\n<li>Create a secure sign-up form</li>\n<li>Using Signup Popup Forms </li>\n<li>Add live chat to your site</li>\n<li>Allow social signups</li>\n<li>Be creative with sign-up CTAs</li>\n<li>A/B testing for CTAs</li>\n<li>Distraction free Signup experience</li>\n<li>Show clear Value prop</li>\n</ol>\n<p><strong><em>Let's dive in!</em></strong></p>\n<h2 id=\"1-reduce-the-number-of-fields-for-the-sign-up-form\" style=\"position:relative;\"><a href=\"#1-reduce-the-number-of-fields-for-the-sign-up-form\" aria-label=\"1 reduce the number of fields for the sign up form permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Reduce the number of fields for the sign-up form</h2>\n<p>You need to make the signup forms as short as possible to convert the users.</p>\n<p>If these forms are lengthy and need so much data to be completed, individuals may not take the time to fill them out.</p>\n<p>Shorter forms are not only easier to fill out, but the visitor is also less intrusive.</p>\n<p>Longer forms need more details. But the visitor to the website may be unwilling to provide you with any information about themselves.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 58.92307692307692%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwUlEQVQoz31STWvbMBjOr9wO3e67tpAFdtm5tJQcdlh2SCCHwT6gtIUWFgi9bO02ksNiQtbFI45b2/FHMqmWIkuWvFdymgQGe7DQ8348vB9ypdiCUmo4HA4Gg9FoNDb4aQCmbdv9fh8hVKYBpJQVuLIsM1YObghHBkmS+L4/n8+jMApmAZA4joUQ6zIrMaU0z3NlXMV/obagxYwxQohUamp9WwTuJkNqbKf+a1Ycx+E8g4pOc3fRuwAC7UFgU0rmcMqmSt2mMgyWMQa5bruGrUtO0KhZVTkndIkxLh5m4UJgQtdzrcSe50Hn4Ju2nyPrUuDYPnoMYf/zR7fTBDL+2mGU3jvWzYd9MP8gRNIUCKzJVM4yqcU1EHOcjOtPIRZ2GsHpoRbXd6hvE7s3aTwDc3JSD66OtVjwCluysm2ntYd+dDmOfx0+gtjs0xvv5MCInywDO7V7v19r8e3bF1G3tRLDpd+5KLzjfXxzLdLFpLWr1/blfdjVbTvtKoumZGq5717qcc5fzb+fGbHYiFmKcli7lDgJwblMcYoWQFAyE5xzxoBo/z1i9GHmrR9gRaQhjGWzMHJd9/bOK6OlX5Wf2fZf+3+asWYWfQsAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"forms-fewer-fields\"\n        title=\"forms-fewer-fields\"\n        src=\"/static/76e53eab2aa7d811e208887da9a86744/e5715/forms-fewer-fields.png\"\n        srcset=\"/static/76e53eab2aa7d811e208887da9a86744/a6d36/forms-fewer-fields.png 650w,\n/static/76e53eab2aa7d811e208887da9a86744/e5715/forms-fewer-fields.png 768w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Source: wingify</p>\n<p>Your sign-ups might be crazy high if your sales team doesn't get all the lead details they need to follow up, but your close rate would be garbage. To find the correct balance between having the key lead details and holding fields to a minimum. Just make sure every sector plays a critical role. Drop it, if not.</p>\n<h2 id=\"2-create-a-secure-sign-up-and-registration-form\" style=\"position:relative;\"><a href=\"#2-create-a-secure-sign-up-and-registration-form\" aria-label=\"2 create a secure sign up and registration form permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Create a secure sign-up and registration form</h2>\n<p>Many developers and website owners overlook the value of providing a safe login form on websites. The incompetence of these web developers can cause a lot of harm to their guests without understanding the dangers of their actions.</p>\n<p><a href=\"https://www.loginradius.com/blog/identity/2020/12/login-security/\">Securing a login</a> form for any website may seem like a tiny move towards web security. Still, users get a negative impression of the safety of the website without taking this step. On the opposite, you are rewarding user perceptions regarding web protection by securing a website's login type.</p>\n<p>The key here is as much as possible to lower the barrier to entry. You don't want your guests to worry about it until they've agreed to sign up. An unsafe sort of website is a chance to change their minds.</p>\n<p>To find the best balance between customer experience and protection, the LoginRadius Identity Platform provides a full range of <a href=\"https://www.loginradius.com/authentication/\">customer registration and authentication options</a>.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 57.53846153846154%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWUlEQVQoz41SW26DMBDM/c/QHIEjRIqU/jTpZ5PPNAGMMbZxwGAe5dHBVglUqtQRssyuZ3a83k1pUSxgjBmGYbT4sui6zm3atsU6/mCTpimNouv1erdgLJFS4jRyTdMgG8cx4mEYBkGQcJ4q5bITWcqUMUYpBefxeGAVQsxkpVRMKSEEZ5IkEYLP0o4sEXWSWZYtyTCJX+giAhVIC4u+71dkCCOttYbPNRm+YqSqqkI7nPSKDG3OubJw2ss7K5Xizufz2fd9Z+1pe2oYjVBZWkBlScZe6+JweN1uX/b7fZ7nc3ZVGTXwSM62M4ZVF7iKzrIcNcHEHubnh5zIiJ5O757nHY9vv4wBwziMf8CSy/LjctntdriY69nckraribj79wCzQEh0u91ixiZFW3yD8Wk4b/O8blqMGsjLGer6rmpMWZTG4DM4UNf1s/K0BERH0ScKTBPGxn/jG0VnqTU/MfwYAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"long-form-vs-short-form\"\n        title=\"long-form-vs-short-form\"\n        src=\"/static/c87e2af06a1da8823013061b6a75fcbe/e5715/long-form-vs-short-form.png\"\n        srcset=\"/static/c87e2af06a1da8823013061b6a75fcbe/a6d36/long-form-vs-short-form.png 650w,\n/static/c87e2af06a1da8823013061b6a75fcbe/e5715/long-form-vs-short-form.png 768w,\n/static/c87e2af06a1da8823013061b6a75fcbe/e619b/long-form-vs-short-form.png 787w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Source: moreconversion</p>\n<h2 id=\"3-using-signup-popup-forms\" style=\"position:relative;\"><a href=\"#3-using-signup-popup-forms\" aria-label=\"3 using signup popup forms permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Using Signup Popup Forms</h2>\n<p>Your conversion rate will be Skyrocket by one shift. To get the highest conversion rate from them, here are some few tips:</p>\n<ul>\n<li>Try many things before finding a good piece of content that increases conversion for your site (PDFs, premium content, etc.).</li>\n<li>But a delay timer of 15 seconds on the pop-up prevents them from being distracting.</li>\n<li>Make it easy for the pop-up to close.</li>\n<li>Set a cookie so that only once per user will the pop-up appear. You can do this with most pop-up tools.</li>\n</ul>\n<p>This combination will provide you with a massive conversion boost and keep your complaints to zero. You're not going to bother anybody, and you get all the perks.</p>\n<h2 id=\"4-add-live-chat-to-your-site\" style=\"position:relative;\"><a href=\"#4-add-live-chat-to-your-site\" aria-label=\"4 add live chat to your site permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. Add live chat to your site.</h2>\n<p>Items and their characteristics often confuse consumers. Offering options in real-time helps speed up their purchase decisions. When interacting with a real person, this is particularly true.</p>\n<p>Customers want to feel listened to, and that's just what it brings to live chat. Rapidly addressing challenges in a tailored manner leaves clients happy and positively affects their purchase decisions.</p>\n<p>On any platform, live chat tools are simple to add and have an instant boost to your versions, just like a pop-up.</p>\n<h2 id=\"5-allow-social-logins\" style=\"position:relative;\"><a href=\"#5-allow-social-logins\" aria-label=\"5 allow social logins permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. Allow social logins</h2>\n<p>For users, <a href=\"https://www.loginradius.com/social-login/\">social login</a> is easy to use and improves the conversion rate for registrations.</p>\n<p>Nevertheless, with social sign-up, the user's privacy is again in the spotlight. Most of them do not realize that, with this registration form, they agree to the use of their data by businesses. An opportunity that companies take to sell the product that best fits their preferences and desires to each customer, in a much more segmented and customized way.</p>\n<p><a href=\"https://www.loginradius.com/resource/social-login-reconsidered/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABcUlEQVQY01WRO08CURCFiQUsu8AiipEsIYTnCgiKuKysCy5vfEYbFY1RS42SmFgJNjbGP2JsTIyFUQsLKm0sbUz8KcfZBUkszp2bzJ1vzsw1WSPz0MWSOFGFTcyDi6p0z4Ol+JfXxYRyYONFjMrrGEmWYE2UwYgFMGGll6doMmBU6J7UMCwq4IJZ2EMy3KkSPJkG+PjCoMBK0ZaswKdtI1beBCttgEnWyIwCpt/UAFqoc1hZgbq2h0xtC46wDDYgwUZwPqY76L1xkSthtgFPuoqx6SqETI1Uxzhp4FA/9AIhXUGUoIFsA65oDs7IHAElA/g3siXUcypIi/Bml+CVl+FMaDAHc/+B+r4cUQUWXxpmbwpMrAhmQgPnn6GRC8ZeTZ4pHHdu8PX9g/unN9w+POPu8QXdj0+8dt/B98EDIC+SCwKy+qc0z8DVD2CPl8hhnrqrGPJLyK7u4+jiGjutDponbTRP2zg8v8Ju69JoaiHWLw3/wWxRywZmAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"social-login-reconsidered\"\n        title=\"social-login-reconsidered\"\n        src=\"/static/bf408b3bda215542fe05da49cb06b853/e5715/social-login-reconsidered.png\"\n        srcset=\"/static/bf408b3bda215542fe05da49cb06b853/a6d36/social-login-reconsidered.png 650w,\n/static/bf408b3bda215542fe05da49cb06b853/e5715/social-login-reconsidered.png 768w,\n/static/bf408b3bda215542fe05da49cb06b853/63ff0/social-login-reconsidered.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<p>Few advantages of using social signups:</p>\n<ul>\n<li>It improves the signing up process- The registration and login processes are quicker, from 1 minute to 1 second. This would have an effect on your conversion rate for sign-up.</li>\n<li>Enabling social functionality is beneficial- By typing their credentials, users can post, comment, or even play games without building an account or wasting time.</li>\n<li>It doesn't require a new password to be created- This method uses the users' social media information, so they have one less password to handle. This is something that they enjoy so much.</li>\n<li>This suggests fewer failed logins- They have to press the social network that they want to use. They won't, therefore, incorrectly fill in their details. Smartphone users may be the most appreciative of this choice, as it is often inconvenient to use this computer to type this information.</li>\n</ul>\n<h2 id=\"6-be-creative-with-sign-up-ctas\" style=\"position:relative;\"><a href=\"#6-be-creative-with-sign-up-ctas\" aria-label=\"6 be creative with sign up ctas permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. Be creative with sign-up CTAs.</h2>\n<p>One of the most critical sections of your sign-up forms is your CTA button. It should attract the attention of the consumer and motivate them to take a specific action. From the form's background color, pick a bright color contrast. </p>\n<p>Make sure it has a simple value proposition when writing a copy of your sign-up button. Using \"Book a free demo\" or \"start your free trial\" instead of using just a simple \"sign up\" or \"download\" button. The subsequent copy explains to the customer what they can get when they sign up.</p>\n<h2 id=\"7-ab-testing-for-ctas\" style=\"position:relative;\"><a href=\"#7-ab-testing-for-ctas\" aria-label=\"7 ab testing for ctas permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7. A/B testing for CTAs</h2>\n<p>Your CTA button is one of the essential parts of your sign-up forms. Signup form CTAs are the ideal candidate for a/b testing.</p>\n<p>You can evaluate several different components of a CTA, such as:</p>\n<ol>\n<li>Dimension</li>\n<li>Placement</li>\n<li>Colour</li>\n<li>Fonts</li>\n<li>Text</li>\n</ol>\n<p>Having small modifications can have a significant effect on your conversions. Make sure that you measure only one item at a time.</p>\n<p>If your A/B checks have been completed, you can rest assured that your CTA signup form is designed for high conversions.</p>\n<h2 id=\"8-distraction-free-signup-experience\" style=\"position:relative;\"><a href=\"#8-distraction-free-signup-experience\" aria-label=\"8 distraction free signup experience permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8. Distraction Free Signup experience</h2>\n<p>Building a high-converting form has always been difficult, even though most of the web's traffic was from the desktop, one that eliminates friction by making it very easy. The share of smartphone users has overtaken the desktop in recent years, creating an additional degree of complexity for designers who now have to build forms with a mobile-first mindset. It comes with its own special collection of issues to conceptualise a signup experience for a smaller screen.</p>\n<p>Speed in UX is crucial when it comes to forms, too. Users do not want to bother with tedious types, nor do they feel like typing their passwords from scratch, especially where it is harder to do so on mobile devices.</p>\n<h2 id=\"9-show-clear-value-prop\" style=\"position:relative;\"><a href=\"#9-show-clear-value-prop\" aria-label=\"9 show clear value prop permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9. Show clear Value prop</h2>\n<p>One of the most critical sections of your sign-up forms is your CTA button. It should attract the attention of the consumer and motivate them to take a specific action.</p>\n<p>Make sure it has a simple value proposition when writing a copy of your sign-up button. Using \"claim your free trial\" or \"start your free demo\" instead of using just a simple \"sign up\" or \"download\" button. The subsequent copy explains to the customer what they can get when they sign up.</p>\n<h3 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>Conclusion</strong></h3>\n<p>Following the tips and examples shown in this article is your next move. If you can get it right, you can build better sign-up forms for conversion and increase the number of quality leads created.</p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABdElEQVQY002RO0/CUBzFG6PtbZWHCAmRmBB5P8vDII9SSC0omog4oAEGjZMO6OKEuLjoJ2Fx0cSBwUQnXZxcHPwux38LJA7nNvfec8+5v1tOCCiwpbbhye2BxbYgBMtgIRVioDRRsARGXxZUzLlEHmehBaesQ4rrEMPViYf2DR9nDGKkChbVICVqsMt1WJI1sHCFwhUsUIFohJH49TxECvRUjhDW2mAbB5iP6hB8hUkhiRPN5KIZYJdrsEYrcCSpmQqMm6/m9ylUhSulY7N5ivROB3L9GOlGF3Ktbc4zuz341UPw/uIk0ESbBjoSGlYIx8BfzjSwVmyCEYEUUmCPa3Bnd+hwC75yC95S05SxbolU/iEbOCFCpDexEfIioTNCNd6Tp6IlMnNuGeeDe3z//OLx5RWj5zFGT2O8fXxh/P4Ja6w6vSEFCnTIlW2YiDzhzX7ATFKojDlvjpBPcDF4QPdyiG5/iE7/BmfXd+hd3VKpCoG8fzxWw2+c+yTpAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"book-a-demo-loginradius\"\n        title=\"book-a-demo-loginradius\"\n        src=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png\"\n        srcset=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/a6d36/book-a-demo-loginradius.png 650w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png 768w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/63ff0/book-a-demo-loginradius.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"January 05, 2021","updated_date":null,"description":"It should be clear and easy to understand your sign-up form. Avoid using undefined fields that frustrate users. Your next step is to follow the tips and examples shown in this article. If you can get it right, better conversion sign-up forms can be developed and the amount of quality leads produced can be increased.","title":"9 Signup Tips To Skyrocket The Conversion Rate","tags":null,"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.6,"src":"/static/edd68e06d3b48bea04c157d4bde4f9ab/14b42/sign-up-rate.jpg","srcSet":"/static/edd68e06d3b48bea04c157d4bde4f9ab/f836f/sign-up-rate.jpg 200w,\n/static/edd68e06d3b48bea04c157d4bde4f9ab/2244e/sign-up-rate.jpg 400w,\n/static/edd68e06d3b48bea04c157d4bde4f9ab/14b42/sign-up-rate.jpg 800w,\n/static/edd68e06d3b48bea04c157d4bde4f9ab/47498/sign-up-rate.jpg 1200w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},{"node":{"excerpt":"In JavaScript, web workers allow developers to benefit from parallel programming. Parallel programming enables various computations to be…","fields":{"slug":"/engineering/web-workers/"},"html":"<p>In JavaScript, web workers allow developers to benefit from parallel programming. Parallel programming enables various computations to be performed at the same time by applications. </p>\n<p>Web Workers are a browser feature that allows scripts to be executed on a separate thread from the main execution thread of your web application. This allows the main thread of your web application to run without being blocked by slow scripts in your application.</p>\n<h3 id=\"isnt-javascript-already-asynchronous\" style=\"position:relative;\"><a href=\"#isnt-javascript-already-asynchronous\" aria-label=\"isnt javascript already asynchronous permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Isn't JavaScript already asynchronous?</h3>\n<p>Well, sort of. This has been something that had confused me many a time when I was initially learning about JavaScript. JavaScript a synchronous, single-threaded language. However, JavaScript has features that allow you to execute asynchronous code, which is handled by browser engines (on your client) or by your OS (in NodeJS), which are capable of executing code in multiple threads.</p>\n<p>We work with asynchronous methods in JavaScript by either using callbacks, <a href=\"https://compile7.org/decompile/callback-vs-promises-vs-async-await/\">Promises or async/await</a>. We'll use Promises as an example for exploring asynchronicity in JavaScript.</p>\n<p>Promises are proxies for values that are not yet available when the Promise is created. This lets you organize parts of your code to run when the value becomes available or if something goes wrong.</p>\n<p>This does not mean that your code is running asynchronously. As I mentioned before, JavaScript code is executed on a single thread. The callback that processes the response from your created Promises still runs on your single main thread. Promises do, however, allow you to spawn asynchronous tasks, such as file I/O or making an HTTP request which runs outside of your code. This allows your main thread to work on something else while waiting for these tasks to return a response. This means that the callback functions which run after a response is received are called asynchronously.</p>\n<p>I feel that the distinction between your code running asynchronously vs. being called asynchronously is important, as you will see that you are not able to perform computationally expensive tasks without blocking your main thread, even when using Promises.</p>\n<p>Here is an example of using an expensive function (finding prime numbers) wrapped in a Promise.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">findPrimeNumbers</span><span class=\"mtk1\">(</span><span class=\"mtk12\">max</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> </span><span class=\"mtk4\">new</span><span class=\"mtk1\"> </span><span class=\"mtk10\">Promise</span><span class=\"mtk1\">((</span><span class=\"mtk12\">resolve</span><span class=\"mtk1\">) </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;starting findPrimeNumbers&quot;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk4\">let</span><span class=\"mtk1\"> </span><span class=\"mtk12\">primes</span><span class=\"mtk1\"> = [];</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk15\">for</span><span class=\"mtk1\"> (</span><span class=\"mtk4\">let</span><span class=\"mtk1\"> </span><span class=\"mtk12\">i</span><span class=\"mtk1\"> = </span><span class=\"mtk7\">0</span><span class=\"mtk1\">; </span><span class=\"mtk12\">i</span><span class=\"mtk1\"> &lt; </span><span class=\"mtk12\">max</span><span class=\"mtk1\">; </span><span class=\"mtk12\">i</span><span class=\"mtk1\">++) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">i</span><span class=\"mtk1\"> === </span><span class=\"mtk7\">0</span><span class=\"mtk1\"> || </span><span class=\"mtk12\">i</span><span class=\"mtk1\"> === </span><span class=\"mtk7\">1</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk15\">continue</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk4\">let</span><span class=\"mtk1\"> </span><span class=\"mtk12\">isPrime</span><span class=\"mtk1\"> = </span><span class=\"mtk4\">true</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk15\">for</span><span class=\"mtk1\"> (</span><span class=\"mtk4\">let</span><span class=\"mtk1\"> </span><span class=\"mtk12\">y</span><span class=\"mtk1\"> = </span><span class=\"mtk7\">2</span><span class=\"mtk1\">; </span><span class=\"mtk12\">y</span><span class=\"mtk1\"> &lt; </span><span class=\"mtk12\">i</span><span class=\"mtk1\">; ++</span><span class=\"mtk12\">y</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">i</span><span class=\"mtk1\"> % </span><span class=\"mtk12\">y</span><span class=\"mtk1\"> === </span><span class=\"mtk7\">0</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                    </span><span class=\"mtk12\">isPrime</span><span class=\"mtk1\"> = </span><span class=\"mtk4\">false</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                    </span><span class=\"mtk15\">break</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">isPrime</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">primes</span><span class=\"mtk1\">.</span><span class=\"mtk11\">push</span><span class=\"mtk1\">(</span><span class=\"mtk12\">i</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;prime numbers found&quot;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk11\">resolve</span><span class=\"mtk1\">(</span><span class=\"mtk12\">primes</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    });</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;a&quot;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk11\">findPrimeNumbers</span><span class=\"mtk1\">(</span><span class=\"mtk7\">100000</span><span class=\"mtk1\">).</span><span class=\"mtk11\">then</span><span class=\"mtk1\">(() </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;b&quot;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">});</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;c&quot;</span><span class=\"mtk1\">);</span></span></code></pre>\n<p>You'll find that the above program will print the following:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk12\">a</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">starting</span><span class=\"mtk1\"> </span><span class=\"mtk12\">findPrimeNumbers</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">prime</span><span class=\"mtk1\"> </span><span class=\"mtk12\">numbers</span><span class=\"mtk1\"> </span><span class=\"mtk12\">found</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">c</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">b</span></span></code></pre>\n<p>The ordering of <code>a</code>, <code>b</code>, and <code>c</code> is not particularly noteworthy, as we already know that the callback for the <code>findPrimeNumbers</code> function will only execute after the main thread has nothing left to do, after printing <code>c</code>.</p>\n<p>What I did find interesting was that the statement printing <code>c</code> waits until the <code>findPrimeNumbers</code> function completes before being executed. To prevent functions like this from blocking the main thread, we'll have to use Web Workers.</p>\n<p>Web Workers run in a separate thread altogether, with no access to the context of the main thread. Data is sent between the worker and the main thread using a system of messages: the <code>postMessage()</code> method is used to send a message from one to the other, and the <code>onmessage</code> event handler is used to receive and respond to messages.</p>\n<p>First we need to create the script (we'll just call it <code>find-prime-numbers.js</code>) that the Web Worker will run:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk11\">onmessage</span><span class=\"mtk1\"> = (</span><span class=\"mtk12\">event</span><span class=\"mtk1\">) </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> { </span><span class=\"mtk12\">data</span><span class=\"mtk1\"> } = </span><span class=\"mtk12\">event</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">primes</span><span class=\"mtk1\"> = </span><span class=\"mtk11\">findPrimeNumbers</span><span class=\"mtk1\">(</span><span class=\"mtk11\">parseInt</span><span class=\"mtk1\">(</span><span class=\"mtk12\">data</span><span class=\"mtk1\">));</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk11\">postMessage</span><span class=\"mtk1\">(</span><span class=\"mtk12\">primes</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">};</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">findPrimeNumbers</span><span class=\"mtk1\">(</span><span class=\"mtk12\">max</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;starting findPrimeNumbers&quot;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">let</span><span class=\"mtk1\"> </span><span class=\"mtk12\">primes</span><span class=\"mtk1\"> = [];</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">for</span><span class=\"mtk1\"> (</span><span class=\"mtk4\">let</span><span class=\"mtk1\"> </span><span class=\"mtk12\">i</span><span class=\"mtk1\"> = </span><span class=\"mtk7\">0</span><span class=\"mtk1\">; </span><span class=\"mtk12\">i</span><span class=\"mtk1\"> &lt; </span><span class=\"mtk12\">max</span><span class=\"mtk1\">; </span><span class=\"mtk12\">i</span><span class=\"mtk1\">++) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">i</span><span class=\"mtk1\"> === </span><span class=\"mtk7\">0</span><span class=\"mtk1\"> || </span><span class=\"mtk12\">i</span><span class=\"mtk1\"> === </span><span class=\"mtk7\">1</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk15\">continue</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk4\">let</span><span class=\"mtk1\"> </span><span class=\"mtk12\">isPrime</span><span class=\"mtk1\"> = </span><span class=\"mtk4\">true</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk15\">for</span><span class=\"mtk1\"> (</span><span class=\"mtk4\">let</span><span class=\"mtk1\"> </span><span class=\"mtk12\">y</span><span class=\"mtk1\"> = </span><span class=\"mtk7\">2</span><span class=\"mtk1\">; </span><span class=\"mtk12\">y</span><span class=\"mtk1\"> &lt; </span><span class=\"mtk12\">i</span><span class=\"mtk1\">; ++</span><span class=\"mtk12\">y</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">i</span><span class=\"mtk1\"> % </span><span class=\"mtk12\">y</span><span class=\"mtk1\"> === </span><span class=\"mtk7\">0</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">isPrime</span><span class=\"mtk1\"> = </span><span class=\"mtk4\">false</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk15\">break</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">isPrime</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk12\">primes</span><span class=\"mtk1\">.</span><span class=\"mtk11\">push</span><span class=\"mtk1\">(</span><span class=\"mtk12\">i</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;prime numbers found&quot;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> </span><span class=\"mtk12\">primes</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}  </span></span></code></pre>\n<p>The <code>onmessage</code> handler receives an event with the message itself contained in the event's <code>data</code> attribute. Here we execute the <code>findPrimeNumbers()</code> function again, and use <code>postMessage()</code> function to send the result back to the main thread.</p>\n<p>Over in your main script, we'll create a worker object using the constructor <code>new Worker()</code>, which runs the named JavaScript file containing the code that we just wrote, which will run in the worker thread.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">primeNumberWorker</span><span class=\"mtk1\"> = </span><span class=\"mtk4\">new</span><span class=\"mtk1\"> </span><span class=\"mtk10\">Worker</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;./find-prime-numbers.js&quot;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">primeNumberWorker</span><span class=\"mtk1\">.</span><span class=\"mtk11\">onmessage</span><span class=\"mtk1\"> = (</span><span class=\"mtk12\">event</span><span class=\"mtk1\">) </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;b&quot;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">};</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;a&quot;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">primeNumberWorker</span><span class=\"mtk1\">.</span><span class=\"mtk11\">postMessage</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;100000&quot;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;c&quot;</span><span class=\"mtk1\">);</span></span></code></pre>\n<p>Running this script will print the following:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">a</span>\n<span class=\"grvsc-line\">c</span>\n<span class=\"grvsc-line\">starting findPrimeNumbers</span>\n<span class=\"grvsc-line\">prime numbers found</span>\n<span class=\"grvsc-line\">b</span></code></pre>\n<p>You can see that this time, the prime numbers function is actually running on a thread separate from our main one, which allows the main thread to continue printing the statement <code>c</code> while the worker thread works out its own response.</p>\n<h3 id=\"when-should-you-use-javascript-web-worker\" style=\"position:relative;\"><a href=\"#when-should-you-use-javascript-web-worker\" aria-label=\"when should you use javascript web worker permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>When should you use JavaScript Web Worker</h3>\n<p>To reiterate, Web Workers allow you to run your own <a href=\"https://www.loginradius.com/blog/engineering/adding-multi-threading-to-javascript-using-web-workers/\">code on a separate thread</a>, which allows your main thread to continue rendering the UI, receive user input, etc., while your worker thread processes a response. </p>\n<p>For most web applications, the most expensive operations in your code will often be I/O, interacting with resources in your network. Thanks to <a href=\"https://www.loginradius.com/blog/engineering/understanding-event-loop/\">JavaScript's Event Loop</a>, these are already offloaded from your main thread to your system's operating system. As such, there is no need for Web Workers when making these kinds of operations. </p>\n<p>If you need to process large sets of data, there is a decent chance that you will be able to perform this on your server-side before sending it to your front end client for display to the user. This will allow you to rely on JavaScript's event loop to prevent these expensive operations from blocking your main thread.</p>\n<p>However, if your scenario must have these long-running tasks running on your client end, Web Workers would be an ideal solution for your needs. Some examples of these could be:</p>\n<ul>\n<li>As-you-type string validation, in situations where your validation logic is complex, such as a spell checker.</li>\n<li>Encrypting and decrypting data within your client, especially in cases where data is being exchanged frequently and cannot be exposed to your server.</li>\n<li>Client-side workspaces to allow your users to process and manipulate data before sending it to your server.</li>\n</ul>\n<h3 id=\"javascripty-web-worker-limitations\" style=\"position:relative;\"><a href=\"#javascripty-web-worker-limitations\" aria-label=\"javascripty web worker limitations permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Javascripty Web Worker Limitations</h3>\n<p>As Web Workers work on a separate thread, it has no access to the parent page, which calls it. This means that the worker itself cannot manipulate the DOM nor access any data stored within it. It is not able to access the browser's localStorage and sessionStorage either. You are limited to the data sent directly via <code>postMessage</code> or IndexedDB for accessing stored client data.</p>\n<p>As with anything multithreaded, adding Web Workers into your application will add complexity to your application. Natively, <code>postMessage</code> is the only direct line of communication between threads. You will need to define how more complex workflows will be managed between your main thread and worker thread (such as error handling).</p>\n<p>If your worker can be triggered multiple times, each request will simply be queued and will run when the previous has been completed. For more complex queuing mechanisms, you would have to define this yourself.</p>\n<h3 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusion</h3>\n<p>With discussions dating back a decade, Web Workers are not a new feature. Despite their powerful potential, they haven't been widely adopted. Client side applications, for the most part, just haven't needed to perform intensive tasks where Web Workers would have been a solution. In addition, with a lack of widespread use, finding relatable examples to reference when implementing them is an extra barrier for adoption. </p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n  .dark-default-dark {\n    background-color: #1E1E1E;\n    color: #D4D4D4;\n  }\n  .dark-default-dark .mtk4 { color: #569CD6; }\n  .dark-default-dark .mtk1 { color: #D4D4D4; }\n  .dark-default-dark .mtk11 { color: #DCDCAA; }\n  .dark-default-dark .mtk12 { color: #9CDCFE; }\n  .dark-default-dark .mtk15 { color: #C586C0; }\n  .dark-default-dark .mtk10 { color: #4EC9B0; }\n  .dark-default-dark .mtk8 { color: #CE9178; }\n  .dark-default-dark .mtk7 { color: #B5CEA8; }\n</style>","frontmatter":{"date":"December 28, 2020","updated_date":null,"description":"Learn how to use JavaScript web workers to create parallel programming and execute multiple operations concurrently rather than interconnecting them.","title":"Web Workers in JS - An Introductory Guide","tags":["Web Workers"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/a17120a4316c8564d40dee1e652c0641/ee604/unsplash.png","srcSet":"/static/a17120a4316c8564d40dee1e652c0641/69585/unsplash.png 200w,\n/static/a17120a4316c8564d40dee1e652c0641/497c6/unsplash.png 400w,\n/static/a17120a4316c8564d40dee1e652c0641/ee604/unsplash.png 800w,\n/static/a17120a4316c8564d40dee1e652c0641/f3583/unsplash.png 1200w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Nick Chim","github":"nickc95","avatar":null}}}},{"node":{"excerpt":"A website is incomplete without a contact form. Depending on the company’s requirements, there are several implications where they may be…","fields":{"slug":"/identity/bot-attacks/"},"html":"<p>A website is incomplete without a contact form. Depending on the company’s requirements, there are several implications where they may be added. For example, they may be included as a permanent element or used as a sudden appearing pop-up on websites. </p>\n<p>It is no surprise that the contact form attracts a lot of bot attacks. Hackers not only create false traffic, resulting in damages to brand images, it also results in malicious attacks on websites. The objective of this blog is to help you to secure contact form. </p>\n<p>We will explore the various methods that can be used to prevent bots from submitting forms and not fall into a random audacious attack.</p>\n<h1 id=\"what-is-a-spambot\" style=\"position:relative;\"><a href=\"#what-is-a-spambot\" aria-label=\"what is a spambot permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What Is a Spambot?</h1>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.769230769230774%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABhklEQVQoz11S226DMAzl/79p0n5gk7o+TFVHu1svo1wLJIGQ5MwOBFEimYTEPj7HduScw7jcZPSlu3Dfaot7ZyBoZyvprAY7+639I/5o69AMDi2ZnRMAchgBtHEYyEcbi54sV4O/W4KGc8RgqdAoG4G8UcjIOSwG6wjgp+5xEwOuZKky/q3qzOxnlwzr3iCTGpvdEfHpjwANCgJlqcyEZfK5J0bnssVX1niwXA4z2KXVaPoxQcQHzv6eChxKYkiOxSSJd5Y6Amg8bT7wvD3gWEjsczmz4ng51TXiAJYWbCmFk7V6/L/WHV6PV2y/b9gmLWICFdNbYOdryAcG5c4lVEvjHovNCbjLn8R+nyvsMom3RHhFkgA59o/iwoqWXWrIgZu0HgWu342CdplATFJ/7wqHQnkCXJZgNjAMgXeizgUOdzwmD2NECTMC4XryG5eo7i3iqvcKOf4BUEydDezCOCzZzqNCSmryT6saL/EZstMEaEfA9YCul1sBLwlcKoFTXiNpOl/Pf1ZcWzj9BDUOAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"spambot\"\n        title=\"spambot\"\n        src=\"/static/94b847f1d6396e8ae36d410eed99679a/e5715/spambot.png\"\n        srcset=\"/static/94b847f1d6396e8ae36d410eed99679a/a6d36/spambot.png 650w,\n/static/94b847f1d6396e8ae36d410eed99679a/e5715/spambot.png 768w,\n/static/94b847f1d6396e8ae36d410eed99679a/2bef9/spambot.png 1024w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>A spambot is a malicious program or unethical activity specially designed to gather email addresses or information from contact forms. It is usually done by sending spam emails.\nAs emails have a distinct structure, a bot creation process is easy for hackers. Hence, you need to be extra cautious while using contact forms for your website or important marketing campaigns. </p>\n<p>Here are some proven ways that will help your secure contact forms from spambots.</p>\n<h2 id=\"12-best-ways-to-stop-bots-from-filling-out-forms\" style=\"position:relative;\"><a href=\"#12-best-ways-to-stop-bots-from-filling-out-forms\" aria-label=\"12 best ways to stop bots from filling out forms permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>12 Best Ways to Stop Bots From Filling Out Forms</h2>\n<h3 id=\"1-add-google-recaptcha\" style=\"position:relative;\"><a href=\"#1-add-google-recaptcha\" aria-label=\"1 add google recaptcha permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. “Add Google reCAPTCHA.”</h3>\n<p>One of the most common ways to stop bots from filling up your form is to add CAPTCHA to the contact form. It offers an intelligent program that ensures that users who are filling out forms are actually humans.\nThe process is simplified by Google with reCAPTCHA and can be used as a protective practice against bots. However, this is not a silver bullet but effective against basic bots. Also, you might be sacrificing some bit of <a href=\"https://www.loginradius.com/blog/identity/2018/10/digital-transformation-safeguarding-customer-experience/\">user experience for security</a></p>\n<h3 id=\"2-secure-contact-forms-using-a-double-opt-in-form\" style=\"position:relative;\"><a href=\"#2-secure-contact-forms-using-a-double-opt-in-form\" aria-label=\"2 secure contact forms using a double opt in form permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. “Secure contact forms using a double opt-in form.”</h3>\n<p>Double opt-in forms make the signup process more secure and help to create spam-free contact forms. For example, it will send a confirmation link to your email address when you enter the email address. Humans generally feel comfortable with the process, but bots skip this step. </p>\n<h3 id=\"3-add-a-test-question-to-your-contact-form\" style=\"position:relative;\"><a href=\"#3-add-a-test-question-to-your-contact-form\" aria-label=\"3 add a test question to your contact form permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. “Add a test question to your contact form.”</h3>\n<p>Add some <a href=\"https://www.loginradius.com/blog/identity/2019/01/best-practices-choosing-good-security-questions/\">tricky questions</a> to your form that are easy to understand by humans, but confuse the bots. However, make sure you put some common questions; otherwise, it may frustrate your potential subscribers.</p>\n<h3 id=\"4-add-honeypots\" style=\"position:relative;\"><a href=\"#4-add-honeypots\" aria-label=\"4 add honeypots permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. “Add Honeypots.”</h3>\n<p>Honeypots are hidden fields that are added to the user registration form to prevent bots from submitting forms. Users cannot see these, but bots can detect them. In this way, if the information is provided for that hidden field, it alerts you that a spambot is trying to fill the form. This unseen field can be programmed using CSS or HTML.  </p>\n<h3 id=\"5-implement-time-analysis\" style=\"position:relative;\"><a href=\"#5-implement-time-analysis\" aria-label=\"5 implement time analysis permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. “Implement time-analysis.”</h3>\n<p>This is again a great way to identify spammers since humans usually will take some time to fill out all the fields of a form while bots can do it instantly. So, measuring the time taken to fill a form can be helpful when finalizing your contact list.</p>\n<p><a href=\"https://www.loginradius.com/resource/understanding-credential-stuffing-attacks-whitepaper\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABbElEQVQY00WQOU8CURSFCTGAA4ICEUUgGJV9kXUQxWEZGGSJBgtCkBhDY2KiVlZKZaM/xNhYaGOkMNGKys7Gwr9yvO8hoTi5xTvvu/cc1axnB0yCNwe9bxcGEp/+8Zy8M+nWsxCCRVgzB7BES5gNydD5JOg2tqH796gmMGtUhjEgQc/AJGMgD0tMgSlU4B84lKYhUoar2EFAbkNIt6ANVyB4xu/Mx4Fa2uyRWii0TyE2j5Gs9xCpdLAYq3AwMzIPW+rKNGBPKLCRHKkq3FtN2FO1KZCfS3KKdcT3uvDmD2GLK1hKVGGOlGAK5qeRyWchqIO8TrFBs4GVdI3XNEnBgayrOb8EtVvEzGqGrqElQRmaZAsmimjw5aBa3sTZ9T2+f37x9PqOh+c3PL4M8TH6wvBzhHmqRrOWHUdmnZmjZRjDMvT+PASCL0g9mIp9GKMK707tTkPcPyHoHY4uBuie33D1r27RuxzwK7Xk+wOessQezDQFMgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"credential-stuffing\"\n        title=\"credential-stuffing\"\n        src=\"/static/091051c0e36ccf509c9dea986078f13a/e5715/credential-stuffing.png\"\n        srcset=\"/static/091051c0e36ccf509c9dea986078f13a/a6d36/credential-stuffing.png 650w,\n/static/091051c0e36ccf509c9dea986078f13a/e5715/credential-stuffing.png 768w,\n/static/091051c0e36ccf509c9dea986078f13a/63ff0/credential-stuffing.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<h3 id=\"6-hide-target-request\" style=\"position:relative;\"><a href=\"#6-hide-target-request\" aria-label=\"6 hide target request permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. \"Hide target request.\"</h3>\n<p>Since bots target sensitive information, these should not be made available from the browser side. These can be added from your server-side, to which no one will have access.\nUse the form as just a medium to collect the information. If the data is not taken through the browser, you can protect your data easily. You can also make your form more secure if you allow only one signup from one IP address.</p>\n<h3 id=\"7-form-validation-after-geolocation-of-the-ip-address\" style=\"position:relative;\"><a href=\"#7-form-validation-after-geolocation-of-the-ip-address\" aria-label=\"7 form validation after geolocation of the ip address permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7. \"Form validation after geolocation of the IP address.\"</h3>\n<p>You can also control the location from which the contact forms are being filled. For example, if you have been witnessing a lot of spam activities from a particular location/country or IP address, you can permanently block such addresses or geolocations. </p>\n<h3 id=\"8-use-a-web-application-firewall\" style=\"position:relative;\"><a href=\"#8-use-a-web-application-firewall\" aria-label=\"8 use a web application firewall permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8. Use a web application firewall.</h3>\n<p>By adding a web application firewall, it is possible to manage <a href=\"https://www.loginradius.com/blog/identity/2019/10/cybersecurity-attacks-business/\">severe attacks</a> and prevent bots from spamming your forms. </p>\n<h3 id=\"9-blacklist-ips-and-limited-ip-addresses\" style=\"position:relative;\"><a href=\"#9-blacklist-ips-and-limited-ip-addresses\" aria-label=\"9 blacklist ips and limited ip addresses permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9. Blacklist IPs and limited IP addresses.</h3>\n<p>If you notice some suspicious activities from a particular IP address, don’t hesitate to block it permanently. Another option is to set a limit for each IP. For example, you might allow only ten forms to be filled from each IP address.</p>\n<h3 id=\"10-beware-of-cross-site-request-forgery-csrf\" style=\"position:relative;\"><a href=\"#10-beware-of-cross-site-request-forgery-csrf\" aria-label=\"10 beware of cross site request forgery csrf permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>10. Beware of Cross-Site Request Forgery (CSRF).</h3>\n<p>A CSRF or XSRF attack usually focuses on executing an operation in a web application on behalf of the user but without consent. To prevent such an event from happening, make sure that the request you receive is from the server and that it is a legitimate one. </p>\n<p>A popular approach to know that the request sent is valid is to use a CSRF token, which stores the value of the matching token on the server. You can also adopt the double submit cookie approach in which the server stores the matching token value in the form of a cookie. The server then checks this value with the hidden field value when it receives a request. </p>\n<h3 id=\"11-validate-email-addresses-and-phone-numbers\" style=\"position:relative;\"><a href=\"#11-validate-email-addresses-and-phone-numbers\" aria-label=\"11 validate email addresses and phone numbers permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>11. Validate email addresses and phone numbers.</h3>\n<p>It can be fairly easy to determine whether the email submitted in the form is linked to a working inbox or not by using an email address <a href=\"https://www.loginradius.com/blog/engineering/best-practice-guide-for-rest-api-security/\">validation API</a>. This will also tell you whether the email has engaged in any abusive behavior.\nSince bots will use invalid email IDs most of the time, verifying the email addresses can give a good layer of protection to your site against bots. </p>\n<h3 id=\"12-block-copy-and-paste-in-your-forms\" style=\"position:relative;\"><a href=\"#12-block-copy-and-paste-in-your-forms\" aria-label=\"12 block copy and paste in your forms permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>12. Block copy and paste in your forms.</h3>\n<p>Another way to prevent contact form spam is to disable the right-click functionality. Your contact forms will only be secured from human spammers who copy and paste their details into your forms. You would also have the added advantage of keeping anyone from stealing content from anywhere on your platform.</p>\n<h2 id=\"stay-rest-assured-with-loginradius\" style=\"position:relative;\"><a href=\"#stay-rest-assured-with-loginradius\" aria-label=\"stay rest assured with loginradius permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Stay Rest Assured with LoginRadius</h2>\n<p>LoginRadius offers all the options mentioned above to secure contact forms from spam or fake signups. The consumer identity and access provider also offers world-class security for consumers to ensure that their data is safe during login, registration, password setup, and any other data touchpoints.\nThe <a href=\"https://www.loginradius.com/\">CIAM platform</a> is a powerhouse of open source SDKs, pre-designed and customizable login interfaces, and robust data security products such as MFA, RBA, and Advanced Password Policies.    </p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 57.53846153846154%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAAB2ElEQVQoz21Ti27bMAz0/3/YgG3Ahm5dt3RplzS1G7+felu+kUqUOkEFEJJl6Xi8o5JlWRBHXDu/oDcenZkpPKxfrv7HeabZzP5qP+EFb2oKHp42K+nQCQVtHSapUQoTksRLEWCkhLveXBEKgHeFxN9Wh83JevTKIM1LHPIaD7sMr82EwfoPWdbKUTXz5TthRp2eLwwGKlEYh8da4tOhx8+sxWM+YFOrUMkazM4LCqqGmQ4ULE2CmzHT5rZRuMsnfM5GbKsJv8sJm0riOJogyQkUKKVF0w2oSJIvR4mG2CZRt3iQM/3IBX6VAk+NxB8C+krAr70OYdy71gyQkTT3+zeqpAtGJkGz4OZMGV04xEyeiSWz4pmBOQl/l8IiGplOFnkvsM9ytEJjJKykIoBdp8lNhZa0lMSgokv7TiEddIh/rcK346nsmpIeCYjN4LYRbsFIMQXTSENhZ3yn7EXTQ9GaszjvcaDydgT0QsD3hSBdJfaDIbdPbaXcu0HyvA4us0NGK9Rth1aaABhLYqZc/pZa6iktsHl+QVk3UOQu3+ORjhYP1AGXPuQyuVUYiPVbN24chgDeBhlk6ScZGM7nNvM3ryW4zPTVinYEXYPb83Pkkt3NU1zf+w9OeaRFyC12GQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"LRbotprotection\"\n        title=\"LRbotprotection\"\n        src=\"/static/8ac22530787b3fd803dfe56d10162987/e5715/LRbotprotection.png\"\n        srcset=\"/static/8ac22530787b3fd803dfe56d10162987/a6d36/LRbotprotection.png 650w,\n/static/8ac22530787b3fd803dfe56d10162987/e5715/LRbotprotection.png 768w,\n/static/8ac22530787b3fd803dfe56d10162987/d0143/LRbotprotection.png 1025w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h2 id=\"final-words\" style=\"position:relative;\"><a href=\"#final-words\" aria-label=\"final words permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Final Words</h2>\n<p>Spambots will not go anywhere so soon. Take your time and learn to implement these strategies to make things easier for you in the long-run. It demands a lot of effort and practice to implement these ideas, but the result is worth it. </p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABdElEQVQY002RO0/CUBzFG6PtbZWHCAmRmBB5P8vDII9SSC0omog4oAEGjZMO6OKEuLjoJ2Fx0cSBwUQnXZxcHPwux38LJA7nNvfec8+5v1tOCCiwpbbhye2BxbYgBMtgIRVioDRRsARGXxZUzLlEHmehBaesQ4rrEMPViYf2DR9nDGKkChbVICVqsMt1WJI1sHCFwhUsUIFohJH49TxECvRUjhDW2mAbB5iP6hB8hUkhiRPN5KIZYJdrsEYrcCSpmQqMm6/m9ylUhSulY7N5ivROB3L9GOlGF3Ktbc4zuz341UPw/uIk0ESbBjoSGlYIx8BfzjSwVmyCEYEUUmCPa3Bnd+hwC75yC95S05SxbolU/iEbOCFCpDexEfIioTNCNd6Tp6IlMnNuGeeDe3z//OLx5RWj5zFGT2O8fXxh/P4Ja6w6vSEFCnTIlW2YiDzhzX7ATFKojDlvjpBPcDF4QPdyiG5/iE7/BmfXd+hd3VKpCoG8fzxWw2+c+yTpAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"book-a-demo-loginradius\"\n        title=\"book-a-demo-loginradius\"\n        src=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png\"\n        srcset=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/a6d36/book-a-demo-loginradius.png 650w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png 768w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/63ff0/book-a-demo-loginradius.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"December 24, 2020","updated_date":null,"description":"It is no surprise that the contact form attracts a lot of bot attacks. Hackers not only create false traffic, but also result in malicious attacks on websites. The objective of this blog is to help you to secure contact form from random audacious attacks.","title":"How To Secure Your Contact Form From Bot Attacks","tags":["data security","ciam solution","cx"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":2,"src":"/static/5311b4c6c298fc095f42c5e9cbcc80c0/33aa5/bot-attacks.jpg","srcSet":"/static/5311b4c6c298fc095f42c5e9cbcc80c0/f836f/bot-attacks.jpg 200w,\n/static/5311b4c6c298fc095f42c5e9cbcc80c0/2244e/bot-attacks.jpg 400w,\n/static/5311b4c6c298fc095f42c5e9cbcc80c0/33aa5/bot-attacks.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}}]},"markdownRemark":{"excerpt":"Identity is evolving, and developers are at the forefront of this transformation. Every day brings a new learning—adapting to new standards…","fields":{"slug":"/identity/developer-first-identity-provider-loginradius/"},"html":"<p>Identity is evolving, and developers are at the forefront of this transformation. Every day brings a new learning—adapting to new standards and refining approaches to building secure, seamless experiences.</p>\n<p>We’re here to support developers on that journey. We know how important simplicity, efficiency, and well-structured documentation are when working with identity and access management solutions. That’s why we’ve redesigned the <a href=\"https://www.loginradius.com/\">LoginRadius website</a>—to be faster, more intuitive, and developer-first in every way.</p>\n<p>The goal? Having them spend less time searching and more time building.</p>\n<h2 id=\"whats-new-and-improved-on-the-loginradius-website\" style=\"position:relative;\"><a href=\"#whats-new-and-improved-on-the-loginradius-website\" aria-label=\"whats new and improved on the loginradius website permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What’s New and Improved on the LoginRadius Website?</h2>\n<p>LoginRadius’ vision is to give developers a product that simplifies identity management so they can focus on building, deploying, and scaling their applications. To enhance this experience, we’ve spent the last few months redesigning our interface— making navigation more intuitive and reassuring that essential resources are easily accessible.</p>\n<p>Here’s a closer look at what’s new and why it’s important:</p>\n<h3 id=\"a-developer-friendly-dark-theme\" style=\"position:relative;\"><a href=\"#a-developer-friendly-dark-theme\" aria-label=\"a developer friendly dark theme permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>A Developer-Friendly Dark Theme</h3>\n<p><img src=\"/f46881583c7518a93bb24e94c32320de/a-developer-friendly-dark-theme.webp\" alt=\"This image shows how LoginRadius offers several authentication methods like traditional login, social login, passwordless login, passkeys and more in a dark mode.\">    </p>\n<p>Developers spend long hours working in dark-themed IDEs and terminals, so we’ve designed the LoginRadius experience to be developer-friendly and align with that preference.</p>\n<p>The new dark mode reduces eye strain, enhances readability, and provides a seamless transition between a coding environment and our platform. Our new design features a clean, modern aesthetic with a consistent color scheme and Barlow typography, ensuring better readability. High-quality graphics and icons are thoughtfully placed to enhance the content without adding visual clutter.</p>\n<p>So, whether you’re navigating our API docs or configuring authentication into your system, our improved interface will make those extended development hours more comfortable and efficient.</p>\n<h3 id=\"clear-categorization-for-loginradius-capabilities\" style=\"position:relative;\"><a href=\"#clear-categorization-for-loginradius-capabilities\" aria-label=\"clear categorization for loginradius capabilities permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Clear Categorization for LoginRadius Capabilities</h3>\n<p><img src=\"/e5358b82be414940f3fb146013845933/capabilities.webp\" alt=\"This image shows a breakdown of all the LoginRadius CIAM capabilities, including authentication, security, UX, scalability and multi-brand management.\"></p>\n<p>We’ve restructured our website to provide a straightforward breakdown of our customer identity and access management platform capabilities, helping you quickly find what you need:</p>\n<ul>\n<li>Authentication: Easily understand <a href=\"https://www.loginradius.com/blog/identity/authentication-option-for-your-product/\">how to choose the right login method</a>, from traditional passwords and OTPs to social login, federated SSO, and passkeys with few lines of code.</li>\n<li>Security: Implement no-code security features like bot detection, IP throttling, breached password alerts, DDoS protection, and adaptive MFA to safeguard user accounts.</li>\n<li>User Experience: Leverage AI builder, hosted pages, and drag-and-drop workflows to create smooth, branded sign-up and login experiences.</li>\n<li>High Performance &#x26; Scalability: Confidently scale with sub-100ms API response times, 100% uptime, 240K+ RPS, and 28+ global data center regions.</li>\n<li>Multi-Brand Management: Efficiently manage multiple identity apps, choosing isolated or shared data stores based on your brand’s unique needs.</li>\n</ul>\n<p>This structured layout ensures you can quickly understand each capability and how it integrates into your identity ecosystem.</p>\n<h3 id=\"developer-first-navigation\" style=\"position:relative;\"><a href=\"#developer-first-navigation\" aria-label=\"developer first navigation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Developer-First Navigation</h3>\n<p><img src=\"/a8c155c2b6faf3d5f4b4de4e2b14d763/developers-menu.webp\" alt=\"This image shows the LoginRadius menu bar, highlighting the developer dropdown.\">   </p>\n<p>We’ve been analyzing developer workflows to identify how you access key resources. That’s why we redesigned our navigation with one goal in mind: to reduce clicks and make essential resources readily available.</p>\n<p>The new LoginRadius structure puts APIs, SDKs, and integration guides right at the menu bar under the Developers dropdown so you can get started faster. Our Products, Solutions, and Customer Services are also clearly categorized, helping development teams quickly find the right tools and make informed decisions.</p>\n<h3 id=\"quick-understanding-of-integration-benefits\" style=\"position:relative;\"><a href=\"#quick-understanding-of-integration-benefits\" aria-label=\"quick understanding of integration benefits permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Quick Understanding of Integration Benefits</h3>\n<p><img src=\"/b2f9a964a2da0ea83e2f8596b833bba7/we-support-your-tech-stack.webp\" alt=\"This image shows a list of popular programming languages and frameworks offered by LoginRadius.\"></p>\n<p>Developers now have a clear view of the tech stack available with LoginRadius, designed to support diverse business needs.</p>\n<p>Our platform offers pre-built SDKs for Node.js, Python, Java, and more, making CIAM integration seamless across popular programming languages and frameworks.</p>\n<h2 id=\"over-to-you-now\" style=\"position:relative;\"><a href=\"#over-to-you-now\" aria-label=\"over to you now permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Over to You Now!</h2>\n<p>Check out our <a href=\"https://www.loginradius.com/\">revamped LoginRadius website</a> and see how the improved experience makes it easier to build, scale, and secure your applications.</p>\n<p>Do not forget to explore the improved navigation and API documentation, and get started with our free trial today. We’re excited to see what you’ll build with LoginRadius!</p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"February 21, 2025","updated_date":null,"description":"LoginRadius’ vision is to give developers a product that simplifies identity management so they can focus on building, deploying, and scaling their applications. To enhance this experience, we’ve redesigned our website interface, making navigation more intuitive and reassuring that essential resources are easily accessible.","title":"Revamped & Ready: Introducing the New Developer-First LoginRadius Website","tags":["Developer tools","API","Identity Management","User Authentication"],"pinned":true,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.7857142857142858,"src":"/static/80b4e4fbe176a10a327d273504607f32/58556/hero-section.webp","srcSet":"/static/80b4e4fbe176a10a327d273504607f32/61e93/hero-section.webp 200w,\n/static/80b4e4fbe176a10a327d273504607f32/1f5c5/hero-section.webp 400w,\n/static/80b4e4fbe176a10a327d273504607f32/58556/hero-section.webp 800w,\n/static/80b4e4fbe176a10a327d273504607f32/99238/hero-section.webp 1200w,\n/static/80b4e4fbe176a10a327d273504607f32/7c22d/hero-section.webp 1600w,\n/static/80b4e4fbe176a10a327d273504607f32/1258b/hero-section.webp 2732w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},"pageContext":{"limit":6,"skip":624,"currentPage":105,"type":"///","numPages":161,"pinned":"ee8a4479-3471-53b1-bf62-d0d8dc3faaeb"}},"staticQueryHashes":["1171199041","1384082988","2100481360","23180105","528864852"]}