Adam Howitt's Blog

Dec 03
2008

Seth Godin says my seminar is a lost cause

Well, close.  Jeff just sent me an article from Seth's blog pointing out that marketing evolution is much harder than marketing gravity because gravity is something people already believe in.

I'm banking on people believing that evolving your website is cheaper and more productive than starting from scratch or paying for AdWords campaigns.  

The seminar follows a logical flow from fixing the problems for the visitors you get before chasing new visitors with SEO and AdWords campaigns.

The morning shows you how to use Google Analytics to analyze the traffic you get to find the problems on your website.  Next I'll cover Google Website Optimizer to help you split test a theory without fighting with the CEO over what goes on the home page.

The afternoon starts with Search Engine Optimization basics to make sure you're getting the best free traffic possible before you invest in pay-per-click, the focus of the last session of the day.  Google AdWords can be expensive if the material covered in the first 3 sessions isn't addressed and I'll teach you how to change the way you buy your campaigns to get the most for your dollar.

The first one day seminar is December 17th in Chicago and space is restricted to a cozy crowd of 10 to promote interaction and make sure everyone goes home with a personal action plan.  If you can't make it to Chicago for the day, let me know if you think there is a demand for the seminar in your city.

Sign up now for Website Evolution!

Nov 25
2008

Website Evolution Seminar

Up the expertise you bring to the table. One-day intensive covers designing for search engine results, split testing of Web pages, using Analytics to arrive at a best design. Google tools provide you with a slam-dunk answers to every client design request.

I'm running a one-day four session seminar from the offices of Adam Howitt Consulting in Chicago on Wednesday, December 17th 2008.

Find out more about Website Evolution!

Oct 28
2008

Eating my own dogfood

AdamHowitt.com is my Google Analytics consulting website and has been live for over a year since the inception of my business last year.  I built my own CMS a few years ago for a client project and recently implemented it for another client.  Finally, I have invested the time to implement the CMS for my own site so it now blossoms with fresh content and a better insight into the services I have to offer.

Key features of Ham: 

  • Relationships between content items - for example, my portfolio items are related to services I offer and vice versa so the tool automatically makes the related items available for display
  • XML driven content specification - quickly add new fields to a content definition to make new fields available in the adminstrator
  • Content versioning to make it possible to rollback content to a point in history
  • Front-end display widgets for common tasks like looping over a list of related item, listing pages and list filters.
That's it for now and I'm trying to tidy up the code to make it open source some day.  Those in favor, please raise your hands :-)

 

Sep 15
2008

svn:ignore problem with robots.txt / files

I've been using subversion for some time now and have had a nagging problem of subversion not acknowledging my svn:ignore list.  Until now, it wasn't a big enough issue to invest the time but since I'm working on a remote team project and the file in question was robots.txt it suddenly became a big priority.

I found several blog entries about how to ignore folders and files but my robots.txt was still listed as modified instead of ignored when I ran

svn status --no-ignore

 

A more careful review of the documentation revealed that I had missed the highlighted text after the sixth paragraph:

"Subversion's support for ignorable file patterns extends only to the one-time process of adding unversioned files and directories to version control. Once an object is under Subversion's control, the ignore pattern mechanisms no longer apply to it. In other words, don't expect Subversion to avoid committing changes you've made to a versioned file simply because that file's name matches an ignore pattern—Subversion always notices all of its versioned objects."

So there you have it.  Put another way, once you add a file to subversion, it won't be ignored until you delete it from the repository.

The fix for robots.txt was to

  1. Copy the local file content to the clipboard,
  2. Run an update on my local copy to delete the file 
  3. Recreate the file and paste in the clipboard contents
  4. Test using a commit in Tortoise to make sure it didn't include the new file

Apr 10
2008

Google Sitemaps made easy with Linux

I just discovered that Google Webmaster now allows you to register Google Sitemaps in a variety of formats: RSS, Simple text or sitemap XML format.

This may not be exciting news to most but the simple text format makes life drastically simpler in terms of an entry point to creating a sitemap. 

I was about to fire up a text editor and some tunes to rip through a site to manually collect the page names when I realized that the find command in linux will spit out a carriage return separated list.  A quick

find -name \*.\.htm
yielded the foundation of what I needed.  Note that backslashes used to escape special characters.  This gave me output as follows:
./index.htm
./thanks_mailing.htm
./resources.htm
./closing copy.htm
./header.htm
./vegas_17.htm

The last step was to use the substitute sed command to replace the ./ at the start of the string with the site name and pipe it into the sitemap.txt file:

