Review App

Internet Entrepreneurs Blog

Archive for July, 2005

Yahoo! no longer the shizzle

Saturday, July 30th, 2005

So I have most of my domain names registered with Yahoo! (or whatever third party registrar they use) and up until recently I have been satisfied with the pricing, the easy to use domain control panels, etc. A few months back one of the domains I registered, remlyrics.com was up for renewal (although I didn’t realize this). Yahoo! took the liberty of re-registering the domain for me, a nice service that most users will appreciate.

Unfortunately I had previously decided NOT to renew the domain since I hadn’t really updated the site and I was hosting it on my singletracks.com hosting account which was skewing some of my webstats (not to mention hogging bandwidth I desperately needed). It was my bad for not realizing this would be auto-renewed (prolly in my user agreement somewhere) so I resolved to make sure I didn’t have the same problem next year.

The Yahoo! domain control panel actually has a nice little link to use for canceling your service for a particular domain. I clicked the link and found a form to send outlining my reason for canceling, etc. I filled out the form and wrote that I didn’t want to drop the domain immediately since I had just re-upped for another year. Instead I just wanted it to fall off once it was up for renewal since I didn’t need it anymore (slim chance that someone would read this but I figured it was worth a shot, I really wasn’t that concerned either way). Anyway, I submit the form and get a message: 406 Not Acceptable. I had never seen this error code before (perhaps Yahoo! invented this one?) but I guessed it was a glitch that would be fixed in a day or so.

I’ve gone back to the page several times and keep hitting the same response. It’s as if Yahoo! is saying to me in a computer-sounding voice: “SORRY, YOUR REQUEST IS UNACCEPTABLE. I MUST NOW TERMINATE YOU…” (not sure how to enunciate computer voice?). Anyway, it’s pretty convenient that the cancel service page isn’t working but the purchase additional domains form works just fine. The real thing that makes me mad is that there is no form or contact email on the site to report problems like this (again, very convenient for the yahoos). I did find a phone number eventually but I don’t have the time nor the cell phone minutes right now to wait on hold to cancel a single domain name renewal.

Anyway, back in the day Yahoo! used to be the heat but clearly they’ve become overly focused on the bottom line, so much so that they make it nearly impossible to cancel a $10 a year service. Troubling…

How to build a simple recommendation engine

Thursday, July 28th, 2005

Building a simple recommendation engine for your website can be a powerful differentiator among your competition. Traditionally only technically advanced sites like Amazon were able to offer this service but with ever increasing processing power and simple open source software, now you too can add recommendations to your website.

A little over a year ago I wanted to add recommendations to my mountain biking website and I searched the net to find a simple open source solution (or even some pseudo-code to get me started). Unfortunately the only things I found were technical research papers on the subject and some fancy proprietary software that I could never afford. In my mind I knew it had to be relatively simple so I set about mapping the idea out in pseudo-code. What follows is pseudo-code you can use to build your own recommendation engine. I personally chose to use PHP and MySQL but this can certainly be done on any platform.

Let me once again reiterate that I am laying out the construction of a simple recommendation engine rather than the complete algorithm for recommendation bliss. I’m sure there are more technically savvy ways to accomplish this and I’m by no means a PHP master. However, I have found this method to work well on my own sites and I think it will work well for 90% of the web tinkerers reading this article.

The first thing you need to do is to keep track of the actions your users are taking. At a minimum you’ll need 3 data tables to store the data to make the engine run. First off, you need a user table so you can uniquely identify who is recommending what. For Amazon this is the customer ID (your email address) and for my site it’s your user login. You’ll also need to use cookies or sessions so you’ll know who the user is and you can track what they do while they’re logged in. Cookies are simple in PHP and a quick search of the PHP website for setcookie() will give you all the info you need.

Next up you’ll need a table to identify the items your users will be recommending (you probably already have this in some form or another). Your table might contain information on products, local night clubs, or mountain bike trails. Each needs to be uniquely identified with a primary key (usually an integer). From here, there’s only one more table to create.

