Drupal Planet

Recently, I had to build a Drupal site that had to be fast for registered and non-registered users. One of the most frequently used module for caching, boost, can offer caching for unregistered users only. But what can we do for the rest of our visitors?
Why can't we offer them more speed? 

The solution

The module I used is authcache and can give us a plain and straighforward configuration that can be used with or without advanced caching server software. For example, if our web server has no Varnish or opcache or memcache etc. we can get from the module a very satisfying out-of-the-box result providing fast page surfing for our registered visitors. 

In a nutshell, the module is similar to the well known boost. The first time a page is requested, a HTML version of it is stored for future requests. Each user role, has its own HTML version of the requested page. Once the cached page is stored, whenever it's been served as static page, an additional AJAX light-weight request is made to the server in order to update the usage statistics of the page requested and as a result the module returns personalized data for this page such as FAPI tokens, FAPI default values etc.

And where are the cached files?

Authcache gives us the ability to expand its functionality with extra features that allows us to use any advanced caching software the server may have. By adding some contrib modules, we can store the cached content either on files, Redis, Memcache, MongoDB etc. By default the module stores the content on our database. That may be a solid approach, but we suggest to use the File Cache module so that the content is stored in sites/default/files folder. With that aproach, MySQL stores only the URL and the age of each stored page. That keeps our database more clean and easier to maintain. Like many caching modules, authcache, has configurable settings such as minimum/maximum lifetime, cache update triggers, debugging modes etc as well.

What do the numbers say?

If a registered user requests a page that has 2 views, 3 blocks, 2 menus and some more "plain" content, the average rendering time is ~650ms. That means that a registered user has to wait for ~650ms after his click before the server can send to him the 1st byte of our page. 
With authcache and File Cache, we got to ~48ms!

These numbers are recorded on a 64bit Windows 7 laptop with SSD and plenty of memory (8GB). You will never going to host you site on something like that, but you get the picture. And if you use any of the contrib modules with the appropriate server software, you WILL get even better response times.

If you use authcache, boost, Block Cache Alter and the native caching of Drupal and Views, you will turn your sluggish Drupal installation to a rocket!

And never forget: Keep your site fast, keep your visitors happy!

Drupal Training

Learn Advanced Drupal 7. Unlock its powerful API and theming engine at a 2-day hands-on workshop delivered by top Drupal developers.

The 2-day workshop will be held in Central London on Monday and Tuesday, July 13th and 14th 2015. Each day is a full 8-hour session. Monday’s session covers building a website with Drupal, and Tuesday’s session covers Drupal Theming and Drupal Module Development.

The training will be highly personalized as there will be one trainer per at most 4 students, so you will can get the attention you need in order to follow the flow of it.

Whom is it for?

The workshop aims at providing the tools and knowledge required for using Drupal as a framework. You won't leave the workshop as a Drupal expert, but you will be led into the right path with top Drupal developers.

Suggested Prerequisites:

Please bring a wifi enabled laptop for the hands-on portion of the workshop.


Familiarity with Drupal Site Building fundamentals


Advanced Drupal Theming and Module Development


Registration fees for workshop attendance are £495 per day. You can attend one or both days. There is a £100 discount if you choose to register for both. Total cost of the 2-day workshop is £890 plus VAT payable via PayPal or direct Bank Transfer.

Price includes coffee and lunch.

An attendance certificate will be provided.

Check out the workshop schedule below and book now, as seats are limited!

Monday, 13 July 2015: Site Building




10:00 - 11:3090’Introduction, Drupal Installation, Learn the Administration environment
11:30 - 11:4010’Coffee Break
11:40 - 12:4060’Custom Content Types, Fields & Modules
12:40 - 12:5010’Coffee Break
12:50 - 13:5060’Showing Content, Views, Panels & Display Suite
13:50 - 14:5060’Lunch Break
14:50 - 15:5060’Internationalization, Performance (Cache, Cache Expiration)
15:50 - 16:0010’Coffee Break
16:00 - 17:0060’Commerce
17:00 - 17:1010’Coffee Break
17:10 - 18:0050’Rules


Tuesday, 14 July 2015: Theming & Module Development





10:00 - 11:3090’Introduction to Drupal Theming, Appearance Interface, Install themes from Drupal.org.
11:30 - 11:4010’Coffee Break
11:40 - 12:4060’Base Themes, Create a new theme
12:40 - 12:5010’Coffee Break
12:50 - 13:5060’Editing the basic templates & javascript libraries
13:50 - 14:5060’Lunch Break

Module Development

14:50 - 15:5060’Introduction to Drupal for Coders, creation of a Module, Hooks, Menu System, Theme API
15:50 - 16:0010’Coffee Break
16:00 - 17:0060’Creation of an Admin Interface, Form API, Entity API, Users and Permissions
17:00 - 17:1010’Coffee Break
17:10 - 18:0050’Using the Database API, Caching, Development Best Practices

For more information, please contact us.

Book Now:

There will be times when you will need your app to know the visitors IP. Either for debugging purposes or for functionality purposes.

Possible workarounds

If you are a newbie, you will probably go for something like this:

