which-cms-is-fastest-?-drupal,-wordpress-or-joomla?

While you are building a website or maybe modifying to make it better; choosing which type of CMS( Content Management System) would be most suitable for your niche of business would be essential in the process. Many businesses use this system for building a blog, or website. It makes it a lot easier for people to create an alluring website, even if they have no designing experience. With CMS, people can include pictures or making edits to the key pages. They can take aid from a professional WordPress development company to run this CMS on a website. 

We all know that content is an essential pillar of any website. In fact, content is King in the world of marketing. Therefore, we need a strong content management platform to manage all the content we want on our website. But while we are on a CMS comparison blog among the 3 industry leaders, but first let’s get the basics right while learning about: 

What Exactly is CMS?

The break of this acronym is a Content Management System. As the name suggests, this is a software that takes care of all content on your website. It allows users to create, manage, and modify content without having a requirement for specialized technical knowledge.  In order words, if coding is not one of your talents, then this software would be a bliss to you! So if you’re not a coding genius, you know who can be your content savior. 

CMS is now evolved even to a greater extent. It is not limited to deal with the looks of content on a website, but users can now take advantage of features like, track user sessions, handle searches, comments sections, offer forums like content form and the list continues! 

60% of marketing professionals used CMS (Content Management System) to support content marketing efforts in demand generation.

Still in doubt to use CMS for your website? We hope not!

While we are on the hunt for finding the best possible CMS system for you, let’s compare the 3 pioneers of the industry. 

WordPress

WordPress is an open-source website tool, available online. This tool for CMS is written in PHP. WordPress is used by 35% of web bloggers and news sites online. 

This is platform might be the easiest CMS to use and has gained great popularity among the beginners. You can this for designing small and medium websites with simple creative exposure. WordPress is also induced with multiple powerful features which have made a favorable choice for trained web developers and designers. With this platform, they can build efficiently performing and alluring sites for clients. People can use WordPress for establishing blog websites or news sites and more. 

For anyone who is searching for an uncomplicated website, WordPress could be their best possible option, in which they can see real-time changes as they apply changes on their website. The best part about this is that you can simply download and deploy on your hosting in just 5 min, no strings attached. 

WordPress, Joomla, and Drupal are all free to use! You can download and deploy them on your hosting right now; no strings attached.

Benefits 

WordPress is easy-to-use for beginners as well. You don’t have to be an expert while working on this platform. The interface and functions are simple and intuitive to understand, with a hint of complexity in it.

With WordPress, you can create websites that are optimized for mobile use. It ensures that user experience is not compromised when changing the device. The website will adjust in accordance with the screen size.

SEO is essential when talking about promotion, branding of services or products. Although there are multiple third-party SEO plugins to assist in optimizing the content that you wish to share; but WordPress allows these practices to get initiate successfully on your website. 

Drupal 

Another Content Management System (CMS) is open-source, which implies that anyone can download it for free and use it as per their requirement. People are required to have a basic understanding of HTML, CSS, and PHP. Drupal was first developed for the student but it has gained its flexibility and availability. There are 617,691 live sites, made from Drupal Development. This software is not really suggested to beginners since it requires some high-end technological skills. Drupal is an extremely SEO friendly CMS.   

Benefits

Drupal is probably one of the most versatile CMS among the other competitors. There are numerous modules for you to choose from. Drupal is like a superhero who can do almost everything that is required from a CMS. it is easy to extend this system and the availability of customization will make it easier for you to twitch the website, according to your preference.

If you have the required skills, Drupal would be bliss for you as it supports multiple websites. Although it is slightly complicated to use, if you know how to code, then Drupal would be the best option for you to support multiple websites with a single code. 

Joomla 

Joomla is another CMS that is available for free. This indicates that it is available open-source content management system(CMS). If your website is made to rock on the social media stage, then Joomla is what you should go for. This CMS is great for eCommerce websites as well. Some of the best examples for websites that run on Joomla is Pizza Hut and Kellogs’. This is another intermediate CMS that requires basic technical skills.  Talking about the complexity, Joomla lies somewhere above WordPress but below Drupal. 

Benefits 

If your website consists of large articles, then Joomla would be offering the best of an interface to showcase them. It’s user-friendly and is immensely easy to use.

