{"version":3,"sources":["webpack:///./src/img/tutorials/abtest/23.png","webpack:///./src/img/tutorials/abtest/12.png","webpack:///./src/img/tutorials/abtest/22.png","webpack:///./src/img/tutorials/abtest/25.png","webpack:///./node_modules/@babel/runtime/helpers/inherits.js","webpack:///./src/img/tutorials/abtest/7.png","webpack:///./src/img/tutorials/abtest/17.png","webpack:///./src/img/tutorials/abtest/14.png","webpack:///./src/img/tutorials/abtest/26.png","webpack:///./src/img/tutorials/abtest/34.png","webpack:///./node_modules/react-scrollspy/lib/throttle.js","webpack:///./src/pages/tutorials/guide-to-ab-testing-with-livesession.js","webpack:///./src/img/blog/covers/ab-test.png","webpack:///./src/img/tutorials/abtest/1.png","webpack:///./src/components/ui/image-modal.js","webpack:///./src/img/tutorials/abtest/11.png","webpack:///./src/img/tutorials/abtest/15.png","webpack:///./src/pages/blog/5-easy-ways-to-increase-landing-page.js","webpack:///./src/img/tutorials/abtest/4.png","webpack:///./src/img/tutorials/abtest/27.png","webpack:///./node_modules/@babel/runtime/helpers/getPrototypeOf.js","webpack:///./src/img/tutorials/abtest/16.png","webpack:///./src/img/tutorials/abtest/31.png","webpack:///./node_modules/@babel/runtime/helpers/createClass.js","webpack:///./src/img/tutorials/abtest/28.png","webpack:///./src/img/tutorials/abtest/2.png","webpack:///./node_modules/react-scrollspy/lib/scrollspy.js","webpack:///./src/img/tutorials/abtest/32.png","webpack:///./src/img/tutorials/abtest/5.png","webpack:///./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","webpack:///./src/img/blog/5-ways-to-increase/increase-conversion.png","webpack:///./src/img/tutorials/abtest/29.png","webpack:///./src/img/tutorials/abtest/18.png","webpack:///./src/img/tutorials/abtest/3.png","webpack:///./src/img/tutorials/abtest/9.png","webpack:///./src/hoc/guideArticle/styled.js","webpack:///./src/hoc/guideArticle/index.js","webpack:///./src/img/tutorials/abtest/33.png","webpack:///./src/img/tutorials/abtest/8.png","webpack:///./src/components/ui/startUsing/index.js","webpack:///./node_modules/@babel/runtime/helpers/defineProperty.js","webpack:///./node_modules/@babel/runtime/helpers/classCallCheck.js","webpack:///./src/img/tutorials/abtest/20.png","webpack:///./src/img/tutorials/abtest/19.png","webpack:///./src/pages/blog/5-tips-for-better-a-b-tests.js","webpack:///./src/img/tutorials/abtest/30.png","webpack:///./src/img/tutorials/abtest/10.png","webpack:///./src/img/tutorials/abtest/21.png","webpack:///./src/img/tutorials/abtest/6.png","webpack:///./src/img/tutorials/abtest/13.png","webpack:///./src/img/tutorials/abtest/24.png","webpack:///./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"],"names":["module","exports","setPrototypeOf","subClass","superClass","TypeError","prototype","Object","create","constructor","value","writable","configurable","__esModule","defineProperty","default","_default","fn","last","timer","threshold","arguments","length","undefined","now","Date","clearTimeout","setTimeout","WhatsNext","styled","section","media","mobile","tablet","Wrapped","GuideArticle","href","target","rel","id","className","src","img1","alt","title","img2","img3","img4","img5","img6","img7","img8","img9","img10","img11","img12","img13","img14","img15","img16","img17","img18","style","margin","inline","img19","img20","img21","img22","img23","img24","img25","img26","img27","img28","img29","img30","img31","img32","img33","img34","meta","url","description","author","date","group","tutorials","customSection","articleDesc","isList","articleDesc2","articleDesc3","cover","useStaticQuery","img","childImageSharp","fluid","Container","div","Box","Close","span","ImageWrapped","Image","ImageModal","props","escFunction","event","showModal","state","keyCode","closeModal","setState","openModal","window","innerWidth","componentDidMount","document","addEventListener","this","componentWillUnmount","removeEventListener","render","imgStyle","imgModalStyle","lazy","modal","onClick","loading","React","Component","defaultProps","BlogArticle","role","aria-label","frontmatter","imgSocial","category","borderBottom","process","descriptionSocial","_getPrototypeOf","o","getPrototypeOf","__proto__","_defineProperties","i","descriptor","enumerable","key","Constructor","protoProps","staticProps","_interopRequireDefault","_extends2","_defineProperty2","_toConsumableArray2","_classCallCheck2","_possibleConstructorReturn2","_getPrototypeOf2","_assertThisInitialized2","_createClass2","_inherits2","_propTypes","_react","_classnames","_throttle","Scrollspy","_React$Component","_this","call","targetItems","inViewState","isScrolledPast","_handleSpy","bind","get","items","arrayOf","string","isRequired","currentClassName","scrolledPastClassName","object","componentTag","oneOfType","elementType","offset","number","rootEl","onUpdate","func","map","item","getElementById","array","val","newArray","max","_getScrollDimension","scrollTop","doc","querySelector","documentElement","body","parentNode","scrollHeight","targets","elemsInView","elemsOutView","viewStatusList","hasInViewAlready","currentContent","isInView","_isInView","push","isLastItem","isScrolled","_isScrolled","_isAtBottom","pop","apply","_fillArray","inView","outView","scrolledPast","_getScrolledPast","el","rootRect","_this$props","getBoundingClientRect","rect","winH","height","innerHeight","scrollBottom","elTop","top","elBottom","offsetHeight","_this$_getScrollDimen2","some","hasFoundInView","_this2","elemensViewState","_getElemsViewState","currentStatuses","_update","prevStatuses","a","b","every","index","indexOf","_spy","_initSpyTarget","_initFromProps","onEvent","offEvent","_this3","Tag","_this$props2","children","counter","Children","child","idx","_classNames","ChildTag","type","childClass","concat","createElement","itemClass","_typeof","assertThisInitialized","self","Section","Header","desktopWide","Title","h1","Cover","Img","ContentContainer","article","TimeToRead","em","Toc","ol","desktop","HeaderContainer","TocHeading","h4","ArticleContainer","Content","timeToRead","authorName","avatar","useState","tocHeadings","setTocHeadings","tocContainers","setTocContainers","tocIDs","setTocIDs","useEffect","containers","querySelectorAll","headings","arrHeadings","Array","from","arrContainers","IDs","formattedDate","format","metaTitle","titleOverride","metaDescription","canonical","datePublished","image","paddingTop","opacity","fontSize","Styled","textContent","StartUsingLS","deleteMarginTop","setMarginTop","link","useSourceParams","email","setEmail","onSubmit","e","preventDefault","navigate","htmlFor","name","placeholder","required","onChange","as","secondary","obj","instance","_objectWithoutPropertiesLoose","source","excluded","sourceKeys","keys"],"mappings":"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","file":"component---src-pages-tutorials-guide-to-ab-testing-with-livesession-js-0c0f3f40bbe4538f3286.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/23-1567bce770f9ff12d24336299c93dee1.png\";","module.exports = __webpack_public_path__ + \"static/12-b3ae2985cac99e1f122d88ed6f3421bd.png\";","module.exports = __webpack_public_path__ + \"static/22-e0d18047c112b2f224084620adc03ab4.png\";","module.exports = __webpack_public_path__ + \"static/25-ddc7bfc91c420ab817d27d8f1f0f0e53.png\";","var setPrototypeOf = require(\"./setPrototypeOf.js\");\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","module.exports = __webpack_public_path__ + \"static/7-1229bfa70e0b3092e3420b928ca74771.png\";","module.exports = __webpack_public_path__ + \"static/17-79922068bc56b2847a16c6cc6fc0e165.png\";","module.exports = __webpack_public_path__ + \"static/14-7ad5fd7c60ef10f044e42cc889eab1f1.png\";","module.exports = __webpack_public_path__ + \"static/26-09d6e079196b11fed0c2b765037e218b.png\";","module.exports = __webpack_public_path__ + \"static/34-29db0d0cff520c6a76b23916c0258725.png\";","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar throttle = function throttle(fn) {\n var threshold = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100;\n var last;\n var timer;\n return function () {\n var now = +new Date();\n var timePassed = !!last && now < last + threshold;\n\n if (timePassed) {\n clearTimeout(timer);\n timer = setTimeout(function () {\n last = now;\n fn();\n }, threshold);\n } else {\n last = now;\n fn();\n }\n };\n};\n\nvar _default = throttle;\nexports.default = _default;","import React from 'react';\nimport { useStaticQuery, graphql } from 'gatsby';\nimport { Post } from 'components/blog/content/styled';\nimport GuideArticle from 'hoc/guideArticle';\nimport { authorKalina as author } from 'data/authors';\nimport Code from 'components/help/codeSnippet';\nimport ImageModal from 'components/ui/image-modal';\nimport styled from 'styled-components';\nimport ArticlePreview from 'components/blog/blogArticlePreview';\nimport { frontmatter as articleDesc } from 'pages/blog/5-tips-for-better-a-b-tests';\nimport { frontmatter as articleDesc2 } from 'pages/blog/5-easy-ways-to-increase-landing-page';\nimport { frontmatter as articleDesc3 } from 'pages/blog/analyze-session-recordings';\nimport { media } from 'theme/breakpoints';\nimport img1 from 'img/tutorials/abtest/1.png';\nimport img2 from 'img/tutorials/abtest/2.png';\nimport img3 from 'img/tutorials/abtest/3.png';\nimport img4 from 'img/tutorials/abtest/4.png';\nimport img5 from 'img/tutorials/abtest/5.png';\nimport img6 from 'img/tutorials/abtest/6.png';\nimport img7 from 'img/tutorials/abtest/7.png';\nimport img8 from 'img/tutorials/abtest/8.png';\nimport img9 from 'img/tutorials/abtest/9.png';\nimport img10 from 'img/tutorials/abtest/10.png';\nimport img11 from 'img/tutorials/abtest/11.png';\nimport img12 from 'img/tutorials/abtest/12.png';\nimport img13 from 'img/tutorials/abtest/13.png';\nimport img14 from 'img/tutorials/abtest/14.png';\nimport img15 from 'img/tutorials/abtest/15.png';\nimport img16 from 'img/tutorials/abtest/16.png';\nimport img17 from 'img/tutorials/abtest/17.png';\nimport img18 from 'img/tutorials/abtest/18.png';\nimport img19 from 'img/tutorials/abtest/19.png';\nimport img20 from 'img/tutorials/abtest/20.png';\nimport img21 from 'img/tutorials/abtest/21.png';\nimport img22 from 'img/tutorials/abtest/22.png';\nimport img23 from 'img/tutorials/abtest/23.png';\nimport img24 from 'img/tutorials/abtest/24.png';\nimport img25 from 'img/tutorials/abtest/25.png';\nimport img26 from 'img/tutorials/abtest/26.png';\nimport img27 from 'img/tutorials/abtest/27.png';\nimport img28 from 'img/tutorials/abtest/28.png';\nimport img29 from 'img/tutorials/abtest/29.png';\nimport img30 from 'img/tutorials/abtest/30.png';\nimport img31 from 'img/tutorials/abtest/31.png';\nimport img32 from 'img/tutorials/abtest/32.png';\nimport img33 from 'img/tutorials/abtest/33.png';\nimport img34 from 'img/tutorials/abtest/34.png';\n\nexport const WhatsNext = styled.section`\n border-top: 1px solid #e4e5e8;\n padding-bottom: 40px;\n ${media.mobile} {\n padding-top: 60px;\n padding-bottom: 8px;\n }\n & h2.heading {\n text-align: center;\n font-size: 32px;\n line-height: 40px;\n margin-bottom: 24px;\n }\n & p.desc {\n font-size: 20px;\n line-height: 36px;\n text-align: center;\n max-width: 75%;\n margin: 0 auto 86px;\n ${media.tablet} {\n max-width: 100%;\n font-size: 18px;\n line-height: 30px;\n }\n ${media.mobile} {\n margin: 0 auto 56px;\n }\n }\n & .article-container {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-column-gap: 55px;\n ${media.tablet} {\n grid-template-columns: 1fr;\n grid-template-rows: repeat(3, auto);\n grid-gap: 55px;\n }\n ${media.mobile} {\n grid-gap: 32px;\n }\n }\n`;\n\nconst Guide = () => {\n return (\n \n

\n \n A/B testing is no longer a niche optimization technique. Did you know that{' '}\n \n 77% of companies\n {' '}\n run A/B tests on their websites?\n \n

\n

\n \n Despite the volume, only 1 in 8 A/B tests results in significant changes for the business.\n In this guide, we’re going to show you how you can make your test more insightful with\n LiveSession.\n \n

\n
\n

Qualitative data in A/B testing

\n

\n Qualitative data is not an alternative to quantitative findings. It’s actually quite the\n contrary! These two methods are supposed to complement each other and help you gain a\n deeper understanding of user behavior.\n

\n

\n While numbers will show you what is happening, qualitative insights will help you find the\n reasons why it’s happening.\n

\n

\n For instance, you might have a landing page with quite a lot of traffic but unsatisfying\n results. While many people visit it, the conversion rates and bounce rates may not meet\n your expectations. Now, what should you do about it?\n

\n

\n Instead of trying to take a shot in the dark, you can turn to{' '}\n qualitative data and see how the users interact with your landing page.\n Perhaps a button is not working, or they just can’t find what they’re looking for?\n

\n

There is a method that is sure to help you out:

\n

Get more context with session replays

\n\n

\n You can easily access this kind of information through session replays.\n This qualitative user research method has a range of od advantages:\n

\n \n

\n Use qualitative research to design A/B tests\n

\n\n

\n Qualitative data can suggest you potential solutions to the problem. When you watch how\n the visitors use your website, you start to imagine what can be done to solve the issue.\n Below we’re describing our own case study so you can see exactly how it works!\n

\n
\n
\n

How LiveSession can help with A/B testing

\n\n

\n LiveSession is a session recording and qualitative analytics platform. It can also be\n connected with a range of other tools, including Google Optimize, one of the most popular\n solutions for A/B testing.\n

\n

\n When you connect your Google Optimize A/B test to LiveSession, you will be able to see\n sessions that illustrate how users interacted with different versions of the test. In\n other words, it’s a fast and easy way to enrich{' '}\n quantitative data with qualitative data.\n

\n

Below you’ll find a tutorial on how to connect LiveSession and Google Optimize:

\n
\n
\n

How to connect LiveSession with Google Optimize

\n\n

We’ll start with an example so you can easily see how it works.

\n

\n Let’s say that you want to measure how the button color affects conversion and bounce\n rate.\n

\n

\n In our example, we’re going to test two different colors: green and{' '}\n red. Originally, the “Purchase Now” button on our site was green:\n

\n \n

\n The best way to find out is to conduct an A/B test with different color\n variants. Here’s where Google Optimize comes in:\n

\n

\n It’s really simple: just go to{' '}\n \n https://optimize.google.com/\n {' '}\n and create your first experiment:\n

\n \n

\n Define the name (1), the URL of the website you’ll be testing (2), and click Create (3):\n

\n \n

\n Next, go to the Targeting and variants section. Click{' '}\n Add variant (1), define the name of the variant (2), and\n click Done (3):\n

\n \n

\n Click Edit to set a variant directly on the website:\n

\n \n

\n \n TIP: The easiest way to create a variant is with the official Google Optimize extension.{' '}\n
\n We’re going to use it in this tutorial.{' '}\n
\n

\n \n

\n Select the button (1). Find the background-color property (2), change it to red (3) and\n click Save (4).\n

\n

\n In the next section, connect (1) your Google Analytics account and choose\n (2) a property for the Google Optimize Container. Remember that it has to be{' '}\n the same property that you’re using on your website.\n

\n \n

Create an objective to measure:

\n \n

\n It this example, we’re going to measure Bounces:\n

\n \n

\n Go back to the top and click Start:\n

\n \n

\n Click View instructions to get information about your\n Container ID:\n

\n \n

Copy the selected ID:

\n \n

\n Next, go to Google Tag Manager (\n \n https://tagmanager.google.com/\n \n ), chose a container for the same website, and open the Tags section:\n

\n \n

\n Click New to add a new tag:\n

\n \n

\n Find Google Optimize on the list:\n

\n \n

\n Paste your container ID and connect your Google Analytics settings (or\n create new ones) with the same property you’ve connected with{' '}\n Google Optimizer. Click Save.\n

\n \n

\n Go back to Google Optimize and copy the Experiment ID from the{' '}\n Measurement and objective section:\n

\n \n

\n In Google Tag Manager, add another Tag with a Custom HTML.\n

\n \n

Paste this code:

\n \n {`\n`}\n \n

\n Paste the copied experiment ID in the {``} field. This\n is a connector between LiveSession and Google Optimize.\n

\n \n

\n Click Save, and then Submit...\n

\n \n

\n ...and Publish the changes:\n

\n \n

\n In Google Optimize, click Start to start testing!\n

\n

\n From now on, your website visitors will see the two different versions of the{' '}\n Purchase Now button.\n

\n

\n Go to LiveSession, and choose the Custom param filter:\n

\n \n

\n Set the ab_id with the Experiment ID value. Then, set the{' '}\n ab_variant. In our case, 1 represents the first variant\n with the red button.\n

\n \n

\n Save the results as a segment (1). It will appear in the segments section (2). Click at\n the ab_variant filter (3):\n

\n \n

\n Change the original version’s ab_variant to 0 (1), apply\n filters (2), and click Save as a segment.\n

\n \n

\n Use the created segments to compare two groups of users. With{' '}\n LiveSession, \n you can precisely check how the behavior varies between different versions. You can always\n preview the properties to see which variant the user has interacted with.\n

\n

\n What’s more, you can also see the results for the segment in{' '}\n Google Analytics. Just create a segment in Google Optimize:\n

\n \n

Here’s what it looks like in Google Analytics:

\n \n
\n \n

Case study: how to analyze test results with LiveSession and Google Optimize

\n\n

\n To show you how our{' '}\n \n Google Optimize integration\n {' '}\n works in action, we’ve decided to use a real-life example!\n

\n

\n We’ve set up a little A/B test on our home page. We’ve created two different versions of\n the hero section on our homepage. Each one of them was shown to half of the website’s\n visitors. The 0 variant had only one column, while the 1 version had two:\n

\n \n \n

The what: Google Optimize test results

\n\n

Here are our results from Google Optimize:

\n \n

\n As you can see, the one-column version performed significantly better than the two-column\n one. The conversion (from visit to signup) was twice as high for the\n original version.\n

\n

\n What’s more, the Optimize analysis comes with actionable statistical data. The{' '}\n Probability to be best section shows you how likely it is that the winning\n variant really is the best one. You can also see the range of conversion rates you can\n expect for both cases.\n

\n

\n That’s it for the results, but here comes another question – how exactly do people\n interact with these websites? Why is one version better than the other?\n

\n

LiveSession can help you find the answers.

\n

The why: LiveSession recordings

\n\n

\n The recordings of users who took part in the A/B test are saved as a separate segment:\n

\n \n

\n It’s easy to say that with session recordings you can see how A/B test participants\n interacted with the website.\n

\n

\n It’s harder, however, to imagine what exactly you can see in these recordings. We don’t\n want to leave it to your imagination only. Have a look at some of our findings from the\n described A/B test:\n

\n\n
    \n
  • \n Users tend to click on things that are not clickable, such as the\n “play” button on this illustration:\n \n
  • \n
  • \n You can see where people tend to stop when they’re browsing the page. For instance, they\n spend more time reading the section about data privacy:\n \n
  • \n
  • \n You can track the most common next steps, just like you’re sitting next to the user! In\n most cases, the visitors go to Features and Pricing after seeing the main page:\n \n
  • \n
\n \n
\n );\n};\n\nconst Wrapped = GuideArticle(Guide);\n\nconst meta = {\n title: 'Guide to A/B testing with LiveSession',\n url: '/tutorials/guide-to-ab-testing-with-livesession/',\n description:\n 'Read our A/B testing guide and learn how to get the most out of your experiments with qualitative analytics and session recordings.',\n author,\n date: new Date(2020, 6, 30),\n group: 'Tutorial',\n tutorials: true,\n customSection: (\n \n

What’s next?

\n

\n We hope this guide helped you understand how you can get the most out of A/B tests with\n LiveSession! Want to read more? You might also be interested in these resources:\n

\n
\n \n \n \n
\n
\n ),\n};\n\nexport { meta };\n\nexport default () => {\n const { cover } = useStaticQuery(graphql`\n query CoverABtest {\n cover: file(relativePath: { eq: \"tutorials/abtest.png\" }) {\n childImageSharp {\n fluid(quality: 95) {\n ...GatsbyImageSharpFluid_withWebp\n }\n }\n }\n }\n `);\n return (\n \n );\n};\n","module.exports = __webpack_public_path__ + \"static/ab-test-270b1dea209c02d3185ee816dbdb8407.png\";","module.exports = __webpack_public_path__ + \"static/1-741f6004aa73a1a572a8f70cfd9b46fb.png\";","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nconst Container = styled.div`\n top: 0;\n left: 0;\n position: fixed;\n width: 100%;\n height: 100vh;\n background-color: rgba(0, 0, 0, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 99999;\n`;\n\nconst Box = styled.div`\n background-color: transparent;\n position: relative;\n width: 95vw;\n height: 95vh;\n padding: 1.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n`;\n\nconst Close = styled.span`\n position: absolute;\n font-size: 1.8rem;\n right: 20px;\n top: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n background-color: #fff;\n border-radius: 100px;\n width: 40px;\n height: 40px;\n padding-bottom: 3px;\n filter: drop-shadow(5px 1px 4px rgba(0, 0, 0, 0.2));\n z-index: 10;\n`;\n\nconst ImageWrapped = styled.img`\n max-width: 100%;\n max-height: 100%;\n display: block;\n margin: 0 auto;\n border: none;\n`;\nconst minWidthToShow = 600;\n\nconst Image = styled.img`\n border: 1px solid #eaebec;\n max-width: 100%;\n height: auto;\n\n @media (min-width: ${minWidthToShow}px) {\n cursor: pointer;\n }\n`;\n\nclass ImageModal extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n showModal: false,\n };\n }\n\n componentDidMount() {\n document.addEventListener('keydown', this.escFunction, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('keydown', this.escFunction, false);\n }\n\n escFunction = (event) => {\n const { showModal } = this.state;\n\n if (event.keyCode === 27 && showModal) {\n this.closeModal();\n }\n };\n\n closeModal = () => {\n this.setState({ showModal: false });\n };\n\n openModal = () => {\n if (window.innerWidth >= minWidthToShow) {\n this.setState({ showModal: true });\n }\n };\n\n render() {\n const { showModal } = this.state;\n const { src, imgStyle, imgModalStyle, alt, title, lazy } = this.props;\n\n const modal = (\n \n ×\n \n \n \n \n );\n\n return (\n <>\n \n {showModal && modal}\n \n );\n }\n}\n\nexport default ImageModal;\n\nImageModal.propTypes = {\n src: PropTypes.string.isRequired,\n imgStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.node]),\n imgModalStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.node]),\n alt: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n lazy: PropTypes.bool,\n};\n\nImageModal.defaultProps = {\n lazy: false,\n imgStyle: null,\n imgModalStyle: null,\n};\n","module.exports = __webpack_public_path__ + \"static/11-081dfc2402c40a05d307de0d1259148a.png\";","module.exports = __webpack_public_path__ + \"static/15-5e076a4c5075d561f88f9b8589e28319.png\";","import React from 'react';\n\nimport BlogArticle from 'components/blog/blogArticle';\nimport { authorKalina as author } from 'data/authors';\nimport { Post } from 'components/blog/content/styled';\nimport img from 'img/blog/5-ways-to-increase/increase-conversion.png';\n\nconst Content = () => {\n return (\n \n

