How to Choose the Best Magento Outsourcing Company

Web development outsourcing is quite a popular approach among IT businesses and digital agencies. It is a good way to get more resources, manage the large work scope, and cut down the costs. Outsourcing turns out to be one of the best modern B2B practices. We can find a lot of web development firms and agencies. But what exactly can help us to make the right choice? Say, you are looking for a good Magento® development outsourcing company. Will it be more complicated to select the executors? Should you pay attention to some specific requirements?

The answer is yes! Let’s consider the key points you need to know to choose the professional Magento outsourcing company for your job.

As an experienced outsourcing web development team, we are aware of the clients’ main requirements to us. Moreover, we succeeded to cooperate with several large companies for 10 years. Keeping this information in mind, we managed to create the guide for entrepreneurs who decided to outsource their Magento projects. So, how to choose the best Magento development outsourcing company?

Create a Portrait of the Perfect Magento Outsourcing Company

It is not a joke. This step will help you to come up with your requirements for the company.There are the things you should think about before starting your search:

Language. What language do the employees speak? It’s a crucial moment for starting communication with your future partner. Definitely, you need to understand people with which you are going to cooperate. For example, if your team speaks English, it’s a good idea to choose the partner among the English-speaking companies.

Time Zone. Another good idea is to determine the time zone you would like your partner’s office to be situated. The closer their time zone is, the better. For, example, we are in the 3 GMT time zone. Our clients are from America, Australia, Europe, UK. Our time difference is up to 12 hours. However, our team works with clients from different time zones.

Project Area. When you are going to outsource your Magento project, surely you should know the area it covers. For example, you want to hire Magento 2 developers. Not all Magento companies work with Magento 2. So you can narrow the choice down. Or, you want to implement some custom features that require the creative approach. It means you should focus on this factor while talking to candidates.

The Number of Developers. Knowing the number of Magento developers required for your project will help you to calculate your budget. Additionally, this allows you to find the companies which provide the wished number of development resources available right at the moment.

Developer’s Skill Set. The main thing you should focus on is the required skill set for Magento developers you are going to hire. We’ll not dig too much into the basic technical knowledge right now. But think about the level of web developers you would like to hire. The level could be Middle, Middle , Senior, Magento Certified Developer. Sometimes Junior Magento developers can cope with some simple tasks. The specialists’ hourly rates depend on developers’ level. So we recommend you to come up with the wished skill set before starting cooperation. It allows avoiding unnecessary money spending.

Maximum Hourly Rate. Determine the maximum cost you are willing to pay for the project. It’s a good idea to calculate the budget. You could find the perfect company you’d like to cooperate with. However, their hourly rates may appear too high for you. Although if the company meets your requirements and provides the qualitative results, you may agree with their price.

When your portrait is ready, you can start your research. Just keep in mind the things you figured out before.

Search For Magento Development Outsourcing Company

Searching for Magento web development company is an obvious step. When you have the complete portrait of your ideal executor, it’s much easier to find the company. You should know where to search. These are the several ideas about the best places from which you can start.

Google. Okay, Google, let’s find the dream team for our project. Most of the companies have good websites. Of course, you’ll find some websites in the top search results. Don’t hurry. Visit the websites which appear farther from the top of Google’s search results. SEO is a large part of marketing strategy. However, you are looking for the web developers, right? The main things you should pay attention to are the company’s website quality and the information provided there. Try to feel whether their story sounds honest enough for you or not.

Another interesting moment you can focus on is the company’s virtual life. This is the way how it works. Check whether the company has social media profiles, Google profile, Google my Business account. Answer the following questions. Can you see their team on Instagram? Do they have a blog which proves their expertise? Does their office appear on Google maps? Do they show their experience on Quora, social networks, Medium? Do they have their products presented on Magento Connect or Magento Marketplace? If the answer is yes for most of these questions, you are on the right way. You should know the people with which you are going to work.

B2B research catalogs. It is one of the best ways to find a good Magento development company. Why? The catalogs allow setting filters. They save our time. Say, you are looking for the UK Magento development company. Tick this option, and then you’ll see the results only for the UK. Filtration by minimum project budget, company size, and the other options is also available. Also, companies’ profiles go through the multilevel verification process. The same happens to the reviews posted there by the clients. Take a look at famous B2B research catalogs, such as Clutch, GoodFirms, TopAgency, CrunchBase, Glassdoor. You can find a broad choice of opportunities there.

Commerce Hero. Commerce Hero is a platform for connecting web development specialists in eCommerce. There we can find Magento developers’ and companies’ profiles. This platform also allows each member to add the portfolio and post the articles. So look through the profiles and connect with your heroes.

Magento Partners. If you are looking for a B2B partner that must also be the official Magento partner, you must get there. Go to Magento partners directory and see all you need to know about your possible partners.

Linkedin. It’s a social network for professionals. It connects people and helps them to build business relationships. On Linkedin, you can find companies, the job of your dream, and a lot of professional people from different knowledge areas. Linkedin is a right place for networking and setting business relationships. You can get in touch with companies’ CEO, directors, and managers directly there.

Meetups and Conferences. No doubts that one of the best ways to find the partner is attending Magento conferences, expos, and meetups. At these events, people share the experience and communicate. They try to know each other better. If it works for you, consider these events like adventures and future opportunities.

Make the Final Choice: Pay Attention to Detail

Finally, you have the portrait of your ideal Magento development company, you planned your budget, and you have the several options you found. It’s time to make the final choice. So, you start communication with companies. We have some extra points you can focus on before choosing the best company. Check them out:

Code Standards. Everybody says their work is qualitative. What do they mean exactly? How can we evaluate the quality of a web developer’s work? There are three parts of good results that should work together: clean code, creative approach, and adhering to deadlines. The company should follow official code standards to perform the best result. Their code should be easy-to-modify. You can ask for developers’ code examples on Github.

Business Processes. An effective process is an essential tool for fruitful cooperation. Don’t hesitate to request the detail description of management processes. It’s good if the company has some kind of business proposal or even a PlayBook. They should tell about the project management model they follow. Are they ready to adjust to your processes? Are their processes convenient for you? Try to pay attention to this moment.

Magento Developers. Of course, you started this everything in order to find professional Magento developers. Good reliable companies have Magento certified developers on their team. Magento Certificate proves that the web developer passed official Magento exam. It shows developers’ expertise in Magento products. Also, take a look at CVs which the company offers. Compare the skill set with your wished one. Personal interview with the candidates will help you to make a final decision.

Portfolio and reviews. The works prove the team’s skills and expertise. A professional portfolio should consist of complicated, beautiful, and modern websites. Another extra safety measure is checking the clients’ reviews on sources like Clutch, Linkedin, Facebook, Google. You’ll see the clients’ true stories there. Before these reviews are posted, the client provides the personal details. It’s a complicated verification process. There are no chances to trick the system.

Guarantees. The guarantees will help you to stay confident and secured. Ask what guarantees the company can provide you with. Do they sign NDA or some other contract in black and white? It’s good if the company guarantees the substitute if their developer leaves the project. We, for example, provide a free trial for each our web developer. It helps our clients understand whether our people are able to cope with their job.

The Guide on How to Speed Up WordPress

Dou you want to speed up WordPress?

Today we’d like to share our guide on how you can make your WordPress website much faster. WordPress is quite a user-friendly and easy-to-run CMS, it should also have the high performance.

