In the ever-evolving digital jungle, the challenge of creating variations that seamlessly adapt across a multitude of devices is a true adventure. It’s a quest not just for visual appeal or functionality but for delivering experiences that resonate on every platform, from the palm-sized smartphone to the expansive desktop.

Responsive Design: The Navigator’s Tool

The key to conquering the device jungle lies in responsive design. It’s like having a magic map, guiding digital creations to adapt fluidly across varying screen sizes and resolutions. This approach isn’t just about looking good; it’s about being universally functional.

Cross-Device Testing: The Explorer’s Quest

To ensure no device is left behind, comprehensive testing is crucial. This phase is like an exploration safari, delving into the behaviors of devices popular and obscure. Analytical tools act as binoculars, revealing insights and addressing specific user-device interactions.

Adaptive Coding: The Craftsman’s Secret

Crafting variations that perform well on every device requires adaptive coding. Employing flexible grids and media queries, developers are like skilled artisans, ensuring that every interaction, big or small, is responsive and intuitive.

Tackling the Multi-Device Challenge:

The real headache in this digital wilderness is ensuring seamless functionality across all devices. Think of it as orchestrating a symphony where every instrument (device) plays in perfect harmony.

The remedy lies in progressive enhancement techniques, which create a foundational experience that can be enriched for more sophisticated devices.

Data-driven prioritization is crucial. By understanding user demographics and device usage patterns, developers can target their efforts effectively, ensuring the best user experience where it matters most.

Ensuring Cohesive Integration Across the Digital Ecosystem:

Integration is about creating a seamless flow within the digital ecosystem, linking variations smoothly with various apps and platforms. It’s akin to being a digital Tarzan, swinging effortlessly from one application vine to another.

As we navigate this realm, the goal is clear: to make every device a portal to a perfectly tailored digital experience. In the EchoLogyx digital jungle, versatility reigns supreme, and adapting to the diverse ecosystem of devices is not just an option but a necessity.

 

Optimizing Variations Across Devices: Navigating the Multi-Device Headache

No comments yet

In the ever-evolving digital jungle, the challenge of creating variations that seamlessly adapt across a multitude of devices is a true adventure. It’s a quest not just for visual appeal or functionality but for delivering experiences that resonate on every platform, from the palm-sized smartphone to the expansive desktop.

Responsive Design: The Navigator’s Tool

The key to conquering the device jungle lies in responsive design. It’s like having a magic map, guiding digital creations to adapt fluidly across varying screen sizes and resolutions. This approach isn’t just about looking good; it’s about being universally functional.

Cross-Device Testing: The Explorer’s Quest

To ensure no device is left behind, comprehensive testing is crucial. This phase is like an exploration safari, delving into the behaviors of devices popular and obscure. Analytical tools act as binoculars, revealing insights and addressing specific user-device interactions.

Adaptive Coding: The Craftsman’s Secret

Crafting variations that perform well on every device requires adaptive coding. Employing flexible grids and media queries, developers are like skilled artisans, ensuring that every interaction, big or small, is responsive and intuitive.

Tackling the Multi-Device Challenge:

The real headache in this digital wilderness is ensuring seamless functionality across all devices. Think of it as orchestrating a symphony where every instrument (device) plays in perfect harmony.

The remedy lies in progressive enhancement techniques, which create a foundational experience that can be enriched for more sophisticated devices.

Data-driven prioritization is crucial. By understanding user demographics and device usage patterns, developers can target their efforts effectively, ensuring the best user experience where it matters most.

Ensuring Cohesive Integration Across the Digital Ecosystem:

Integration is about creating a seamless flow within the digital ecosystem, linking variations smoothly with various apps and platforms. It’s akin to being a digital Tarzan, swinging effortlessly from one application vine to another.

As we navigate this realm, the goal is clear: to make every device a portal to a perfectly tailored digital experience. In the EchoLogyx digital jungle, versatility reigns supreme, and adapting to the diverse ecosystem of devices is not just an option but a necessity.

 

“Collaborating with EchoLogyx has been a transformative experience for us. Thanks to their efficient team we’ve been able to operate at an extremely high testing velocity, much higher than I’ve been able to achieve in any previous companies. The team, with their 100% specialisation in CRO development, enabled us to smash our velocity targets and also overcome many technical challenges, pushing the boundaries of Optimizely. Our work with EchoLogyx has proven invaluable investment. They’ve been the rocket fuel to our growth.

– Mike F., Head Of Experimentation

 

About GoStudent

GoStudent is an online platform providing 1:1 tutoring for students across Europe. They have over 23,000 tutors and have supported over 11mil families.

Download the full case study.

The Challenge

The GoStudent marketing team is divided across more than 15 regions, dispersed throughout Europe. They had Optimizely as their testing platform. However, there was no dedicated CRO team and they were struggling to launch experiments frequently due to a shortage of resources to support test design, development and QA.

How EchoLogyx helped GoStudent

In summer 2022, GoStudent wanted to ramp up their CRO activity. They hired a Head of CRO (Mike) to build a new team, who quickly employed Echologyx as their A/B test delivery partner. The
team started to communicate and educate about the power of experimentation and created a series of experimentation strategies for the different marketing teams. This included simplified user
journeys, personalisations, prioritisation of experiments based on impact, and UX studies of different cultures.