\n A landing page is a standalone website dedicated to a specific purpose, such as a particular\n marketing campaign or a product page. Once customers click on your Google or social media\n ads, they “land” on landing pages. This is an excellent opportunity to attract them to your\n products and close the deal. Because of that,\n landing page optimization is crucial for improving the performance of your\n marketing campaigns. Check out our tips and revamp your landing pages with no fuss!\n

\n

Take a customer-centric approach

\n

\n First of all, every landing page should have a clear purpose. For sure, it has to be\n aesthetic and compliant with your branding, but it’s not all about stunning design. First of\n all, make sure that your landing page is useful and intuitive. Drop videos or pictures that\n may slow-down your website, and use images that will enable speed loading instead.\n

\n\n

\n To identify your visitors’ pain points, you can use tools like LiveSession. They enable\n session recording, so you can learn how users interact with your website, both on desktop\n and mobile. It is a valuable opportunity to see visitors’ clicks, mouse movement, scrolling\n and keystrokes. Once you analyze recordings and get to know how your customers behave on\n your website, you can adapt your product to their needs. The system evaluates recordings\n based on the level of user involvement in a given session. That way, you can focus on the\n most valuable sessions and come to fruitful conclusions.\n

\n

\n And there is more! Thanks to session recordings you can identify bugs or errors, and fix\n them faster{' '}\n \n 😉\n \n