If you own the WordPress based website, we recommend you to check whether it’s optimized or not. Present and quick-coming future require the high performance of any process. The users expect more stability and efficiency from websites they visit. Time is the valuable thing now, and even several seconds of the user’s waiting can cause the falling of involvement and visiting of your website. So we need to check the things and fix the problems.

Let’s do it!

First, run Google’s speed test. You’ll see the level of website performance. If you see the red color on a scale, your website needs increasing. You can also check your website with Pingdom. It shows you the state of your website and gives the recommendations.

Then you can speed up WordPress performance following our quick guide a checklist. There you’ll find the basic things that influence page loading time of WordPress website. Let’s begin!

5 Basic Steps to Speed Up WordPress

Here are several most important things you can do to speed up your website.

Minimize CSS and JS Files

Here we talk about the code optimization. The less amount of code your web page has, the faster it’s loaded. The same goes for content. We’ll talk about it later. So, try to write the clean code, and it will help you to keep your WordPress website quick.

You can do it using W3 Total Cache Plugin. This is a pretty helpful plugin in the whole process of WordPress performance optimization and has many advanced features.It includes a built-in tool for minifying CSS and JS file.

Here are the things you should do:

  • install W3 Total Cache Plugin;
  • run it and find Minifying Setting in General Setting Tab;
  • enable Minify in a checkbox and save your changes.

Analogically, you can use such plugin as Autoptimize. You should go to the Settings Page after its installation set the following items in the checkboxes:

  • Optimize HTML code;
  • Optimize CSS code;
  • Optimize JavaScript code;
  • Generate data: URLs for images.

Then save your changes.

Also, you can use the online services like:

Don’t forget to check your website speed again after each step.

Optimize Images

Images take up the most part of things that are loaded on your website. It’s better to compress them and reduce the server load.

You can do it with a help of EWWW Image Optimize plugin. It automatically optimizes images you upload and also can work with already uploaded images.

Also, we recommend you to install Lazy Load plugin. It loads the images only when they are visible to the user that reduces the server load in many times.

Optimize Database

When you use WordPress for a while, the database stores much information which is already unnecessary. We mean, some tags and categories, images you don’t use, trash posts, etc.

You can clean up your database using the WP-Sweep plugin.

Use Caching for Better Performance

You should know that caching help to reduce the server load drastically. Cache store the copies of already loaded pages by the user, and provides him with them. So it increases website speed. You can enable caching via W3 Total Cache Plugin. You’ll find all features for caching in General Settings Tab. We recommend you to use caching and take the advantages of it.

Enable GZIP Compression

GZIP compression helps to build pages on a server before the web page is sent to the user. It increases the website performance drastically. You can enable it with W3 Total Cache.

There were 5 common recommendations on how to improve WordPress website performance. Also, try to keep WordPress updated and choose fast and reliable hosting.

Each website should tend to not more than 3 seconds of loading time according to the research. It influences your conversions. Take a look: How page loading speed influences your conversion rate.

Remember, when your website is loaded fastly, and the visitors don’t need to wait, you take care of their time.

Now, when you’ve tried all our recommendations, run the speed test, and if you need more improvements, contact us.

We’ll be glad to help you!

Extension Attributes for Total Model in Magento 2

We continue to set extension attributes in Magento® 2. Last time we were talking about the adding a custom attribute to the customer’s address. But what if we need to set these attributes for the total model? Today we’ll consider how we can do that step by step.

Total Model

Total model is a dynamic system used for collecting the shopping cart and the order total. It usually contains the elements which take part in calculating the total cost: final products total, discount, tax, shipping fee, and some other parameters.

How It Works

Imagine the online store. You buy some products there and add them to the shopping cart. When you view the shopping cart page, you can see something like this:

Subtotal – X.XX$ final cost of products (the product’s cost multiplied by the number of products)

Tax  – X.XX$ (optionally)

Shipping  – X.XX$ (optionally)

Discount (optionally)

Total – X.XX $ (the final cost of the order)

Let’s take a look at VENROY online store (it’s Magento based) to see how it can work for you:

Magento based online store

The whole system shown in this example is the Total model. Let’s move on.

What We Need to Do

First of all, we need to add the row before subtotal in the total model. The row will show the customer’s profit. The profit is a marketing element that shows how much money the customer saves using the offer. This profit should not be included in the final cost of the shopping cart and the order totals. It is calculated on the base of subtotal.

So, we can separate our task into two main problems:

  • Add the row before Subtotal and don’t include its results to the total cost.
  • Make the extension and Magento 2 work right together.

These both conditions must work correctly with each other.

In the end, we should get the result of this kind:

You save: (Our additional row)

Subtotal – final cost of products (the product cost * the number of products)

Tax (optionally)

Shipping (optionally)

Discount (optionally)

Total – the final cost of the order

Let’s go on to code!

Preconditions

There is a Magento 2 based online store. It is oriented on the retail and wholesale customers. Due to this fact, most of the products have the tier prices, as well as the retail prices. The types of store products are the simple products and configurable products. As we said before, we need to output the additional row before Subtotal on the shopping cart and the order pages. This row must show the total profit for the wholesale customer. While calculating the profit, we don’t include the extra-charge for product options. This row mustn’t influence the order final cost, as well as it mustn’t be copied to the order.

Solution

Setting Magento 2 Extension Attributes

Last time, we added the custom attribute to the customer address. Let’s follow the same way. We’ll add the style_discount field with decimal(10,4) type to the address extension attributes table from the last example. Also, we’ll need to add the attribute to the extenson_attributes.xml file of our module. We should add it twice for two different interfaces.

...
<extension_attributes for="MagentoQuoteApiDataAddressInterface">
        <attribute code="type" type="int">
            <join reference_table="web4pro_quote_address" join_on_field="address_id" reference_field="address_id">
                <field column="type">type</field>
            </join>
        </attribute>
        <attribute code="style_discount" type="float">
            <join reference_table="web4pro_quote_address" join_on_field="address_id" reference_field="address_id">
                <field column="style_discount">style_discount</field>
            </join>
        </attribute>
    </extension_attributes>
    <extension_attributes for="MagentoQuoteApiDataTotalsInterface">
        <attribute code="style_discount" type="float"/>
    </extension_attributes>

In the first case, we should specify the table which will store this attribute. In the second case, there is no necessity to do this, because the entity implemented with MagentoQuoteApiDataTotalsInterface is always formed from the address data along the way. Saving of this attribute will be performed in sales_quote_address_save_after event processor, which we described in the previous example.

Furthermore, we need to describe the total model. Let’s create an etc/sales.xml file in the module for these purposes. It looks like the following:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Sales:etc/sales.xsd">
    <section name="quote">
        <group name="totals">
            <item name="style_discount" instance="Web4proAjaxcartModelQuoteAddressStyle" sort_order="110"/>
        </group>
    </section>
</config>

We choose the sort_order parameter keeping in mind that calculations were performed after Subtotal had been calculated. In this case, the Product entity has already been initialized for all shopping cart elements.

Implementing Total Model in Magento 2

The total model must implement two methods: collect() method used for the calculation and fetch() method used for the output on request. You can implement the total by following this example:

namespace Web4proAjaxcartModelQuoteAddress;
use MagentoQuoteModelQuoteAddressItem as AddressItem;

class Style extends MagentoQuoteModelQuoteAddressTotalAbstractTotal {

