June 30, 2012

Using Twilio to extend the functionality of Siri

Siri is great for playing music from your iPhone. But if you don’t have the song on your library, Siri can’t go and play it on Spotify, Pandora, Grooveshark, or any of the other players (for now). But if Siri can send a text message to a Twilio number (which I called “Siri Tunes” in my address book), that number can reply with a message linking to an mp3 that can be opened in QuickTime. Watch the demo of the application:

I love building Twilio applications. Contact me if you’re interested having a Twilio application created.

April 12, 2012

Using Keyword Rankings to Measure SEO Success

BrightEdge vs AWR

Using keyword ranking positions as a measure of SEO success isn’t perfect. Do you track 200 keywords, or 2000? Do you include branded keywords that you’ll likely rank for anyway? What do you do when you want to add new keywords? And then there’s the issue of customized search results. Is one scrape from one IP a good measure of the actual position?

I’ve used three different keyword ranking tools to gather this data – AdvancedWebRanking (AWR), BrightEdge, and to a small extent Positionly. Each has their pros and cons, but all can be leveraged to gain insight on your SEO performance.

AWR is great, and is probably my favorite and the most complete seo software package of the three. The thing I like most about it is that I understand how it gets the data. It runs locally on your computer, and scrapes the rankings directly from Google. I know it’s using my IP and I know what time it crawled. That’s valuable information when I need to explain fluctuations to a client – “Well, the report is from Monday morning, but if you search now for ‘cloud hosting’ you’ll see that you’re back at position 2.” With BrightEdge, when you export or compare data you can’t select rankings from a specific day, just for an entire week. I have no idea if the reported position was pulled on Sunday or Thursday.

Search results continue to become more and more tailored to the individual user. A searcher from New York will see different results from a user in Vancouver – even if neither is logged in. With AWR running locally, I know that the results I’m seeing are from my city, and to take that with a grain of salt. In BrightEdge, I need to take that gain of salt blindly, as I do not know how they’re getting the rankings. Fortunately, you can customize the search engine being used in both. There’s a lot of other factors that go into the personalization of results, but with being able to do things like see the user agent of the scraper, there’s just more transparency with AWR.

One of the things almost every SEO I know misses when thinking about keyword ranking software is the imperfection of the data. All of these tools are scrapers. They’re pinging Google and interpreting the results. Google doesn’t like this. Robots, hitting up their servers, not viewing ads, to reverse engineer their rankings? Aww hell no. These spiders frequently time out or get blocked out with a captcha by Google. I’ve been using AWR and BrightEdge in parallel for the past 3 months, and this happens in both… a lot. That’s the reason we use both, so that if one messes up, we’ll hopefully have solid data with the other. The only thing is, AWR tells you when it fails and on what keywords it failed. BrightEdge doesn’t, and will often show a stable keyword dropping from the first page to the tenth.

AWR does a better job with transparency. BrightEdge does a better job with user experience and ease of use. AWR has to be running on your own machine, while BrightEdge is SaaS on the cloud. I like the ability to automatically create customized reports with AWR (and then send them via email or push them to an FTP server), but BrightEdge is way better when it comes to grouping keywords and exporting to Excel. To me, having accurate data is way more important than saving a few seconds when sorting it.

Positionly is only in the beginning stages, but I feel it holds real promise. They have a great email alert system, and are at a way more practical price point than BrightEdge. If they can combine the best of both, I think we’ll see a worthy competitor emerge.

If you’re using any of these three, or a completely different solution, let us know what you thought.

November 16, 2011

Load External Content in Tumblr Sidebar

I was creating a theme for a Tumblr blog and wanted to embed a list of upcoming events. The ideal solution would be a Google calendar, but the only way to do that was via an iFrame, which style-wise would just not do. The events needed to be editable by someone who has no HTML knowledge, and fit in as inline content. The creative workaround is to create a sub page in Tumblr, use the jQuery .load function, and specify the div you want to grab content from.

Here’s how you do it:
1. Embed jQuery in your blog

<script type="text/javascript" 
    src="http://www.google.com/jsapi"></script>

2. Set the id of the div that you want to load the external content into, the url of the page you’re grabbing content from, and the id of the div that the content lives in.

<script type="text/javascript">
  google.load("jquery", "1.3");
  google.setOnLoadCallback(function() {
    jQuery(function($) {
      $("#events").load("/events #eventsHere");
    });
  });
</script>

3. Create a new page in tumblr, and wrap the content in the div with the id you specified in line 5 from step two. For me, this is #eventsHere.

Voila! You’ve got your blog fetching the content from your other tumblr page, which can be edited with their friendly WYSWIG editor.

November 7, 2011

BigCommerce Customize Compare Products Page

We can’t tweak the snippet used to print out the info on the compare products page. My client wanted to get rid of the “Availability” and “Brand” rows on the compare page of his BigCommerce shop. Since BigComemrce doesn’t even give relevant IDs or class names to their elements, I wrote another snippet of javascript that searches the page for the rows, and hides them. This goes at the end of the HTMLHead panel.

To hide the Availability row:

<script type="text/javascript">
    $(document).ready(function() {
        $("td.CompareFieldName").each(function() {
            if( $(this).text() == 'Availability' ){
            $(this).parent().hide();
            }        
        });
    });
</script>

To remove the Brand row:

<script type="text/javascript">
    $(document).ready(function() {
        $("td.CompareFieldName a").each(function() {
            if( $(this).text() == 'Brand' ){
               $(this).parent().parent().hide();
            }        
        });
    });
</script>

If you need help with customizing any other part of BigCommerce, please reach out, I’m available for hire.