Within a few months, GoStudent started to push experiments based on the new growth strategy findings across different customer journeys, landing pages and registration process. EchoLogyx designed, developed, and QA’d an average of 20 tests per month based on the research findings by Mike and the GoStudent growth team. This has helped the team from different regions to gain more traffic and increase conversion rate.

Download the full case study.

Case Study: EchoLogyx helps GoStudent’s Growth team to increase test velocity by 10x

No comments yet

“Collaborating with EchoLogyx has been a transformative experience for us. Thanks to their efficient team we’ve been able to operate at an extremely high testing velocity, much higher than I’ve been able to achieve in any previous companies. The team, with their 100% specialisation in CRO development, enabled us to smash our velocity targets and also overcome many technical challenges, pushing the boundaries of Optimizely. Our work with EchoLogyx has proven invaluable investment. They’ve been the rocket fuel to our growth.

– Mike F., Head Of Experimentation

 

About GoStudent

GoStudent is an online platform providing 1:1 tutoring for students across Europe. They have over 23,000 tutors and have supported over 11mil families.

Download the full case study.

The Challenge

The GoStudent marketing team is divided across more than 15 regions, dispersed throughout Europe. They had Optimizely as their testing platform. However, there was no dedicated CRO team and they were struggling to launch experiments frequently due to a shortage of resources to support test design, development and QA.

How EchoLogyx helped GoStudent

In summer 2022, GoStudent wanted to ramp up their CRO activity. They hired a Head of CRO (Mike) to build a new team, who quickly employed Echologyx as their A/B test delivery partner. The
team started to communicate and educate about the power of experimentation and created a series of experimentation strategies for the different marketing teams. This included simplified user
journeys, personalisations, prioritisation of experiments based on impact, and UX studies of different cultures.

Within a few months, GoStudent started to push experiments based on the new growth strategy findings across different customer journeys, landing pages and registration process. EchoLogyx designed, developed, and QA’d an average of 20 tests per month based on the research findings by Mike and the GoStudent growth team. This has helped the team from different regions to gain more traffic and increase conversion rate.

Download the full case study.

EchoLogyx’s expertise has been invaluable to our Gardenista project. With the upgraded website now live for several months, we are delighted with the solution provided. Minor bugs were swiftly resolved, leading to a stable platform. Sales have surpassed our expectations, and the automated processes have saved our team significant time.

Our gratitude goes to the EchoLogyx team for their collaborative approach and commitment to deadlines. Their flexibility allowed us to launch just in time for the Garden season.” – Babak M., Digital Project Manager

About Loft25 Group

Loft25, a prominent player in the furniture and home décor industry, embarked on a transformative journey with EchoLogyx, a trusted web development and quality assurance agency. The collaborative venture aimed to rejuvenate Loft25’s Gardenista line, a segment dedicated to outdoor furniture and décor. EchoLogyx was entrusted with the task of revamping the Gardenista website, hosted on the Shopify platform. The mission was clear: enhance Gardenista’s sales performance with new and innovative product range while simplifying operations through automation.

Download the full case study

The Challenge

The team at Loft25 wanted to simplify the customer journey of purchasing bespoke product range that is personalised for the customer’s need. This required a series of questions to get the right product and receive the product price using a decision tree. As the store is built on Shopify, this whole journey needed to be part of the existing store but at the same time, need to have a bespoke section for the customers to go through the questions to buy the personalised product.

How EchoLogyx helped Loft25

EchoLogyx executed a strategic approach for the project by developing this as a standalone product. Provided that this is a custom made product, the customers were able to choose the exact dimension, colours and other attributes which then automatically calculates the price. Additionally, to make it simple, customers were able to add multiple personalised products within the same journey.
Once this was developed, it went through a full end to end QA process across multiple devices and browsers to make sure that the correct pricing is getting calculated and no UI issues are found by the end users.

Download the full case study to find out more.

Case Study: EchoLogyx helping Loft25 Group with their bespoke product launch

No comments yet

EchoLogyx’s expertise has been invaluable to our Gardenista project. With the upgraded website now live for several months, we are delighted with the solution provided. Minor bugs were swiftly resolved, leading to a stable platform. Sales have surpassed our expectations, and the automated processes have saved our team significant time.

Our gratitude goes to the EchoLogyx team for their collaborative approach and commitment to deadlines. Their flexibility allowed us to launch just in time for the Garden season.” – Babak M., Digital Project Manager

About Loft25 Group

Loft25, a prominent player in the furniture and home décor industry, embarked on a transformative journey with EchoLogyx, a trusted web development and quality assurance agency. The collaborative venture aimed to rejuvenate Loft25’s Gardenista line, a segment dedicated to outdoor furniture and décor. EchoLogyx was entrusted with the task of revamping the Gardenista website, hosted on the Shopify platform. The mission was clear: enhance Gardenista’s sales performance with new and innovative product range while simplifying operations through automation.

Download the full case study

The Challenge

The team at Loft25 wanted to simplify the customer journey of purchasing bespoke product range that is personalised for the customer’s need. This required a series of questions to get the right product and receive the product price using a decision tree. As the store is built on Shopify, this whole journey needed to be part of the existing store but at the same time, need to have a bespoke section for the customers to go through the questions to buy the personalised product.