\n

Refurbish your CTAs

\n

\n There should be one main call-to-action present on every landing page. This way, you can\n inform visitors what kind of action you to expect them to take. A few strong CTAs can be\n confusing and distracting for a potential customer. This is also why it’s a good practice is\n to leave a white space around a button to increase its visibility. A powerful CTA should\n include up to five words and action verbs, such as “join”, “sign-up”, “buy now”, “order”\n etc. If you need to share more details for clarification, you can use additional text below\n the actual CTA button. As a result, visitors can be sure what action they are about to take.\n

\n

\n CTA, as well as other crucial elements of a landing page, should be placed above the fold.\n Therefore, the users can notice them without scrolling your website. This little trick can\n help you increase conversion rates! Creating a sense of urgency can also be beneficial.\n Sometimes customers interested in your offer might postpone their decision. In this case,\n you can help them make a choice by highlighting that your special deal is temporary.\n

\n

\n If you’d like to learn more about the subject, this{' '}\n \n guide to creating successful CTAs\n {' '}\n is sure to come in handy!\n

\n

Come up with a value proposition

\n

\n Highlight the unique things or qualities about your company, products or services to\n convince your visitors why they should choose your offer over your competitors. A{' '}\n unique value proposition should inform your customers\n which of their problems your company solves and what actual benefits they can\n get. Additionally, it should emphasize how your offer differs from the others available on\n the market. Use the language of your customers so that they can easily understand what you\n want to say.\n