Joomla has a hand-full of extensions which allows user to enlist their product as well content, all at one place.

There are various categories of extensions that users can utilize. Using these users can improve the content on the website. The pre-provided modules, templates, languages have different characteristics, within which, users can choose according to their preferences. 

Final Words

Now that we have discussed all the major CMS available while comparing them. We can conclude the results by the following points: 

Talking about WordPress, this CMS is for anyone who requires something simple and quick to install. It is preferably a good choice for any code rookie.  WordPress is easy to customize and there are a plethora of templates that are available for you. 

Joomla, on the other hand, is a bit more advanced than WordPress. People who are here to impress social network and/or have an eCommerce business to boost, Joomla might be a way to go. Simple knowledge of PHP would be enough for t get started with Joomla. 

Drupal is the most advanced of these 3, as this CMS is very powerful and best suited for trained professionals. 


This comparison would help you make an informed decision while choosing a CMS, best suited for you, among these three popular CMSs. If you don’t have the required resources to make this work, you can hire a WordPress web development company or professional developers that can provide you the required assistance.

which-martech-workshop-will-you-choose?

Senior-level marketers like you will attend MarTech next April for actionable tactics and proven strategies that solve pressing marketing technology and operations challenges. Two intense days of expert-led sessions, illuminating keynotes, and networking with a thriving community of like-minded professionals… what more could you want?

What’s that? You want more? The MarTech workshops were designed for overachievers like you.

These immersive, half-day training seminars — led by recognized industry experts — dive deep into specific aspects of modern marketing and deliver practical insights you can implement immediately. Here’s a look at some of the workshops coming to San Jose, Wednesday, April 15 and the experts who will lead them:

Keep reading for more details!

The Right Way to Buy Marketing Technology

Instructor: Tony Byrne, founder of Real Story Group

Who Should Attend: Marketers charged with identifying, evaluating, and negotiating the purchase of marketing software.

What You’ll Learn:

  • How to efficiently distinguish among features, architectures, cost, and ecosystems
  • How to drive an agile, test-based selection process that engages your peers as advocates for the right solution
  • How to adopt this methodology for selecting digital agencies and other consulting firms
  • How to benefit from case studies and those who have gone before you


    The major pros and cons of the key martech cloud/suite players

Using CDP to Make the Most of Your Customer Data

Instructor: David M. Raab, founder of the Customer Data Platform Institute

Who Should Attend: Marketers new to customer data management or charged with overhauling their existing (read: messy) system and practices.

What You’ll Learn:

  • What Customer Data Platforms are and how to define your organizations’ needs
  • How to assess technical or organizational factors that could affect CDP success
  • How to quickly identify the most relevant vendors
  • How and when to write an RFP
  • How to ensure a quick and successful deployment

Agile Marketing Advantage

Instructor: Andrea Fryrear, President and Lead Trainer for AgileSherpas

Who Should Attend: Marketing leaders looking to improve their teams’ performance by applying “agile” or “lean” methods in the workplace

What You’ll Learn:

  • How the agile mindset informs new ways of working inside marketing teams
  • Case studies and hands-on exercises that prove modern marketing demands an agile process
  • How to put agile into practice, including Andrea’s 100% customized approach just for marketers
  • How to get the most from agile with practical advice for designing roles, leadership, and team structure.
  • How to roll out agile methods at a pace that ensures team and departmental success.

Creating Connected Experiences

Instructor: Jeff Cram, Chief Strategy Officer and co-founder of Connective DX

Who Should Attend: Marketers responsible for orchestrating seamless digital customer experiences and maximizing the full potential of existing martech investments (yep, they’re connected!)

What You’ll Learn:

  • How digital experience mapping can inform organizational alignment and help prioritize areas of improvement
  • The most frequent challenges for organizations trying to better connect their marketing technology and what you can do to overcome them
  • How content can help bind your teams and digital experiences together
  • How to assess your organization’s preparedness to create connected experiences
  • How you get more from your existing personas and better align customer insight programs with martech implementations.

A Marketer’s Guide To Attribution Analysis

Instructor: Christopher Penn, Co-Founder and Chief Data Scientist at Trust Insights

Who Should Attend: Marketers who want to get a better handle on attribution by using the tools they already have.

