{"id":289,"date":"2016-11-08T12:36:17","date_gmt":"2016-11-08T10:36:17","guid":{"rendered":"https:\/\/www.nonamehosts.com\/blog\/?p=289"},"modified":"2016-11-08T12:36:17","modified_gmt":"2016-11-08T10:36:17","slug":"landing-page-design-building-the-ultimate-landing-page","status":"publish","type":"post","link":"https:\/\/www.nonamehosts.com\/blog\/tutorials\/landing-page-design-building-the-ultimate-landing-page\/","title":{"rendered":"Landing Page Design: Building the Ultimate Landing Page"},"content":{"rendered":"<p>When I started to implement the <a href=\"https:\/\/www.toptal.com\/embedded\/from-the-ground-up-how-i-built-the-developers-dream-keybooard\">Ultimate Hacking Keyboard<\/a>, I wasn\u2019t very marketing savvy. As an engineer, all I could see ahead was product development and technical challenges. However, marketing is just as important and must not be overlooked. A good landing page is a must-have.<\/p>\n<p>Luckily for us, we realized that there\u2019s a lot to do before we start our crowdfunding campaign, and an attractive site could turn this otherwise idle time to our advantage by capturing people\u2019s attention, generating more subscribers and priming us for the campaign.<\/p>\n<p><!--more--><\/p>\n<p>So, the development of the <a href=\"https:\/\/ultimatehackingkeyboard.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Ultimate Landing Page<\/a> for our Ultimate keyboard began in earnest.<\/p>\n<h2 id=\"how-this-landing-page-guide-differs-from-the-rest\">How This Landing Page Guide Differs From The Rest<\/h2>\n<p>When Google-searching for \u201clanding page,\u201d you\u2019ll find dozens of excellent articles that raise a number of important points, like \u201cabove the fold\u201d content should load in a snap, be relevant and contain a form to gather leads.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/assets.toptal.io\/uploads\/blog\/image\/91590\/toptal-blog-image-1440488055200-1c82ed6eb02dbe46ca031704929ffbde.jpg\" alt=\"Landing Page Design Tips\" \/><\/p>\n<div class=\"pop_out_box is-full_width is-big\">The Arduino-based Ultimate Hacking Keyboard tries to be different, and so does its landing page.<\/div>\n<div class=\"tweet_this\"><\/div>\n<p>While most of these landing page design rules are important, I want to touch on a number of other aspects of our landing page. A lot of work went into choosing and integrating various third-party services and technologies that work behind the scenes, so I\u2019ll talk about these.<\/p>\n<p>The focus of this landing page guide will be technical. My goal is to help other developers narrow down their search for the right third-party services and technologies, which they will deploy in their landing page designs. This will, hopefully, help them save time and money, which could otherwise be wasted on fruitless experimentation.<\/p>\n<h2 id=\"landing-page-video-production-and-hosting\">Landing Page Video Production And Hosting<\/h2>\n<p>Presenting video on the web is easier than ever, and yet, few sites use it. It\u2019s not a technical challenge from a web perspective, but it is an investment of other resources, namely time and money. We created about 12 iterations of our landing page trailer video, gradually refining every little detail. The <a href=\"https:\/\/www.behance.net\/gallery\/17492943\/Ultimate-Hacking-Keyboard-Promo-animation\" target=\"_blank\" rel=\"noopener noreferrer\">design process<\/a> was exhausting but very rewarding. I consider this trailer video to be the crown jewel of our landing page which differentiates us from the pack.<\/p>\n<p>Please bear in mind that high-quality content creation is expensive. If you want the best possible results, you will need to outsource the work to professionals, and obviously, start by making sure you can afford it. Depending on what you need, and what sort of budget you have, you could get away with an in-house video. It depends on your skill set and the type of landing page your plan to design.<\/p>\n<p>We settled on a dynamic 3D animation, demonstrating the basic functionality of our keyboard on our landing page. However, if you need a 2D animation of an app or web service, or if you need camera footage, the process will be somewhat different and maybe less challenging than ours.<\/p>\n<p>Once you have a video made, you have to host it somewhere, which leads us to some options.<\/p>\n<p><a href=\"https:\/\/www.youtube.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube<\/a> needs no introduction, as it is the undisputed market leader and a synonym for video on the web. It\u2019s a reasonable choice that would have worked well for us, but we didn\u2019t find its embedded player to be aesthetically pleasing.<\/p>\n<p><a href=\"https:\/\/vimeo.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Vimeo<\/a> was an obvious second choice. It features a super clean, elegant, minimalistic design. It\u2019s known for hosting quality content and for its superior high-definition. It was love at first sight, so we ended up choosing it for our landing page.<\/p>\n<p><a href=\"http:\/\/wistia.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Wistia<\/a> is another popular choice among marketers. It provides advanced features like video heatmaps that show you which parts of your videos have been watched, skipped and rewatched. It would have been a great choice, but it doesn\u2019t support full HD quality, a deal-breaker for us.<\/p>\n<p>This is our landing page trailer <a href=\"https:\/\/vimeo.com\/95916728\" target=\"_blank\" rel=\"noopener noreferrer\">video on Vimeo<\/a>:<\/p>\n<p><a href=\"https:\/\/vimeo.com\/95916728\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/assets.toptal.io\/uploads\/blog\/image\/91591\/toptal-blog-image-1440488076227-70ee9e5a422426f4b4c2c9c4d6ed9bc9.jpg\" alt=\"Vimeo is the way to go for landing page video\" \/><\/a><\/p>\n<div class=\"pop_out_box is-full_width is-big\">Vimeo is the way to go for landing page video.<\/div>\n<div class=\"tweet_this\"><\/div>\n<p>It\u2019s worth delving into the APIs of these services to better capture the attention of visitors. For example, using the <a href=\"https:\/\/developer.vimeo.com\/player\/js-api\" target=\"_blank\" rel=\"noopener noreferrer\">Vimeo player JavaScript API<\/a> we made the \u201cI want one\u201d buttons on our site pulse three times in a row right after our trailer ends. Used properly, little tweaks like this can increase the conversion rate.<\/p>\n<p>To make matters even more complex, embedding videos on responsive sites is no easy matter. The video has to scale properly, and the experience must be fluid. It can be done by utilizing some <a href=\"https:\/\/css-tricks.com\/NetMag\/FluidWidthVideo\/Article-FluidWidthVideo.php\" target=\"_blank\" rel=\"noopener noreferrer\">not-so-obvious CSS tricks<\/a>.<\/p>\n<h2 id=\"hosting-3d-content\">Hosting 3D Content<\/h2>\n<p>In order to give our landing page visitors a more immersive experience, we wanted them to be able to explore our keyboard in 3D. There are a few WebGL-based services created specifically for this purpose.<\/p>\n<p><a href=\"https:\/\/sketchfab.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Sketchfab<\/a> is the most popular of these services. It\u2019s easy to master, provides a lot of visual settings, and is embeddable into a wide range of popular sites, which is why we chose it. However, depending on your needs, you may want to check out a couple of alternatives.<\/p>\n<p><a href=\"https:\/\/www.verold.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Verold Studio<\/a> boasts some advanced features, such as animation and interactivity. I\u2019m sure it\u2019s the right choice for many, but we couldn\u2019t import our CAD model into it.<\/p>\n<p>The most minimalistic and simplistic of all WebGL services is <a href=\"http:\/\/p3d.in\/\" target=\"_blank\" rel=\"noopener noreferrer\">p3d.in<\/a>, but it didn\u2019t support the high-resolution textures used in our 3D model, which was a deal-breaker. Also, it seems that it\u2019s not possible to rotate the model until the textures are fully loaded, which doesn\u2019t result in a great <a href=\"https:\/\/www.toptal.com\/designers\/ux\/portfolios\">user experience<\/a>.<\/p>\n<p>This is how our keyboard <a href=\"https:\/\/sketchfab.com\/models\/69792d2a798042b98c847e84e896d91f\" target=\"_blank\" rel=\"noopener noreferrer\">looks in Sketchfab<\/a>:<\/p>\n<p><a href=\"https:\/\/sketchfab.com\/models\/69792d2a798042b98c847e84e896d91f\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/assets.toptal.io\/uploads\/blog\/image\/91592\/toptal-blog-image-1440488096999-bd10f35eadd46917225f0d7868bb0501.jpg\" alt=\"Check out why our landing page relies on Sketchfab for 3D content\" \/><\/a><\/p>\n<div class=\"pop_out_box is-full_width is-big\">Check out why our landing page relies on Sketchfab for 3D content.<\/div>\n<div class=\"tweet_this\"><\/div>\n<h2 id=\"creating-2d-animation\">Creating 2D Animation<\/h2>\n<p>One of the major advantages of our keyboard is that it dramatically reduces hand movement. We wanted to visualize this on our landing page by putting the UHK and a regular keyboard side-by-side and displaying an animation. Implementing this wasn\u2019t as simple as it sounds.<\/p>\n<p>Using an embedded video did not only feel like overkill, but it would have to be rendered first, which is extra work. Animated GIFs weren\u2019t a viable solution either given their huge size and limited palette. Canvas would work, but I found SVG to be even better suited for this purpose because the hand objects can be separately moved without affecting the rest of the graphics.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/assets.toptal.io\/uploads\/blog\/image\/91593\/toptal-blog-image-1440488131452-2da9e1d0a454ef26de6371ab064f2e36.jpg\" alt=\"\" \/><\/p>\n<div class=\"pop_out_box is-full_width is-big\">2D animation is an important component of landing page design, but it&#8217;s not as easy as it sounds.<\/div>\n<div class=\"tweet_this\"><\/div>\n<p>Creating this landing page animation was certainly more <a href=\"https:\/\/ultimatehackingkeyboard.com\/blog\/2015\/02\/03\/hand-movements-minimized\" target=\"_blank\" rel=\"noopener noreferrer\">time consuming<\/a> than we expected, but the <a href=\"https:\/\/ultimatehackingkeyboard.com\/#hand-movements-minimized\" target=\"_blank\" rel=\"noopener noreferrer\">end result<\/a> looks nice.<\/p>\n<p>Sometimes you have to make your way through cross-browser issues, JavaScript library bugs and nearly endless technical challenges just to make a seemingly obvious thing work. Never underestimate the number of things that can go wrong!<\/p>\n<h2 id=\"real-time-analytics\">Real-Time Analytics<\/h2>\n<p>Everybody uses Google Analytics and we are no exception, but it\u2019s not specifically built for real-time operations; there are better candidates for this purpose.<\/p>\n<p><a href=\"https:\/\/chartbeat.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Chartbeat<\/a> is great at notifying us when the site exceeds certain thresholds, most notably the number of simultaneous users on our site. Every now and then someone links our site in a forum, which generates a sudden traffic spike. Thanks to Chartbeat, we immediately know about such events, and able to join the ongoing conversation early on.<\/p>\n<p><a href=\"https:\/\/mixpanel.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Mixpanel<\/a> helps us gather and analyse events. Site visits, opening the subscription dialog, subscription and confirming the subscription, are all events that we log. Mixpanel can build funnels out of these events and visualize conversion rates, making things measurable so that we can act upon the numbers.<\/p>\n<p><a href=\"http:\/\/clicky.com\/100769327\" target=\"_blank\" rel=\"noopener noreferrer\">Clicky<\/a> is great at a number of things and we especially love its site heatmaps feature, which reveals where users click on our site. Based on the results, we can adjust the layout of the site, change its content or redesign it to achieve the desired outcome.<\/p>\n<p><a href=\"https:\/\/www.hotjar.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">HotJar<\/a> enables website owners to record the interactions of their users. It saves every mouse and keyboard action, and constructs videos out of them so that one can watch what visitors do on the site. Yes, it\u2019s the most privacy intrusive of all, so much so that it\u2019s almost scary!<\/p>\n<p>I surely couldn\u2019t do justice to these services by singling out one because all of them offer so much. Most such services can visualize real-time visitor activity on a map, on a summary screen, or a in visitor list, along with lots of metadata such as the referrer URL, operating system and screen size.<\/p>\n<p>I believe that these are some of the best real-time analytics services out there, but there are others, so if you have some specific requirements, Google search for alternatives.<\/p>\n<div class=\"embeddable_form-wrapper for-post\">\n<form class=\"embeddable_form\" action=\"https:\/\/www.toptal.com\/blog\/subscription\" method=\"post\">\n<div class=\"embeddable_form-step is-email_form is-current\">\n<div class=\"embeddable_form-row is-label\"><\/div>\n<div class=\"embeddable_form-row is-privacy\">\n<div class=\"embeddable_form-privacy\">\n<div class=\"embeddable_form-privacy_text\">No spam. Just great engineering and design posts.<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/form>\n<\/div>\n<h2 id=\"error-logging\">Error Logging<\/h2>\n<p>Websites are getting more and more JavaScript-heavy, so much so that critical features of your site may depend on it. In our case, the subscription dialog is triggered by JavaScript code.<\/p>\n<p>When implementing the subscription feature, I tested it on major browsers and sat back with confidence, believing that I\u2019ve done my part. Later on, I got an email from a visitor complaining that the landing page subscription feature doesn\u2019t work.<\/p>\n<p>As it turned out, the visitor in question used Adblock Plus in its strictest mode, which blocked the Clicky analytics script. Unlike other analytics services, Clicky\u2019s embed code wasn\u2019t resilient in this respect, so upon logging the subscription action and referencing the Clicky object, the code generated an error.<\/p>\n<p>After this incident, I started to think hard about how to avoid such situations in the future. It occurred me that I should use the global <code>window.onerror<\/code> event handler to catch such errors and log them. Then, I searched for suitable logging services, found many, and ended up choosing <a href=\"https:\/\/errorception.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Errorception<\/a>.<\/p>\n<p>I love Errorception because it does one job and does it very well; its user interface is minimalistic and functional, the support is great and it simply provides a lot of bang for your buck. One can look into the individual errors to investigate stack traces along with other information.<\/p>\n<p>Since integrating Errorception, I\u2019ve resolved about a dozen bugs some of which were very unlikely and unexpected. For example, once I got a <code>localStorage<\/code> related error, as it turned out, when Safari is in private browsing mode <code>localStorage.setItem()<\/code> <a href=\"http:\/\/stackoverflow.com\/questions\/14555347\/html5-localstorage-error-with-safari-quota-exceeded-err-dom-exception-22-an\" target=\"_blank\" rel=\"noopener noreferrer\">results in an error<\/a>.<\/p>\n<p>I think it\u2019s impossible to account for every such outlier case, and only logging can reveal them.<\/p>\n<h2 id=\"the-build-process\">The Build Process<\/h2>\n<p>The index page started out as a single HTML page, hosted in WordPress, containing all the <a href=\"https:\/\/www.toptal.com\/css\">CSS<\/a>, HTML and JavaScript code. In the beginning this was a feasible solution, but as it grew, it started to become a maintenance burden and a more modular approach was needed.<\/p>\n<p>I ended up splitting the CSS, HTML and JavaScript code, resulting in a number of files. Then I converted the CSS files to LESS files to further increase maintainability. Finally, I needed a build process to assemble all these tiny files.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/assets.toptal.io\/uploads\/blog\/image\/91589\/toptal-blog-image-1440488033067-72f4a42b98d52a5a34cf1ceeb49503eb.jpg\" alt=\"\" \/><\/p>\n<div class=\"pop_out_box is-full_width is-big\">Check out our landing page build process, step by step.<\/div>\n<div class=\"tweet_this\"><\/div>\n<p>Now the landing page build and deploy process looks like this:<\/p>\n<ul>\n<li>gulp-less takes the LESS files and outputs a single CSS file.<\/li>\n<li>gulp-browserify merges the JavaScript files as a single JavaScript file.<\/li>\n<li>gulp-file-include merges the HTML files as one HTML file.<\/li>\n<li>gulp-concat links the above into a master template.<\/li>\n<li>gulp-ssh uploads the master template to the server.<\/li>\n<li>gulp-ssh calls a node.js script on the server which generates multiple landing pages per ad campaign based on the master template and a spreadsheet.<\/li>\n<li>gulp-ssh calls wp-cli on the server to update the landing pages.<\/li>\n<\/ul>\n<p>The above is a slightly simplified description because this process is not purely sequential. Various gulp tasks depend on each other and watchers are set up so upon modifying a file only the dependent files get rebuilt.<\/p>\n<h2 id=\"optimizing-for-performance\">Optimizing For Performance<\/h2>\n<p>Performance matters a whole lot, especially if your landing page gets Slashdotted and you get 260 visitors simultaneously, like we did as can be seen above. Luckily, our $20 per month Linode VPS performed like a champ without breaking a sweat, although it wasn\u2019t exactly luck to begin with, so let me share some tips.<\/p>\n<p>Use nginx instead of Apache. Apache is a memory hog and I was getting daily disk IO threshold notifications from Linode because Apache was trashing. I\u2019ve never yet had another such notification since using nginx + PHP-FPM.<\/p>\n<p><a href=\"https:\/\/wordpress.org\/plugins\/wp-super-cache\/\" target=\"_blank\" rel=\"noopener noreferrer\">WP Super Cache<\/a> is the easiest, and probably most profound way, to make your WordPress site go faster. Instead of generating pages from MySQL on-the-fly, it saves them as static files and serves the content of those files.<\/p>\n<p>Image lazy loading is your friend, especially if your page, like ours, contains a lot of images. We\u2019re using the WordPress <a href=\"https:\/\/wordpress.org\/plugins\/unveil-lazy-load\/\" target=\"_blank\" rel=\"noopener noreferrer\">Unveil Lazy Load<\/a> plugin.<\/p>\n<p>You can lazy load not only images but any assets. If a section of your page depends on an additional script you can lazy load it when it gets within the viewport. You can check viewport visibility with the <a href=\"https:\/\/github.com\/protonet\/jquery.inview\" target=\"_blank\" rel=\"noopener noreferrer\">jQuery inview plugin<\/a> and load the script with <a href=\"https:\/\/api.jquery.com\/jquery.getscript\/\" target=\"_blank\" rel=\"noopener noreferrer\">jQuery.getScript()<\/a> or with any other script loader.<\/p>\n<h2 id=\"final-words\">Final Words<\/h2>\n<p>I touched on a lot of <a href=\"https:\/\/www.toptal.com\/designers\/digital\">landing page design<\/a> issues in this post, possibly too many for such a brief overview, so let me sum up the most important points:<\/p>\n<ul>\n<li>Don\u2019t only use text content, but include rich media like video, 3D and 2D animation. It will make you stand out and encourage visitors to share your ideas.<\/li>\n<li>Use real-time analytics so that you can swiftly react to sudden traffic spikes and join the ongoing conversation.<\/li>\n<li>Always log errors because there are a lot of things that can (and will) go wrong.<\/li>\n<li>Split your codebase into small pieces for easy maintainability and set up a build process to assemble the tiny pieces and deploy the bundle.<\/li>\n<li>Optimize performance so that your site will keep up even when encountering with the highest traffic.<\/li>\n<\/ul>\n<p>This article is intended to be a glimpse into landing page design and deployment from a number of aspects, and as such, it\u2019s not supposed cover everything in detail. In any case, I hope it gives you a couple of ideas and you find it useful and time-saving.<\/p>\n<p>I always strive to learn more and improve things further so you\u2019re welcome to visit our landing page at <a href=\"https:\/\/ultimatehackingkeyboard.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">UltimateHackingKeyboard.com<\/a> and give me additional feedback in the comments below on how to improve our site.<\/p>\n<p>All suggestions, constructive criticism and ideas will be appreciated.<\/p>\n<p>This article originally appeared on <a href=\"https:\/\/www.toptal.com\/designers\/web\/a-landing-page-design-guide\">Toptal<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>When I started to implement the Ultimate Hacking Keyboard, I wasn\u2019t very marketing savvy. As an engineer, all I could see ahead was product development and technical challenges. However, marketing is just as important and must not be overlooked. A good landing page is a must-have. Luckily for us, we realized that there\u2019s a lot [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-289","post","type-post","status-publish","format-standard","hentry","category-tutorials"],"_links":{"self":[{"href":"https:\/\/www.nonamehosts.com\/blog\/wp-json\/wp\/v2\/posts\/289","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nonamehosts.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nonamehosts.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nonamehosts.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nonamehosts.com\/blog\/wp-json\/wp\/v2\/comments?post=289"}],"version-history":[{"count":0,"href":"https:\/\/www.nonamehosts.com\/blog\/wp-json\/wp\/v2\/posts\/289\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.nonamehosts.com\/blog\/wp-json\/wp\/v2\/media?parent=289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nonamehosts.com\/blog\/wp-json\/wp\/v2\/categories?post=289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nonamehosts.com\/blog\/wp-json\/wp\/v2\/tags?post=289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}