if ($_SERVER['REMOTE_ADDR'] == '') {
  // Your code here

If you are bit more experienced, you 'll do something like this:

if (ip_address() == '') {
  // Your code here

The problem

Yes! That would do the work alright. But what will happen if your website is behind a reverse proxy? Varnish or Nginx? Or even behind advanced caching and proxy services like Cloudflare or Akamai? And what would you do if the server is not yours and you cannot install mod_rpaf on it? And it's 03:00 in the morning and your server administrator is asleep? None of the above approaches will reveal your visitors IP address!

The solution

But guess what! Drupal has a solution for that too.

The solution lays in the site/default/settings.php file at the reverse proxy configuration section.
All you need to do is follow these steps:

1. Comment out the line $conf['reverse_proxy'] = TRUE;
2. Put the known reverse proxy IPs in the following array. In case of Varnish or Nginx, the IP would normaly be the server's own IP.
In case of Cloudflare or any other service, you will need the IPs that the service uses, and store them in the array:
$conf['reverse_proxy_addresses'] = array('a.b.c.d', ...);
3. We store the header that the proxy uses to keep the visitors IP. By default is HTTP_X_FORWARDED_FOR but in case that it's not, you can easily find it by executing the following:

print '<pre>';
print '</pre>';

Check where is your IP and add the header to the variable: $conf['reverse_proxy_header'] = 'HTTP_X_CLUSTER_CLIENT_IP';

Follow the above and then the ip_address() function, will always return your visitor's IP address.

Good luck and keep it simple!

Drupal behind reverse proxy

We launch the new, redesigned website of the The Cognitive Systems Research Institute (CSRI), www.csri.gr

The release of the newly redesigned website has been crafted to reflect the rapidly growing activities and results of the institute, and to provide easy access to such information for all site users. Key features of the site include a refreshed and simplified look combined with enhanced content, improved search functionality and optimisation for mobile devices; these features allow the site users to better interact with CSRI online.

They provide one the opportunity to sign up for newsletters, be part of our experiments and download all open source software and Institute’s data, as they become available.

Drupal 8

Four years ago we made an important decision at Netstudio: We would migrate to Drupal. Drupal 7 had just come out, and despite our having mastered Joomla at online-store level, we simply could not ignore Drupal’s embedded Content Construction Kit, its multi-lingual support, safety, stability, scalability, search engine friendliness, but, most of all, the professionalism of the Drupal community.

Drupal 7 helped us undertake even bigger and more complex projects, and build all of our solutions for ecommerce and presentation websites, including even our ERP, project management tool, quotes generation and hiring systems and our project management tool. It was on Drupal we based our company’s projects, like visibility.gr and servalarm.com, as well as more than 200 websites and online stores for our customers.

Not for a single moment have we regretted our migration to Drupal, despite our having to learn a new ecosystem from scratch.

Just six months after Drupal 7 was launched, the Drupal community set off for Drupal 8. Dries Buytaert set very high standards for the new version of Drupal defining the main pillars to set it on the crest of the wave.

Four and a half years of development later, beta 10 release is here, signalling the approach of the final release in less than 6 months from now!

More than 2800 programmers − twice as many as for its predecessor − have contributed for Drupal 8 developing hundreds of new features.

The most significant structural change made was that it was based on Symfony2 framework thus turning it into an object-oriented platform. From now on, large chunks of code, such as Guzzle, Twig (the new theming system), the Composer, etc. come from the Symfony2 community.

Moreover, Drupal 8 brings along enormous changes in the way we develop websites.


Multilingual support is very important for us, since we are based in Greece and our many international clients require the operation of their website in English and the language spoken in their country. Some of our clients run multilingual websites ​​(eg ivf-embryo.gr is available in 14 languages). Drupal 7 supports multilingual websites much better than Joomla or WordPress, but requires installing and configuring over 15 additional modules. In some extreme cases full support requires a programmer’s intervention, so it is not fully manageable by the non-technical administrator.

Multilingual support is embedded in the core of Drupal 8 requiring the activation of only 4 modules. Drupal can now be installed and operated in the administrator’s native language from start to finish. Gábor Hojtsy, heading a large team of contributors for this pillar, did an excellent job solving dozens of issues on Drupal 7, and transforming Drupal 8 into the most comprehensive platform available for developing multilingual websites and open-source-code applications!

Views in Core

For many, the views module is the basic reason for choosing Drupal. It allows displaying data to the user, without them having to write SQL queries. In Drupal 8 the Views module is conveniently embedded in Core. You can start building your website without having to install an additional module offering stability, full integration and interoperability. Furthermore, all administration screens are now Views, allowing the administrator to change fields and their appearance with just a few clicks.

WYSIWYG and Inline Edit

Drupal 8 Inline Edit

Content editing in Drupal 7 hasn’t been the best experience for the administrator. WordPress is still the leader in convenience and usability in this area. At Netstudio we have been installing dozens of modules in order to provide our customers with an environment almost as friendly as that of WordPress. Drupal 8 is a huge step in that direction. Its basic installation offers the content manager enhanced usability in a much friendlier environment (in fact, Netstudio has contributed some usability tests via UserFeel.com). The new release features a configured built-in WYSIWYG editor, as well as the impressive cutting-edge Inline Edit, making quick content interventions piece-of-cake for the front-end administrator.

Anything left for the next Drupal 8 (maybe 8.1) release? Well, yes. Media administration (photos, videos etc.). Although there have been improvements, additional modules need to be installed for a comprehensive solution, as is the case of the recently released Entity Embed and Entity Browser.

Mobile friendly

Now that the mobile web is a reality, it all seems so matter-of-fact. In 2011 however, at the onset of the Drupal 7 era, all we knew about the mobile web was forecasts. Fortunately, Dries Buytaert took these forecasts seriously, so he set the requirements for Drupal 8 aiming at its full compatibility with mobile devices. And his efforts were not in vain. The environment all around Drupal 8 is not only responsive, but also very easy for mobile and tablet users, even regarding contextual links, the admin menu and inline editing. The bottom line is that any administrator can manage their website comfortably commuting on a bus seat, on their bed or enjoying the sunshine on the beach!

Performance & Scalability

A platform’s performance and its ability to juggle sudden spikes of traffic have been major concerns of ours, partly explaining why we migrated to Drupal 7. Initially, Drupal 8 was much slower than Drupal 7, as shown in a comparative analysis we published two years ago. The obvious reason of course was that it was still under development and lacking the necessary speed optimization. This now has been changed. About a month ago, internal cache was set to on by default. We’re talking about a much smarter cache than that in Drupal 7. Speed racing is in progress, with developer Wim Leers in the lead. Here we expect dramatic improvements and capabilities once "SmartCache" and "PigPipe", Facebook-style page loading have been embedded in the core.

Configuration Management

I have a crush on this one, can’t wait for it, as it solves the issue of maintaining the site configuration under version control. In Drupal 7 website configuration and content were stored in the database, sometimes in the same tables, making their management almost impossible. We have repeatedly tried to resolve this issue using features, strongarm etc, but have given up as these solutions were too time-consuming and costly. We’ve been going out of our way creating scripts to control functionality, and checking over 300 points regarding security, performance, SEO etc. before delivering a website to our client. Still, this may not be considered a comprehensive solution. In Drupal 8 configuration is stored in YML files. That makes version control management, and data transfer from website to website or from environment to environment (e.g. development > staging > testing > live) a breeze.

Next Releases

Another important change in Drupal 8 is the rate of publication of new releases. In Drupal 7 subsequent releases (7.01, 7.02, and the most recent one, 7.37) focused exclusively on fixing bugs and security issues During these last four and a half years only few features have been added, in accordance to the backward compatibility policy. This is changed in Drupal 8. Versions 8.1, 8.2, etc. will not comprise of "minor updates", but will add new functionality. What it boils down to is that from now on, Drupal will be integrating technology innovation much faster.

More Novelties

Over and above the most important new features mentioned above, Drupal 8 comes with many more innovations like fieldable blocks, a greater range of integrated field types (date, entity reference, phone, email, link), the tour module, embedded schema.org output, enhanced accessibility, content publishing preview, friendlier front-end development, and more. What’s your main reason you can’t wait for Drupal 8?
Leave your comment below.

When will it be ready?

DrupalCon Los Angeles, with dozens of developers racing in Coding Sprints for the completion of Drupal 8, is now over. Only 20 critical issues (tasks and bugs) were left unsolved!

The RC (Release Candidate) version will be released once the last of these issues will have been resolved. The final version of Drupal 8 will be released 15 days after critical tasks and critical bugs have been brought down to zero. This is likely to take less than six months, but we’ll need to wait for another few months before we see the top contributed modules upgraded to Drupal 8. Knowing us, however, I’m sure we’ll start developing some simple presentation websites on the release of the almost final version. However, we’ll have to wait for 3-6 extra months before we can use Drupal 8 in more demanding installations. Meanwhile, we can all keep an eye on the top 100 contributed modules and their Drupal 8 updating status at: http://www.bluespark.com/status-top-100-contributed-modules-drupal-8

We can’t wait for Drupal 8. Can you?

Now you know our reasons of impatience to start working on Drupal 8. What about your reasons? Do you plan on using Drupal 8? Have you used it already? What do you like most about it? Write your comment here.

13+1 critical technology elements for a succesful online store

As more and more online stores are created, e-commerce competition increases, and so does the demand for stores created professionally to work online. In 2013 there were 102,728 US-based online stores making $12,000 annual revenue or more. Behind the promising numbers though, most of the time, US-based online retailers operate in a battleground against Amazon’s overwhelming buying power and ridiculously low prices. 

How can an individual online seller win this? For one, you must squeeze your mind to find products the online marketplace is not so keen on. Fortunately, this is not all you can do. Your online store needs to be ready for online commerce combat. So let’s start shining the “arrows” in your quiver.

Nowadays, there are hundreds of new features and tools an online store can feature for its customers to create a unique purchasing environment and buying experience. Remember, the tools are for you to use so your shoppers will remember their way back to your online store. If they do, there are tactics you can use to keep them there until they fill the shopping cart.

So either you’re making your commercial website from scratch or just upgrading it, find out what could change its revenue fate for the better, starting today!

Would you like to get this guide in PDF format for easier reading?
Enter your email address and we'll send it to you instantly:

1. Easy Management

In today’s competitive environment, you need to be able to regularly update your commercial website. Administration ease is, therefore, critical, in terms of order handling and content management.

If you need special instructions, or worse, the developer's intervention to update your online store, you either dig deeper into your company’s pockets, or forget about updating altogether – both obviously undesirable.

What you actually need to target for is being able to perform the daily operations of your website after a few minutes’ management environment training.

Tip 1: Check the platform you are planning to use for your ­web-­store. Check its usability and flexibility before you invest in it. Is this platform already used by successful online stores?
Tip 2: Ask us to present you the management environment we have developed on Drupal, a powerful open source content management platform. You will be impressed!

2. Fast loading

Nowadays, fast loading is a must-­have for any wannabe online store success. Not only does it help your online store’s Google ranking and reduce its Google AdWords costs, it is also now considered as a basic requirement by online shoppers. If your online store takes more than four seconds to load, you lose 25% of your visitors. An experiment conducted by Amazon has shown that for every extra one-­tenth of a second a page took to load, there was a 0.7% decrease in Amazon’s sales! That’s a 7% drop in turnover for each second of loading delay!

Bounce Rate and Page Loading Time Graph

Like on any website, the time required for an online store to load depends on the time the server takes to generate the page and start sending its data to the user, as well as on the amount of data that has to be sent to the user's browser for the page to run.

Thus, the final time is affected by how efficiently the online store is programmed and what caching techniques are being used, by the power and the burden of the server, the server's physical distance from the user, the optimization of the graphics that are sent to the user and the compression of the text files (html, css, js) sent from the server.

Tools Measuring Page Load Speed

You can measure how fast any website loads using the tools built in most browsers.

Additional tools you can use to track your website's speed problems are Google Page Speed and Yahoo YSlow, both available as add­ons for Firefox and Chrome.

For example, on Google Chrome either through the menu or pressing the Ctrl + Shift + I (for Windows) or Command + Alt + I (Mac), you can open the developer tools, and select the Network tab. There, on each page loading, you can check the exact load time.

If load time exceeds 2 seconds on a second visit (with the data having been cached in the browser) or is more than 7 seconds on a first visit (with the browser's cache empty), focusing on your website's acceleration, you are on the right path towards an increase in sales.

Tip 1: Before you choose a platform or a website developer for your online store, check out other online stores based on the same platform or made by the same developer for loading speed.
Tip 2: You can ask us to make your online store load faster. Go ahead and take advantage of our team’s website rally speed expertise.

3. Search Engine Friendly

Your online store should be easily read and indexed by the main search engines (call me Google). If that isn’t the case, you will be missing an important sales channel that would work for you for free.

Search-­engine friendly involves a number of things you need to pin down, the most critical of which being:

  • The URL structure, i.e. the structure of the web addresses for your product and product category pages. The URL form should look like this: myeshop.com/product­-category/brand/product-­name and myeshop.com/ product-­category /product-­subcategory rather myeshop.com/index.php?id=XXX.
  • The URLs should be generated from the titles of products and categories. In case of non-Latin characters, they first need to be replaced by the corresponding Latin ones). However, both of these functions should be done automatically.
  • Similarly, you should make sure that for every store's page, and especially for the home page, the correct title tag and meta description is automatically or manually provided. That will determine what will be shown both in the user’s browser tab, and on Google results. As regards the meta keywords, you do not need to bother, as these have been completely ignored by Google for years.
  • In HTML language used to build your website’s product and other pages, the appropriate heading tags (h1, h2, h3, etc.) should be used based on the new HTML5 standards for titles and subtitles.
  • Mechanisms should be laid down in order to prevent the creation of duplicate content, mainly by setting up automated redirects to the correct pages. For example, the online store will open with or without the "www" in the web address, but it should always redirect to one of the two versions.
  • An automated mechanism monitoring your online store on a regular basis for any incorrect links will immediately let you know whenever a problem arises so you can fix it.
  • Finally, an updated XML sitemap should be automatically generated on a daily basis which will be read by Google. This helps Google to read and index your website, as well as display diagnostic messages that will help you to improve your website and its Google visibility.
Tip: For English sites use SearchMetrics.com to track the results of your efforts measured by the visibility of your website on Google, as well as those of your competitors. For Greek sites you may use our Visibility.gr.

4. Fast and Smart Search

Nowadays, searching in online stores, especially those with many products, should be both fast and smart. Actually, it should work:

  • On misspellings, too.
  • Both in singular and plural. For example, if the user types the word "knife", the searching results should also contain the word "knives".
  • Faaaast!
  • In short, as expected by the guys and girls next door/screen.


At Netstudio, for about 4 years, we have been developing the search and filtering system FindasticTM, which essentially is faceted search based on Solr Server. It features super­fast and smart search filters, as well as a free search engine that fetches correct results impressively fast. For example, try searching at http://bemine.de for "red adidas watches up to 55 euro". Note how quickly the results show narrowing the results down to what you are looking for as you go on typing your search.

Similarly, use the search filters in any product category. Notice that filters not fetching any results are automatically disabled, so that you will never end up on a blank page without products, and while at it, take a look at the Google friendly urls.

FindasticTM is designed to work at an equally high speed, even with many thousands of products. For example, at http://bemine.de,  it searches through 18,000 products.

A faceted search engine like FindasticΤΜ can add a major competitive advantage to your online store, considering that a lot of large-­scale online stores lack some important search functions.

5. Thorough Analytics and Reporting

At your brick­-and-­mortar store, you watch how many customers come every day, how many of them are buying, what sales you make, and then you try to improve the results. Likewise in the online world it is important that you have a full and clear picture of the users’ behavior at your online store and above all, to know which marketing moves pay, which do not and to what extent, in order to maintain the most efficient ones and be able to improve them. There are many tools that help in this direction, yet Google Analytics is considered the website statistics service par excellence, a safe stepping stone for monitoring your store’s progress.

Google Analytics is freely offered by Google and its installation is very simple, although a mere installation is not enough for you to get the full picture.

Make sure that your website is properly set up and configured, so that, besides the default basic information, it also reports:

Sales and E­commerce Data

So that you can see the number of orders, revenue, the average order value and sold products on each Google Analytics report. For instance, you’ll be able to see what turnover and number of orders you have per traffic source.

Search Tracking

Keeping track of your users’ searches you can get valuable information on how they perceive your e­business, as well as on their needs and wants.

Event Tracking

In its simple installation form, Google Analytics tracks the pages visited by your website’s users. Tracking events, you can also monitor actions that you would miss, like downloading of important files, clicks on links that drive users out of your website, error pages, video views etc.


Make sure you have configured the desired goals (orders, contact form submissions, sign­ins) in Google Analytics, in order to track the conversion rate for each of them. You can read more about conversion rates and conversion rate optimization here.

Conversion Funnel

By setting up the Conversion Funnel, you can track the progress of users and see at which stage of the buying process most visitors will leak away. There you can step in for potential improvements.

6. Easy Checkout

One of the most critical parts of every online store is the checkout, namely the order completion process. This is where the primary goal of every online store, i.e. sales, is completed. Therefore, it is very important that this process be easy, clear and simple for the user.

Anything that will distract or confuse the potential buyer may prevent the sale.

It is not rare for an online store to have a large abandonment rate at the checkout process (this can be as high as 90%!).

The main points you should consider at this point are the following:

  • During checkout do not ask for information that is not really needed. The more information you request, the more you actually discourage users from filling them in. Ask for only what is absolutely necessary. For example, in BeMine.gr you will see that if the user chooses to receive the order from their nearest courier service, we do not even ask for their home address, but only for their zip code so we can present the nearest reception points.
  • Provide as many payment methods as possible. Cash on delivery, PayPal, Credit Card, Bank Transfer are the most important.
  • Remove anything unnecessary and distracting from checkout. Experiment with hiding the menu bar during checkout.
  • Offer the option of guest checkout, i.e. the option of purchase completion without the user being required to sign in.
  • During checkout display information that will increase the user's trust, such as the SSL seal, any certifications, the organizations you belong to etc.

7. Process Automation

The more your online store succeeds and the daily orders increase, the greater role procedure automation will play. The two most important points are linking to your ERP or invoicing program, and linking to the courier company you work with.

Linking to ERP

Linking to ERP is feasible on many levels, the most important being:

  • Linking orders. So that the orders coming in your online store will automatically be registered in the ERP, regarding both customer and order data details. That way, you avoid mistakes and, with the click of a button, you can issue the relative receipt or invoice.
  • Linking products. With this interface, you register your products only once in ERP and your online store is automatically updated. New products, updates and deletions already registered are automatically entered into the online store, either at regular intervals or whenever you choose to do so.
  • Syncing inventory and stock count. This interface is required if the store's inventory is common with that of your brick­and­mortar store. Whenever a product is sold at the physical store, it is automatically removed from the online store's available products page. In this way, you can avoid the embarassment of being unable to satisfy an order that came for a product out of stock.

Integrating with a Courier company

This interface saves you time and errors, as the order details entering your online store are converted into Voucher, which is affixed to the parcel, without you ever having to type the shipping details.

Implementing this interface, we have saved more than 75% of the online store owners’ time required for preparation of deliveries.

Furthermore, the customer is informed by SMS of the progress of their order online. That builds on your online store’s reliability big time.

You can watch a Video explaining the Courier service interface on this blog post.

8. Mobile Friendly (tablets and mobile phones)

Over 25% of site users surf the net from tablets and mobile phones. For many sites tablet usage exceeds 40% with a strong upward trend.

You can see the percentage of visitors that have visited your website through mobile devices in the relative Google Analytics report (Audience > Mobile > Devices).

The technique that has prevailed over the last three years in response to these developments is that of responsive design. Responsive design is what Google recommends for websites nowadays. Through responsive design the website or online store automatically adapts to the dimensions of the user’s screen. Either we deal with a big or a small screen, or with a mobile device in horizontal or vertical orientation, the website adjusts the presentation of its data, moving or eliminating some of them to fit to the user’s screen.

For instance, visit www.pharmaplus.gr from your computer and use your mouse to alter the width of your browser window. You will see how all the elements of the website are automatically adjusted.

9. Easy creation of deals & discount coupons

“Deal” is a very catchy word. So, depending on the object of your online store, you may need to use it quite often.

Ask for your online store to provide an easy way to create discounts, offers, gift vouchers, discount coupons or whatever is used to bring results within your industry.

At Netstudio we help run a great deal of online stores which need to put up dozens of deals of all types on a daily basis. E.g., "With each product of X Category, you get a product of Y Category for free. Or "Only for the next 3 days you get two products at the price of one". Or "Buying two products, you get one more for free."

Ask us to study your product line and develop together an offer strategy and the mechanisms that will allow you to have full control over the offers and discounts you will be presenting on your e-­store.

10. Blog (Content Marketing)

By keeping an updated blog, you get to:

  • Create targeted content search engines read thus leading visitors to your site.
  • Develop an "expert" profile on your subject, making visitors to trust you more.
  • Create a community of targeted audience that creates additional content on your website (enabling visitors’ comments).
  • Reveal your personality so that guests will have one more reason to buy from you, as many of them will identify with you. That way you avoid the mere comparison of prices, especially if you sell standardized products or services.
  • Get feedback from the market, and you can stay targeted on the needs of your audience.

We would advise you to have the blog be embedded on your website. Don’t have it in another domain or subdomain. It could be in a subfolder such as example.com/blog.

At Netstudio we chose to base the online stores we make on the Drupal platform. That way we can always enrich the blog with the necessary functions in the same skin and administration environment as the online store’s:

  • Article posting as easy as writing in a simple text editor.
  • Easy integration of images, videos, PDF files.
  • Sortable articles (tagging).
  • Programmable publishing and unpublishing articles.
  • Access to a number of authors with different rights, such as writing, approval, publishing, unpublishing etc.
  • Display all or part of blog content to specific user groups.
  • Visitors’ comments published automatically or after screening (moderation).
  • Connection with Social Media for many and easy likes, shares, tweets, etc.

11. Newsletter (E-Mail Marketing)

In most successful online stores, email marketing is a basic channel of sales creation.

The cost/benefit ratio from sending informative emails (newsletters) is too important to ignore.

A complete e­mail marketing service should comprise the following:

  • The correct strategy respecting the moral code of newsletter dispatches. Whatever you do, do not engage in practices that could characterize you as a spammer.
  • A collection mechanism that lists the subscribers according to their interests.
  • A mechanism that will allow you to easily write and send emails.
  • Automated removal from email lists of people who wish to unsubscribe.
  • SPF Record and DKIM signing of sent emails, so that they will not end up in the recipients’ spam folders.
  • A mechanism that will provide you with detailed statistics on how many people received your email, how many of them read it, how many clicked a link and which link(s) they clicked on.
  • A mechanism that will allow you to experiment with different subject lines (A/B Testing).
  • Linking to Google Analytics, to track resulting sales performance and number of transactions.
  • Automated creation of user's lists with specific behavior in your online store for targeted e­mail marketing. E.g. customers who bought only once, or customers who put items in the basket but did not complete the checkout, or customers who bought from a particular product category or a specific product.

12. Social Media

Depending on your online store’s product line, social media (Facebook, Twitter, LinkedIn, Google+, Pinterest, Instagram, YouTube, etc.) can be another important source of sales, but also a tool to enhance your brand.

Using social media may be the subject of another book by itself. However, setting up your online store, make sure the backbones are in place:

  • Make it easy for the users to like, share, tweet, pin, etc.
  • Show the right image and title fit for each of the social media.
  • Provide the followers with continuous updates for major events, e.g. new offers or new arrivals.
Tip: You can use Facebook’s diagnostic tool at https://developers.facebook.com/tools/debug to check the validity of tags generated by your page relating to Social Media.

13. Continuous improvement

The online store’s results can be optimized and your business can become much more profitable, if you embed a culture of measurement, testing and continuous improvement.

The two main tools you can use are Usability Testing and Experiments (A/B Testing & Multivariate Testing).

Usability Testing

Both you and your website developer are so involved in what you do so that you cannot see what may possibly confuse the user. Just sit next to a friend and ask him to enter your online store and in a few minutes you will be able to see it through his or her eyes.

The standard usability testing process is very expensive and not every online store can afford it. At Netstudio we have developed http://www.userfeel.com, a remote usability testing tool that allows you to see a video with users performing the desired actions on your website, at a cost of $39. Usually, 5 usability tests are enough to reveal quite a lot and may lead to significant improvements for your website.

A/B Testing & Multivariate Testing

No matter how sure you are about the changes and improvements that you want to make on your page, it is advisable to measure their actual impact. Quite often, changes we believe they will bring an increase in sales end up causing a decrease.

Actually, you can play it safe. With A/B Testing and Multivariate Testing, you can test different variations in different groups of visitors simultaneously, and see which variation works best.

Watch the video on page https://www.netstudio.gr/conversion-rate-optimization-case-studies where we describe how we increased the conversion rate of our customers’ websites and online stores carrying out experiments on their websites.

Tip: You can use tools such as Optimizely, Convert or VWO to setup and perform your experiments.

13 + 1. Professional Design & Photography

All the above will yield more in the context of a professional design.

No matter how good products you have, or how well you describe them, either on site, on blog, on Facebook, or in a Newsletter, a smart skin will increase your prestige and rates. In other words, your website needs to look neat, and be easy to grasp and use.

Invest in:

  • A professional design of your corporate identity (logo, letterhead, business cards, folders, etc.).
  • Professional shooting of your merchandise, premises and team.
  • Professional design of your website, Facebook page and Newsletter.

You can ask for our consultation on how best you can implement all the above, or make them work for your online business.

You can appreciate the quality of our services with a look at some case studies.

Bottom Line

To some, e-­commerce seems like an easy solution that will bring customers from all over the world. To the down-­to­-earth, it’s more like a mountain of new skills and knowledge they need to conquer.

This guide aims to provide the basic guidelines for setting up a promising online store. It is not all there is to it, just the fundamentals.

Our advice is that, if you never had relative experience, you’d be better off hiring a consultant or an experienced online store development company. Their fees will be written off before you know it.

You can contact Netstudio and Yannis Karampelas via our contact form. We will be glad to hear your comments on this guide and give you everything you need as you are setting out for your online journey.

We wish you success!

The problem

If you own an e-shop, you know the process:: Orders come, you write the shipping vouchers by hand or through the software that your courier service has given to you, you print them, and you stick them on the packages. This has to be done quickly and with no mistakes.

The solution

Recently, we developed for a client the automation of this process. When an order is received, it automatically gets assigned a voucher ID. The client receives an email, SMS or both with a link to the tracking page. This page resides inside the e-shop, so the prestige of the site is increased. Alternatively, before the voucher creation, the shop owner checks the address for possible extra charges and informs the client. This automation reduces the time it needs to prepare the shipments to one third and keeps the client happy as he may check his shipment progress through the tracking page without having to call the e-shop. Finally, mistakes are gone, as the voucher gets printed with the data that the client has entered himself. For more info call us at +30 2108004447 or fill in the contact form.

The creation of new modules that add extra functionality on Drupal and make it work exactly the way we want has become a daily occupation of our programmers. We often realize that our team’s modules are necessary for other Drupal community developers. In such cases we feel obliged to provide for free the code that we wrote, in order to be used by everyone, with the same exact way that we are using all those awesome modules that have been developed and published on Drupal.org!

Two of our most recent modules that are published on Drupal.org is Entity Translation Export/Import and Node Translation XML sitemap.

Entity Translation Export/Import

This module provides the ability for mass export and import of content translations (nodes, categories, products). Of course one can translate content through Drupal’s translation UI and in most cases this is just enough. But there might be some cases, such as the existence of a large amount of content, in which massive export/import and editing in excel might save a lot of time.

Entity Translation Export/Import gives the ability by just pressing a single button to export as many as content type fields as we want. Then we can open the file in excel and translate the fields in all available languages. Finally again with the press of a button we upload the file.. and we are ready! The translations have been applied.

We benchmarked our content manager guy with both available ways. The results are enlightening:

 UI translationExcel translation
100 categories (terms)30 minutes7 minutes
100 products45 minutes10 minutes
100 pages translation (nodes)a couple of centuries... :)about 30 minutes

Node Translation XML sitemap

“Node Translation XML sitemap” doesn’t do anything extraordinary but it covers one very basic need. The ability of exporting xml sitemap of all the available languages of the site and not only from the original language.

It sounds a little bit odd that such a famous system like Drupal lacks this ability, but it is also makes sense. Drupal 7 has two ways of translating. Internationalization and Entity Translation. Internationalization was the basic way of translating in Drupal 6 and this was continued in version 7, at least in the beginning. In the meantime Entity Translation was developed which is expected to be the main translation mechanism for Drupal 8. So Entity Translation as a subsequent system it had some inconsistencies with many famous Drupal modules and one of them was XML sitemap. As a consequence, every site that uses the modern Entity Translation, mainly the more recent ones, are in need of Node Translation XML Sitemap in order to be able to export sitemap for all the languages.

Convert.comSome days ago, we released to the Drupal community a module that facilitates A/B Testing & Multivariate Testing through Convert.com.

Convert.com is a new generation experimenting tool that allows people with no coding capabilities to start optimizing their site.

Enable the module, go to the settings page (admin/config/system/convert), set it to ON and insert your account id. Then, you are set to go.

The module adds the Convert.com tracking code in your page's HEAD and also allows you to tag your pages using Drupal Tokens.

Finally, adds the revenue tracking js on the commerce checkout complete page, so you can have revenue as a tracked goal as well. You don't have to do anything to enable this, it is added automatically.

You can sign up at the convert.com service here. You can download the module from here. You can get more information about how the module works and how to integrate with convert.com here.

At Netstudio we have extensive experience on building, running and analyzing A/B and multivariate experiments, so if you need any help, feel free to contact us.

My name is Panagiotis Moutsopoulos and I am the most recent member of the Netstudio.gr team. I have been part of this great team for a few months but I never had the needed time to say "Hi!". Wondering about what I should write, I thought of what Ernest Hemingway used to think: “Do not worry. You have always written before and you will write now. All you have to do is write one true sentence. Write the truest sentence you know".

So, I've been a member of Drupal.org since 2009 but my first contact with Drupal was a few years before that, back in the 5.x era. I had just reached the end of my studies in university (Information Technology in the Technological Institute of Athens, actually) and I was used to build websites from scratch using plain PHP and MySQL. Well, Joomla existed but I still preferred using custom code. It might be that I didn’t like Joomla’s logic or that I had to pay money for some modules. The fact is that in a colleague’s screen I saw the Garland theme with the Druplicon. It was kind of weird. It seemed so weird that I wanted to explore it. What it is, what it does, who uses it and why! All these questions filled my mind and since I was used to check the various web applications found in the Ubuntu repositories (like EGroupware for example), I thought of testing the Drupal system too.

Long story short, I started reading the docs, hacking the core (and understanding why this is a bad thing!!!) and developing my custom modules from defining simple hook_form_alter()s to implementing payment methods for the Ubercart ecommerce system or processing images using the PHP GD image library. I also learnt jQuery in the process. So, after being burnt and having got my hands dirty many times with what I did wrong, I decided to write below a few statements and a few advices. Some of them are meant to be read from anyone in the WebDev community, whereas others are meant only for the Drupal community.

1) Don't ask for the solution. Discover it!