What You’ll Learn:

  • Why attribution analysis is important
  • Why attribution analysis is broken
  • What kinds of attribution models exist
  • How to get started with 5 different kinds of models
  • What’s state-of-the-art in attribution modeling today

Get the most out of MarTech!

Add one of these outstanding workshops to your itinerary today… they’re the perfect way to jumpstart your conference experience and maximize your time and investment.

Choose your pass:

  • All Access Pass Workshop (best value!): The complete MarTech experience, including all sessions, keynotes, and amenities, plus your choice of half-day intensive workshop. Register by February 15 and save $900 off on-site rates!
  • Workshop Only: Interested in just a workshop? Register by February 15 and save $450 off on-site rates. (This pass also gets you complete access to the Expo Hall April 15-17, select networking — including the 2020 Stackie Awards — refreshments, WiFi, sponsored sessions, and more.)
  • Team Package: MarTech is a fabulous option for your 2020 company outing. Attend as a group for a unique team-building experience and lock in extra savings while you’re at it.

Register by year end to use up leftover 2019 budget… and I’ll see you in San Jose 🙂



About The Author

Lauren Donovan has worked in online marketing since 2006, specializing in content generation, organic social media, community management, real-time journalism, and holistic social befriending. She currently serves as the Content Marketing Manager at Third Door Media, parent company to Search Engine Land, Marketing Land, MarTech Today, SMX, and The MarTech Conference.



study:-which-digital-ad-formats-are-most-effective?

A new report published by mobile ad company Kargo found that ad viewability does not directly correlate to memorability. Similarly, the report also indicated that ad visibility does not necessarily yield higher user engagement. 

Kargo’s study distinguished the correlation between viewability of an ad unit and its memorability (ad effectiveness), examining the following formats: Instagram ads, large format in-article mobile ads, Kargo pinned mobile ads, mobile gaming in-app ads, and desktop ads.

Viewability vs. memorability across digital ad formats

Instagram among the highest in ad effectiveness. Despite the low share of sessions reported at 1.9%, Instagram proved to be 8.3x more effective than gaming and 5.4x more than desktop with 77% of participants looking at an ad at some point during their session. Instagram generated an ad effectiveness score of 10.8%, which was also matched by large-format in-article mobile ads.

Large-format in-article ads just as effective as Instagram ads. These ads also scored 10.8% in ad effectiveness with 4.1% share of sessions. The ads had a 50% viewability rate. The study determined that mobile web ads offer a lucrative format for amplifying social efforts within existing contextual environments.

Kargo’s pinned mobile ads 2x more effective than desktop ads. Kargo’s “Breakout” and “Sidekick” ad units – which display as a fixed block at the bottom of articles – ranked third in ad effectiveness at 3.9% with 90% viewability. By using a basic banner format and adding animation, these smaller format units were analyzed to test if creative enhancements alone could result in a higher share of session and attention.

In-app gaming banner ads showed lowest ad effectiveness.  While in-app game banners were highly visible (90% viewability) according to Kargo’s study, they were rarely looked at and resulted in only 1.3% ad effectiveness. Almost 98.5% of the time that the ad was in-view, it was not being looked at, and claimed only 1.5% share of total sessions. Furthermore, ad recall for these ads was extremely low, with participants claiming there were no lasting impressions around the brands or products being advertised.

Desktop banners second-lowest ad effectiveness of all platforms. Kargo exposed participants to sidebar banner ads on desktop. While these ads had an 80% viewability rate, they were only looked at an average of 1.9% of the total session time and represented 2% ad effectiveness.

Ad recall by platform

In addition to tracking viewability, Kargo also measured the effectiveness of each platform by how well respondents accurately recall the brands that were advertised.

Among the respondents who were exposed to at least one ad, pinned mobile web ads and large format in-article ads outperformed the other platforms in ad recall by 29%.

Additionally, participants in the mobile web group were tasked with selecting the brands they recall from a list, of which 60% selected at least one of the four brands tested.


Source: Kargo | Mobile web recall is significantly higher than gaming or desktop at 90% confidence | Base: Total respondents exposed to at least one ad; Mobile web n=126, Game n=119, Instagram n=107, Desktop n=112

Why we should care