    protected $_objectManager;

    public function __construct(MagentoFrameworkObjectManagerInterface $objectManagerInterface){
        $this->_objectManager = $objectManagerInterface;
    }

    public function collect(
        MagentoQuoteModelQuote $quote,
        MagentoQuoteApiDataShippingAssignmentInterface $shippingAssignment,
        MagentoQuoteModelQuoteAddressTotal $total
    ) {
        parent::collect($quote,$shippingAssignment,$total);
        $items = $shippingAssignment->getItems();
        $address = $shippingAssignment->getShipping()->getAddress();
        $amount = 0;
        foreach($items as $item){
            if ($item->getParentItem()) {
                continue;
            }
            if ($item instanceof AddressItem) {
                $quoteItem = $item->getAddress()->getQuote()->getItemById($item
->getQuoteItemId());
            } else {
                $quoteItem = $item;
            }
            $product = $quoteItem->getData('product');
            $childProduct = $product;
            if($product->getTypeId()=='configurable'){
                $childProduct = $product->getCustomOption('simple_product')->getProduct();
            }
            $qty = $quoteItem->getQty();
            $amount =(float)($qty*($childProduct->getPriceModel()->getFinalPrice($qty,$childProduct)-$childProduct->getPriceModel()->getBasePrice($childProduct,1)));
        }
        $total->addTotalAmount($this->getCode(),$amount);
        $extensionAttr = $address->getExtensionAttributes();
        if(!$extensionAttr){
            $extensionAttr = $this->_objectManager
->create('MagentoQuoteApiDataAddressExtension');
        }
        $extensionAttr->setData($this->getCode(),$total->getTotalAmount($this->getCode()));
        $address->setExtensionAttributes($extensionAttr);
        return $this;
    }
    public function fetch(MagentoQuoteModelQuote $quote, MagentoQuoteModelQuoteAddressTotal $total)
    {
        $result = null;
        $amount = $total->getTotalAmount($this->getCode());

        if ($amount != 0) {
            $result = [
                'code' => $this->getCode(),
                'title' => __('Style Discount'),
                'value' => $amount
            ];
        }
        return $result;
    }
}

Copying Data to Total Model in Magento 2

We need to provide copying the data from the address to the total model. It’s possible with the plugin from the previous example to MagentoFrameworkApiDataObjectHelper class. But note that we should work separately with address attributes and total model attributes. We copy the first ones to the order address and the second ones – to the total model. When trying to copy some data to the receiver which can’t receive the attribute, the exception will be thrown out. The method looks like this one:

public function beforePopulateWithArray($helper,$dataObject, array $data, $interfaceName){
        switch($interfaceName){
            case 'MagentoSalesApiDataOrderAddressInterface':
                if($data['extension_attributes'] instanceof MagentoQuoteApiDataAddressExtensionInterface){
                    $data['extension_attributes'] = $data['extension_attributes']->__toArray();
                    if(isset($data['extension_attributes']['style_discount'])){
                        unset($data['extension_attributes']['style_discount']);
                    }
                }
            break;
            case 'MagentoCustomerApiDataAddressInterface':
                if(isset($data['extension_attributes'])&&($data['extension_attributes'] instanceof MagentoQuoteApiDataAddressExtensionInterface)){
                    $data['extension_attributes'] = $data['extension_attributes']->__toArray();
                    if(isset($data['extension_attributes']['type'])){
                        $data['type'] = $data['extension_attributes']['type'];
                    }
                }
                break;
            case 'MagentoQuoteApiDataTotalsInterface':
                if($data['extension_attributes'] instanceof MagentoFrameworkApiAbstractSimpleObject){
                    $data['extension_attributes'] = $data['extension_attributes']->__toArray();
                    if(isset($data['extension_attributes']['type'])){
                        unset($data['extension_attributes']['type']);
                    }
                }
                break;
        }
        return array($dataObject,$data,$interfaceName);
    }

Outputting Total on Shopping Cart Page

Now we are going to output a new Total on the shopping cart page. It requires us to describe and implement Magento 2 knockout-component. It’s described in Layout file the next way:

<referenceBlock name="checkout.cart.totals">
            <arguments>
                <argument name="jsLayout" xsi:type="array">
                    <item name="components" xsi:type="array">
                        <item name="block-totals" xsi:type="array">
                            <item name="children" xsi:type="array">
                                <item name="style_discount" xsi:type="array">
                                    <item name="component"  xsi:type="string">Web4pro_Ajaxcart/js/style</item>
                                    <item name="sortOrder" xsi:type="string">1</item>
                                    <item name="config" xsi:type="array">
                                        <item name="template" xsi:type="string">Web4pro_Ajaxcart/checkout/cart/totals/style</item>
                                        <item name="title" xsi:type="string" translate="true"><![CDATA[Style Quantity Discount]]></item>
                                    </item>
                                </item>
                            </item>
                        </item>
                    </item>
                </argument>
            </arguments>
        </referenceBlock>

We choose sort_order taking into consideration that the row is outputted before Subtotal. As you can see, the component consists of a template and a javascript file. The template is loaded asynchronously, and it’s filled with the content with JavaScript. This is how the template supposed to look like:

<tr class="totals">
    <th class="mark" scope="row" data-bind="text: title"></th>
    <td data-bind="attr: {'data-th': title}" class="amount">
        <span class="price" data-bind="text: getValue()"></span>
    </td>
</tr>

JavaScript code:

define(
    [
        'Magento_Checkout/js/view/summary/abstract-total',
        'Magento_Checkout/js/model/quote'
    ],
    function (Component, quote) {
        "use strict";
        return Component.extend({

            isDisplayed: function() {
                return this.getPureValue()!=0;
            },
            getPureValue: function() {
                var totals = quote.getTotals()();
                if (totals) {
                    if(typeof totals.style_discount=='undefined'){
                        quote.setTotals(window.checkoutConfig.totalsData);
                        totals = quote.getTotals()();
                    }
                    return totals.style_discount;
                }
                return quote.style_discount;
            },
            getValue: function() {
                    return this.getFormattedPrice(this.getPureValue());
            }
         });
    }
);

Pay attention to the if condition (type of totals.style_discount==’undefined’). It’s necessary because Magento 2 extension attributes (we checked  2.1.2 version) are written to Total JavaScript object if only the asynchronous loading takes place (_SetTotals() method). It is not being written when the page is loaded from window.checkoutConfig.totalsData.

We can output this component to the order page by following the same routine.

Pitfalls

One of the moments we should keep in mind is that Total content is being added while calculating the Grand Total. It’s not good for our task. The reason lies in the implementation features of Grand Total calculation in MagentoQuoteModelQuoteAddressTotalGrand class. Take a look:

public function collect(
        MagentoQuoteModelQuote $quote,
        MagentoQuoteApiDataShippingAssignmentInterface $shippingAssignment,
        MagentoQuoteModelQuoteAddressTotal $total
    ) {
        $totals = array_sum($total->getAllTotalAmounts());
        $baseTotals = array_sum($total->getAllBaseTotalAmounts());

        $total->setGrandTotal($totals);
        $total->setBaseGrandTotal($baseTotals);
        return $this;
    }

We can fix this out using a plugin which excludes our total from the sum.

<type name="MagentoQuoteModelQuoteAddressTotal">
        <plugin name="web4pro-remove-external-totals" type="Web4proAjaxcartModelPlugin" sortOrder="20"/>
    </type>