(if you have the time)

We will always find bugs in the code. May it be a module that doesn't do what it says, may it be a library that has a conflict with custom code. Bugs are always bound to survive and developers are bound to always be there to fix them. From the smallest function to the largest framework, everything comes down to basics eventually. In most cases, someone will have already asked the same question and you will be able to find it with a simple Google search or a more focused one like in StackOverflow or Drupal Issue queues.

Do not forget: There are times that it is needless to reinvent the wheel. If what you are trying to do is so extreme, or you will need more time doing it than having a benefit from the experience, it might be better if you asked a colleague. Just make sure you dedicate some time later on understanding how the code you may have copied works.

2) Don’t improvise! Use the tools you have!

(or at least have a knowledge of them and when you have to use them)

From a simple programming language to a full framework, the developer has some tools at his disposal and must know how to use them. If you know for example that the PHP function array_slice() exists, you will most possibly avoid for{} loops until a certain index is reached.  On the same track, if you know that there is an entity_load() function in Drupal, you will most certainly avoid querying the tables of the database to get the values you need. When choosing a toolbox, we use to choose it for the tools it offers and not for the wood or the iron we can get if we disband the hammer.

Do not forget: There are times that you will not able to do exactly what you want to. There are also times that if you do it the framework-way the whole process will take longer. For example, if you need the title of a node in a Drupal single-language website, using node_load() just for this might be a bit excessive. You could just db_select() or even better db_query(‘SELECT ...’) the node table. If you have knowledge of the tools you have in your possession, you will be more flexible. I wouldn’t want to give the benefit of flexibility away. Would you?