The study findings indicate that in-app gaming and pinned mobile web ads demonstrated the highest rate of viewability, despite in-app ads producing extremely low ad recall. In contrast, Instagram and in-article mobile ads yielded the highest ad effectiveness and ad recall – while not being considered the most viewable.

“In order to deliver a successful ad experience today, brands need to consider if their creatives actually depict a clear message and resonate with consumers,” said Harry Kargman, CEO and founder of Kargo.

Factors such as ad creative, messaging, and digital placement can greatly impact how consumers are exposed to ads, and whether or not they are memorable.

The metric of viewability implies that an ad format has a greater opportunity to make an impression on audiences the longer it’s in-view, but Kargo’s findings show that viewability alone isn’t a consistent indicator of the ad’s lasting effect. Digital advertisers should consider that while an ad may have been “viewable,” it doesn’t necessarily mean that it was memorable.



About The Author

Taylor Peterson is Third Door Media’s Deputy Editor, managing industry-leading coverage that informs and inspires marketers. Based in New York, Taylor brings marketing expertise grounded in creative production and agency advertising for global brands. Taylor’s editorial focus blends digital marketing and creative strategy with topics like campaign management, emerging formats, and display advertising.



api-design:-which-version-of-versioning-is-right-for-you?
this article describes some of Google’s investments to make it work. It is usually much better for API providers to treat internal users and partners as if they were external consumers whose development process is independent.

Choosing the appropriate technique

You can probably see already that format version and entity versioning are fundamentally different techniques that solve different problems with different consequences, even though they both sail under the flag of versioning.

So when should you choose to do format versioning versus entity versioning? Usually the business requirements make the choice obvious.

In the case of the bank, it isn’t feasible to introduce a new entity version of an account in order to enable an API improvement. Accounts are stable and long-lived, and moving from old accounts to new ones is disruptive. A bank is unwilling to inconvenience its banking customers just to make life better for API developers. If the goal is just to improve the API, the bank should pick format versioning, which will limit the sort of changes that they make to superficial improvements.

The bank should consider introducing a new entity version if there’s significant new value that it wants to expose to its banking customers, or if it’s forced to do so for security or regulatory reasons. In the case of blockchain accounts, there may be publicity value as well as practical value. Entity version upgrades are less common than format versioning changes for established services, but they do happen; you may have received messages from your bank telling you about a significant technology upgrade to your accounts and alerting you to actions you need to take, or changes you will see.

Entity versioning puts an additional burden on API clients, because the older clients cannot work with the newer entities, even though they continue to work unchanged with the older ones. This puts pressure on client developers to produce a new client application or upgrade an existing one to work with the new API.

Entity versioning can work well for technology products, where the the users of the API and the core customers are often one and the same and rapid obsolescence is considered normal.

How do you implement the different versions of versioning?

On the web, you often see conflicting advice on whether or not a version number should appear in the URLs of a web API. The primary alternative is to put the version ID in an HTTP header. The better choice depends on whether you’re doing format versioning or entity versioning.

For format versioning, put the version identifier in an HTTP header, not in the URL. Continuing the banking example, it’s conceptually simpler for each account to have a single URL, regardless of which format the API client wants to see it in. If you put a format version identifier in the URL, you are effectively making each format of each entity a separate web resource, with some behind-the-scenes magic that causes changes in one to be reflected in the other.

Not only is this a more complex conceptual model for users, it also creates problems with links. Suppose that in addition to having an API for accounts, the bank also has an API for customer records, and that each account contains a link to the record for the customer that owns it. If the developer asks for the version 2 format of the account, what version should be used in the link to the customer record? Should the server assume that the developer will also want to use the version 2 format of the customer record and provide that link? What if customer records don’t even have a version 2 format?

Some APIs that put version identifiers in URLs (OpenStack, for example, and at least one bank we know) solve the link problem by having a “canonical” URL for each entity that’s used in links, and a set of version-specific URLs for the same entity that are used to access the entity’s format versions. Clients that want to follow a link have to convert a canonical URL in a link into a version-specific URL by following a documented formula. This is more complex for both the provider and the client; it’s simpler to use a header.