\n

\n There is no single recipe for the perfect value proposition. It can include an appealing\n headline, two or three sentences of specification, bullet points describing the benefits and\n an appealing image.\n

\n

\n On the product pages, you should definitely highlight your e-commerce advantages, like{' '}\n \n last mile delivery\n \n , free-shipping or next-day delivery. Of course, you need to expose best qualities of a\n given product. Instead of describing technical specification, come up with a value\n proposition. For example, explain the extraordinary features, like waterproof material. If\n your company act responsibly, supports fair trade, or contributes to charity – don’t forget\n to mention it!\n

\n

Build trust

\n

\n A landing page is visited by users that are initially interested in your offer. Use that\n opportunity to maximize your chances of closing the deal! Building trust is\n one of the most helpful approaches when it comes to triggering shopping impulses.\n

\n

How exactly can you show your potential customer that your company is reliable?

\n
    \n
  • \n Add testimonials – A few sentences with an honest, positive opinion can\n work wonders! Ask your previous customers for a recommendation (you can offer them\n something in return for that effort, like a 10% discount for the next shopping), but never\n publish fake comments;{' '}\n
  • \n
  • \n Take advantage of social proof – Use the number of customers that already\n bought your products or display the amount of downloads of your assets and show visitors\n that your brand is recognizable on the market;\n
  • \n
  • \n Display logos of your partners and prominent customers to show what is\n your business environment and who you cooperate with;\n
  • \n
  • \n Add certificates and awards – Depending on your industry and specifics of\n your products; you can share information about your company achievements and certified\n skills.{' '}\n
  • \n
\n

\n Customer trust is especially significant when it comes to e-commerce websites. Be sure to\n add information about payment methods and third-party providers. Assure\n your customers that your platform is fully secured. Another essential aspect of online\n shopping is safe and fast delivery– don’t forget to inform visitors which\n delivery companies will take care of their order. Product rating expressed through numbers\n or stars can be helpful as well. By providing this information to your customers, you can\n count on a better conversion rate. Make sure these details are easy to read and understand.\n

\n

Test, test, test!

\n