public function afterGetAllTotalAmounts($total,$result){
        if(isset($result['style_discount'])){
            unset($result['style_discount']);
        }
        return $result;
    }

Conclusion

Finally, we have coped with our task. Let’s summarise what we needed to do:

  • add the style_discount field with decimal(10,4) type to the address extension attributes table;
  • add the attribute to the extenson_attributes.xml file of our module (twice for two different interfaces);
  • create the etc/sales.xml file in the module to describe the total model;
  • implement the total model;
  • provide copying the data from the address to the total model with the plugin (work separately with address attributes and total model attributes);
  • fix the adding of Total content while calculating the Grand Total with a special plugin;
  • output a new Total on the shopping cart and the order pages.

This is how it works. We hope that our article answers your question about set extension attributes for the total model. However, if you have some issues regarding extensions at your store and you need assistance, we can provide you with Magento 2 Extension Development.

Wish you good luck with Total Models in Magento 2!

How to Understand Clients: Step into Their Shoes

You’ve been working at the position of Project Manager for five years. You think you understand clients and all working processes. You follow the rule: “Think like a customer. Feel the pains of the customer”. But much as you tried, you are still the manager, who acts using your company’s working templates.

I have been working at WEB4PRO since 2012. We have succeeded to complete over 20 projects from scratch since then. Now I have taken a maternity leave. So, I’ve got the time for starting the own project. This is my story about how it was.

Step Into Client’s Shoes

My project is a medical website from scratch. I made up my mind to bring it to life, and I began with the preparation. First, I created mockups and short project requirements with the detailed description. Then I sent these data to WEB4PRO for the estimation, as I completely trust my team. I know they follow the timeline and provide the high-quality result.

But… “What if I look up some market offers? What about checking some other companies? Do they understand client’s business and needs?” – I thought.

So I got down to business.

Follow the Client’s Routine

I sent a lot of requests for quote. We started communication with 11 contacts. There were various executors: company representatives and freelancers. I prefer working with companies. The company could cover the risks when some unexpected problems arise. Furthermore, a company can provide a complex solution. I decided to compare all candidates by several aspects.

Proofs. Portfolio

We considered a lot of offers. We focused on two things along the way: portfolio and the quality of works there.

I evaluated the portfolio by the websites it included. The most criteria for we were the websites design, compatibility, mobile versions, complexity. Also, I tested the main features. I declined the companies if their portfolio contained bad-made websites. Those websites were too old, too simple, unattractive, inconvenient. But the high-quality works caught my eye even if it was not relevant to the medical field. The relevancy was not the main factor for me. If the company built a great website, it could do a good job for us. So, I came up with the following:

The example of work may not be from the client’s business area. That’s great if it has some features like the customer’s project does (even if it’s a contact form functionality). The good portfolio must consist of complicated, modern, and beautiful works.

First Interaction

First, I provided the companies with links to mockups and the project specification. I requested the project estimation, hourly rate, and a technical solution. I wanted to check their level of understanding the client’s requirements. The result was curious.

Three people gave the estimation right on the same day, on Saturday. According to WEB4PRO standards, we provide the estimation within 3 working days. I knew the work scope required for our project. That’s why costs and terms the candidates suggested looked strange for me. They seemed too short.

Many candidates revealed their hourly rate. Also, they provided the project duration expressed in months. So, I couldn’t understand the final cost. Project duration expressed in months doesn’t make any sense. It’s much better to express it in hours. When we multiply the project term on the hourly rate, we get the final cost.

In conclusion, I declined several candidates for the following reasons:

  • improbable estimation;
  • the absence of related questions;
  • inattentive learning of project requirements;
  • unclear estimation expressed in months;
  • low level of communication.

Most freelancers replied within two days. They all suggested we contact via Skype and discuss the detail.

Due to all these facts above, I made the next observation:

When you first interact with the client, you set the first contact. It’s very important to understand customers needs and wants right on the first stages. They’d like to hear the questions related to their project. Also, always give the project duration expressed in hours, not in months or something else. Costs must be easy to calculate. It shows your honesty, and it saves clients’ time.

Skype Call

I talked to five candidates. I didn’t like the ones who asked me the odd questions. I understood they were not ready for negotiations. Also, the candidates who didn’t have any creative approach were not the right people for my job. Definitely, they were not good at identifying customer needs.
 
The others were well-prepared. They asked the right questions and expressed the interest to my business. Some candidates even learned our competitors. One company showed the great approach to the work processes. Here is the process routine they follow with the clients:
  • 2 weekly email reports: 1 working-plan report, 1 results report;
  • Trello dashboard as a tool and how-to-use guide for customers;
  • 1 weekly Skype call;
  • key project manager for communication and the team members the client can refer to;
  • payment within the certain number of days after receiving the invoice.

This information made me more confident in that executor. So that, Skype call is one of the most important steps in building relationships with the customers. On this step, you can start discovering customer needs. I understood the following:

When we communicate by voice, we gain trust. Skype call is a good way to do that. Learn project requirements and speak in a friendly manner. Show that your understand the client’s problem. It deserves the respect.

Project Estimation

understand clients: provide clear reports

Project duration. The candidates determined the project term in months, more seldom – in weeks. Nobody provided me with the detailed estimation broken into small milestones. The most I’ve got was a description of the work scope broken into work processes. They were backend development, frontend development, web design, management, testing, and analysis. It didn’t help me to understand the final cost of project development.

Engagement models. Almost nobody wanted to use the Fixed Price model. The reason was the necessity of incorporating some extra tasks and edits along the way. The solution for that was the following. They offered to follow the Agile model with breaking the project into milestones. We had to pay for each milestone. This works well enough.

Candidates ready to work on fixed price required the approved high-fidelity prototypes. High-fidelity prototypes are interactive mockups allowing the simulation of user actions. In this case, your cooperation starts with creating such prototypes. And the company includes this works to invoice.

Business Proposal. Several candidates impressed me with their business proposal. It’s convenient to receive negotiations result packed in a beautiful business proposal. This way you can find out the main points without any efforts.

The business proposal consists of the following parts:
  • technical solution;
  • description of the project team;
  • project duration represented in graphics;
  • final cost;
  • payment terms;
  • presentation of the company, etc.

It is very useful, and finally, I can say:

While requesting the estimation, customers look for the details about the future cooperation. duration, engagement model, and the final cost. Create a complete business proposal. It may include negotiations results, technical solution, and information about your company. Highlighting the main points shows your care and respect.

See What Matters

understand clients: see what matters

I became a client for a while. I had a chance to make sure of a great importance of knowing your customer. I checked cooperation systems implemented at WEB4PRO and the other companies first-hand. Now I know what the clients want.

Qualitative portfolio. The more complicated, beautiful, and modern works you show, the better.

Video Skype call. There is more trust between people who can look at each other. If we take WEB4PRO, here we always talk via Skype using video if the client turns on the camera.

Understanding the problem. It’s nice to get some questions about your business, goals, target audience, differences from competitors. That shows you know how to meet customer expectations.

Lean business processes. It’s very useful when the company knows how to work with clients. It’s great when their managers are always ready to help you out. That makes you feel convinced.

Open hourly rates. Good when executors don’t hide their hourly rates. A clear estimation should include the cost for project managers, analytics, QAs works.