The final table will be a junction table combining the user and information tables. This table will need to have 4 columns at a minimum to keep track of the following details:

  1. user id of recommender
  2. information table id (night club id, product id, etc.)
  3. the rating (usually on a scale of 1 to 5, with 5 meaning “best”) and
  4. a primary key (this is a given).

If your data is product related and you actually sell products on your site, you might be able to skip the rating column altogether and base recommendations simply on what users have purchased (where a user id & product id entry implies purchase).

Once you’ve collected this information in the junction table, it’s time to get down and dirty with the recommendation algorithm. First off, you need to collect all the user ids of users who have rated a particular item highly (my cutoff is 4 and above; if you are trying to recommend other things people will dislike, you might choose 2 and below). Or if your users are very precise or you have lots of data, you might only consider the maximum rating (5). Suppose we have a user who rates item A a 3. This user does not meet the threshold for a “favorable” vote and is therefore not included in providing a recommendation for this item (we assume this user has different tastes since he does not agree with our other users that this is a good item). Collect the proper user ids in an array for use in the next step.

With the user array in hand, we want to find out what other items each user has also rated highly (or lowly, depending). So for example, if we are interested in providing a recommendation for item A and user 1 gave item A a 5, item B a 2, and item C a 4, we would grab the item C product id and rating as a possible recommendation and place it in an array.