find -name  \*\.htm | sed 's/^./http:\/\/www\.mysite\.com/' > sitemap.txt

Feb 13
2008

Protect Your Children Online for Free

In just a minute you can set-up an alert to keep a watch on your family's internet exposure with Google Alerts.

I heard about some changes on the radar for Facebook or maybe MySpace yesterday to protect children online by requiring their parents to register and it reminded me that I was going to post a tip about Google Alerts.  

When the name of one of your family members or your business appears on a blog, in the news, in a video or even in a newsgroup, you can get a daily summary of those listings.  I use it for my business and my running site to make sure I know what people are saying, if anything at all.  In most cases it is a blog somewhere and I leave a comment thanking them for the feedback or offering an answer to a question or a problem they encountered using my site.

You could easily use the same approach to monitor your children's names to protect their online identity.  If you see something they have done or someone else has posted about them that you think could be a problem, you can take action early before it gets to be a bigger problem.

How it works:
1. Go to http://www.google.com/alerts
2. You will need a Google account to set this up so it may prompt you to create one at this point
3. For search terms put the search term you want to track in quotes e.g. "adam howitt"
4. For type, select "comprehensive" to make sure you get a broader insight across video, blogs etc.  If you only care about blogs you can just select that
5. Set "how often" to daily for a daily email
6. Enter your email

Easy huh?  The only challenge may be a common name or that you have the same name as someone else with a lot of activity on the internet.  You can minimize mistaken identities by adding extra qualifiers to your search e.g. "adam howitt" Chicago
Here I'm trying to broader mentions of my name by picking out those that mention the city where I live.  You can create as many of these as you need so in addition to geographical tips like "Chicago" I can use keywords related to the type of work I do or the activities I'm involved in.

Jan 30
2008

Free Search Engine Optimization Tool

Four years ago I began working with a content management system, DuoCMS, which was super flexible but the consequence was that the basic search engine optimization pieces could be missed when implementing anything other than a standard content block.  I developed a simple Search Engine Optimization spider to rip through pages of the site and generate a report of the meta data, keywords and titles on each page to help track down omissions.

Last October I started working in Analytics as an independent consultant and I see the demand for this kind of tool is certainly out there.  For that reason, I've added a slimmed down version to start at your home page and find the first 5 pages on your site linked from the home page.  It shows you the title, heading, meta description tag, meta keywords and finally a rudimentary keyword density analysis for the page to give you some ideas about what to use in your meta keywords. 

The intro paragraph to the tool gives some optimization recommendations but it should be enough to lift most pages lacking in any of these areas from mid-google obscurity to a respectable first page placement for your selected keywords.  The exceptions are going to be where you are going after the most competitve keywords.  If you find yourself in that boat, use your title and meta tags to carve out a niche in that competitive space.  For example, if dog walking is massively competitive (2 million pages last time I checked), try to focus on your most profitable or rewarding area of your business which might be large breed dog walking (311,000 pages).  If you add your city to the title, in my case Chicago, you get down to 82,000 competing pages.

To try the tool on your website visit my consulting website at  www.adamhowitt.com and select resources in the top right.  You'll find the tool listed as SEO Preview Tool and can find some of my presentations and white papers freely available for download.  I recommend my Google Technology for Better Content presentation for anyone getting started with Google Analytics.

Nov 02
2007

Google Adds Site Search to Google Analytics

One of the most important but least tracked aspects of your website is how people use search to find things on your site.  Google Analytics has been updated to include a new section for tracking site searches by category.

I'll explain why it's important to track search, describe each of the new reports Google Analytics provides, offer some conclusions you may be able to draw from the reports and then explain how to configure Google Analytics to track searches.

Why track searches?
People typically resort to searching your site when they are either in a hurry or can't find what they are looking for.  It can also be argued that if they are in a hurry and can't find what they are looking for that you still have an issue in that your site doesn't make the important information obvious enough.  Given that the average person spends around 8 seconds on each page of your site you might notice that it seems like everyone is in a hurry!  