Detailed Estimation. It’s better to express the project duration in hours. Also, breaking the process into milestones makes the difference. That helps the client understand the final costs.

Friendly communication. When you feel convenient speaking with a person, you’ll like to talk again. You event don’t pay too much attention to high rates and prices if the person is friendly.

Adherence to deadlines. If the executor sticks to the schedule at the beginning, they might adhere to the deadlines along the way.

Long-term partnership. I noted the company which described their partnership with Australian clients. Their projects were large enough. Who knows, but they tried to support their achievements. But all in all, they impressed me.

Results of negotiations. It’s pretty useful to receive an email with the results of negotiations after the meeting. This type of report is a must-do point at our company. So, now I’m confident in its efficiency and necessity.

Business proposal. It helps to sum up the main ideas and points of cooperation. A good marketing kit provides the full picture of the business processes you are going to follow.

What you can do to be on the same wavelength with a customer:

  • learn client’s project requirements;
  • wonder about the client’s values and business ideas;
  • don’t ask the needless questions: try to find the answers in the project specification;
  • don’t hide your hourly rate. Be honest;
  • prepare detailed project estimation;
  • and the main: keep your word.

Do we have anything to improve? Of course! Anyone who works with customers should always work on understanding clients needs. But it’s pleasant to note that we are on the right way at WEB4PRO. Our work processes are well-thought-out. They help the whole team work well and cooperate with customers with the high efficiency.

What do the clients want? Well, the clients want to understand what happens and what they pay for. They want to be confident in the executor, and they want to secure themselves from risks. Finally, a client is a person, who wants to deal with friendly, honest, and professional people.

How to understand clients? – Step into their shoes at least once. Then a lot of steps and routine work points will matter much more to you. These are my words, the words of Project Manager:)

P.S. This rule works with any person, not only with your clients. As Harper Lee says in the book To Kill A Mockingbird, “You never understand a person… until you climb into his skin and walk around in it.”

The featured image: the scene from “What women want”. The main character climbed into women skin in the truest sense of the word.

Migration from Magento 1 to Magento 2 using Magento 2 Migration Tool

Welcome! Today we’ll show you how to migrate Magento® 1 to Magento 2 using Magento 2 data migration tool. You’ll also learn how you can manage themes, extensions, and customization. Together we’ll follow the next script:

Let’s get the ball rolling!

Magento 2 Usage Statistics

Magento 1 stops official updates in November 2018. According to BuiltWith, the number of live websites using Magento 2 grew up to 13500 at the moment (July 2017). There were 11000 live websites in May 2017. As you can see, Magento 2 becomes more and more popular, while the first version still exists. If you’ve made a decision to move to Magento 2, there is a complete guide on how to do this. But this task requires strong web development skills, some effort and a bit of patience:)

Magento 1 to Magento 2 Migration Process

While migrating your website from Magento 1 to Magento 2, you’ll work with four components:

  • data;
  • themes,
  • extensions and custom code;
  • customization.

Each of these components requires a certain approach.

Our today’s task is to migrate data with Magento 2 Data Migration Tool. Follow our step-by-step guide below, and you’ll make it!

Migrating Data with Magento 2 Data Migration Tool

Before we start, we should make several preparation steps. Let’s run through them.

Step 1: Software and Hardware Requirements

Preconditions

  • Check system requirements. Check parameter in php.ini

memory_limit: more than 512M

  • Install Data Migration Tool. Versions of Magento and Data Migration Tool must match.

How to Install Data Migration Tool

First, you need to edit composer.json in the Magento root directory. This way you provide the location of the Data Migration Tool package: “URL”: “https://repo.magento.com/.” Also add to require “magento/data-migration-tool”: “version”, where “version” must match the Magento 2 code base version.

  • Create a Magento 2 database backup. This will allow you to restore the initial database state if migration is not successful.
  • Check the network access to connect Magento 1 and Magento 2 databases.
  • Copy Magento 1.x media files to Magento 2.x. You need to copy them manually from magento1-root/media to magento2-root/pub/media directory.
  • Stop all Magento 1.x cron operations.
  • Stop making any changes in Magento 1.x Admin except for order management and in Magento 2 Admin and storefront.
  • Remove outdated and redundant data from Magento 1.x database (logs, order quotes, recently viewed or compared products, visitors, event-specific categories, promotional rules, etc.).

Step 2: Theme Migration

As for themes, we’ll need to make changes to themes and customizations for Magento 2, because the system’s hierarchy is completely different from Magento 1. So, you’ll find lots of space for your creativity and innovation.

Step 3: Extension Migration

We can go to Magento Marketplace or MagentoConnect and get new Magento 2 extensions with their latest versions. Also, we can develop a new custom solution. If you want to migrate the custom code, you can use Code Migration Toolkit presented by Magento on Github.

According to the Magento community, migration to Magento 2 is 20% more complicated than updating Magento to the latest minor version. Opinions differ. It depends on the level of the developer’s experience and the project complexity.

Step 4: Data Migration

Magento 2 Data Migration Tool is a ready-made assistant for migrating the website data. We can move all our customers, products, store configurations, order and promotions data to Magento 2 with its help. It is the process we’ll focus on in our article.

Configuring Migration to Magento 2

If we need to migrate Magento 1.x EE to Magento 2.x EE, the mapping and configuration files will be located in the following directory:

<your Magento 2 install dir>/vendor/magento/data-migration-tool/etc/ee-to-ee

Create a config.xml from the provided sample config.xml .dist.

If we migrate data from Magento 1.14.1.0, the config.xml and map.xml. will be located in the following directory:

<your Magento 2 install dir>/vendor/magento/data-migration-tool/etc/ee-to-ee/1.14.1.0

But before, enable to perform custom database mapping between your Magento 1 and Magento 2 databases.

Specify the access to the databases in config.xml:

<source>
    <database host="127.0.0.1" name="magento1" user="root"/>
</source>
<destination>
    <database host="127.0.0.1" name="magento2" user="root"/>
</destination>
<options>
    <crypt_key />
</options>

The <crypt_key> tag must be filled in. You can find it in the local.xml file. The file is located in Magento 1 instance directory at app/etc/local.xml in the <key> tag.

Migration to Magento 2 Modes

Overall, migration from Magento 1 to Magento 2 consists of three phases (modes):

  • Settings: migrates configuration settings.
  • Data: bulk migrates the main data to the database.
  • Delta: transfers incremental data updates added to Magento 1 storefront and Admin Panel while running previous migration modes.

Each mode is declared in config.xml and divided into steps. Each step is responsible for transferring particular data. At the begin of the run, the step checks Magento 1 and Magento 2 table structures for consistency. Then the actual data is transferred to Magento 2. In the end, this data is verified.

If you don’t want to migrate some data from Magento 1 to Magento 2, you just need to disable or remove the specific step in config.xml. For example, remove the following step from Data mode:

<step title="Log Step">
   <integrity>Migration\Step\Log\Integrity</integrity>
   <data>Migration\Step\Log\Data</data>
   <volume>Migration\Step\Log\Volume</volume>
</step>

And remove this one from delta mode:

<step title="Log Step">
   <delta>Migration\Step\Log\Delta</delta>
   <volume>Migration\Step\Log\Volume</volume>
</step>

Furthermore, if we do not want to track the changes in the log_visitor table, we need to remove “delta_log” group in deltalog.xml.dist file:

<group name="delta_log">
   <document key="visitor_id">log_visitor</document>
</group>

Migrating Settings and Data to Magento 2

So, we successfully moved to the finish.

To start migrating settings, run:

bin/magento migrate:settings [-r|--reset][-vvv] {<path to config.xml>}

where:

  • [-r|–reset] is an optional argument that starts the migration from the beginning. You can use this argument for testing migration.
  • {<path to config.xml>} is the absolute file system path to config.xml.
  • [ -vvv] – you can use this argument to output more verbose messages in the console.
<your Magento 2 install dir>/vendor/magento/data-migration-tool/etc/ee-to-ee/1.14.1.0/config.xml

To start migrating data, run:

bin/magento migrate:data [-r|--reset] {<path to config.xml>}

To start migrating incremental changes, run:

bin/magento migrate:delta [-r|--reset] {<path to config.xml>}

Incremental migration enables to migrate only data that customers added via storefront (created orders, reviews, changes in customer profiles, etc.) and all operations with orders in Magento Admin panel.

Incremental migration runs continuously until you stop it by pressing CTRL C.

Reindex all Magento 2.x indexers after migration.

Possible Problems

We can get the following error during Data Integrity Step:

  • Error: Foreign key (<KEY_NAME>) constraint fails. Orphan records id:<id> from <child_table>.<field_id> has no referenced records in <parent_table>

Solution: There are missing database records in the parent_table. The field_id of the child_table is pointing to this parent_table.

If we can not delete the records from the child_table, we can just disable the Data Integrity Step in config.xml:

<step title="Data Integrity Step">
<integrity>Migration\Step\DataIntegrity\Integrity</integrity>
</step>

The data migration tool recognizes the differences in database structure between Magento 1.x versions. Most of these database structural differences are declared in map files. Each step in the process uses map files to transform data for use in the Magento 2 store. When differences are not declared in map files, then the Data Migration Tool displays an error and does not run.

If some Magento 1 entities (in most cases, coming from extensions) do not exist in Magento 2 database, the following errors may occur:

  • Error: Source documents are not mapped: <EXTENSION_TABLE>

Solution: Install the corresponding Magento 2 extensions or ignore the problematic data in map.xml (or map.xml.dist).

<source> 
  <document_rules> 
      <ignore>
          <document><EXTENSION_TABLE</document>
      </ignore> 
  </document_rules> 
</source>
  • Error: Source fields are not mapped. Document: <EXTENSION_TABLE>. Fields: <EXTENSION_FIELD>

Solution:

<source> 
  <document_rules> 
      <ignore>
          <document><EXTENSION_TABLE>.<EXTENSION_FIELD</document>
      </ignore>
  </document_rules> 
       </source>
  • Error: Destination documents are not mapped: <EXTENSION_TABLE>

Solution:

<destination>
<field_rules>
<ignore>
     <field><EXTENSION_TABLE>.<EXTENSION_FIELD></field>
</ignore>
</field_rules>
 </destination>
  • Error: Mysql server has gone away

Solution: Increase the following value in the /etc/mysql/my.cnfmysql configuration file:

  • max_allowed_packet = 2000M
  • wait_timeout = 6000

3 Best Magento SEO Extensions in 2019

We continue to work on Magento® SEO. Here you’ll find Top 3 Best External Magento SEO extensions for performing the best search engine optimization practices. We have already learned the things that matter in Magento SEO and how to set them up.  Now there is an additional help for making your Magento website SEO-friendly.

Best External Magento SEO Extensions: Our Choice

All steps to SEO become much easier and convenient with external Magento SEO extensions. We‘ve chosen three of them which are the best in our humble opinion. Here they are:

SEO Toolkit by Amasty

This extension includes the numerous features of Magento SEO. It will help you to do the following:

  • work with categories and products;
  • create relevant metadata for all pages;
  • export and import product tags;
  • generate the sitemaps for a multiple Magento online store;
  • create SEO-friendly short URLs;
  • make SEO-friendly product reviews.

It’s a really good solution, and it comes with a user-friendly guide on how to make all thing works.

Where to find the extension and guide: amasty.com

There you’ll also find the detailed description of a product.

Magento SEO Suite Ultimate extension v9.0.1 by Mageworx

This is the all-in-one Magento SEO solution. It can do the same things as the previous one. So you can choose the extension you like more. Let’s take a look at what it can:

  • has 20 templates for work with metadata;
  • helps to create advanced Magento snippets;
  • performs SEO for category and product pages;
  • includes features for SEO breadcrumbs and redirects;
  • allows external and internal cross-linking;
  • generates extended XML and HTML sitemap;
  • provides the detailed SEO reports.

It is also packaged with users guide that will help you to achieve the best results in working with Magento SEO features.

Where to find the extension and guide: mageworx.com

Create HTML Sitemap for SEO by Creare – Free

The extension is focused on creating an HTML sitemap for Magento store, and it’s available for free on MagentoConnect. Here is how it works::

  • lists all Magento store categories in cascading style;
  • creates the SEO-friendly sitemap;
  • replaces the defaulted paginated sitemap of Magento;
  • lists all static and CMS pages;
  • helps to make all category pages indexed;
  • has built-in XML checker.

Where to find the extension: magentocommerce.com

Ultimate Magento SEO Guide: What Matters and How to Setup

Anyone who runs Magento® online store aims to reach its popularity, get more customers, and as a result, more sales. So what factors affect the success of the online store? Definitely, they are the high quality of products and services, meeting the market expectations, website performance which influences conversion rate, and SEO.

Magento SEO is similar to the optimization process of any other website. But on the other hand, Magento online shop is much more complicated. It has more pages, categories, products, and features. So what exactly matters in Magento SEO and how to set up everything correctly? Today we’ll make it clear. Meet our ultimate guide which contains certain steps on how to make Magento online store SEO-friendly and popular. Our Magento SEO technical recommendations will help you not forget all these important things.

Magento SEO Content Structure

When we say “structure”, it means the whole content logic in HTML of each web page. In Magento, there are different types of pages, such as home page, contact page, category page, product page, and more others. And by the way, the last ones are the most multiple types. Each page must have a certain content structure to be SEO-friendly. We are going to consider the main structural elements in the context of Magento.

When Google’s bot goes through the web, it scans the web pages using the “links” it can base on, like titles, meta keywords, meta description, alt-texts of images, the logically built headers, and URLs. It aims to provide the users with the most relevant information, and these elements together help it learn the level of relevancy. It goes through the sitemap and stops on the pages that are marked like robot.txt (the pages which are not enabled to index). So this structure must be logically clear and give the certain sense of the content you post. If it is, each web page gets indexed and becomes visible for web users.

You can carry out and control your SEO using Google Search Console.

Magento SEO Titles

The title is the heading of your web page. It is the first visible element in Google search results colored in blue. It’s quite important to create a unique title for each Magento page (category, product, home and others.). And the main: a title should contain your focus keywords.

It looks like: Keyword1 Keyword 2…- Your Company Name

Setup titles in Magento: System -> Configuration -> Design-> HTML Head-> Default Title.

Example: In case the category page for business laptops, use a title like:

Business Laptops – Computer Shop. (“Computer Shop” is imagined brand name).

Magento SEO Metadata

Metadata is one of the most important types of information for search engines. It contains keywords, meta description. We’ll not stop on how to make a keyword research or write a description. You can read more about SEO-elements if you need.