How EchoLogyx helped Loft25

EchoLogyx executed a strategic approach for the project by developing this as a standalone product. Provided that this is a custom made product, the customers were able to choose the exact dimension, colours and other attributes which then automatically calculates the price. Additionally, to make it simple, customers were able to add multiple personalised products within the same journey.
Once this was developed, it went through a full end to end QA process across multiple devices and browsers to make sure that the correct pricing is getting calculated and no UI issues are found by the end users.

Download the full case study to find out more.

You have just published your Shopify site, or you have been using Shopify for a while now, but want to add new feature which is not supported by the native Shopify system. You have looked into the marketplace to find an app – but struggling to get the right one that will cover all of the scenarios you would like to have. This is where you need to consider getting a Shopify App developed for your store.

Here are the six basic steps to follow and consider whilst building a new Shopify App:

1. Define the app’s purpose and features:

Before starting the development process, you need to have a clear idea of what your app will do and what features it will include. This will help you define your app’s key functionalities and guide your development efforts. Part of this step is to also consider how the UI will be defined when using this app by the end users.

2. Choose a development approach:

You can either develop your Shopify app using Shopify’s API or use a Shopify app development framework. Shopify’s API is a more flexible option, while the development framework provides a more structured development approach. If necessary, consider where the app will be hosted and served (e.g.  AWS, Azure or other cloud platforms).

3. Set up your development environment:

You need to set up a development environment to start building your app. This involves setting up a local development server, configuring your app’s settings and testing your app’s functionality. Create a copy of your live store as a staging site and use that if necessary to test the app whilst developing.

4. Build and QA your app:

Once you have set up your development environment, you can start building your app. This involves writing code, integrating Shopify’s API or app development framework, and testing your app’s functionality. Make sure that all of the features and functionalities based on original requirements are QA’d properly.

5. Integrate your app to the live store:

Once you have tested the app, you can add this to your live store as a private app. Make sure that once this is added to the live store, you run another round of QA.

6. Maintain and update your app:

Finally, you need to maintain and update your app to ensure it stays compatible with Shopify’s updates and meets the changing needs of your store. This involves adding new features and fixing any issues that may arise due to other changes within the store.

 

6 Steps to Develop a Private Shopify App

No comments yet

You have just published your Shopify site, or you have been using Shopify for a while now, but want to add new feature which is not supported by the native Shopify system. You have looked into the marketplace to find an app – but struggling to get the right one that will cover all of the scenarios you would like to have. This is where you need to consider getting a Shopify App developed for your store.

Here are the six basic steps to follow and consider whilst building a new Shopify App:

1. Define the app’s purpose and features:

Before starting the development process, you need to have a clear idea of what your app will do and what features it will include. This will help you define your app’s key functionalities and guide your development efforts. Part of this step is to also consider how the UI will be defined when using this app by the end users.

2. Choose a development approach:

You can either develop your Shopify app using Shopify’s API or use a Shopify app development framework. Shopify’s API is a more flexible option, while the development framework provides a more structured development approach. If necessary, consider where the app will be hosted and served (e.g.  AWS, Azure or other cloud platforms).

3. Set up your development environment:

You need to set up a development environment to start building your app. This involves setting up a local development server, configuring your app’s settings and testing your app’s functionality. Create a copy of your live store as a staging site and use that if necessary to test the app whilst developing.

4. Build and QA your app:

Once you have set up your development environment, you can start building your app. This involves writing code, integrating Shopify’s API or app development framework, and testing your app’s functionality. Make sure that all of the features and functionalities based on original requirements are QA’d properly.

5. Integrate your app to the live store:

Once you have tested the app, you can add this to your live store as a private app. Make sure that once this is added to the live store, you run another round of QA.

6. Maintain and update your app:

Finally, you need to maintain and update your app to ensure it stays compatible with Shopify’s updates and meets the changing needs of your store. This involves adding new features and fixing any issues that may arise due to other changes within the store.

 

“We have a strong digital team to continuously improve our digital presence in the market. Like our amazing products, we always want to provide a great customer experience across all of our digital presence. Working with EchoLogyx and getting their experienced Shopify engineer provided us the necessary resource and expertise to achieve our digital strategy and create a wonderful experience for our customers.

The team at EchoLogyx showed us how we can test different concepts before launching the changes to our website – allowing us to become a lot more data driven in order to make the rights business decisions. They have been helping us to implement and develop new apps, change templates and test different concepts on our Shopify store.

I would definitely recommend EchoLogyx without any doubt – these guys go above and beyond the call of duty to help us out with our Shopify site”
– Rachael W., Founder

About Chinti and Parker

Since 2009, Chinti & Parker, a London based brand, has been dedicated to creating collections which aim to invigorate women’s wardrobes with knitwear that celebrates joyful colour, timeless shapes, and innovative texture.

Download the full case study

The Challenge

The founders of Chinti and Parker are not only visionary with their amazingly stunning knitwear range, they wanted to provide a great customer experience through their Shopify store with innovating ideas and design.

When they started the process of implementing the back-to-back changes, they noticed that the development work was extremely slow and expensive. As a result, even though they had a digital strategy in place, they were unable to delivery the changes as quickly as they were hoping.