3) Check the server! Check the version! Beforehand!

(or upgrade if necessary)

When developing a new website or adding new features to an existing website, make sure that the client has specified the supported browsers and that the hosting company has specified the possibilities of the server. If the client needs IE6-support, in case of an intranet site where the users haven’t upgraded their Operating Systems for a very long time for example, you might want to make sure no border-radius or box-shadow or any other hocus-pocus CSS exists in your code. Hocus-pocus for the Middle-Aged IE6 that is... If you add features to a pre-existing website, you might also want to check its software version. May it be a JS or PHP framework, you must take the version into account. For example, the entity_language() function in Drupal was added in version 7.15. If you need this function and the website is built upon a version prior to 7.15 you should consider upgrading. On the other hand, make sure your production server has the same packages installed as your development server. It would be terrible if you couldn’t use file_get_contents() to get the contents of a URL you need because the hosting server is a shared plan and the allow_url_fopen setting is set to false.

Do not forget: You won’t be able to please everyone. You may get anxious, you may struggle to make everything work correctly with what the client and the server offers you, you may try again and again but some things are not meant to be. If you are sure you will get the job done much easier using a version of PHP >5.2, you’d better talk with your client about investing on an upgraded server.

4) Gain the experience of the Drupal or similar application process!

(even if it takes sometimes long)