\n No matter how many guides and tips on landing page optimization you will read, you still\n have to find out what works best for your audience. Landing pages are an\n excellent opportunity for A/B testing. This method is about changing only one element, for\n example the CTA button, title, image or color pallette. This is how you can find out which\n version of your website performs best. You can learn what are your target group preferences\n and use this knowledge for your further improvements and projects.\n

\n

\n For example, you can notice how conversion differs depending on how you inform about the\n current discount – in percentage or the exact amount. Run A/B tests to find out which is\n more convincing for your customers and use the winning version your future campaigns.{' '}\n

\n

Conclusion

\n

\n Here’s an extra tip: landing pages, like other types of websites, can also be entered via\n Google search results. Even though social media campaigns and Google Ads might generate most\n of the traffic, you can still benefit from search engine optimization. Star\n from the basics – use the right keywords and headlines to fit users’ search phrases. You can\n also link to useful blog posts and other subpages.\n

\n

\n The clue of{' '}\n \n creating the most effective landing page\n {' '}\n is to understand that it has to be as useful as possible for the visitors.\n Think about its purpose and highlight the most crucial benefits and features of your\n products. Include appealing CTAs, testimonials and contact details. Nevertheless, keep it\n simple. Direct customer’s attention to the one goal of your landing page to maximize its\n performance.{' '}\n