How EchoLogyx helped Chinti and Parker’s Shopify Development

Chinti and Parker started working with EchoLogyx from early 2022. The first project was to develop a bespoke private app to integrate with their fulfilment house. The Shopify engineers from EchoLogyx went through the scoping, making sure that all the functionalities are documented and started the development work. Within just over a month, they delivered the fully functioning private app that integrated seamlessly with their fulfilment company.

Following on to this, Chinti and Parker took one full time Shopify Engineer from EchoLogyx to help them with their digital strategy. Since then, Chinti and Parker have seen their development work move significantly faster than before. This allowed them to make bigger and bolder changes to the store, creating an amazing customer experience.

On top of using the Shopify development and QA work, Chinti and Parker started to A/B test their bigger and bolder concepts. This has started to help them make better decisions based on the data and what works best for their end users.

Download the full case study to find out more.

Case Study: EchoLogyx helping Chinti and Parker with their Shopify Store

No comments yet

“We have a strong digital team to continuously improve our digital presence in the market. Like our amazing products, we always want to provide a great customer experience across all of our digital presence. Working with EchoLogyx and getting their experienced Shopify engineer provided us the necessary resource and expertise to achieve our digital strategy and create a wonderful experience for our customers.

The team at EchoLogyx showed us how we can test different concepts before launching the changes to our website – allowing us to become a lot more data driven in order to make the rights business decisions. They have been helping us to implement and develop new apps, change templates and test different concepts on our Shopify store.

I would definitely recommend EchoLogyx without any doubt – these guys go above and beyond the call of duty to help us out with our Shopify site”
– Rachael W., Founder

About Chinti and Parker

Since 2009, Chinti & Parker, a London based brand, has been dedicated to creating collections which aim to invigorate women’s wardrobes with knitwear that celebrates joyful colour, timeless shapes, and innovative texture.

Download the full case study

The Challenge

The founders of Chinti and Parker are not only visionary with their amazingly stunning knitwear range, they wanted to provide a great customer experience through their Shopify store with innovating ideas and design.

When they started the process of implementing the back-to-back changes, they noticed that the development work was extremely slow and expensive. As a result, even though they had a digital strategy in place, they were unable to delivery the changes as quickly as they were hoping.

How EchoLogyx helped Chinti and Parker’s Shopify Development

Chinti and Parker started working with EchoLogyx from early 2022. The first project was to develop a bespoke private app to integrate with their fulfilment house. The Shopify engineers from EchoLogyx went through the scoping, making sure that all the functionalities are documented and started the development work. Within just over a month, they delivered the fully functioning private app that integrated seamlessly with their fulfilment company.

Following on to this, Chinti and Parker took one full time Shopify Engineer from EchoLogyx to help them with their digital strategy. Since then, Chinti and Parker have seen their development work move significantly faster than before. This allowed them to make bigger and bolder changes to the store, creating an amazing customer experience.

On top of using the Shopify development and QA work, Chinti and Parker started to A/B test their bigger and bolder concepts. This has started to help them make better decisions based on the data and what works best for their end users.

Download the full case study to find out more.

About Wax London

Wax is a London-based family label established in 2015, inspired by the places, faces and stories that surround us. Keeping sustainability at their core, Wax’s clothing is made with carefully sourced materials, designed to be worn, time and time again.

Download the full case study

The Challenge

After Wax moved their ecommerce platform to Shopify, they started to face some challenges to make necessary changes on their new platform. Their dynamic ecommerce and digital marketing team were getting blocked due to reduced amount of support received by their previous agency. As a result, even though they had new and innovative ideas to try and test to improve customer experience, they had to wait for months to get things implemented. They needed a solution that was efficient, cost effective and high standard.

How EchoLogyx helped Wax to scale their Shopify Development

Wax started working with EchoLogyx from early 2022. With a fulltime experienced Shopify engineer from EchoLogyx directly supporting Wax’s digital team, Wax was able to move quickly with the necessary changes on their Shopify site. On top of that, all changes were tested across multiple devices and browsers by their dedicated QA engineers, ensuring that everything is bug free when anything is going live. Download the full case study to find out more.

“When we first started working with EchoLogyx, we realised that it is possible to move things faster without losing the quality and spending a huge amount of money for the development support. We are using EchoLogyx and their Shopify developers for a while now. They are great to work with, understand our challenges and produce innovative solutions that is continuously helping us to fulfil our digital requirements. On top of that, their QA is extremely thorough, making sure that we are not making any mistakes when pushing any changes live to our storefront. This is allowing us to try out the boundaries of Shopify and enhance the customer experience of our store. Without any hesitation, I would highly recommend EchoLogyx for their Shopify development support.”

– Nicolo T., Head of Digital and Ecommerce

Case Study: Wax London increases their velocity of Shopify Development with EchoLogyx

No comments yet

About Wax London

Wax is a London-based family label established in 2015, inspired by the places, faces and stories that surround us. Keeping sustainability at their core, Wax’s clothing is made with carefully sourced materials, designed to be worn, time and time again.

Download the full case study

The Challenge