I have the experience of the Drupal application process but I’m sure there are others like this too. It was easy to start developing a module. This part is always easy. I even remember a speaker in a conference telling us that it is much easier to forget security in web applications than in desktop applications. Web languages offer the possibility of displaying your content immediately and when you see immediate results, you can always say «Since it executes and displays correctly, it’s ok», but clearly it’s not. Till now, developing a custom module in Drupal is almost like writing a function or two {which are mostly hook_alter_*() functions} in a .module file and enabling it. After my experience with the Drupal application process, it seems this isn’t just that. There are coding standards that you won’t be able to miss if you want your module published in the community. My experience was with the UC Clear Roles module of Drupal 6 and there were many things I had missed. For example, when creating menu items through hook_menu() functions, you don’t need to enclose your string in t(). The system does it by itself and using t() over the default t() is just plain wrong. The website will still work. But you will have some translation issues. Other than that, I also discovered the Coder module.

Do not forget: Sometimes it may seem harsh when having done a great work and people tell you that you have to correct the comments and the lines that exceed the 80 characters-limit. Don’t take it too hard. There is a reason behind this. You won’t be able to understand the “why” until you succeed but it is definitely worth it.

5) Check how the core developers have made it!

(and file a patch if it’s faulty)

If someone knows how to do it better than anyone, it must be the core developers. They are the ones who created all the tools you have in your hand to start building your application. Check the code of a core module of the system you are using and get a glimpse on how the core developers have written their code. Don’t expect to start developing and implementing a new payment method in Drupal Commerce without having at first looked the DC core module implementing the Paypal method. You may succeed but it will be painless and useless.

