The Basics of SEO

Tired or afraid of getting little to no results from your time and money spent on SEO for your small business? Despite what most “SEO experts” want you to believe, the fundamentals of SEO are easy to understand, simple to execute, and (most of the time) require little or no specialized knowledge, even if you’re a beginner. In this guide, I expose a simple checklist of the three fundamental principles of SEO and show you where to direct your time and money to get better results in less time.

The Three Principles of SEO

Search Engine Optimization really boils down to three fundamental components:

  1. Crawlability
  2. Meaning
  3. Importance

Everything else you’ll ever hear or read about SEO is merely strategies, tactics and techniques designed to positively influence these three components.

SEO Basics


Crawlability is the first and most fundamental component of SEO. As I define it, “crawlability” means “possessing the characteristics necessary for a web crawler to find and extract information.” In practical terms, in order for search engines to do anything with the stuff you put out there on the Web, they to need to be able both to find the web resources you’ve created such as web pages, images, videos, audio files, etc., and extract the information they contain.

The bread and butter of crawlability is:

  • Web server
  • HTML
  • Links

Obviously, your stuff has to be online in order for a web crawler to find it. This goes without saying. But, for some reason, I felt compelled to state the obvious.

HTML is the native language of web search engines. And links, which are themselves HTML, provide search engines with the locations of other web resources. In other words, HTML is the primary means of relaying information to search engines, and links are the pathways to that information.

There are lots of little details that can inhibit a web crawler’s ability to crawl your site.  But at the core, if you want search engines to be able to crawl the stuff you’re putting online, you can’t go wrong with HTML and links.


The value of a search engine lies in its ability to match resources to what a user wants. At the most abstract level, search engines are extracting meaning from the user and comparing that meaning to the meaning found in resources.


You can think of a search engine like a librarian. Let’s say that I ask a librarian, “I’d like to know how to build a birdfeeder.” The librarian extracts meaning from my words and understands that I’m interested in a resource that will provide instructions for building a birdfeeder.

The librarian might also extract information from sources other than my words. For example, the librarian might extract information from my clothes and hands and estimate the probability that I’m looking for a resource for the inexperienced woodworker.

The librarian might also extract information from my location. I live in Iowa. So, I’m likely looking for a birdfeeder for birds found in Iowa.

Search engines extract meaning from users in much the same way. For a user searching for “restaurants”, Google will take meaning not only from the user’s “question” but also from elements like the user’s location. “There’s a high probability that he wants restaurants near his location.”