After Wax moved their ecommerce platform to Shopify, they started to face some challenges to make necessary changes on their new platform. Their dynamic ecommerce and digital marketing team were getting blocked due to reduced amount of support received by their previous agency. As a result, even though they had new and innovative ideas to try and test to improve customer experience, they had to wait for months to get things implemented. They needed a solution that was efficient, cost effective and high standard.

How EchoLogyx helped Wax to scale their Shopify Development

Wax started working with EchoLogyx from early 2022. With a fulltime experienced Shopify engineer from EchoLogyx directly supporting Wax’s digital team, Wax was able to move quickly with the necessary changes on their Shopify site. On top of that, all changes were tested across multiple devices and browsers by their dedicated QA engineers, ensuring that everything is bug free when anything is going live. Download the full case study to find out more.

“When we first started working with EchoLogyx, we realised that it is possible to move things faster without losing the quality and spending a huge amount of money for the development support. We are using EchoLogyx and their Shopify developers for a while now. They are great to work with, understand our challenges and produce innovative solutions that is continuously helping us to fulfil our digital requirements. On top of that, their QA is extremely thorough, making sure that we are not making any mistakes when pushing any changes live to our storefront. This is allowing us to try out the boundaries of Shopify and enhance the customer experience of our store. Without any hesitation, I would highly recommend EchoLogyx for their Shopify development support.”

– Nicolo T., Head of Digital and Ecommerce

We have recently created a new Chrome Extension to check if a particular goal is firing or not. Currently it supports 7 testing tools. The plan is to gradually increase the number of A/B testing tools to help marketers, CRO consutlants, QA engineers, and developers to QA metrics.

But why this is important?

Well – first of all, if your metrics are not firing as expected, how are you going to analyze the results of your tests? In simple terms, there is no point of running an experiment if you can’t measure the performance – whether it is a button click, pageview goal or transactional metrics.

The other reasion for making sure that the metrics are working correctly up front is so that you don’t lose out the days of testing – only to find at a later stage that some of them were not working as expected.

We all know that in simple terms, Conversion Rate Optimisaiton is making changes to improve specific KPIs. If you are not making sure that the metrics are being tracked properly – what’s the point!

Key takeaway – QA your metrics before you launch the tests!

Metrics checking – why this is important?

No comments yet

We have recently created a new Chrome Extension to check if a particular goal is firing or not. Currently it supports 7 testing tools. The plan is to gradually increase the number of A/B testing tools to help marketers, CRO consutlants, QA engineers, and developers to QA metrics.

But why this is important?

Well – first of all, if your metrics are not firing as expected, how are you going to analyze the results of your tests? In simple terms, there is no point of running an experiment if you can’t measure the performance – whether it is a button click, pageview goal or transactional metrics.

The other reasion for making sure that the metrics are working correctly up front is so that you don’t lose out the days of testing – only to find at a later stage that some of them were not working as expected.

We all know that in simple terms, Conversion Rate Optimisaiton is making changes to improve specific KPIs. If you are not making sure that the metrics are being tracked properly – what’s the point!

Key takeaway – QA your metrics before you launch the tests!

“Our whole website has been redeveloped and now it is using a new SPA framework. My development team is saying that we can’t build tests using Adobe Target on the new site because the way the pages are changing, it is not loading the test scripts.” – Sounds familiar? Well, you are not alone. I am going to talk through a way to tackle this issue that will make sure that you don’t need to worry about running tests using Adobe Target on SPA sites.

Why is this a challenge:

In short, the main purpose of using an SPA is to speedup page loads. The common elements within the page (such as header, footer, layouts etc) usually stays the same but inner content changes when a user navigates from one page to another. In most cases, using an SPA helps speed up the page load by only fetching the core content that needs to be updated on the page rather than the elements that are already delivered to the user.

This poses an issue with widely used A/B testing tools such as Adobe Target, Optimizely, Monetate, VWO, Convert, Optimize etc. Why – because the “single line of JavaScript tag” that has been implemented across the site no longer gets reloaded when the page content is changing. As a result, if let’s say you are targeting your funnel step 2 to run an experiment, your testing tool will not be able to detect when the user has landed on that step and display the variation. Bummer…

What can you do within Adobe Target (1.x) to detect the changes and run a test

You need to run two experiments:
1. A background experiment running globally to 100% traffic without any changes apart from some JavaScript code,
2. Your core experiment that will have the variation code for your experiment
Within the background experiment, by using MutationObserver you can detect the changes to the page content. When you detect any changes, find the element that signifies the specific page – e.g. Step 1: Delivery Address / Step 2: Billing Address etc. You will then need to make a call to getOffer() and applyOffer().

adobe.target.getOffer({
"mbox": "newPage",
"params": {
"loadedPage": "FunnelStep1"
},
"success": function (offer) {
adobe.target.applyOffer({
"mbox": "newPage",
"offer": offer
});
},
"error": function (status, error) {
//console.log('Error', status, error);
}
});

Now let’s get to your original experiment – for this use a Form based experiment and target the mbox called newPage. Although this is not necessary, it is a good idea to specify the additional targeting conditions here – such as custom parameter loadedPage is PageX.

Add your JS code here to make your variations, including your goals and additional targeting conditions. And that’s it! The background experiment will continuously listen to the page changes and whenever it finds the right page to run your experiment, it will call for that form based experiment, put the visitor in control or one of the variations, and the experiment will work as normal.