Do not forget: Sometimes you will find bugs in the core documentation or modules. Don’t just fix the problem in your local environment without informing the developers. In Open Source systems especially, their power is the power of contribution from the community. Even if you don’t care about the community, at least think of this: If you don’t fix the problem, you will encounter it again in the future.

6) New technologies mean new possibilities!

(sometimes new troubles too)

Being a developer is not something you study in university and after graduation someone will tell you “That’s it! You ‘re ready! Congratulations!”. It definitely doesn’t go this way. Using document.getElementById() function when you have jQuery or any other JS framework loaded is like using the copy con DOS command to write a text file when all those editors exist out there. It’s worthless unless you want to add a Google Map in your application or if you are studying JS from zero point. You have to learn new technologies and test them. Clients will learn about them and ask for them. You can’t just say “I have studied B and in B I believe” when it has been overlapped by C and C++.

Do not forget: It’s not possible for a human being to study all and every new technology. You will get anxious and eventually give everything up. When having your first steps is when you need to get a glimpse of everything. After deciding your field of knowledge, you‘d better stick with it and just evolve and advance in it.

7) Secure your database! Secure your code! Secure your input!

(anyway you can)

Most web applications at this time require a database system to store their information. I’ll start from the basics. The user passwords should not be plaintext. You should encrypt them and then store them. If not even the administrator of the website may make the system reveal a user’s password, then this gives the system an integrity bonus. Another thing you should make sure when developing an e-shop system and the client needs credit card details stored in your system is this: make sure you store the data encrypted. No, MD5 algorithm won’t suffice. You should better consider using a salt algorithm for this kind of data. Just make sure your salt is not hard-coded but, instead, included in your code from a file outside your website’s root folder. You should also consider securing your code. Drupal modules are mostly functions doing nothing if you’re not Drupal. CSCart uses another mechanism for its files: it looks for a constant normally defined in its index file. If it’s undefined, die() is invoked and the process stops. Drupal’s contributed modules don’t have any .php extension too. One of the benefits of this, is that the developer may include them in his/her code but no one will be able to execute them since Apache only knows about .html and .php files. Files with a .module or .inc extension are no candidates of being executed.