But it’s not enough to understand what a user is looking for. The search engine also has to extract meaning from web resources it’s found. The search engine can extract meaning from a resource by analyzing:

  • content
  • structural elements such as:
    • title tag
    • meta description
    • headings
    • HTML5 semantic markup (e.g. <article>)
    • sturctured markup (e.g.
  • links
    • anchor text
    • surrounding text
    • etc.

Search engines compare the meaning obtained from the user to the meaning extracted from resources. Matching results are returned ordered by a combination of relevance and…


Back in 1997 before Google was created, only the first two components (crawlability and meaning) mattered for SEO. However, as the creators of Google noted, “‘Junk results’ often wash out any results that a user is interested in.” Those were the days of keyword stuffing. If you wanted to rank higher for a given keyword than the highest ranked web page, you simply had to increase the meaning/relevance factor of your page by increasing the number of times your keyword appeared on your page.

The creators of Google attempted to solve this problem by taking advantage of the link structure of the Web to produce a global importance ranking of every web page. The algorithm they developed, PageRank, gave each page an importance score (i.e. a PageRank value) based on:

  • the number of links pointing to the page
  • the importance (i.e. PageRank) of the other pages that linked to the page
  • the number of outgoing links on those other pages

Since that time, many elements besides links are used by search engines to determine importance. However, as of today, PageRank is still one the top 2 ranking factors.

Where to Focus Your SEO Activities

To get results from SEO, you’ll know you’re spending your time well if you’re focusing your efforts on elements that will have the greatest impact on the three fundamental components: crawlability, meaning, and importance.

How to Improve Crawlability

Your primary focus for crawlability should be:

  • Put your stuff online
  • Use HTML
  • Link to your content

A bit of a shortcut for getting your pages indexed is to use a sitemap. But bear in mind, a sitemap is not a substitute for links. As one of the top 2 ranking factors, links have tremendous value beyond just getting your pages crawled.

How to Influence Meaning

To understand the words and phrases that people are using to search for the topics of your content, use the Google Keyword Planner.

Apply what you learn from your keyword research and analysis to the language you use in your content.

And, of course, create lots of awesome content. More content exposes your site to a greater number of search queries for which you’ll have the potential to rank. And more search queries and rankings means more traffic to your site.

How to Increase Importance

Links. And if you’re a local business, then local business citations, too. Basically, get your name out there. Publish something provocative or polemic. Create something innovative or revolutionary. Publish content elsewhere. Get interviewed. Interview other people. Make friends. Make connections. Build relationships. Do something extraordinary, newsworthy or remarkable in some way.

Other factors that can increase importance include things like the load time of your pages. A slow loading page may be negatively impacted in search results.

Don’t worry too much about the little details of SEO. “But what about the robots meta tag? Or rel=’nofollow’? Or…” Your time would be much better spent creating new content and building links to your site. Focus on these three fundamental areas of SEO and you can expect to see a significantly greater return on your investment of time and money.

Related Posts

26 Responses
  1. Dave Meindl

    Import the data into your “data” sheet with importrange. Effectively, there’s no difference between static data and imported data.

  2. David Stirlng

    Thank you very much for writing this. Using your example made it really easy to create a “Sort by: [Column name]” dropdown menu.

  3. Rodolpho Brock


    function columnToLetter(column)
    var temp, letter = ”;
    while (column > 0)
    temp = (column – 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column – temp – 1) / 26;
    return letter;

    function columnOf(columnName, sheetName, headerRow){
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName(sheetName);
    headerRow = (headerRow?headerRow:1);

    var headerAddress = “A” + headerRow + “:” + columnToLetter(sheet.getLastColumn()) + headerRow;
    var range = sheet.getRange(headerAddress);
    var values = range.getValues();

    for( var column = 0; column <= values[0].length; column++ ) {
    if( values[0][column] == columnName ) return columnToLetter(column+1);

    throw ("ERROR: NOT FOUND!");

    =QUERY(data!A:C;CONCATENATE("SELECT ";columnOf("Year";"data")))

  4. Wanderley Oliveira

    Thank you so much for sharing this awesome way to get things working out in a easy way. Your exemplos made it clear!

    Hugs from Brasil

  5. Elaine

    Thank you for posting this! I spent a ridiculous amount of time searching for a way to deal with my variable column locations. It seemed like such a small problem when I created the spreadsheet, yet it was incredibly difficult to find a working solution. This worked a treat AND provided to ability to match a cell reference instead of a string. I ended up creating a column of drop down menus to choose my desired headers:

    ‘DataSheet’ contains the data with variable columns
    ‘QuerySheet’ is where you choose the headers you’d like
    “DataHeaders” is a named range for your data’s headers, ie ‘DataSheet’!1:1
    ‘QuerySheet’!A2 and down are each Data Validated with a dropdown list for the named range “DataHeaders”

    &”, “&SUBSTITUTE(ADDRESS(1,MATCH(‘QuerySheet’!$A$3,DataHeaders,0),4),1,””)
    &”, “&SUBSTITUTE(ADDRESS(1,MATCH(‘QuerySheet’!$A$4,DataHeaders,0),4),1,””)
    &”, “&SUBSTITUTE(ADDRESS(1,MATCH(‘QuerySheet’!$A$5,DataHeaders,0),4),1,””))

    My data set has over 60 columns, and I use this to grab over 30 of them with no problems. The formula is absurdly long, but it works. I’m sure it could be condensed to be more efficient, but I’ve spent far too much time already on such a small issue! It would be great if Google could make selecting headers in a Query more intuitive.

    Thanks again!

  6. Arun Kumar Nair

    This Is close to what I was searching. Thank you. Can you help me with my exact problem. It is as below:
    I have a sheet with sales data of salesman selling two products x and y arranged over a period of time. Like x jan’17 y jan’17 x feb’17 y feb’17 and so on till x dec’18 y dec’18. I want to find all columns which has sales of x in 17. Is it possible?

  7. Narendra

    hi expert, I have done code in MS XLS but this does not work for Google Sheets can you please help me create a macro for Google sheet, which will find certain text in a in given column and copy entire row and paste in given sheet name after Last entry.

    For an example I have a sheet which content verius fruites data on date 13-1-2018, if I run macro then it should find mango and apple in the given column refrence and copy entire row and add it to “mango” sheet after 12-1-2018 entry and same thing with apple too

  8. You can create macros in Google Sheets. However, in this case, it sounds like a macro might be unnecessary (and inefficient).

    For example, you could use QUERY. Suppose that your “fruit” is in column C.
    =QUERY(product_sales!A:Z,"SELECT * WHERE C = 'mango'")
    If you want to show only records from yesterday, you’d do something like the following. (Suppose that the dates are in column A.)
    =QUERY(product_sales!A:Z,"SELECT * WHERE C = 'mango' AND A = DATE '"&TEXT(DATEVALUE(TODAY()-1),"yyyy-mm-dd")&"'")

    Alternatively, you could use the FILTER function to pull in only the desired rows.

    However, easiest of all, you could skip all the extra sheets and formulas and simply create filtered views of the original sheet.

  9. Narendra

    Thanks sir for your reply. Actually I don’t want to filter data , what I want to do is, find given text here is “mango” in given column specified and copy entire row than it should add in next empty row in named “mangos inventory” sheet.

    I have searched a lot on net and taking some bits and pieces from verius code I came up with this code ,

    function givenmodi() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var s = ss.getSheetByName(‘Sheet1’);
    var r = s.getDataRange();
    var v = r.getValues();
    var arr = new Array();
    for(var i=0;i<v.length;i++) {
    if(v[i][0]==='Table') {
    var t = ss.getSheetByName('Table');

    Now this code finding and copying properly but problem is it's not adding in next empty row in " mangos inventory'" sheet. In fact it's easiering sheet and than pasting..

    Hope you understood my problem.

    Thanks & regards

  10. Niranjan

    Hi, Thanks for the Query.
    How to arrange the same in ascending or descending order of a particular column value

  11. DP

    Is it possible to add Arithmetic, Grouping, Etc?

    I tried things like sum(“&SUBSTITUTE(ADDRESS(1,MATCH(“Year”,data!A1:C1,0),4),1,””)&” ), but kept getting errors.

  12. Yep. SUM, GROUP BY, etc. will all work so long as the their conditions are met. For example, SUM requires that all rows in the column be numeric. Anyway, here’s an example that works:

    =QUERY(data!A:C,"SELECT SUM("&SUBSTITUTE(ADDRESS(1,MATCH("Year",data!A1:C1,0),4),1,"")&")")

  13. Eléonore Breton

    Dave, thanks a million for your post, extremely useful. Would you by chance have a trick to select multiple columns with the same header? For example, I have 3 columns ‘Components’ but using SUBSTITUTE(ADDRESS(1;MATCH(“Components”;’Import’!A1:EE1;0);4);”1″;””) will always give me the first one…

  14. Eléonore, I’d recommend not having multiple columns with exactly the same header name. You can think of your spreadsheets like a database, especially when using QUERY. And think of each individual sheet like a table in your database. The first row is the header row in your table, and each column has a unique name. Having a unique name is how SQL and your database work together to identify what column you want. For example, if you have multiple columns named “Components” in a single table, writing a query like “SELECT `Components` FROM my_database” would be ambiguous. It’s unclear which “Components” column is desired.

    The quick and dirty solution is to add a sequential numeric value to each “Components” header name (e.g. Components_1, Components_2, Components_3).

  15. Eléonore Breton

    Dave, yes I totally agree this isn’t a database format for my sheet but it’s the format I export from the tool I use (Jira). Yes I’ll think I’ll have to resort to your quick & dirty solution.
    Thanks a lot again!

Leave a Reply