Running A/B tests using Adobe Target 1.X on sites built with SPA frameworks

No comments yet

“Our whole website has been redeveloped and now it is using a new SPA framework. My development team is saying that we can’t build tests using Adobe Target on the new site because the way the pages are changing, it is not loading the test scripts.” – Sounds familiar? Well, you are not alone. I am going to talk through a way to tackle this issue that will make sure that you don’t need to worry about running tests using Adobe Target on SPA sites.

Why is this a challenge:

In short, the main purpose of using an SPA is to speedup page loads. The common elements within the page (such as header, footer, layouts etc) usually stays the same but inner content changes when a user navigates from one page to another. In most cases, using an SPA helps speed up the page load by only fetching the core content that needs to be updated on the page rather than the elements that are already delivered to the user.

This poses an issue with widely used A/B testing tools such as Adobe Target, Optimizely, Monetate, VWO, Convert, Optimize etc. Why – because the “single line of JavaScript tag” that has been implemented across the site no longer gets reloaded when the page content is changing. As a result, if let’s say you are targeting your funnel step 2 to run an experiment, your testing tool will not be able to detect when the user has landed on that step and display the variation. Bummer…

What can you do within Adobe Target (1.x) to detect the changes and run a test

You need to run two experiments:
1. A background experiment running globally to 100% traffic without any changes apart from some JavaScript code,
2. Your core experiment that will have the variation code for your experiment
Within the background experiment, by using MutationObserver you can detect the changes to the page content. When you detect any changes, find the element that signifies the specific page – e.g. Step 1: Delivery Address / Step 2: Billing Address etc. You will then need to make a call to getOffer() and applyOffer().

adobe.target.getOffer({
"mbox": "newPage",
"params": {
"loadedPage": "FunnelStep1"
},
"success": function (offer) {
adobe.target.applyOffer({
"mbox": "newPage",
"offer": offer
});
},
"error": function (status, error) {
//console.log('Error', status, error);
}
});

Now let’s get to your original experiment – for this use a Form based experiment and target the mbox called newPage. Although this is not necessary, it is a good idea to specify the additional targeting conditions here – such as custom parameter loadedPage is PageX.

Add your JS code here to make your variations, including your goals and additional targeting conditions. And that’s it! The background experiment will continuously listen to the page changes and whenever it finds the right page to run your experiment, it will call for that form based experiment, put the visitor in control or one of the variations, and the experiment will work as normal.

What are the benefits of arrow functions in JavaScript?

  • They are more concise.
  • They have implicit returns. (We’ll get into this below.)
  • They do not rebind the value of this when you use an arrow function inside another function. (We’ll get into this in a later post.)

How do I convert my ES5 functions to ES6 arrow functions?

Let’s start with a simple example using .map().

// Let's define an array of first names:
const names = ['joe', 'rache', 'micaela'];
// If I want to add my last name to each I'll run the following function using .map():
const fullNames = names.map(function(name) {
return `${name} cardillo`;
});
// In the console when I call:
names
// It returns:
['joe', 'rache', 'micaela']
// Then if I call the function:
fullNames
// It returns:
["joe cardillo", "rache cardillo", "micaela cardillo"]

To start, delete the word ‘function’ and replace it with a fat arrow =>

const fullNames = names.map((name) => {
return `${name} cardillo`;
});

If you have only one parameter you can remove the parenthesis from it:

const fullNames = names.map(name => {
return `${name} cardillo`;
});

You can also do an “implicit return.”

But first, what is an explicit return?

An explicit return is when you explicitly write the word return in the function.

To do an implicit return, remove the word return, then move what you are returning up to the same line as the rest of the function. You can remove the curly brackets.

// Explicit return:
const fullNames = names.map(name => {
return `${name} cardillo`;
});
// Implicit return:
const fullNames = names.map(name => `${name} cardillo`);

If there is no parameter you can replace it with parenthesis:

const fullNames = names.map(() => `hey cardillo!`);
// Returns:
["hey cardillo!", "hey cardillo!", "hey cardillo!"]

Arrow functions are always anonymous functions.

Before describing an anonymous function, let’s first answer the question, “What is a named function?”

// In ES5 a named function can be written as follows:
function myFavFood(food) {
console.log(`My favorite food is ${food}!`);
}
// myFavFood is the name of the function.
// Calling this in the console:
myFavFood('pizza');
// Returns:
My favorite food is pizza!

In the above arrow functions, notice that we set all of them equal to a constvariable called fullNames.

So why would we want to set our arrow function equal to a variable?

One reason is that it can help us debug JavaScript errors, since sometimes the line number isn’t enough to narrow down where it’s coming from.

Using the food example, we can assign the arrow function to a const variable called myFavFood.

const myFavFood = (food) => { console.log(`My favorite food is ${food}!`) }
// In the console:
myFavFood('pizza');
// Returns:
My favorite food is pizza!

An introductory guide to ES6 arrow functions in JavaScript

No comments yet

What are the benefits of arrow functions in JavaScript?

  • They are more concise.
  • They have implicit returns. (We’ll get into this below.)
  • They do not rebind the value of this when you use an arrow function inside another function. (We’ll get into this in a later post.)