The usual objection to putting format version identifiers in a header is that it’s no longer possible to simply type a URL into a browser to test the result of a GET on a specific version. While this is true, it’s not very hard to add headers in the browser using plugins like Postman, and you’ll probably have to set headers anyway for the Authorization and Accept headers. If you’ew using the cURL shell command to test your API, adding headers is even simpler. You’ll also need more than just the browser to create, update or delete requests to your API, so optimizing for GET only helps for one scenario. Your judgement may be different, but I have never found it very onerous to set a header.

There’s no standard request header that’s ideal for the client to say what format version it wants. The standard “Accept” header specifies which media types the client can accept (e.g., json, yaml, xml, html, plain text), and the standard “Accept-Language” header denotes which natural languages the client can accept (e.g., French, English, Spanish). Some API designers (e.g., the authors of the Restify framework) use a non-standard header called “Accept-Version”. If you’re doing format versioning, I recommend this header. The standard “Accept” headers allow the client to give a list of values they accept, and even provide a weighting for each. This level of complexity isn’t necessary for “Accept-Version”; a single value is enough. If you’re meticulous, you should set a corresponding “Content-Version” header in the response. Further, it can be useful for clients if the server also puts the format version in the body of the response; in fact, if the representation of one resource is embedded in another, the body is the only place to put it. [This argument applies to a number of the standard headers too: e.g., Etag, Location, and Content-Location.]

By contrast, if you’re doing entity versioning, the version identifier will appear somewhere in the URL of each entity—usually either in the domain name or the path. Users of the API do not have to be aware of this; for them, it’s just the entity’s URL. The version identifier will appear in the URL because the URL has to contain information for two different purposes: for routing requests to the correct part of the implementation for processing, and for identifying the entity within that implementation. Because requests for entities that belong to two different entity versions are almost always processed by a different part of the implementation or use different storage, the version identifier (or a proxy for it) must be somewhere in the URL for your routing infrastructure or implementation to use.

Coincidentally, banking provides a simple illustration of the principle that identifiers contain information for both routing and identification. If you have a checking account at a U.S. bank (the details are different in other countries, but the idea is similar), you’ll find two numbers at the bottom of each check. The first is called the routing number. It identifies the institution that issued and can process this check. The second number identifies the check itself. Conceptually, entity URLs are like the numbers at the bottom of a check, though their formats may be different.

Do I have to define my versioning strategy up front?

You’ll sometimes hear the advice that you must define a versioning strategy before you release your first version, or evolving your API will be impossible. This is not true.

You can always add a new versioning header later if you find the need to do format versioning and you can always add new URLs for new entities for a different entity version. Any requests that lack the format versioning header should be interpreted as meaning the first format version. Since instances of a new entity version get new URLs, you can easily introduce a version ID in those URLs without affecting the URLs of the entities of the first version. The new URLs may use a new hostname rather than adding path segments to URLs on the original hostname; whether or not you like that option will depend on your overall approach for managing hostnames.

Procrastination can be good

Laziness is not the only reason why you might not add versioning to the initial version of your API. If it turns out that versioning is never needed for your API, or for significant portions of your API, then the API will look better and be easier to use if it doesn’t include versioning in its initial release.

If you introduce an “Accept-Version” header in V1 of your API in anticipation of future “format versions” that never materialize, then you force your clients to set a header unnecessarily on every request.

Likewise, if you start all your URLs with the path prefix ‘/v1’ in anticipation of future “entity version” introductions that never happen, then you make your URLs longer and uglier than they need to be.

More importantly, in both cases you introduce a complex topic to clients that you didn’t need to introduce.

Some more versioning tips

If you use versioning, make it clear what sort of versioning you use. If there’a a field in your HTTP requests and responses that says “version: V1,” what does that mean? Does V1 apply to the persistent entity itself (entity versioning), or does it reflect the format in which the client asked to see the entity (format versioning)? Having a clear understanding of which versioning scheme or schemes you use helps your users understand how to use your API as it evolves.

If you’re using format versioning and entity versioning together, signal them with different mechanisms. Format versions should go in headers—Accept-Version and Content-Version—in the request and response. Format versions can also be included in the bodies of responses and requests, for those requests that have them. Entity versions (which are really part of the entity type) belong in the request and response bodies; they’re part of the representation of the entity.

