Chevy vs. Ford.


Coke vs. Pepsi.


David Lee vs. Sammy.

In any group of enthusiasts there are classic debates that rage on year after year.

Content Management Systems (CMS) are no different.

Any time the topic of "What CMS to Use?" comes up, enthusiasts of different products immediately start pitching in on why their favorite CMS would be a better choice.

Often a given CMS is suggested because it's "better at SEO" (SEO being Search Engine Optimization. Just in case you didn't know).

We've got two things to say to that:

  • Most SEO has nothing to do with what CMS you use.
  • ExpressionEngine (our CMS of choice) is more than capable of handling the SEO ranking signals that a CMS is responsible for.

200 Ranking Signals

According to, Google looks at 200 Factors when deciding how to rank your content.

Go ahead, scan that list.

We'll wait.



So what did you see there? Most ranking factors are handled outside of the CMS:

  • Number and quality of backlinks
  • The quality of your content
  • The length of your content
  • Use of images with content
  • If the search keyword is in your title tag
  • Use of an SSL certificate (so your URL is "https://" rather than "http://")
  • If the site domain name matches the search keyword
  • Domain registration length
  • Number of social shares
  • Magnitude and frequency of content updates

These ranking factors are attributes of the content itself, the hosting environment, the domain, your ability to pimp your stuff on social media, etc.

Granted - some of these factors can be influenced by choice of CMS (if your content is easier to update you're more likely to do it more often, etc), but the vast majority of the known SEO ranking signals are outside the scope of the Content Management System.

How ExpressionEngine Handles SEO

Having said that, there are still ranking factors that a CMS should:

  • Completely automate
  • Allow the developer to configure
  • Let the end-user manage

We went through the list from and pulled out the ranking factors we think a CMS has its fingers in. Here's that list and how the ExpressionEngine CMS from EllisLab would handle them:

Keyword in Title Tag

ExpressionEngine has a default Title field in every channel. However, we prefer to create a dedicated channel field to populate the HTML Title tag (this lets the Channel Entry Title be different from what appears in the browser Title).

Either way, the title variable can be sent to a shared/centralized template that creates the HTML Title tag for every page on your website. This approach keeps the site's code DRY while making Google happy with unique META for every page.

Keyword in Description Tag

There's no default field for META Description in ExpressionEngine, but you can either take advantage of EE's channel fields and create a field for each Channel, or use a third party add-on like SEO Lite.

We prefer to keep our EE installs as close to "out of the box" as possible so stick with creating Channel Fields for the META Description value. You can set this field to be required so content managers don't leave it blank.

Duplicate Meta Information On-Site

When it comes to SEO, shortcuts are usually a dangerous path. It would be easy to use an add-on or put some code in ExpressionEngine templates that would check META Descriptions and drop in default text if the fields were left empty.

In this case, an empty value would be better than a default because then Google would find duplicate instances of the default value in your website and possibly penalize you for it.

Keyword Appears in H1 Tag

This is simple to do in ExpressionEngine. EE doesn't dictate your HTML structure so setting the H1 tag is as simple as: <h1>{title}<h1>

As long as the content manager puts the desired keyword in the Entry Title, it will appear marked up as an H1 on the website.

Keyword in H2, H3 Tags

While H1 tags are usually set automatically in an ExpressionEngine template, the lower-level heading tags can be handled in different ways.

Depending on the site design and how it's been coded, we can either set these programmatically by feeding other Channel Fields into them, or let the content manager create them using a WYSIWYG editor.

Keyword in URL

ExpressionEngine creates a URL title for you based on the Title you enter for each Entry - so if the keyword is in the Entry Title it will also be in the URL title. ExpressionEngine also allows content managers to over-write the default URL title so any combination or ordering of keywords can be manually specified.

URL Length

ExpressionEngine's default URL titles will often be longer than the 3-4 word recommendation from the SEO world, but again - since EE lets you overwrite the defaults your URL titles can be as short as you like.

URL String

When viewing categorized content the SEO world recommends category keywords in URL. ExpressionEngine offers this option natively when using Categories.

URL Path

The SEO world says a page with a fewer segments (closer to the base URL) may get a slight boost. ExpressionEngine sites used to suffer in this regard so you may find (or have) some lingering resistance in this area. Depending on what content you are pulling, EE's default URLs are created based on a combination of:

  • Template Group name
  • Template name
  • Category name
  • Pagination state
  • Date indicators
  • Entry URL title

This can lead to longer than desired URLs. However, ExpressionEngine 2.8 introduced Template Routes that allow the developer to shorten the URL structure.

Page Loading Speed via HTML

The speed a page loads into a web browser depends on a number of factors not having anything to do with the CMS - how fast your host is, how optimized their database is, etc.

But still, there are a couple of things to look at within the CMS.

ExpressionEngine is incredibly flexible for developers - there are often half a dozen ways to implement a given feature. With that flexibility comes opportunity for inefficient code.

Most of the slow EE sites we've run across are slow because they were poorly implemented, not because ExpressionEngine itself is inherently slow. If a given template is loading slowly, developers can:

There should be no reason pages on a well-designed and well-implemented ExpressionEngine-based website running on a quality host should take any longer than 2 seconds to load.

Duplicate Content

We think more people worry about this one than they need to - read this and this.

The reality with ExpressionEngine is you will have content that appears at multiple URLs. This usually happens with blogs where a post will appear at the blog index URL, a paginated URL, a category URL, and its specific URL, etc.

This isn't a new issue, nor is it unique to ExpressionEngine. We're confident Google is smart enough to not penalize sites in this situation.


Content with images tends to rank higher and using an image opens up some additional opportunities for SEO optimization. Image file names, alt text, titles and descriptions can all be tweaked for better results.

While possible using native features, it's not the most efficient. This is a case where we will install a 3rd party module to help out - namely DevDemon's Channel Images.

Channel Images makes it easy for content managers to bulk upload images, change file names, add alt text, titles and descriptions right in the ExpressionEngine entry form.

Recency, Frequency and History of Content Updates

Theoretically any CMS should allow content managers to actually maintain content. But different systems have different efficiencies.

The way ExpressionEngine thinks about content (as structured content types) usually means EE can offer a more efficient editing process. Content is stored centrally and presented in different places on the site - but one update in the EE Control Panel will change it everywhere on the website.

Content Editors don't have to know or manage HTML to make updates.

Bullets and Numbered Lists

People scan more than read on the web - and Google knows this. Content using lists will generally rank better than content without. ExpressionEngine enables content managers to add bulleted or numbered lists using the native Rich Text Editor.

Link Anchor Text & Title Text

In an ExpressionEngine site there are two types of links: links that EE creates dynamically at the template level and links that are created by content managers within a block of text.

Dynamic links have the anchor and title text set by the developer (and any content from a Channel field can be used). ExpressionEngine's Rich Text Editor provides an interface for content managers to create links, then specify the link anchor text and link title text. Microformats

Between ExpressionEngine's flexibility with Channel Fields and its "hands-off" approach with front-end code, Microformats are easily doable in ExpressionEngine.

Mobile Optimized

Google's recent decision to start penalizing sites that didn't have a mobile friendly design made a lot of waves in the business community (and generated a lot of business for web development shops).

ExpressionEngine has never dictated front-end code. EE can spit out an old-school table-based layout with spacer pixels, specific desktop and mobile sites, or a completely responsive design.

User Friendly Layout / Site Usability

These ranking factors are more on your designer than your CMS - but ExpressionEngine can dynamically power any design your creative types can throw at it. Any change you need to make to help your site be friendlier or more usable can be accomodated by ExpressionEngine.

Breadcrumb Navigation

With ExpressionEngine you can either create breadcrumb navigation with custom code at the template level, or use any of a number of third party breadcrumb add-ons.

Site Architecture

ExpressionEngine has the flexibility to render a site architecture in any number of ways. While content gets "normalized" and stored in discreet channels (one channel for each type of content is usually best), the site's front-end architecture is established using ExpressionEngine's:

  • Template Groups
  • Templates
  • Template Routes
  • Categories
  • Relationships
  • Pages Module

Using a carefully planned combination of these EE features will usually allow a developer to create any site architecture desired. If not, there are some 3rd party solutions to consider as well.

HTML Errors/W3C Validation

A website that renders out to the browser with code that validates according to W3C standards is the goal of any web developer worth their salt.

We've said it already, but ExpressionEngine leaves the front-end code almost entirely in the hands of the implementing developer. Very few EE tags return HTML (and the ones that return HTML by default can often be configured to not return it).

# of Linking Pages

The number of linking pages - even within the same site - is a ranking factor. This is usually where ExpressionEngine developers reach out for the Relationships Field.

By implementing Relationships you can:

  • Give content managers a list of articles to select as "related" to the current one.
  • Have EE build those links dynamically on the rendered web page.
  • Also display a link back to the "parent entry" from the "child entry".

You can also use Categories and simply display other articles that belong to the same Category.

WordPress Tags

This is a bit of a strange one. Without specific examples we're not clear on what Backlinko means by "Wordpress Tags" (see #50).

Nothing against Wordpress - but we're not aware of any special Google-juice for Wordpress sites (and it's strange to see this ranking factor attributed to the provider of a commercial SEO add-on for Wordpress). suggests that a WP tag just generates an index of related content at a keyword-specific URL like:

ExpressionEngine (and likely many other commercial CMS) could easily create that output in any number of ways.

Contact Us Page, Terms of Service Page, Privacy Page

ExpressionEngine can easily create these pages and list the appropriate content.

Number of Pages

In general - the bigger the site the more likely it is that the pages will be found in Google search results. A well-built ExpressionEngine site will allow content managers to easily add pages by just creating new entries in the right Channels. EE will dynamically update all necessary navigation and links.

Number of Comments

The value of blog comments has come into question over the recent years. The SEO value of them may be the best reason to keep comments turned on. Google sees an active commenting section as an indicator of a healthy site providing quality content.

ExpressionEngine grew out of the blogging market so comments are baked into the core. Every Channel, regardless of the type of content it holds, can accept and display comments from visitors.

Using comments opens the door to SPAM, but we have a good arsenal of add-ons that we install to prevent that from happening.

Presence of Sitemap

Submitting an XML Sitemap to Google is a great way to both speed up and improve your search rankings. We recently wrote an article on How to Create a Sitemap For Google using native code in ExpressionEngine.

Presence of RSS Feed

An RSS feed is another way that Google can learn of and index new content on an ExpressionEngine-based website. Again, ExpressionEngine has a blogging heritage so comes with an RSS Module that you can install and use to create an RSS feed on your site.

And There You Have It

That's our list of all of the ranking factors relevant to your chosen CMS, and how ExpressionEngine addresses them. We're confident that the sites we implement on ExpressionEngine will have great SEO results. As part of our site launch process we'll even take a before and after snapshot of your SEO results so we can prove it!

Get In Touch

If you are ready to move forward on building out a mobile friendly, highly usable website that's easy for you to manage and has great SEO, give us a shout!.