\n
\n );\n};\n\nconst Wrapped = BlogArticle(Content);\n\nexport const frontmatter = {\n title: '5 easy ways to increase landing page conversion rate',\n url: '/blog/5-easy-ways-to-increase-landing-page/',\n description:\n 'Landing page optimization is crucial for improving the performance of your marketing campaigns. Check out our tips and revamp your landing pages with no fuss! ',\n author,\n img,\n imgSocial: img,\n date: '2019-10-07',\n category: '',\n imgStyle: { borderBottom: '1px solid rgba(0,0,0,0.125)' },\n group: 'Articles',\n};\n\nexport default () => (\n \n);\n","module.exports = __webpack_public_path__ + \"static/4-96e6c4b28c5426450acb8b648c471d0a.png\";","module.exports = __webpack_public_path__ + \"static/27-c747d60ca5af439d505da73a511205f4.png\";","function _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","module.exports = __webpack_public_path__ + \"static/16-e066eb5ee119f7725a4b5f3e9bd2c91a.png\";","module.exports = __webpack_public_path__ + \"static/31-b674ca6eb32aa8bcbdba79c9c458282b.png\";","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","module.exports = __webpack_public_path__ + \"static/28-a1aae3f327de77e390ebbd02877e221e.png\";","module.exports = __webpack_public_path__ + \"static/2-9e9ab7e37b78005a91dce9b8bb11c872.png\";","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/toConsumableArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _throttle = _interopRequireDefault(require(\"./throttle\"));\n\nfunction isEqualArray(a, b) {\n return a.length === b.length && a.every(function (item, index) {\n return item === b[index];\n });\n}\n\nvar Scrollspy = /*#__PURE__*/function (_React$Component) {\n (0, _inherits2.default)(Scrollspy, _React$Component);\n (0, _createClass2.default)(Scrollspy, null, [{\n key: \"propTypes\",\n get: function get() {\n return {\n items: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,\n currentClassName: _propTypes.default.string.isRequired,\n scrolledPastClassName: _propTypes.default.string,\n style: _propTypes.default.object,\n componentTag: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.elementType]),\n offset: _propTypes.default.number,\n rootEl: _propTypes.default.string,\n onUpdate: _propTypes.default.func\n };\n }\n }, {\n key: \"defaultProps\",\n get: function get() {\n return {\n items: [],\n currentClassName: '',\n style: {},\n componentTag: 'ul',\n offset: 0,\n onUpdate: function onUpdate() {}\n };\n }\n }]);\n\n function Scrollspy(props) {\n var _this;\n\n (0, _classCallCheck2.default)(this, Scrollspy);\n _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Scrollspy).call(this, props));\n _this.state = {\n targetItems: [],\n inViewState: [],\n isScrolledPast: [] // manually bind as ES6 does not apply this\n // auto binding as React.createClass does\n\n };\n _this._handleSpy = _this._handleSpy.bind((0, _assertThisInitialized2.default)(_this));\n return _this;\n }\n\n (0, _createClass2.default)(Scrollspy, [{\n key: \"_initSpyTarget\",\n value: function _initSpyTarget(items) {\n var targetItems = items.map(function (item) {\n return document.getElementById(item);\n });\n return targetItems;\n } // https://github.com/makotot/react-scrollspy/pull/45\n\n }, {\n key: \"_fillArray\",\n value: function _fillArray(array, val) {\n var newArray = [];\n\n for (var i = 0, max = array.length; i < max; i++) {\n newArray[i] = val;\n }\n\n return newArray;\n }\n }, {\n key: \"_isScrolled\",\n value: function _isScrolled() {\n return this._getScrollDimension().scrollTop > 0;\n }\n }, {\n key: \"_getScrollDimension\",\n value: function _getScrollDimension() {\n var doc = document;\n var rootEl = this.props.rootEl;\n var scrollTop = rootEl ? doc.querySelector(rootEl).scrollTop : doc.documentElement.scrollTop || doc.body.parentNode.scrollTop || doc.body.scrollTop;\n var scrollHeight = rootEl ? doc.querySelector(rootEl).scrollHeight : doc.documentElement.scrollHeight || doc.body.parentNode.scrollHeight || doc.body.scrollHeight;\n return {\n scrollTop: scrollTop,\n scrollHeight: scrollHeight\n };\n }\n }, {\n key: \"_getElemsViewState\",\n value: function _getElemsViewState(targets) {\n var elemsInView = [];\n var elemsOutView = [];\n var viewStatusList = [];\n var targetItems = targets ? targets : this.state.targetItems;\n var hasInViewAlready = false;\n\n for (var i = 0, max = targetItems.length; i < max; i++) {\n var currentContent = targetItems[i];\n var isInView = hasInViewAlready ? false : this._isInView(currentContent);\n\n if (isInView) {\n hasInViewAlready = true;\n elemsInView.push(currentContent);\n } else {\n elemsOutView.push(currentContent);\n }\n\n var isLastItem = i === max - 1;\n\n var isScrolled = this._isScrolled(); // https://github.com/makotot/react-scrollspy/pull/26#issue-167413769\n\n\n var isLastShortItemAtBottom = this._isAtBottom() && this._isInView(currentContent) && !isInView && isLastItem && isScrolled;\n\n if (isLastShortItemAtBottom) {\n elemsOutView.pop();\n elemsOutView.push.apply(elemsOutView, (0, _toConsumableArray2.default)(elemsInView));\n elemsInView = [currentContent];\n viewStatusList = this._fillArray(viewStatusList, false);\n isInView = true;\n }\n\n viewStatusList.push(isInView);\n }\n\n return {\n inView: elemsInView,\n outView: elemsOutView,\n viewStatusList: viewStatusList,\n scrolledPast: this.props.scrolledPastClassName && this._getScrolledPast(viewStatusList)\n };\n }\n }, {\n key: \"_isInView\",\n value: function _isInView(el) {\n if (!el) {\n return false;\n }\n\n var _this$props = this.props,\n rootEl = _this$props.rootEl,\n offset = _this$props.offset;\n var rootRect;\n\n if (rootEl) {\n rootRect = document.querySelector(rootEl).getBoundingClientRect();\n }\n\n var rect = el.getBoundingClientRect();\n var winH = rootEl ? rootRect.height : window.innerHeight;\n\n var _this$_getScrollDimen = this._getScrollDimension(),\n scrollTop = _this$_getScrollDimen.scrollTop;\n\n var scrollBottom = scrollTop + winH;\n var elTop = rootEl ? rect.top + scrollTop - rootRect.top + offset : rect.top + scrollTop + offset;\n var elBottom = elTop + el.offsetHeight;\n return elTop < scrollBottom && elBottom > scrollTop;\n }\n }, {\n key: \"_isAtBottom\",\n value: function _isAtBottom() {\n var rootEl = this.props.rootEl;\n\n var _this$_getScrollDimen2 = this._getScrollDimension(),\n scrollTop = _this$_getScrollDimen2.scrollTop,\n scrollHeight = _this$_getScrollDimen2.scrollHeight;\n\n var winH = rootEl ? document.querySelector(rootEl).getBoundingClientRect().height : window.innerHeight;\n var scrolledToBottom = scrollTop + winH >= scrollHeight;\n return scrolledToBottom;\n }\n }, {\n key: \"_getScrolledPast\",\n value: function _getScrolledPast(viewStatusList) {\n if (!viewStatusList.some(function (item) {\n return item;\n })) {\n return viewStatusList;\n }\n\n var hasFoundInView = false;\n var scrolledPastItems = viewStatusList.map(function (item) {\n if (item && !hasFoundInView) {\n hasFoundInView = true;\n return false;\n }\n\n return !hasFoundInView;\n });\n return scrolledPastItems;\n }\n }, {\n key: \"_spy\",\n value: function _spy(targets) {\n var _this2 = this;\n\n var elemensViewState = this._getElemsViewState(targets);\n\n var currentStatuses = this.state.inViewState;\n this.setState({\n inViewState: elemensViewState.viewStatusList,\n isScrolledPast: elemensViewState.scrolledPast\n }, function () {\n _this2._update(currentStatuses);\n });\n }\n }, {\n key: \"_update\",\n value: function _update(prevStatuses) {\n if (isEqualArray(this.state.inViewState, prevStatuses)) {\n return;\n }\n\n this.props.onUpdate(this.state.targetItems[this.state.inViewState.indexOf(true)]);\n }\n }, {\n key: \"_handleSpy\",\n value: function _handleSpy() {\n (0, _throttle.default)(this._spy(), 100);\n }\n }, {\n key: \"_initFromProps\",\n value: function _initFromProps() {\n var targetItems = this._initSpyTarget(this.props.items);\n\n this.setState({\n targetItems: targetItems\n });\n\n this._spy(targetItems);\n }\n }, {\n key: \"offEvent\",\n value: function offEvent() {\n var el = this.props.rootEl ? document.querySelector(this.props.rootEl) : window;\n el.removeEventListener('scroll', this._handleSpy);\n }\n }, {\n key: \"onEvent\",\n value: function onEvent() {\n var el = this.props.rootEl ? document.querySelector(this.props.rootEl) : window;\n el.addEventListener('scroll', this._handleSpy);\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this._initFromProps();\n\n this.onEvent();\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.offEvent();\n }\n }, {\n key: \"UNSAFE_componentWillReceiveProps\",\n value: function UNSAFE_componentWillReceiveProps() {\n this._initFromProps();\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this3 = this;\n\n var Tag = this.props.componentTag;\n var _this$props2 = this.props,\n children = _this$props2.children,\n className = _this$props2.className,\n scrolledPastClassName = _this$props2.scrolledPastClassName,\n style = _this$props2.style;\n var counter = 0;\n\n var items = _react.default.Children.map(children, function (child, idx) {\n var _classNames;\n\n if (!child) {\n return null;\n }\n\n var ChildTag = child.type;\n var isScrolledPast = scrolledPastClassName && _this3.state.isScrolledPast[idx];\n var childClass = (0, _classnames.default)((_classNames = {}, (0, _defineProperty2.default)(_classNames, \"\".concat(child.props.className), child.props.className), (0, _defineProperty2.default)(_classNames, \"\".concat(_this3.props.currentClassName), _this3.state.inViewState[idx]), (0, _defineProperty2.default)(_classNames, \"\".concat(_this3.props.scrolledPastClassName), isScrolledPast), _classNames));\n return _react.default.createElement(ChildTag, (0, _extends2.default)({}, child.props, {\n className: childClass,\n key: counter++\n }), child.props.children);\n });\n\n var itemClass = (0, _classnames.default)((0, _defineProperty2.default)({}, \"\".concat(className), className));\n return _react.default.createElement(Tag, {\n className: itemClass,\n style: style\n }, items);\n }\n }]);\n return Scrollspy;\n}(_react.default.Component);\n\nexports.default = Scrollspy;","module.exports = __webpack_public_path__ + \"static/32-d42f9aac3dad3e1a09b1e667d58461b5.png\";","module.exports = __webpack_public_path__ + \"static/5-dc10e8cbfa7a081b9a9ab09dfce6689a.png\";","var _typeof = require(\"@babel/runtime/helpers/typeof\")[\"default\"];\n\nvar assertThisInitialized = require(\"./assertThisInitialized.js\");\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n\n return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","module.exports = __webpack_public_path__ + \"static/increase-conversion-bddf03c3dd79e3c22e31f15fc3fa8ddb.png\";","module.exports = __webpack_public_path__ + \"static/29-b331084c8d79bc5d3614d40b3e0ad401.png\";","module.exports = __webpack_public_path__ + \"static/18-dd7fe62ef26af2951ba81fd4682e3f97.png\";","module.exports = __webpack_public_path__ + \"static/3-70378cc3e440afb294fc13050fb77ea4.png\";","module.exports = __webpack_public_path__ + \"static/9-76cc8d6e7ba0435d875c9806fd6a0949.png\";","import styled from 'styled-components';\nimport { media } from 'theme/breakpoints';\nimport Img from 'gatsby-image';\n\nexport const Section = styled.section`\n ${media.mobile} {\n padding-bottom: 60px;\n }\n`;\n\nexport const Header = styled.div`\n position: relative;\n padding-top: 8rem;\n margin-bottom: 88px;\n text-align: left;\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n grid-column-gap: 56px;\n align-items: center;\n width: 100%;\n ${media.desktopWide} {\n grid-template-columns: 1fr;\n grid-template-rows: auto auto;\n grid-gap: 40px;\n padding-bottom: 40px;\n }\n ${media.mobile} {\n margin-bottom: 40px;\n padding-top: 6rem;\n }\n`;\n\nexport const Title = styled.h1`\n margin: 0 0 32px 0;\n line-height: 60px;\n ${media.desktopWide} {\n font-size: 1.8rem;\n margin: 0 0 1rem 0;\n line-height: 1.4;\n }\n @media (max-width: 600px) {\n font-size: 1.6rem;\n }\n @media (max-width: 400px) {\n font-size: 1.5rem;\n }\n`;\n\nexport const Cover = styled(Img)`\n max-width: 584px;\n position: relative;\n z-index: 5;\n ${media.desktopWide} {\n margin: 0 auto;\n max-width: 770px;\n }\n ${media.tablet} {\n margin: 0 auto;\n max-width: 100%;\n }\n`;\n\nexport const ContentContainer = styled.article`\n display: block;\n background-color: #f8f8f8;\n position: relative;\n &::after {\n content: '';\n position: absolute;\n width: 100%;\n height: 40px;\n background-color: #fff;\n bottom: 0;\n left: 0;\n z-index: 1;\n ${media.desktopWide} {\n display: none;\n }\n }\n`;\n\nexport const ArticleFooter = styled.section`\n border-top: 1px solid #eaebec;\n border-bottom: 1px solid #eaebec;\n padding-top: 3rem;\n padding-bottom: 3rem;\n & .bio {\n font-size: 16px;\n line-height: 28px;\n margin-top: 16px;\n }\n .profile-picture {\n margin: 0 auto;\n }\n`;\n\nexport const TimeToRead = styled.em`\n font-style: normal;\n margin-left: 16px;\n position: relative;\n &::before {\n content: '';\n width: 4px;\n height: 4px;\n position: absolute;\n left: 0;\n top: 50%;\n transform: translate(-10px, -25%);\n border-radius: 50%;\n background-color: #000;\n opacity: 0.75;\n }\n`;\n\nexport const Toc = styled.ol`\n position: sticky;\n top: 130px;\n margin-right: 26px;\n padding-left: 20px;\n ${media.desktop} {\n position: static;\n margin: 0 0 56px 0;\n padding-left: 18px;\n }\n & li {\n font-weight: 700;\n ${media.mobile} {\n color: #0a4ed6;\n }\n &:not(:last-child) {\n margin-bottom: 16px;\n }\n &.active {\n color: #0a4ed6;\n & a {\n color: #0a4ed6;\n }\n }\n & a {\n color: #000;\n font-size: 16px;\n line-height: 24px;\n display: inline;\n transition: none;\n font-weight: 700;\n ${media.mobile} {\n color: #0a4ed6;\n }\n }\n }\n`;\n\nexport const HeaderContainer = styled.div`\n margin-bottom: 40px;\n ${media.desktopWide} {\n width: 770px;\n margin: 0 auto;\n }\n ${media.tablet} {\n width: auto;\n }\n`;\n\nexport const TocHeading = styled.h4`\n display: none;\n ${media.desktop} {\n display: block;\n margin-bottom: 32px;\n }\n ${media.mobile} {\n margin-bottom: 24px;\n }\n`;\n\nexport const ArticleContainer = styled.div`\n & img {\n filter: drop-shadow(0px 0px 20px rgba(0, 0, 0, 0.16));\n border: 1px solid #f8f8f8;\n }\n & h2 {\n font-weight: 800;\n }\n div.section-container {\n padding-top: 78px;\n margin-top: -78px;\n }\n`;\n","/* eslint-disable react/prop-types */\nimport React, { useEffect, useState } from 'react';\nimport Layout from 'layout';\nimport StartUsing from 'components/ui/startUsing';\nimport Scrollspy from 'react-scrollspy';\nimport { format } from 'date-fns';\nimport * as Styled from './styled';\n\nexport default (Content) => ({\n title,\n description,\n img,\n author,\n date,\n url,\n timeToRead,\n customSection,\n ...props\n}) => {\n const { authorName, avatar } = author;\n\n const [tocHeadings, setTocHeadings] = useState(null);\n const [tocContainers, setTocContainers] = useState(null);\n const [tocIDs, setTocIDs] = useState([]);\n\n useEffect(() => {\n const containers = document.querySelectorAll('.post-container .section-container');\n const headings = document.querySelectorAll('.post-container h2');\n const arrHeadings = Array.from(headings);\n const arrContainers = Array.from(containers);\n if (!tocHeadings) {\n setTocHeadings(arrHeadings);\n setTocContainers(arrContainers);\n const IDs = arrContainers.map((item) => item.id);\n setTocIDs(IDs);\n }\n }, [tocHeadings, tocContainers]);\n\n const formattedDate = format(new Date(date), 'do MMMM yyyy');\n\n return (\n \n \n \n \n \n \n {title}\n
\n {authorName}\n
\n {authorName}\n \n {formattedDate}\n {timeToRead && {timeToRead} min}\n \n
\n
\n
\n
\n
\n
\n
\n {tocContainers && (\n
\n Table of contents\n \n {tocContainers.map(({ id }, i) => (\n
  • \n {tocHeadings[i].textContent}\n
  • \n ))}\n \n
    \n )}\n \n \n \n
    \n
    \n
    \n
    {customSection || null}
    \n \n \n );\n};\n","module.exports = __webpack_public_path__ + \"static/33-ca57d5789735ccf7c6748a4fa6744f60.png\";","module.exports = __webpack_public_path__ + \"static/8-6ccd9756c380b983671eb4578f3a3437.png\";","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useSourceParams } from 'hooks/useSourceParams';\nimport { navigate } from 'gatsby';\nimport * as Styled from './styled';\n\nconst StartUsingLS = ({ deleteMarginTop, setMarginTop }) => {\n const { link } = useSourceParams('start-using');\n const [email, setEmail] = useState('');\n\n const handleSubmit = (e) => {\n e.preventDefault();\n navigate(`${link}&email=${email}`);\n };\n return (\n \n

    \n Start using LiveSession for free now.\n

    \n
    \n \n \n \n Sign up free\n \n \n
    \n

    Free 14-day trial

    \n

    \n No credit card required\n

    \n

    Easy setup

    \n
    \n
    \n \n );\n};\n\nexport default StartUsingLS;\n\nStartUsingLS.propTypes = {\n deleteMarginTop: PropTypes.bool,\n // eslint-disable-next-line react/forbid-prop-types\n setMarginTop: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]),\n};\n\nStartUsingLS.defaultProps = {\n deleteMarginTop: false,\n setMarginTop: false,\n};\n","function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","module.exports = __webpack_public_path__ + \"static/20-b0bfc30d45af5c4d3cf611cad67aafca.png\";","module.exports = __webpack_public_path__ + \"static/19-2cab227b1493a2bad47e2601c0a5186c.png\";","import React from 'react';\n\nimport BlogArticle from 'components/blog/blogArticle';\nimport { authorKalina as author } from 'data/authors';\nimport img from 'img/blog/covers/ab-test.png';\nimport { Post } from 'components/blog/content/styled';\n\nconst Content = () => {\n return (\n \n

    \n Every resource and asset you create - be it an ad, landing page or email, always consists of\n multiple elements. The design, copy, CTAs, headlines, ad placements… The list goes on. With\n so many factors influencing the performance of your creations, optimising them is definitely\n not an easy task. This is when A/B testing comes in useful - and here are your 5 tips for\n better A/B tests.\n

    \n

    \n What are A/B tests?\n

    \n

    \n A/B testing is a very common and effective way to optimise any digital asset you create. It\n revolves around two variants – A and B – which are both tested simultaneously to find out\n which is performing better.\n

    \n

    \n How are the tests performed, you ask? Two variants of a landing page, email or ad, as an\n example, are shown to users at random - which means that 50% of your web visitors or email\n recipients will see the version A, whereas 50% of them will see the version B. Then, the A/B\n test will indicate which version proved more popular among your audience based on specific\n metrics of your choosing.\n

    \n

    \n This might seem like a quick fix - but in reality, it’s not. It takes time and diligence to\n get proper results, and comparing the winning variant with a new variant on and on, to keep\n optimising your assets.\n

    \n

    \n What are the benefits of A/B testing?\n

    \n

    \n Essentially, A/B testing takes the guesswork out of your optimisation efforts. You can\n easily check the preferences of your users, and see how they react to your assets or any\n changes to them you might have in store.\n

    \n

    What exactly can be achieved with A/B tests, then?

    \n
      \n
    • \n \n A/B testing helps you figure out what words, images, button placements, and other\n elements seem attractive for your target audience.\n {' '}\n This way, you can truly meet their expectations when creating any{' '}\n \n digital assets\n {' '}\n and resources - and even the simplest changes and minor adjustments can work wonders here\n
    • \n
    • \n A/B testing helps you reduce bounce rates. In many cases, the assumptions\n website owners have about their target audience are completely wrong. As a result, web\n visitors and email recipients often “bounce” from the site or messages without spending\n any time checking them out. A/B testing can help you verify such assumptions and truly get\n through to your target audience. A/B testing helps you reduce bounce rates. In many cases,\n the assumptions website owners have about their target audience are completely wrong. As a\n result, web visitors and email recipients often “bounce” from the site or messages without\n spending any time checking them out. A/B testing can help you verify such assumptions and\n truly get through to your target audience.\n
    • \n
    • \n A/B testing helps you increase conversion rates. This is basically what\n optimisation is all about. With A/B testing, you’re seeing for yourself what works and\n what doesn’t for your visitors and email recipients, which makes it easier for you to\n craft your layout, copy and visuals to achieve more conversions. A/B testing helps you\n increase conversion rates. This is basically what optimisation is all about. With A/B\n testing, you’re seeing for yourself what works and what doesn’t for your visitors and\n email recipients, which makes it easier for you to craft your layout, copy and visuals to\n achieve more conversions.\n
    • \n
    \n

    Once you’re convinced they work - here’s how to make the most of A/B tests.

    \n

    \n Tips for better A/B tests\n

    \n
      \n
    1. \n

      \n Start A/B testing with no assumptions whatsoever.\n

      \n

      \n When you’re creating an asset and putting it to the test, you should have no assumptions\n as to how your target audience would react to certain versions of it. Let the users tell\n you which option works better for them - and don’t try to act against their opinion.\n

      \n

      \n The results of A/B tests might not be what you expect, and this happens more often than\n you might think. The key to making the most of them, though, is to draw data-driven\n conclusions and strive to optimise your asset accordingly.\n

      \n
    2. \n
    3. \n

      \n Test only one thing at a time.\n

      \n

      \n It’s true that A/B testing is all about comparing two versions of a web page, email, or\n any other digital asset. The thing to remember, however, is that these versions should\n have only one varying element. So, to give you an example - if you want to test a\n specific CTA, you should create two versions of the same page with only this specific\n CTA changed. Otherwise, it might be difficult to say what actually appeals to your users\n and what doesn’t, and attribute the results of an A/B test to particular elements.\n

      \n

      \n But, what if you want to test multiple elements of your asset (as you probably should do\n anyway)? Write down a list of such elements and prioritise them, it’s simple as that.\n Then, run your A/B tests - one at a time, to get a clear picture from the results.\n

      \n
    4. \n
    5. \n

      \n Put your trust in qualitative analysis.\n

      \n

      \n The best way to test anything is to ask your audience for detailed feedback or, even\n better, to see for yourself how they use your assets. Even if you consult the designs\n with your team or friends, you’re already gaining qualitative insights. Still, when you\n hear about a certain issue from your users first-hand or actually watch someone navigate\n your site - you get a strong proof of what might not be working as well as you expected.\n

      \n

      \n That’s precisely why user session recordings & replays work so well with A/B\n testing.\n \n Session replays\n {' '}\n are recorded visits of users actually browsing your site. Of course, since it’s\n basically an observation you’re making, it’s subject to your own biases. Nevertheless,\n recordings are a goldmine of information and a great tool for finding bottlenecks in\n your user experience.\n

      \n
    6. \n
    7. \n

      \n Use the right tools.\n

      \n

      \n If you want to do A/B testing the right way (especially if you want to leverage session\n replays), you’ll need a proper tool for this purpose. There are plenty of factors that\n affect such tests, which is why trying to conduct them all manually is really difficult\n (and frankly, often ineffective). Tools like{' '}\n \n LiveSession\n \n ,{' '}\n \n Omniconvert\n \n ,{' '}\n \n AB Tasty\n {' '}\n or{' '}\n \n Freshmail\n {' '}\n can easily help you create the right environment needed to run A/B tests. This, in turn,\n helps you get valid results that will make a real difference to your optimisation\n efforts.\n

      \n
    8. \n
    9. \n

      \n Define what metrics you’re after and document all your results.\n

      \n

      \n Before you run any test, decide how you’re going to measure its success. In fact, there\n should be one metric in particular that will help you determine the winning version of\n your asset. Such metrics can be different, depending on the actual result you’re trying\n to achieve. Pick something measurable which has an impact on your business. The{' '}\n \n conversion rate\n {' '}\n is a great example here. Other{' '}\n \n metrics that are worth tracking\n {' '}\n include bounce rates and exit rates.\n

      \n

      \n Once you have the metrics covered, don’t forget to document all your tests and their\n results. This will not only save you some effort on repeating it but also help you see\n the improvements over time. Not to mention that these results can reveal deep insights\n about your customers and their preferences, which is definitely something worth to keep\n in mind at all times.\n

      \n
    10. \n
    \n

    \n Take your digital assets to the next level with A/B tests\n

    \n

    \n There’s no single best practice when it comes to A/B tests - you can pretty much test\n whatever elements you want to. It makes most sense to test on pages that already have some\n traffic, as this is more likely to make a difference to your company’s bottom line. The most\n important thing, however, is to stay consistent and have patience.\n

    \n

    \n Usually, a recommended time span for an A/B test is{' '}\n \n between one to four weeks\n \n . The recommended minimum is 7-14 days. This amount of time can be flexible, though,\n depending on the amount of traffic or interest your digital assets receives. The frequency\n of tests also varies - but keep in mind that the goal is to optimise your assets constantly.\n

    \n

    \n For best results, combine quantitative and qualitative insights to come up with even better\n solutions for your digital assets. Once you’re at it - definitely{' '}\n \n \n give session replays a try\n \n .\n {' '}\n LiveSession is here to help you out!\n

    \n
    \n );\n};\n\nconst Wrapped = BlogArticle(Content);\n\nexport const frontmatter = {\n title: '5 Tips for Better A/B Tests',\n url: '/blog/5-tips-for-better-a-b-tests/',\n description: `Every resource and asset you create - be it an ad, landing page or email,\n always consists of multiple elements.`,\n author,\n img,\n imgSocial: img,\n date: '2019-12-30',\n category: '',\n group: 'Analytics',\n timeToRead: 6,\n};\n\nexport default () => (\n \n);\n","module.exports = __webpack_public_path__ + \"static/30-5e74804bebd3f42828b0c124525c36df.png\";","module.exports = __webpack_public_path__ + \"static/10-4a225442e98faa8a885309f68fddb64e.png\";","module.exports = __webpack_public_path__ + \"static/21-b1a568e8b93e19d895046103fc478ffc.png\";","module.exports = __webpack_public_path__ + \"static/6-4399de59ecd80f4f8a5f23e1122ef840.png\";","module.exports = __webpack_public_path__ + \"static/13-4bdc1f4f9ae9fc19ec3f8031de968dc7.png\";","module.exports = __webpack_public_path__ + \"static/24-f8aebfde88fadb0203b047b09b5d2688.png\";","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}"],"sourceRoot":""}