Do not try to put versioning identifiers of either kind or entity type identifiers into the standard Accept or Content-Type headers; those headers should only include standard media types like text/html or application/json. Avoid using values like application/v2 json or application/customer json; the media-type is not the place to try to encode version or type information. Unfortunately, even some of the web standards do this the wrong way, for example application/json-patch json.

Don’t put words like “beta” or “alpha” in version IDs for either format versioning or entity versioning. When you move from alpha to beta, or beta to general availability, you’re making a statement about your level of support for the API, or its likely stability. You don’t want to be in a position where the API version changes just because your level of support changes; you only want to change the version if there’s a technical or functional reason for changing it. To illustrate this point, imagine I am a customer who develops a number of client applications that are using the V1beta4 version of an interface—a late-beta version. The API provider declares the product to be GA, and introduces the V1 version of the API, which is actually exactly the same as the V1beta4 API, since there were no breaking API changes between V1beta4 and GA. The V1Beta4 version of the API is still available, so my client applications don’t break, but the language of the support agreement is clear—only users of the V1 version get full product support. The change to my client applications to upgrade to V1 is small—I only have to change the version number I’m using, which may even be as simple as recompiling with the latest release of the vendor-provided client libraries—but any change to my applications, no matter how small, needs to go through a full release process with QA testing, which costs me thousands of dollars. This is very annoying.

Hopefully this post helps bring a little more clarity to the topic of API versioning, and helps you with your design and implementation choices. Let us know what you think.

For more on API design, read the eBook, “Web API Design: The Missing Link” or check out more API design posts on the Apigee blog.

“>

One of these formats encodes the list of characters as a JSON object keyed by the characters’ name, and the other encodes it as a JSON array. Neither are right or wrong. The first format is convenient for clients that always access the characters by name, but it requires clients to learn that the name of the character is to be found in the place that a property name is usually found in JSON, rather than as a property value. The second format does not favor one access pattern over another and is more self-describing; if in doubt, I recommend you use this one. This particular representation choice may not seem very important, but as an API designer you’re faced with a large number of options, and you may sometimes wish you had chosen differently.

Sadly, there’s no practical way to write API clients that are insensitive to name changes and changes in data representation like these. A version format allows you to make changes like this without breaking existing API clients.

Browsers are able to survive HTML webpage changes without versioning, but the techniques that make this work for browsers—e.g., the ability to download and execute client code that is specific to the current format of a particular resource, enormous investment in the technology of the browser itself, industry-level standardization of HTML, and the human user’s ability to adapt to changes in the final outcome—are not available or practical for most API clients. An exception is when the API client runs in a web browser and is loaded on demand each time an API resource is accessed. Even then, you have to be willing to manage a tight coordination between the team producing the browser code and the team producing the API—this doesn’t happen often, even for browser UI development within a single company.

A very common situation that usually requires an entity version change, rather than just a format version change, is when you split or merge entity hierarchies. In the bank example, imagine that Accounts belong to Customers, and each Account entity has a reference to the Customer it belongs to. Because some customers have many Accounts, the bank wants Accounts to be grouped into Portfolios. Now Accounts need to reference the Portfolio they belong to, not the Customer, and it’s the Portfolio that references the Customer. Changes like this are hard to accommodate with format versions, because older clients will try to set a property linking an Account to a Customer and newer clients will try to set a property linking an Account to a Portfolio. You can sometimes find ways to make both sets of clients work in cases like this, but more often you are forced to introduce new entity versions, each of which is updated using only one API format.

The sort of structural changes that force a new entity version usually introduce new concepts and new capabilities that are visible to the user, whereas the changes handled by format version changes are more superficial.

In general, the more clients an API has, and the greater the independence of the clients from the API provider, the more careful the API provider has to be about API compatibility and versioning.

Providers of APIs sometimes make different choices if the consumers of the API are internal to the same company, or limited to a small number of partners. In that case they may be tempted to try to avoid versioning by coordinating with consumers of the API to introduce a breaking change. In our experience this approach has limited success; it typically causes disruption and a large coordination effort on both sides. Google uses this approach internally, but at considerable cost—this article describes some of Google’s investments to make it work. It is usually much better for API providers to treat internal users and partners as if they were external consumers whose development process is independent.

Choosing the appropriate technique

You can probably see already that format version and entity versioning are fundamentally different techniques that solve different problems with different consequences, even though they both sail under the flag of versioning.