You should just know that it’s necessary to pick the focus keywords for each page.

Setup keywords in Magento: System -> Configuration -> Design-> HTML Head-> Default Keywords.

Setup description in Magento: System -> Configuration -> Design-> HTML Head-> Default Description.

Magento SEO URLs

Here we’ll look at the common issues related to URLs you should keep in mind.

Human- and SEO-Friendly URLs

Don’t forget to include the keywords and relevant information to your URLs, where your pages sit. Each URL should be readable and tell the relevant information. Let’s take a look at some product page. Here is an example of good URL for the certain product: yourdomainname.com/puma-sneakers-for-run-white

Avoiding Duplicate Content

The duplication of content happens in several cases. We’ll consider them below

Domain Name Issue

The first one happens when your shop is delivered by the both types of domain name: with www and without www. It looks something like this:

http://www.websitename.com

http://website.com

If your Magento store is loaded with any of this types, congratulations, you have the duplicate content. But you can fix this and set up your domain name in Magento: System –> Configuration –> Web –> Unsecure –> Base URL.

Enter and save your domain name. Then make sure that your website doesn’t generate duplicate content and is available only by the domain name you’ve chosen.

Enable this option (choose „Yes“) using the following way: System –> Configuration –> Web –> Search Engines Optimization –> Use Web Server Rewrites.

Rel=Canonical Turning On

Turn on rel=canonical for the categories and products. It’s pretty helpful in reducing the number of duplicate content.

Setup rel=canonical: System –> Configuration –> Catalog –> Search Engine Optimisation -> „Use Canonical Link Meta Tag For Products“ and „Use Canonical Link Meta Tag For Categories“.

Set Up Redirects

Here the function Create Permanent Redirect for old URLs if Url key change will be helpful when you migrate your website or apply the certain changes to your URLs. Choose “Yes” for this function.

How to turn it on: System –> Configuration –> Catalog –> Create Permanent Redirect for old URLs if Url key changed

Don’t Set Up Categories Path for Product URLs

It’s better to turn off this function and choose “No” for it, in order not to make Google confused when you change the category name and all products set on this path can vanish from the index.

How to turn it off: System–>Configuration–>Catalog–>Use Categories Path for Product URLs

Also, there are some useful extensions that can help you on your way to great SEO.

Magento SEO Headings

Headings divide the page content into parts and name them. In HTML, headings follow locally one by one like H1, H2, H3, H4 tags and so on so forth. You should follow this logic and not miss the heading level when creating your content. H3 should follow H2. You can’t miss H4 and place H5 after H3. Also, include your keywords here.

Magento SEO Image Attributes

Everyone who carries out SEO should know that the search engines are not able to see what in the picture is. The only way to help them is to add the image attributes: image title and alt-text.

If talk about Magento with its numerous product images, this moment is quite critical here. Alt-text and image title should also include the keywords.

Magento SEO Links

Such important content elements, as links and anchors, should also contain the keywords. Internal site links for SEO are under your control in Magento, but also the system generates the category-related links automatically. Each page should be reachable through the website. For these purposes, webmasters should create a sitemap.

Sitemap.xml and Robot.txt in Magento SEO

These elements are devoted to helping the search engines follow the right way through the website. Sitemap.xml is a listing data of your store pages and links.

Where to find the Sitemap: Admin Panel -> System -> Configuration -> Google Sitemap. Then Enable it in Catalogue -> Sitemap.

A tip: it’s better to do this process after your website release. Before, don’t turn on “index, follow”, and use subdomain with an access password in the stage of development.

Setup Index Follow: System –> Configuration –> Design –> HTML Head –>  Default robots “INDEX, FOLLOW”. – Turn on after release.

Check your sitemap file. Only then add it to Google Webmasters Tools.

If you run a multiple Magento online store, for example, Chinese and German, separate your sitemaps and call them like sitemap-ch.xml and sitemap-ge.xml.

Robot.txt is the file that contains the information about the website URLs Google’s robot should not crawl through. But note that it could keep the pages in the index (but not show the other elements, like title and description for these pages). Creating this file is a process that needs to be well-thought-out and performed. You can read more about it in Inchoo guide.

Content Quality in Magento SEO

The content quality definitely matters in SEO. What does it mean?

First of all, it’s the relevance of the content. Google’s most task is to provide the users with the most relevant information.

If you pick the keywords, they should make sense in the website texts, such as category and product descriptions, product cards, landing pages, and so on so forth.

The next thing is that the content should be unique, interesting, and attractive. Never try to use someone’s content or copy it from the other website. Such actions are forbidden by Google. Don’t only advertise. Give something useful.

Never use the black methods like hidden, bought, and broken links, spam, links in a bad neighborhood, overlinking. They will not boost the brand but destroy the reputation.

And remember the following: the more traffic generates your online store, the more conversion it gets, and the more popular is your brand, the higher position in the search results it gets.

Measurement of Magento SEO Results

It is not a step. It’s a continuous process that we have to for performing the best SEO practices. You should know how to measure results from the SEO campaigns. And here Google’s tools are very useful. The best helpers for watching your SEO are Google Search Console, and the most powerful platform for deep analysis of traffic sources is Google Analytics. Try to make friends with Google, and your Magento SEO will be much better.

Full Page Cache Magento Extensions for the High Website Performance

Last time we discussed how to optimize Magento® performance. It’s a pretty important process for everyone who owns the website, especially eCommerce online store. Page loading time affects the conversion rate dramatically. It’s an interesting fact that if the page is loaded more than 3 seconds the visitor goes away. In the worst scenario, a website is hopeless at selling products, and you lose potential customers. But everyone can avoid it and turn this task into benefits. By the way, the search engines consider page loading time. And the websites that load faster get the higher positions in search results.

If your website is based on Magento, you are familiarized with its power. And that means your online store resists a high load of visitors on a daily basis. Is it ready for such a huge pressure, for example, when you run season sales at your store, and the number of visitors goes sky high? You can check your Magento based website for the most important parameters using our checklist. If you find something you can improve, just do it.

Checklist on How to Speed up Magento

  • Migrate to the Latest Version
  • Perform Image Optimization
  • Enable Flat Catalog
  • Concatenate (merge) CSS and Javascript Files
  • Enable Magento Compilation
  • Utilize Caching
  • Choose Fast Web Hosting
  • Clean Up Magento Database & Logs
  • Download Fewer Extensions & Modules
  • Perform MySQL Configuration
  • Update Indexes
  • Use PHP Accelerators

Now you can move on to the list of Magento Extensions to improve your website performance with full page caching.

Classic Scheme of Full Page Cache Magento Extensions

Imagine the user. He is opening the page of some Magento online store the first time. What happens then? Here are where Magento starts its work. It creates and delivers the required web page to a user and saves its copy in cache. This copy is stored there, and next time when the visitor goes to this page, he gets this copy. So, you see that the way is shortened. It goes from the user to cache. This process increases page loading speed in many times.

Top 3 Useful Full Page Cache Magento Extensions

As we work on Magento on a daily basis, and Magento development is our main expertise, we face different tasks related to Magento performance optimization. We can give you several recommendations on the choice of the useful full page cache Magento extensions based on our technical experience. You can try them and speed up your Magento based website. Before, you can view our checklist to learn what items you can improve right now.

Full Page Cache by Mirasvit