What reports will using Google Analytics provide to help me?

  • Visits: Who searched and when?
    • When did visitors use site search? - Trends over time to let you know when people are searching.  The drop down box on this report allows you to dig deeper to see how many visitors searched, total unique searches, how many result pages were viewed per search, percentage of people leaving after seeing your search results page (hint: they didn't find what they were looking for), percentage of people refining their search to be more specific (hint: your search results were not very helpful), time spent on your site after they searched and lastly how many results did they user click on to find what they needed.  All of these sub-reports should help you be more critical of your current embedded search.  If people are constantly refining searches or leaving but you know the content they needed was there, maybe it's time to consider Google's site search or another service.
    • How do visitors who searched compare to those who didn't? - This report has the standard 3 tabs you may be familiar with from elsewhere in Google Analytics "Site usage", "Goal Conversion" and "Ecommerce".  The site usage tab allows you to use the drop down boxes to compare visitors that searched against those who did not in terms of how many pages were viewed, how many people after just one page (a "bounce").  If you have configured goals for your site you can switch to the goal conversion tab and, for example, compare visitors who added an item to their cart who used search versus those who did not to see if searches are more or less likely to purchase from you.  If you have e-commerce configured for analytics you can go one step further and the e-commerce tab will tell you if you get more revenue from people who search than those who don't.
  • Search: What did visitors search for?
    • Which search terms did visitors use? This report can tell you what the top terms used to search your site were and gives you the same 3 tabs as the previous report.  This means that you can see whether people were more likely to leave your site or buy something based on the terms they used to search.  Clearly if you do track revenue based on visitors to your site and you see that a popular search term results in substantial revenue, it is a strong indicator that this item or product isn't prominent enough in your navigation but has good demand.
    • Which categories did visitors search?  This report tells you how many people are using the more advanced category based searches. You can investigate whether one category of search causes more people to leave the site or purchase something than the other categories of search.
  • Content: Where did visitors search?
    • Where did visitors start their searches?  Searchers always have a starting page and this report can tell you which page was the last page they visited before they gave up clicking your navigation and tried to search instead.  This doesn't necessarily mean that the starting page was the dud because they may have bounced around your site with the navigation first.  People want to be successful and feel empowered when they use your site and you can improve this feeling by making visitors feel like they were able to find what they needed by clicking.  It's a small victory but it makes people feel a little happier to use your site so if they resort to searching it can be very disappointing. 
    • Which pages did visitors find?  Once they searched, where did they end up?  This report will tell you where people went for each type of search.


What should you look for?
Take a look at the top 10 search terms on the site and think about the role of your website.  Are any of the search terms valid terms for someone interested in reaching the ultimate goal of your website?  The ultimate goal might be signing up for a newsletter, filling out an application, buying something or submitting a contact form.  If the terms are for this type of content then you may have an information architecture problem.  The solution to this problem is broader than the scope of this post but you should probably gather some of your team together to brainstorm some ideas.  Here are some general pointers but for more information checkout Steve Krug's "Don't make me think".

  1. Emphasis is an accent.  If everything on a page is emphasized, nothing on a page is emphasized.  
  2. Prioritize.  Your web page reads from top to bottom so the most important messages should appear at the top.  There is only one number one slot on the page.
  3. Keep it above the fold.  Not everything deserves to appear in the top part of the page, the trick is deciding which content doesn't belong there.
  4. Think like your visitor.  Try to get some people who are unfamiliar with your website to review any different concepts for reorganizing your pages to make sure they can find the new elements you introduce.  An alternative is to try the Google Website Optimizer to test the new designs side by side, otherwise known as an A/B test.  Google serves your new and the old design to a fraction of your existing traffic so you can monitor changes in search behavior and navigation behavior.  Ultimately you can track how many more people converted/ purchased/ signed up because of the new design and make the switch if you have positive results.


To setup search analytics for your site in Google Analytics

  1. Go to Analytics Settings for the site where you want to monitor searches
  2. Click the edit link on the far right of the "Main Website Profile Information" section
  3. You should see a site search section with "don't track site search" selected
  4. Change this to "Do track site search" and you should see a new field appear for query parameter and categories
  5. The query parameter is the part of your URL which is used to tell your web server which search term was used.  To work this out, go to the search box on your site, enter a search term and hit submit.  Look at the URL on the search results page and you should see something like q=my+search+term or search=my+search+term or something similar.  "q" and "search" are query string parameters and "my+search_term" is the search term.  You may have more than one pair of parameters and search terms, especially if your search has options like cat=my+category where you filter a search based on a category of your website.
  6. Enter a list of each query string parameter found in the previous step, separated by commas. So we would use q or search for our example above.
  7. If you found that you do have different categories of search like "search people", "search offices", "search products" and there is a query string parameter used to differentiate each search type, select yes where it asks "Do you use categories for site search?" and enter the list of category parameter names.

 

Oct 09
2007

Google Analytics reports zero visits but Google Ads shows clicks

I've been working with a client to troubleshoot his Google Analytics setup and discovered a documented issue you should look out for.  The Google Adwords campaign summary was reporting over 2000 clickthrus but the Google Analytics AdWords campaign summary showed zero visits for the same period.  After some investigation it became clear that the issue manifested itself after the new site was launched.  In my mind if a click was occuring but not recording a visit my concern was that the adunit was redirecting to a page that had gone away.  I clicked the link in the adunit but it took me to a valid page.  Knowing that 301 redirects are used to redirect clients to new permanent homes of content I fired up Fiddler 2 to inspect the actual http request and discovered a 301 redirect.  My instinct told me that a 301 redirect wouldn't pass on the campaign data from the original page and was ready to set up my own experiment to test the theory when I came across the definitive answer on the Google Analytics support page "Why do AdWords and Analytics show different figures in my reports?".

Sep 14
2007

Glo-Brite Heavy Duty Section Launched

It's always a big relief to see a client really embrace a CMS and throw resources at it to get the website moving.  Glo-Brite is a client I've been working with for the last year and we launched their site about six months ago.  We stalled for a while but finally got back on track as Paul dedicated a resource to load all his heavy duty truck parts, uploading images, creating page titles and descriptions from their catalog.

The site is driven by my home grown CMS "Ham" (an anagram of my initials).  It is driven by an xml configuration file and includes rollback, file and image uploads and allows you to relate one object class to another.  It runs on MySQL and BlueDragon.  Image uploads are resized using the native java AWT image library.

<cffunction name="scaleImage" access="private" output="false" returntype="boolean" description="Scales an image by a factor or to fit within a max width/max height or both with configurable quality settings">
    <cfargument name="inFile" type="string" required="true">
    <cfargument name="outFile" type="string" required="true">
    <cfargument name="scale" type="numeric" required="false" default="0">
    <cfargument name="intMaxWidth" type="numeric" required="false" default="0">
    <cfargument name="intMaxHeight" type="numeric" required="false" default="0">
    <cfargument name="quality" type="numeric" default="0.30" required="false">
    <cfscript>
        fs = createObject("java","java.io.FileInputStream").init(arguments.inFile);
        jpegCodec=createObject("java","com.sun.image.codec.jpeg.JPEGCodec");
        decoder = jpegCodec.createJPEGDecoder(fs);
        srcImg = decoder.decodeAsBufferedImage();
        fs.close();
        if (arguments.scale neq 0 OR (arguments.intMaxWidth eq 0 AND arguments.intMaxHeight eq 0)) {
            variables.scale = arguments.scale;
        } else {
            w=srcImg.getWidth();
            h=srcImg.getHeight();
            if (arguments.intMaxWidth neq 0 AND arguments.intMaxHeight eq 0) {
                variables.scale = arguments.intMaxWidth / w;
            } else if (arguments.intMaxWidth eq 0 AND arguments.intMaxHeight neq 0) {
                variables.scale = arguments.intMaxHeight / h;
            } else if (h lt w) {
                variables.scale = arguments.intMaxWidth /w;
            } else {
                variables.scale = arguments.intMaxHeight / h;
            }
        }
        </cfscript>
        <cfscript>
        af = createObject("java","java.awt.geom.AffineTransform").getScaleInstance(variables.scale, variables.scale);
        hints = createObject("java","java.util.HashMap").init();
        rh = createObject("java","java.awt.RenderingHints").init(hints);
        transform = createObject("java","java.awt.image.AffineTransformOp").init(af,rh);
        destImg = transform.createCompatibleDestImage(srcImg, srcImg.getColorModel());
        transform.filter(srcImg, destImg);
        out = createObject("java","java.io.FileOutputStream").init(outFile);
        encoder = jpegCodec.createJPEGEncoder(out, jpegCodec.getDefaultJPEGEncodeParam(destImg));
        par = encoder.getDefaultJPEGEncodeParam(destImg);
        par.setQuality(JavaCast("float",arguments.quality), true); // set jpeg quality to 30 percent
        encoder.setJPEGEncodeParam(par);
        encoder.encode(destImg);
        out.close();
        return true;
    </cfscript>

</cffunction>

I'll post a follow up to this to explain how I arrived at this code as this was my first experiment at leveraging Java objects within my applications and once you get it, the process is actually really straightforward.

The site is configured with Google Analytics and we are tracking the goal that clients are submitting the contact form as the way to evaluate the performance of the content on the site and ad campaigns they are going to run.  Some areas are still a little rough but the client was willing to work on a "more content online is better than none while we wait for final sign off on every piece" basis.  There will be a few more design tweaks, plenty of content updates and the car and light duty AJAX driven part browser will be the last piece to launch.