How do I convert my ES5 functions to ES6 arrow functions?

Let’s start with a simple example using .map().

// Let's define an array of first names:
const names = ['joe', 'rache', 'micaela'];
// If I want to add my last name to each I'll run the following function using .map():
const fullNames = names.map(function(name) {
return `${name} cardillo`;
});
// In the console when I call:
names
// It returns:
['joe', 'rache', 'micaela']
// Then if I call the function:
fullNames
// It returns:
["joe cardillo", "rache cardillo", "micaela cardillo"]

To start, delete the word ‘function’ and replace it with a fat arrow =>

const fullNames = names.map((name) => {
return `${name} cardillo`;
});

If you have only one parameter you can remove the parenthesis from it:

const fullNames = names.map(name => {
return `${name} cardillo`;
});

You can also do an “implicit return.”

But first, what is an explicit return?

An explicit return is when you explicitly write the word return in the function.

To do an implicit return, remove the word return, then move what you are returning up to the same line as the rest of the function. You can remove the curly brackets.

// Explicit return:
const fullNames = names.map(name => {
return `${name} cardillo`;
});
// Implicit return:
const fullNames = names.map(name => `${name} cardillo`);

If there is no parameter you can replace it with parenthesis:

const fullNames = names.map(() => `hey cardillo!`);
// Returns:
["hey cardillo!", "hey cardillo!", "hey cardillo!"]

Arrow functions are always anonymous functions.

Before describing an anonymous function, let’s first answer the question, “What is a named function?”

// In ES5 a named function can be written as follows:
function myFavFood(food) {
console.log(`My favorite food is ${food}!`);
}
// myFavFood is the name of the function.
// Calling this in the console:
myFavFood('pizza');
// Returns:
My favorite food is pizza!

In the above arrow functions, notice that we set all of them equal to a constvariable called fullNames.

So why would we want to set our arrow function equal to a variable?

One reason is that it can help us debug JavaScript errors, since sometimes the line number isn’t enough to narrow down where it’s coming from.

Using the food example, we can assign the arrow function to a const variable called myFavFood.

const myFavFood = (food) => { console.log(`My favorite food is ${food}!`) }
// In the console:
myFavFood('pizza');
// Returns:
My favorite food is pizza!

Arrow functions were introduced with ES6 as a new syntax for writing JavaScript functions. They save developers time and simplify function scope. They are undoubtedly one of the more popular features of ES6.

Here is a function is written in ES5 syntax:

function timesTwo (params) {
  return params * 2
}
timesTwo(4);  // 8

Now, here is the same function expressed as an arrow function:

var timesTwo = params => params * 2

timesTwo(4); // 8

It’s much shorter! We are able to omit the curly braces and the return statement due to implicit returns (but only if there is no block — more on this below).

It is important to understand how the arrow function behaves differently compared to the regular ES5 functions.

One thing you will quickly notice is the variety of syntaxes available in arrow functions. Let’s run through some of the common ones:

1. No parameters

If there are no parameters, you can place an empty parentheses before =>.

() => 42

In fact, you don’t even need the parentheses!

_ => 42

2. Single parameter

With these functions, parentheses are optional:

x => 42  || (x) => 42

3. Multiple parameters

Parentheses are required for these functions:

(x, y) => 42

4. Statements (as opposed to expressions)

In its most basic form, a function expression produces a value, while a function statement performs an action.

With the arrow function, it is important to remember that statements need to have curly braces. Once the curly braces are present, you always need to writereturn as well.

Here is an example of the arrow function used with an if statement:

var feedTheCat = (cat) => {
  if (cat === 'hungry') {
    return 'Feed the cat';
  } else {
    return 'Do not feed the cat';
  }
}

5. “Block body”

If your function is in a block, you must also use the explicit return statement:

var addValues = (x, y) => {
  return x + y
}

6. Object Literals

If you are returning an object literal, it needs to be wrapped in parentheses. This forces the interpreter to evaluate what is inside the parentheses, and the object literal is returned.

x =>({ y: x })

Syntactically anonymous

It is important to note that arrow functions are anonymous, which means that they are not named.

This anonymity creates some issues:

  1. Harder to debug

When you get an error, you will not be able to trace the name of the function or the exact line number where it occurred.

2. No self-referencing

If your function needs to have a self-reference at any point (e.g. recursion, event handler that needs to unbind), it will not work.

In classic function expressions, the this keyword is bound to different values based on the context in which it is called. With arrow functions however, this is lexically bound. It means that it usesthis from the code that contains the arrow function.

For example, look at the setTimeout function below:

// ES5
var obj = {
  id: 42,
  counter: function counter() {
    setTimeout(function() {
      console.log(this.id);
    }.bind(this), 1000);
  }
};

In the ES5 example, .bind(this) is required to help pass the this context into the function. Otherwise, by default this would be undefined.

// ES6
var obj = {
  id: 42,
  counter: function counter() {
    setTimeout(() => {
      console.log(this.id);
    }, 1000);
  }
};

ES6 arrow functions can’t be bound to a this keyword, so it will lexically go up a scope, and use the value of this in the scope in which it was defined.

When you should not use Arrow Functions