So when should you choose to do format versioning versus entity versioning? Usually the business requirements make the choice obvious.

In the case of the bank, it isn’t feasible to introduce a new entity version of an account in order to enable an API improvement. Accounts are stable and long-lived, and moving from old accounts to new ones is disruptive. A bank is unwilling to inconvenience its banking customers just to make life better for API developers. If the goal is just to improve the API, the bank should pick format versioning, which will limit the sort of changes that they make to superficial improvements.

The bank should consider introducing a new entity version if there’s significant new value that it wants to expose to its banking customers, or if it’s forced to do so for security or regulatory reasons. In the case of blockchain accounts, there may be publicity value as well as practical value. Entity version upgrades are less common than format versioning changes for established services, but they do happen; you may have received messages from your bank telling you about a significant technology upgrade to your accounts and alerting you to actions you need to take, or changes you will see.

Entity versioning puts an additional burden on API clients, because the older clients cannot work with the newer entities, even though they continue to work unchanged with the older ones. This puts pressure on client developers to produce a new client application or upgrade an existing one to work with the new API.

Entity versioning can work well for technology products, where the the users of the API and the core customers are often one and the same and rapid obsolescence is considered normal.

How do you implement the different versions of versioning?

On the web, you often see conflicting advice on whether or not a version number should appear in the URLs of a web API. The primary alternative is to put the version ID in an HTTP header. The better choice depends on whether you’re doing format versioning or entity versioning.

For format versioning, put the version identifier in an HTTP header, not in the URL. Continuing the banking example, it’s conceptually simpler for each account to have a single URL, regardless of which format the API client wants to see it in. If you put a format version identifier in the URL, you are effectively making each format of each entity a separate web resource, with some behind-the-scenes magic that causes changes in one to be reflected in the other.

Not only is this a more complex conceptual model for users, it also creates problems with links. Suppose that in addition to having an API for accounts, the bank also has an API for customer records, and that each account contains a link to the record for the customer that owns it. If the developer asks for the version 2 format of the account, what version should be used in the link to the customer record? Should the server assume that the developer will also want to use the version 2 format of the customer record and provide that link? What if customer records don’t even have a version 2 format?

Some APIs that put version identifiers in URLs (OpenStack, for example, and at least one bank we know) solve the link problem by having a “canonical” URL for each entity that’s used in links, and a set of version-specific URLs for the same entity that are used to access the entity’s format versions. Clients that want to follow a link have to convert a canonical URL in a link into a version-specific URL by following a documented formula. This is more complex for both the provider and the client; it’s simpler to use a header.

The usual objection to putting format version identifiers in a header is that it’s no longer possible to simply type a URL into a browser to test the result of a GET on a specific version. While this is true, it’s not very hard to add headers in the browser using plugins like Postman, and you’ll probably have to set headers anyway for the Authorization and Accept headers. If you’ew using the cURL shell command to test your API, adding headers is even simpler. You’ll also need more than just the browser to create, update or delete requests to your API, so optimizing for GET only helps for one scenario. Your judgement may be different, but I have never found it very onerous to set a header.

There’s no standard request header that’s ideal for the client to say what format version it wants. The standard “Accept” header specifies which media types the client can accept (e.g., json, yaml, xml, html, plain text), and the standard “Accept-Language” header denotes which natural languages the client can accept (e.g., French, English, Spanish). Some API designers (e.g., the authors of the Restify framework) use a non-standard header called “Accept-Version”. If you’re doing format versioning, I recommend this header. The standard “Accept” headers allow the client to give a list of values they accept, and even provide a weighting for each. This level of complexity isn’t necessary for “Accept-Version”; a single value is enough. If you’re meticulous, you should set a corresponding “Content-Version” header in the response. Further, it can be useful for clients if the server also puts the format version in the body of the response; in fact, if the representation of one resource is embedded in another, the body is the only place to put it. [This argument applies to a number of the standard headers too: e.g., Etag, Location, and Content-Location.]