rec[’B'][’score’] = 2

rec[’B'][’votes’] = 1

rec[’C'][’score’] = 4

rec[’C'][’votes’] = 1

Now suppose that user 2 also gave item A a 5 but gave B a 3, C a 5, and D a 4. Now our array looks like this:

rec[’B'][’score’] = 2 + 3 = 5

rec[’B'][’votes’] = 1 + 2 = 2

rec[’C'][’score’] = 4 + 5 = 9

rec[’C'][’votes’] = 1 + 1 = 2

rec[’D'][’score’] = 4

rec[’D'][’votes’] = 1

After a little math, we compute the average score for each recommendation and order our array from best match to worst:

rec[’C'][’avg’] = 4.5

rec[’D'][’avg’] = 4

rec[’B'][’avg’] = 2.5

Now we can present our recommendations to the user. Since our cutoff for likeability was 4 and over, we only present those items that have an average score of 4+: items C and D. Item C is the best match, item D is the next best, and item B is not a match at all. You may want to weight those items with more “votes” more highly than single vote recommendations but this really isn’t as important once your recommendation table reaches a decent size. You can also limit the results you return to the top 5 or whatever number you deem sufficient if many of your users rate a large number of items.

Another way to describe these recommendations is to say “Users who enjoyed A also enjoyed C and D.” This actually better explains the relationship between the items, especially given the simple algorithm used to join the items.

There are several variations you can make to this scheme to improve the results you return. For my own use, I have limited the number of users I poll to 10 users who have rated a particular item (selected at random). This is to keep the script from slowing my pages since I have some items that have been rated by hundreds of unique users. I also limit the recommendations to items in similar “categories.” Specifically, I only return bike trail recommendations for trails in the same state as the original trail. Although many of my users have rated trails in multiple states, it is unlikely that information seekers will be interested in a trail in California that is similar to the one in Georgia that they’ve just ridden.

A recommendation engine is fairly easy to construct using a few simple tables and arrays and can be a distinctive and compelling offering for your users. Once you’ve got the basics down it’s easy to improve this idea to give you truly meaningful results.

Google Crawling Database-Driven Pages

Tuesday, July 26th, 2005

Here’s a neat little trick I figured a little over a year ago with a couple of my PHP-driven websites. I noticed that Google and other search engines weren’t picking up some of my new database-driven content pages while other database-driven pages were picked up and updated regularly. Of course we’ve all read that the big search engines are making an effort to include these pages today, but coverage is far from complete even by the search engines’ own admissions. So maybe this trick isn’t that useful anymore but I thought I would share it in case I’m the only one who figured it out ;)

The pages that were picked up by the search engines were my “state navigation pages” and their urls typically looked something like: database.php?state=CA&sort=name. The pages that weren’t getting picked up (which just so happened to be the bulk of my content) were those pages that had a url similar to: trail.php?id=14. Can you spot the pattern? Turns out the search engines weren’t interested in pages generated through numeric keys but they were interested in those pages whose URLs contained only letters (and question marks, ampersands, periods, etc.). I quickly threw together a little code to convert my number references to alpha characters: 1 = a, 2 = b, etc. I prolly could have used hex or something like that but I’m no computer scientist ;) . So now a request for trail.php?id=ad was translated in my php script to call the trail data associated with primary key 14.

Wonder upon wonders, within a week all of my trail pages were picked up by Google. I’ve since taken most references to my alpha-code down since Google now indexes the bulk of my pages regardless of the URL. I understand that search engines most prefer pages with static looking URLs (they must think the more ghetto and unsophisticated your site is, the better the info) but I’d be interested to know how pages under my alpha scheme stack up to those under the numeric scheme (I’d guess they’re equal now but who knows?). What about a page whose url looks like: /trails/14 versus a page whose url is masked using my method: /trails/ad? Clearly the more data a site has, the more likely they are to use some kind of content database, yet these sites are penalized under current algorithms (unless they are sophisticated enough to look ghetto by building a static looking scheme like the /trail/14 example above). Crazy.

My scripts still accept either the alpha-code or the numeric id but I’ve removed all the alpha-code links for the site (as far as I know). Interestingly, Google still indexes both versions of the pages (often as supplemental results, but not always!). I’m sure this is bad and perhaps grounds for banishment from Google but an interesting result nonetheless, although I don’t know of any advantage to having multiple listings of the identical page in a search engine.

Creating a business ecosystem

Tuesday, July 26th, 2005

The name of the game in business today is ecosystem creation and it’s amazing how many companies just don’t get this. In this day of open source software, global project collaboration, and the like, it’s amazing that more companies aren’t viewing their businesses as ecosystem providers.

One of the best examples of a corporate ecosystem is eBay. eBay loves to tout the fact that hundreds of thousands of people are making their living exclusively through the site. People are selling handmade crafts, scrounging for sweet threads at the thrift store to resell on the site, and devloping software and services to help buyers and sellers, large and small. By providing these services, eBay is becoming an indispensible product to thousands if not millions of loyal customers/users. By opening their product, eBay has expanded the business and made their service even more useful. Brilliant.

Another example of this new economy thinking comes from Cisco. Cisco made a tough decision early on to focus on creating an ecosystem business instead of closing the system. Instead of offering training, certifications, and installation services, Cisco chose to support third parties in building their businesses around Cisco’s business. Imagine choosing networking equipment from two vendors: one vendor provides just the equipment and another is your only source for the equipment, the installation, and the support. Clearly it would be easier to go with the one stop shop but what if these guys lock you into a system that’s expensive to maintain? You’re pretty much at the mercy of your supplier at this point and the one stop shop isn’t looking so hot anymore. Clearly this has worked well for Cisco as they continue to dominate the networking business.

In my own entrepreneurial ventures I’ve come across a few companies that I wish would embrace the ecosystem model so I could build a business around thier businesses. Take for example VRBO.com, a vacation rental by owner listing service. Paul and I created Safarium because VRBO was (and still is) doing a terrible job with their site and we knew we could offer a better service to both owners and renters. Clearly our site hasn’t caught on as well as VRBO and I tried to think about how we could join ‘em since we can’t beat ‘em.

Leah and I came up with the idea to offer a VRBO/online marketing service for vacation home owners so they could essentially “outsource” many of the mundane details of building and keeping a rental listing online (you know, mailing keys to renters, collecting payment, uploading photos, etc.). Unfortunately, VRBO has a very clear policy against “property management” companies from listing on their site (not sure why, who are they protecting?). But their core (paying) customers are very wealthy and probably don’t have the time or the inclination to learn how to create their own listings online so they continue to pay exhorbitant fees to traditional property management companies. By opening up their ecosystem, VRBO could benefit from savvy marketers who can reach new and profitable customers.

Another company I would love to see “open up” is Active.com. I would kill to have a feed of their mountain bike races (filtered by state if possible) to list on Singletracks.com for my users. Users would benefit from having the information in one place while Active would benefit from the registrations I send their way. Seems like a win-win huh? Instead, others try to build their own race listing services and only capture part of the information (type mountain bike race into google and see how many random sites come up). If Active.com were to step up and say, “we are the place to find out about and sign up for races,” I’m sure many of us would agree that makes sense and we would gladly link to their registration forms. With the proliferation of web services today it really doesn’t make sense to keep things like this closed.

Amazon associates affiliate program is the shizzle

Thursday, July 21st, 2005

I joined the Amazon Associates affiliate program several years ago to sell mountain biking related books on my website, singletracks.com. The program has worked pretty well for me, unlike other affiliate programs where I would rarely convert a single sale. Today Amazon third-party vendors sell every imaginable product from electronics to clothing to bike gear and lately I’ve taken advantage of this by listing GPS receivers, videos, and of course lots of mountain biking gear. My commission is anywhere from 5% to 8% on third-party products (from vendors like Nashbar and Bikesomewhere who list their products on Amazon) and my commission generally averages around 7% of sales. Some users even end up buying completely unrelated items (like baby car seats and blue jeans) once they’ve clicked through to Amazon from my site but I still get the commission!

The interesting thing is that affiliate programs from companies like Performance Bikes and Soccer.com usually offer a commission of just 5% of sales. But these same companies sell many of their items on Amazon where as an Amazon affiliate I can make a commission that is up to 60% larger on the same item from the same company. Neat, huh?

But being an Amazon Associate is better for other reasons as well. First off, as an Amazon Associate your don’t have to bother joining multiple affiliate programs to get products from multiple vendors. In general the more programs you join, the more fragmented and diluted your earning will be. Plus with Amazon you won’t have to worry about inconsistent technical requirements and confusing payment structures/thresholds. With Amazon all your sales are in one place plus your customers are more likely to find something they want to buy once they’ve clicked through to the site.

Finally, Amazon blows away all of the affiliate programs I’ve seen in their use of product data feeds. Some affiliate programs are starting to offer feeds of their product data but greedy companies like Linkshare and Commission Junction actually charge both affiliate and vendor a fee to use these. Plus the ones I’ve seen use clumsy ftp or email systems to push the latest product data to affiliate sites. With Amazon, it’s crazy easy (and free) to get data and to build effective product links for your site.

Bottom line: Amazon Associates program pays more, offers more products, consolidates sales to multiple vendors, and provides the best data feed services around. Most vendors are already selling on Amazon so check to see if yours are on the site, and if so, make the switch today!

Reasons users go online

Friday, July 15th, 2005

I’ve been thinking a bit lately about the reasons people go online and I think I’ve narrowed it down to 5 basic objectives. Once a webmaster has determined the reason his/her users are going online, he/she can determine the best way to generate revenues from the site. Here are the reasons in no particular order:

  1. To find information/research

  2. To buy something
  3. For entertainment
  4. To interact with others
  5. To manage data/processes

So maybe all this isn’t that interesting; perhaps you’ve seen this somewhere online before (personally I couldn’t find a list like this online, but I’m certainly no google guru) but here’s where this information becomes profitable: Based on the reasons users are visiting your site, you can choose the best “business model” to maximize your site’s revenue potential.

Users seeking information can be doing so for a number of reasons. They could be performing research for school or for work, looking for things to do in a new town, or comparing products for an upcoming purchase. My own website falls into this category and I can tell you firsthand that it can be frustrating attempting to make money from users seeking information. The problem is that these users aren’t in purchase mode (yes, it is possible but difficult to move them to purchase mode) and they really won’t be satisfied until they find the information they’re looking for.

I’ve personally tried a number of “business models” on my own site to varying degrees of success. Affiliate programs have worked marginally for me and most of my users end up buying books rather than mountain biking equipment (this makes sense, right, since they’re looking for information). Text ads like Google’s Adsense have worked better since they are tightly targeted and many of the ads point to other information-rich websites (or perhaps users don’t find the information they’re looking for at my site and choose to click a link that looks more fruitful). My latest foray is in subscription services/digital downloads and I’m cautiously optimistic that this model will work the best. Just look to sites like CNN with premium paid content and you’ll see that this can be a viable option for information-based sites. On the other end, though, you’ll notice sites plastered with all types of ads like Weather.com appear to be seriously frantic (or brilliant) in their attempts to convert traffic into revenue. Clearly there is no magic bullet.

Other users go online with the intent to buy. These users are some of the most valuable since they’ve already got their wallets out and they know what they need. On my own site I have a gear section where my Adsense CPM rates are double what they are on my information pages. The affiliate click-through rates are high on these pages as well as “buyers” have self-identified themselves by wandering onto the gear side. Online retailers invest big money to find buyers and many companies’ most successful affiliates are pure shopping comparison sites (more so than enthusiast sites). If you’re running a useful information-based site and can’t understand why people aren’t buying more, (hard to believe, you even tell your users to support you by buying through your amazon links!) it’s because your users aren’t buyers when they visit your site. Unfortunately, there isn’t a magic chunk of code you can drop into your site to transform information seekers into buyers. However, if you’re lucky enough to have a site full of buyers, then you should sell stuff (no?) or join an affiliate program.

Next up we have the entertainment seekers. These folks are online to play games, read humorous articles, or to watch online video. Some sites like this that come to mind are eBaum’s World and The Onion but there are a bunch of them out there. I imagine that these sites have a tough time making money since users are there to lose themselves in entertainment and aren’t really paying attention to the banner ads or product pitches around the screen. These sites also spend a lot on graphics and bandwidth and so their costs can be higher than a typical information or e-commerce site. To make money with one of these babies you need to get creative (not just in your entertainment offering but in your business as well). First off, you could have companies sponsor your games or videos. For example, Mr. Peanut could be the driver in your racecar game or you could have TV-quality commercials at the start of your videos. The other option is to sell impressions to advertisers. This is difficult to do but if your site has enough traffic of the right demographic, advertisers may be interested in renting your users’ eyeballs. Pay-per-click ads may not be as fruitful since entertainment seekers spend much of their time engrossed in your content, more so than information seekers.

Still other sites are set up so users can interact with others. Typically these are the messageboards, chat rooms, and forums but they can also be community calendars used to organize local events or matchmaking/social networking services. Users can spend hours on these sites and the coveted average page views per user can be very large. In the old days we called this “sticky” but it’s difficult to make money if your users are “stuck” on your site and are unwilling to leave to buy things or to seek information. Plus, most viewers are probably repeat users so they’re immune to your pitches unless you keep the ads fresh. These sites are a lot like a coffee shop where everyone loves to hang out but no one ever buys anything: bad for business. In this scenario the most profitable path is most likely similar to entertainment sites mentioned above: sell impressions. If your users see that MasterCard ad on your site every day for hours at a time, maybe it will eventually sink in, much like a billboard might on your daily commute. You can try all you want to implore your “loyal users” to buy through your affiliate ads or to click your links, but at the end of the day, how many of them actually will? Finding a way to leverage your community or social network to provide product recommendations (marketers’ holy grail) can be very powerful but there isn’t yet a reliable strategy for doing so. Let me know if you figure it out!

Finally, users may go online to manage data or processes. You can try affiliate links or text ads on a site like this but my impression is this just won’t work very well. Instead, consider charging for your services or perhaps selling the aggregated data you’ve collected to marketers/researchers. If your service offering is good, then users shouldn’t mind paying for the service and you shouldn’t be afraid to lose the freeloaders by charging a fee.

Of course, no site will fit neatly into one of the five categories I’ve outlined above but you should take the time to consider the reasons your users are online. Whether your site is a hobby, a second job, or a full-time business, pick the business model that best addresses your users’ online objectives and revenues will follow.