After learning a little more about arrow functions, I hope you understand that they do not replace regular functions.

Here are some instances where you probably wouldn’t want to use them:

  1. Object methods

When you call cat.jumps, the number of lives does not decrease. It is because this is not bound to anything, and will inherit the value of this from its parent scope.

var cat = {
  lives: 9,
  jumps: () => {
    this.lives--;
  }
}

2. Callback functions with dynamic context

If you need your context to be dynamic, arrow functions are not the right choice. Take a look at this event handler below:

var button = document.getElementById('press');
button.addEventListener('click', () => {
  this.classList.toggle('on');
});

If we click the button, we would get a TypeError. It is because this is not bound to the button, but instead bound to its parent scope.

3. When it makes your code less readable

It is worth taking into consideration the variety of syntax we covered earlier. With regular functions, people know what to expect. With arrow functions, it may be hard to decipher what you are looking at straightaway.

When you should use them

Arrow functions shine best with anything that requires this to be bound to the context, and not the function itself.

Despite the fact that they are anonymous, I also like using them with methods such as map and reduce, because I think it makes my code more readable. To me, the pros outweigh the cons.

Proper ways of using ES6 arrow functions in JavaScript

No comments yet

Arrow functions were introduced with ES6 as a new syntax for writing JavaScript functions. They save developers time and simplify function scope. They are undoubtedly one of the more popular features of ES6.

Here is a function is written in ES5 syntax:

function timesTwo (params) {
  return params * 2
}
timesTwo(4);  // 8

Now, here is the same function expressed as an arrow function:

var timesTwo = params => params * 2

timesTwo(4); // 8

It’s much shorter! We are able to omit the curly braces and the return statement due to implicit returns (but only if there is no block — more on this below).

It is important to understand how the arrow function behaves differently compared to the regular ES5 functions.

One thing you will quickly notice is the variety of syntaxes available in arrow functions. Let’s run through some of the common ones:

1. No parameters

If there are no parameters, you can place an empty parentheses before =>.

() => 42

In fact, you don’t even need the parentheses!

_ => 42

2. Single parameter

With these functions, parentheses are optional:

x => 42  || (x) => 42

3. Multiple parameters

Parentheses are required for these functions:

(x, y) => 42

4. Statements (as opposed to expressions)

In its most basic form, a function expression produces a value, while a function statement performs an action.

With the arrow function, it is important to remember that statements need to have curly braces. Once the curly braces are present, you always need to writereturn as well.

Here is an example of the arrow function used with an if statement:

var feedTheCat = (cat) => {
  if (cat === 'hungry') {
    return 'Feed the cat';
  } else {
    return 'Do not feed the cat';
  }
}

5. “Block body”

If your function is in a block, you must also use the explicit return statement:

var addValues = (x, y) => {
  return x + y
}

6. Object Literals

If you are returning an object literal, it needs to be wrapped in parentheses. This forces the interpreter to evaluate what is inside the parentheses, and the object literal is returned.

x =>({ y: x })

Syntactically anonymous

It is important to note that arrow functions are anonymous, which means that they are not named.

This anonymity creates some issues:

  1. Harder to debug

When you get an error, you will not be able to trace the name of the function or the exact line number where it occurred.

2. No self-referencing

If your function needs to have a self-reference at any point (e.g. recursion, event handler that needs to unbind), it will not work.

In classic function expressions, the this keyword is bound to different values based on the context in which it is called. With arrow functions however, this is lexically bound. It means that it usesthis from the code that contains the arrow function.

For example, look at the setTimeout function below:

// ES5
var obj = {
  id: 42,
  counter: function counter() {
    setTimeout(function() {
      console.log(this.id);
    }.bind(this), 1000);
  }
};

In the ES5 example, .bind(this) is required to help pass the this context into the function. Otherwise, by default this would be undefined.

// ES6
var obj = {
  id: 42,
  counter: function counter() {
    setTimeout(() => {
      console.log(this.id);
    }, 1000);
  }
};

ES6 arrow functions can’t be bound to a this keyword, so it will lexically go up a scope, and use the value of this in the scope in which it was defined.

When you should not use Arrow Functions

After learning a little more about arrow functions, I hope you understand that they do not replace regular functions.

Here are some instances where you probably wouldn’t want to use them:

  1. Object methods

When you call cat.jumps, the number of lives does not decrease. It is because this is not bound to anything, and will inherit the value of this from its parent scope.

var cat = {
  lives: 9,
  jumps: () => {
    this.lives--;
  }
}

2. Callback functions with dynamic context

If you need your context to be dynamic, arrow functions are not the right choice. Take a look at this event handler below:

var button = document.getElementById('press');
button.addEventListener('click', () => {
  this.classList.toggle('on');
});

If we click the button, we would get a TypeError. It is because this is not bound to the button, but instead bound to its parent scope.

3. When it makes your code less readable

It is worth taking into consideration the variety of syntax we covered earlier. With regular functions, people know what to expect. With arrow functions, it may be hard to decipher what you are looking at straightaway.

When you should use them

Arrow functions shine best with anything that requires this to be bound to the context, and not the function itself.

Despite the fact that they are anonymous, I also like using them with methods such as map and reduce, because I think it makes my code more readable. To me, the pros outweigh the cons.