Do not forget: Drupal has this simple but powerful function called check_plain(). It’s actually just a wrapper around the PHP built-in htmlspecialchars function but it gets the job done well enough. I have even found myself copying this wrapper in other systems to make sure the values the user submitted are going to reach the database without breaking anything. Well, dangerous strings will break but that’s a good thing I can assure you.

8) Cache what you can!

(don’t overdo it though)

From basic PHP to frameworks like Drupal, there are some mechanisms and some ways of caching the data you once produced in the same page request, in the session or somewhen in the past. For example, if a function returns a HTML string and doesn’t take any arguments, you might want to use the static keyword to declare the variable holding the output and return this when non-empty instead of recreating the value. You might also want to store values in the $_SESSION variable, like the email, the full name and other personal details, to prepopulate the fields the user has already filled but left the form page. Drupal also offers various mechanisms for caching forms, blocks, entities, views and other elements in database and these values can be used later in the day to save regeneration.

Do not forget: Don’t overdo it! Using static variables increases the memory footprint and using the $_SESSION variable to store HTML is not the best thing to do. You can always store the values you need in session and have a HTML template file for the static content.

9) Run cron outside Drupal!

(or even more outside)

Drupal 6 without Poormanscron module required a cron job to make the website’s cron run. In Drupal 7 this is no longer required since every time a user views your website, if a certain time has passed since the last time, cron will run. This has some drawbacks though. This means that the visitor running cron will have a slower response. This also means that if no one reaches your site for a certain day, cron will not run. To avoid all this, or if you need cron to run every minute for example, you should set a cron job from an external source. As for how to do this, you should consider checking the drupal docs.

Do not forget: Drupal runs each module’s hook_cron() based on the module’s name and weight. If a module’s cron execution takes longer than desired, you have at least two ways of solving your problem. One way is to create an external file which will include the drupal bootstrap and call from there your desired function. You may find information on how to do that in Navin S Nayan’s blog. The other way is to install and enable contributed modules like Elysian Cron or Ultimate Cron and decide how often each hook_cron() will get executed. This way, you may set, for example, the core’s functions to get executed once per hour but your custom module’s hook to get executed every five minutes.