This solution works following the classic scheme of page caching and helps to increase the speed of Magento based website. It returns the web pages copies from the cache immediately. It allows you to reduce page loading time in 6-25 times comparing to default Magento. And this is an advantage of the extension.

Features:

  • full page cache for all website pages;
  • excludes required pages from the cache;
  • supports themes for mobile devices;
  • you can use different types of cache;
  • built-in crawler.

It also includes the detailed crawling statistic that helps you to keep cache up-to-date.

Where to get and learn more: https://mirasvit.com/

Full Page Cache by Amasty

Full Page Cache by Amasty also helps you to decrease server load and speed up your website. The distinctive feature of this extension is the support of dynamic blocks, called “holes” punch. So you can choose whether you want to use dynamic block caching or not.

Features:

  • full page cache for web pages;
  • dynamic blocks caching (enable/disable);
  • supports themes for mobile devices;
  • clearing cache for the whole website and its specific pages individually;
  • caching of Ajax requests;
  • uses native Magento functionality and compatible with default Magento;
  • Includes full page cache crawler;
  • supports LSS websites and compatible with content delivery networks.

Where to get and learn more: amasty.com

Lesti_Fpc Extension

Lesti_Fpc extension is an internal solution for Magento. As external extension work in front of Magento, they reload dynamic content with Ajax. Yes, they are fast and efficient. But if you need more flexibility, Lesti_Fpc extension is one of the best solutions for you. It is an internal extension. It requires a bit more time for caching but could be compatible mostly with any Magento theme without much customization and development processes.

And a great plus that it’s absolutely free.

Features:

  • full page caching;
  • works with events;
  • replaces dynamic fields;
  • can exclude a category and a product;
  • 24-hour cache lifetime;
  • compatible with 1.5 – 1.9 Magento CE versions.

Where to get and read the instruction: github.com

Where to learn more: gordonlesti.com

How to Optimize Magento Performance Without Coding

If you have a website based on Magento®, sooner or later, you face the question of how to optimize Magento performance. We have already discussed how page loading speed influences conversion. So it’s time to make it clear and finally get the working steps on how to speed up Magento based website. Let’s start.

Magento Performance and Website Speed Test

Although the process of Magento performance optimization is quite difficult and depends on different parameters, there are several basic things that can help you decrease your website loading time. You can speed up Magento by yourself using our Magento optimization techniques. Let’s start from scratch and check whether your website is optimized or not. Then run the Google speed test and learn how fast your website is.

If you see that your page loading time needs to be reduced, we can move on.

Magento Performance Tuning

The process of performance optimization for any CMS and website is quite similar: we should keep up with the times and reduce page loading time by reducing the weight of content and code. We need to shorten the way of servers request. How to do it? Let’s do the following:

Use the Latest Version of Magento for Better Performance

It’s quite important to use the latest version of CMS and modules because the bugs are fixed, and performance is improved in updates. Also, it will help you to keep your Magento based website protected.

Optimise Images and Reduce Their Weight

Surprisingly, but more than 50% of page loading time is taken by images loading. Here we move to reduce the weight of content. So, where are the images on your website? For sure, you’ll find them in Products and Categories. If you just decrease their size and use the compression, it will drastically affect the page loading time. You can do it with help of different extensions, but also the simple way is to use “Save for Web” in Adobe PhotoShop (you’ll find this function in header menu, “File” tab).

Flatten Your Categories and Products

Imagine that your website has a huge number of categories and products. And all of them have their own attributes. These attributes are stored in separate databases. So while reaching some product from some category, the way of the request is too long. That’s why if you enable flat categories and products, the attributes will be in one table. Therefore, you shorten this way. Magento website speed will be increased.

How to enable flat categories and products:

  • go to Magento admin panel;
  • choose System in top menu;
  • then choose Catalog.
  • Catalog Frontend and set Yes for “Use flat Categories” and “Use flat products”.

Combine CSS and JS Files into One File

This will also have a positive impact on a website performance. It’s useful when it comes to the time of server request. If you merge CSS and JS files, you’ll shorten the way of request and optimize your code.

How to merge CSS and JS file:

  • go to Magento admin panel;
  • choose System in top menu;
  • then choose Configuration, Advanced.
  • go to Developer, CSS settings, and JavaScript settings;
  • there you should set Yes for “Merge Javascript” Files and “Merge CSS” Files.

We are on the right way. We have already done the most important steps. Let’s move to the next one.

Enable Compilation and Activate the Scripts

This step helps to activate some important scripts in Magento core, and the website becomes faster.

How to enable compilation:

  • go to Magento admin panel;
  • choose System in top menu;
  • then choose Tools, Compilation, Enable.

Enable Caching

Cache is quite a powerful element when it comes to website performance optimization. It helps to shorten the way of server request by storing different data that was loaded before. There are different types of caching in Magento. We offer you to enable all of them and look at the result.

How to enable caching:

  • go to Magento admin panel;
  • choose System in top menu;
  • then choose Cache Management, select all items and choose Enable.

Magento admin panel

Also, don’t forget to turn on the page cache. It’s a pretty useful and powerful way to increase your Magento website speed. You can use special extensions for these purposes, for example:

Zoom Full-Page Cache, LiteMage Cache, Product & Category Page Cache

Choose the Fastest Web Hosting

It’s an important step which you should do right at the beginning of your Magento performance optimization. It is a base for your website, that’s why it should be fast and reliable enough in order to resist the high load and perform the best efficiency. It’s better to prefer not cheap but well known hosting providers with a good reputation and reliable technical support.

How to Install Magento 2 on Windows 10 Using Local OpenServer

Install Magento® 2 on Windows 10… Sounds good, right? Today we’ll run through the process on how to make it work using OpenServer.

Magento Installation Steps

Anytime you are going to deal with Magento 2, you’ll find the list of specific technical requirements, such as the following ones:

Magento 2 technical requirements

It’s just a part of them. The first requirement is operating system requirements: Linux x86-64. But should we do if our task is working with Magento 2 on Windows 10? OpenServer is a right solution in this case. The matter is that symlinks don’t work on Windows 10 for Magento 2.

However, OpenServer and the correct install of Node.js are helpful in solving this problem. It’s our way of how to work with Magento 2 and Node.js. Enough words – follow our Magento install instructions guide.

Setting the local OpenServer in order to Install Magento 2 on Windows 10

  • Install Node.js if it’s not set. You can find the Node.js official installer here. It is set to Program Filesnodejs by default.
  • Run OpenServer with admin access. The symlinks will work only in case you use admin access.
  • Open settings. On the ‘Server’ tab and “Setting the use of Path variable” field, we should set ‘Own Path userdata/config/path.txt’.
  • Following the path: Your_drive:OpenServeruserdataconfig (Your_Drive is a drive’s letter where OpenServer is set), create a path.txt file with the next content:

C:Program Filesnodejs

C:UsersyouAppDataRoamingnpm

The second row here is a path of setting grunt, gulp, etc. If you have the other files location, don’t forget to correct the paths.

  • Rerun the server.
  • Run OpenServer console.
  • Check whether node.js works. Use node v command.
  • Install Grunt: npm install -g grunt-cl
  • Check whether Grunt works. Use grunt v command.

Now Node.js and Grunt are set on your OpenServer globally.  You can set any other packages, such as Bower, Gulp, etc using our approach.

The main thing here is to write path.txt. file paths correctly. That’s all!