By contrast, if you’re doing entity versioning, the version identifier will appear somewhere in the URL of each entity—usually either in the domain name or the path. Users of the API do not have to be aware of this; for them, it’s just the entity’s URL. The version identifier will appear in the URL because the URL has to contain information for two different purposes: for routing requests to the correct part of the implementation for processing, and for identifying the entity within that implementation. Because requests for entities that belong to two different entity versions are almost always processed by a different part of the implementation or use different storage, the version identifier (or a proxy for it) must be somewhere in the URL for your routing infrastructure or implementation to use.

Coincidentally, banking provides a simple illustration of the principle that identifiers contain information for both routing and identification. If you have a checking account at a U.S. bank (the details are different in other countries, but the idea is similar), you’ll find two numbers at the bottom of each check. The first is called the routing number. It identifies the institution that issued and can process this check. The second number identifies the check itself. Conceptually, entity URLs are like the numbers at the bottom of a check, though their formats may be different.

Do I have to define my versioning strategy up front?

You’ll sometimes hear the advice that you must define a versioning strategy before you release your first version, or evolving your API will be impossible. This is not true.

You can always add a new versioning header later if you find the need to do format versioning and you can always add new URLs for new entities for a different entity version. Any requests that lack the format versioning header should be interpreted as meaning the first format version. Since instances of a new entity version get new URLs, you can easily introduce a version ID in those URLs without affecting the URLs of the entities of the first version. The new URLs may use a new hostname rather than adding path segments to URLs on the original hostname; whether or not you like that option will depend on your overall approach for managing hostnames.

Procrastination can be good

Laziness is not the only reason why you might not add versioning to the initial version of your API. If it turns out that versioning is never needed for your API, or for significant portions of your API, then the API will look better and be easier to use if it doesn’t include versioning in its initial release.

If you introduce an “Accept-Version” header in V1 of your API in anticipation of future “format versions” that never materialize, then you force your clients to set a header unnecessarily on every request.

Likewise, if you start all your URLs with the path prefix ‘/v1’ in anticipation of future “entity version” introductions that never happen, then you make your URLs longer and uglier than they need to be.

More importantly, in both cases you introduce a complex topic to clients that you didn’t need to introduce.

Some more versioning tips

If you use versioning, make it clear what sort of versioning you use. If there’a a field in your HTTP requests and responses that says “version: V1,” what does that mean? Does V1 apply to the persistent entity itself (entity versioning), or does it reflect the format in which the client asked to see the entity (format versioning)? Having a clear understanding of which versioning scheme or schemes you use helps your users understand how to use your API as it evolves.

If you’re using format versioning and entity versioning together, signal them with different mechanisms. Format versions should go in headers—Accept-Version and Content-Version—in the request and response. Format versions can also be included in the bodies of responses and requests, for those requests that have them. Entity versions (which are really part of the entity type) belong in the request and response bodies; they’re part of the representation of the entity.

Do not try to put versioning identifiers of either kind or entity type identifiers into the standard Accept or Content-Type headers; those headers should only include standard media types like text/html or application/json. Avoid using values like application/v2 json or application/customer json; the media-type is not the place to try to encode version or type information. Unfortunately, even some of the web standards do this the wrong way, for example application/json-patch json.

Don’t put words like “beta” or “alpha” in version IDs for either format versioning or entity versioning. When you move from alpha to beta, or beta to general availability, you’re making a statement about your level of support for the API, or its likely stability. You don’t want to be in a position where the API version changes just because your level of support changes; you only want to change the version if there’s a technical or functional reason for changing it. To illustrate this point, imagine I am a customer who develops a number of client applications that are using the V1beta4 version of an interface—a late-beta version. The API provider declares the product to be GA, and introduces the V1 version of the API, which is actually exactly the same as the V1beta4 API, since there were no breaking API changes between V1beta4 and GA. The V1Beta4 version of the API is still available, so my client applications don’t break, but the language of the support agreement is clear—only users of the V1 version get full product support. The change to my client applications to upgrade to V1 is small—I only have to change the version number I’m using, which may even be as simple as recompiling with the latest release of the vendor-provided client libraries—but any change to my applications, no matter how small, needs to go through a full release process with QA testing, which costs me thousands of dollars. This is very annoying.

Hopefully this post helps bring a little more clarity to the topic of API versioning, and helps you with your design and implementation choices. Let us know what you think.

For more on API design, read the eBook, “Web API Design: The Missing Link” or check out more API design posts on the Apigee blog.