Canadian eCommerce a Growth Market

by Matthew Bertulli 8/25/2010

I talk about this almost daily with prospects and clients.  The Canadian eCommerce market is 5-6 years behind the USA in terms of business use/adoption.  The large majority of wholesale distributors and retailers in this country are still not online and only now just starting to think about their online selling strategy. We see this every day.  The competition in Canada is ridiculously low compared to our neighbors to the south.  

Further proof of how much opportunity lies in our own back yard can be seen by GAP's latest eCommerce expansion efforts.

"Now, faced with growing economic uncertainty and skittish consumers, Gap is betting heavily on e-commerce beyond its U.S. home base. Tuesday, it officially launched its Canadian e-tailing sites for its three main chains. Earlier this month it rolled out its sites in the U.K. and will do so in China later this year. By the end of 2010, it will offer shipping to 65 countries."

The eCommerce Platform mid-market is littered with shopping cart options for businesses looking to either setup or expand their online selling operations.  The options range from $25/month (see Shopify.com and Bigcommerce) to Magento Enterprise (roughly $13,000/year).  It's been my experience that many first-time eCommerce sites are getting to sustainable sales levels with moderate effort and resources in Canada.

In other words, what the heck is your problem!?

Vortx Acquires AspDotNetStorefront – Exciting New Era Starts Now

by Matthew Bertulli 8/5/2010

Yes, the title just about sums it all up.  Vortx, Inc. has acquired AspDotNetStorefront from it’s previous owner.  This is a fantastic turn of events for all of us involved in the AspDotNetStorefront community. 

Over the years we have come to be great fans of AspDotNetStorefront as an eCommerce platform for the mid-market.  Like all platforms in this space, it has it’s ups and downs, but we always maintained that the downs were ones with which we could work/get around.

Having Vortx snag up this platform is truly a great thing for merchants, developers and platform partners alike.  We have always enjoyed competing with, and sometimes working with the folks over at Vortx.  We share similar core values, and ultimately a common vision, for what this platform could really become.

In the coming months expect to see more stability brought to the platform, stronger community development efforts, and and overall greater value level brought to those merchants who made the decision (and are still pondering) to go with AspDotNetStorefront.

Stay tuned, it’s going to be a brilliant ride!

Edit: Official press release - http://www.vortx.com/t-20100805_pressrelease.aspx 

Return Policies and Building Customer Loyalty

by Matthew Bertulli 7/11/2010

After a recent visit to a higher end, locally owned clothing store in Calgary I was reminded about the impact a retailers return policy could have on customer loyalty.  You see, this particular store only accepted returns on unworn merchandise within 15 days of purchase. Also, they only gave out store credit.

I understand the unworn part when dealing with clothing (definitely a "sanitation" thing in play here). Where I stumble is the 15 day restriction and also the store credit.

This is what made me think about retail return policies in general, including those on eCommerce stores.

Everyone in the eCommerce space knows the story of Zappos and their stellar return policy. Zappos figured out that the customer / retailer balance has shifted in the last few years. With the reach of social media and customer interaction in general, retailers have to be ever more creative in fostering customer loyalty.

Which brings me back to return policies.

I come from a retail family. We've spent the last 40 years in the retail space actually. One of my parents and grandparents greatest fears with having liberal return policies was the worry that customers would take advantage of the policy. "Trying instead of buying" or "we aren't a rental store" were the common theme in these discussions.

Based on the success of eCommerce vendors and their free returns within long terms, I think it's safe to say that customers really aren't that abusive.  

Don't get me wrong, there are a few caveats to consider here. The first is margins. If your product margins are priced so thin, free returns and long return terms are probably not going to work. The second is knowing your space and the customers in your space. If the % of returns in your space is abnormally high then you may want to express caution with overly liberal return policies.

For the rest of you, stop it with the forced customer loyalty that is "store credit". Give the customers the option if you must, but don't force them to pick something else. And especially don't force them to have store credit that expires in some short amount of time. Give them at least 6 months.

We have seen clients of ours create some really fun and unique return promotions and incentive offers that have worked brilliantly at re-converting returners into buyers. I'll save that for another post though!

eCommerce is Finally Changing. What are you doing about it?

by Matthew Bertulli 7/2/2010

For the last 10 years the eCommerce landscape really hasn’t changed much.  There has been quite a bit of improvement in the business of eCommerce, especially in technology and processes.  However, anyone who has been around eCommerce for the last decade will agree that only in the last 2 years have we actually seen dramatic, disruptive change.

So far, it’s been two major trends emerging as the big disruptors.  The are also both underpinned by one driving force…

Private Sales / Shopping Clubs

Ventee-Privee started it, and hordes of other sites like Gilt and Ideeli.com have followed to become extremely fast growing online retailers. The concept is simple. They provide highly discounted product to an exclusive membership only crowd.  With memberships tallying in the millions for each of these sites, things are hardly that exclusive, but the deals being enjoyed by customers can’t be denied.

Group Buying

Everybody in the eCommerce or tech world has heard of the massive success that is Groupon.  They’ve gone from zero to monster in an incredibly short period of time and their business model is actually pretty simple as well.  They find local businesses willing to offer Groupon members a great deal every day.  If enough Groupon members sign up for the deal, it’s on.  If Groupon can’t get enough people to commit, the deal is void. 

Common Thread – The Social Web!

Most of the disruptive technologies appearing in the eCommerce world are all based on the underlying power of the social web.  It’s no secret that eCommerce companies are pretty slow to adopt new, trendy technology, so it’s also no surprise that the social web is finally making it’s way into the world of selling stuff.

For those of you with a Facebook account (who doesn’t?), it’s pretty obvious that retailers are slowly making some moves here.  We see major brands establishing themselves on Facebook and in many cases are even setting up virtual storefronts on social networking giant.

E-tailers everywhere are trying to figure this social web thing out.  They are looking at pushing their content, which is largely product based, out to these various social platforms.  They are trying to find which social networks best fit their particular business in an effort to achieve maximum ROI on their spend.  They are even trying to figure out how to even START in this big social web thing.

So our question to clients and prospects; what are you doing about evolving your retail / eCommerce business?

LINQ to XML XElement Memory Problems

by Matthew Bertulli 6/9/2010

Let me just start by saying that this post is one of those weird ones where it probably serves more function as a "lookup" for a very fringe issue in the off chance we run into it again. 

We've recently been doing some work with the book publishing industry ONIX file format, which for those who don't know, is an XML schema for moving book product data between publishers, distributors and retailers.  When we were asked to bring the ONIX format into the AspDotNetStorefront eCommerce platform, we decided to build an integration service that used LINQ to XML to work with ONIX.  We've used LINQ to XML in the past and found that it's speed to develop with was important for this job (the code is just really nice to write).  

All was going well until we started testing the service with ONIX files that contained north of 20,000 records, roughly 75MB of XML in size per file.  The service started to chew up several GB of RAM while running, clearly the result of a memory link somewhere in the entire process. After smashing our heads against the wall I decided to grab a free trial of the Redgate ANTS Performance Profiler to see if they might shed some light as to why we were leaking memory from a rather simply set of functions.

The ANTS Profiler showed us that our major culprit was the XElement object that is part of LINQ to XML.  So we began googling around to see if anybody else was having similar problems.  There were hints here and there that some were experiencing this issue but nobody seemed to be solving the issue except for changing their method of XML manipulation to using traditional stream readers/writers. 

Then, one of our senior developers (Dimitri) took a look at the code and saw that we weren't calling RemoveAll() on our container XElement that held all the manipulated xml.  Before you comment, know that this XElement was contained in a separate class that was instantiated + destroyed every 50 records or so in an attempt to work in smaller more manageable data chunks.

So, we added the .RemoveAll() to our root XElement object and bingo, no more memory leaks!  The lesson here is that the XElement is a fully managed object that does not implement IDisposable, so there is no nice way to force it to remove from memory.  The .RemoveAll() method at least seems to destroy a lot of the memory footprint of this rather wierd beast.

Hope this helps someone else out!

Choosing the right eCommerce Platform

by Matthew Bertulli 6/6/2010

There is certainly no lack of selection when it comes to choosing an eCommerce software solution for your business.  Seeing as we are a company who works mainly with Magento Commerce and AspDotNetStorefront, we are often asked how we choose which platform to recommend.  There is no straight forward response to this question, as choosing a platform is extremely difficult.  I can even think of several instances where the two platforms we work with aren't even a good fit for the client, so we need to point them elsewhere.

So, how do we evaluate and choose an eCommerce platform?

Who is your target audience?

This is truly where you should be starting.  Some eCommerce platforms are geared entirely towards the merchant who requires a strictly business to business (B2B) solution.  These platforms typically don't have the same feature set as their business to consumer (B2C) counterparts and we have sadly seen some merchants go in the wrong direction right from step #1.  If you are intending on selling to the general public, you should be looking at a pure play B2C offering.  If perhaps all you do is wholesale business, then B2B platforms will have features that are tailored to wholesalers.  So, who is your customer?

You need the basics, so forget the other stuff until you have these checked off.

Doing a side by side comparison of platform features can be somewhat daunting as many of the platforms out there have hundreds of features and they are quite up front with listing them all on their website in some weird effort to impress merchants. 

Here is our list of the real basics that you need in a platform:

  1. 100% Design Flexibility
  2. Friendly URLs (i.e. - www.mystorerocks.com/fancy-pair-of-shoes.html instead of www.mystorestinks.com/?productid=1234)
  3. Category and Product SEO specific control (titles, descriptions, meta info, url naming etc...)
  4. Rich Product Categorization options
  5. Support for multiple category and product templates.
  6. Source Code (paid or free, you want a completely open solution to touch/mold to your business as it grows)
  7. API.  If you can't get source code, you at least want a rich API that allows you to build functionality extensions for your store.
  8. Payment gateway options, and lots of them!
  9. Shipping provider integrations, and lots of them!
  10. Community.  Having a strong community of fellow merchants, developers, and marketers is like having a large group of experienced personal advisors.   

Like I said, there are hundreds of features, but we consider the above 10 to be absolutely critical.

Consider your in-house technical talent.

They say good programmers/developers can work with any language or framework.  The problem is, good programmers are hard to find in any industry, let alone eCommerce.  Many eCommerce operations have internal tech talent that know one language fairly well.  If you are looking at an eCommerce platform that is build on a technology stack that you are not equipped for, then you need to consider the secondary costs of training or replacing your internal talent.  

What about platform cost (licensing).  What is too little?  What is too much?

This one is where many merchants get their first dose of "sticker shock".  The eCommerce mid-market has literally hundreds of platforms available for your picking.  They range from open source (free) to tens of thousands of dollars in licensing.  At the end of the day, the cost shouldn't matter as much as the value the platform will deliver.  

The perfect example of choosing a platform strictly on "cost" is the Magento Commerce editions.  They have an extremely popular 100% free open source Community Edition.  They have a newly released Professional Edition that is $2,995 per instance/server.  And they have an Enterprise Edition which starts at around $13,000 per instance/server. With these three options, we commonly get the business who is evaluating all three and has a hard time justifying the difference in cost.  Putting code base aside, the feature set that comes in Enterprise Edition is far superior to Community Edition just in the amount of revenue boosting features it offers merchants out of the box.  Even the Profesional Edition has a handful of features that add immense revenue boosting value that are not in Community Edition.  

If you're a serious eCommerce store, even if you're smaller store that does less than $1million/year in gross sales, you need to make sure you are choosing a platform that gives you the most bang for the buck.  Free is nice, but absolutely NOTHING is free, especially when it comes to open source technology!

To summarize, one of the main reasons we work with more than 1 eCommerce platform is because we don't think that there is a one size fits all solution out there.  We help our clients go in a direction that will help them build a better eCommerce business.

I hope these pointers help you out in your eCommerce journey.  If you think I've missed anything critical I would be quite greatful for the feedback and hopefully some open discussion!

eCommerce Tips – Customer Loyalty

by Matthew Bertulli 4/21/2010

The topic of “brand loyalty” is something I seem to be discussing with clients and prospects quite a bit in the last few months.  I like to refer to brand loyalty as “customer loyalty” as I find it more fitting a description and less buzz-word like.  Ultimately, any business that has been around for some time has some degree of customer loyalty. 

The correlation between customer loyalty and growth is one that can’t be denied.  As an eCommerce business you should focus significant efforts on providing the absolute best customer experience during pre-sale, sale and post-sale stages.  Here are a few pointers for building customer loyalty:

Keep in touch often, but not to the point of spam or being annoying.

In discussions with clients we find ourselves talking a lot about the modern internet being all about people and the relationships you have with them.  A big part of building a successful retailer–consumer relationship is communication.  Having open lines of communication is critical, but balancing good communication and the temptation of e-mail/coupon/promotion spam is tough to tackle.

My family has been in retail for over 40 years, from furniture and home decor stores to baby products and home organization products.  One thing I’ve always noticed is the incredible importance of “key customers”.  I’ve heard my mother speak time and time again of how she has a handful of clients who keep her in business.  These are people she has worked hard at building relationships with.  She over services these customers and they return to her for their home decor desires.

It’s being proven over and over that building good relationships with your customers is absolutely critical to having repeat customers and not just bargain hunters.

Keep things relevant

Many eCommerce stores incorporate more than just products and category data into their site content.  We’re seeing an active increase in blogging, forums, online chat, social networking and so on.  However, what we have seen are eCommerce stores that have blogs which have a lot of non relevant content on them.  It’s nice to switch things up, and as bloggers you have a freedom of speech that makes it easy to voice opinions and talk about random junk.  Just keep it relevant the majority of the time!

Our advice, sprinkle a little personality in your site blog, but keep things relevant as your customers are looking to you as an authority in your space.  If you aren’t trying to be an authority in your space, what the heck are you running an eCommerce site blog for anyway?

Let the customer know that the customer experience is what you’re all about.

Everybody in eCommerce (heck, the internet) has heard about Zappos and their ridiculous level of customer service.  If you haven’t, I suggest you give them a search and do some reading.  They’ve now set the bar in the world of customer service and if you want to be known for great customer service, I suggest you learn from them.

A great example about customer experience lies in Starbucks.  By now you are bound to have heard someone talk about how Starbucks gets us to pay $4 for a coffee over the next $1.50 place.  Our local Starbucks here in Burlington, Ontario is proof of how they do it.  I can’t tell you one single experience I’ve had there where the staff isn’t unbelievably friendly.  It makes me enjoy my coffee buying experience, and keeps me coming back for more.

Customers like knowing that we care about them, and you SHOULD care about your customers because without them you have no business.  We like working with companies who look at eCommerce as a serious part of their business.  The guys who think they can get into selling product-x online without providing solid consumer experiences are in for a shocker.  The modern internet is all about people.  It’s about relationships.  It’s about connection.  All of these terms are just other ways of saying GREAT CONSUMER EXPERIENCE.

Allow customers to talk and connect with one another (reviews, forums, blog comments, twitter, facebook etc…)

We’ve talked about building your retailer-customer relationship, but what about fostering communication and relationship building amongst your customers?  There are many, easily findable reports about the importance of peer recommendation in world of consumer purchasing.

We believe in a multi-step approach to fostering communication amongst customers.  First, make sure you have product reviews on your products, and keep them open!  Showing just the positive reviews makes things seem unrealistic and you aren’t fooling anybody.  Second, have an open forum for customer service question and answer.  This is a great place for customers to come, search, and participate in what other customers are saying about your site, products, and space.

Honesty and transparency lead to stronger business brand and reputation.  This, above all else, is the new mantra of the web and eCommerce businesses need to embrace it.

eCommerce Law - Customer Agreements, Internet Contracts and Much, Much More

by Matthew Bertulli 4/21/2010

If you are in any kind of internet business selling goods and services via online sales channels then you need to read the ecommerce law blog by Jonathan D. Frieden.  I’ve been reading this blog for a while and always learn something new from this less than well understood side to the world of internet business.

Recently he posted on the topic of internet contracts and whether or not they can be enforced.  This was actually something my partners and I were discussing for our own business recently.  We are very lucky to have good relationships with a number of lawyers, but many of our clients are not in a position to spend the kind of money lawyers command these days.  For these clients, I point them over to Jonathan.

Enjoy!

Google’s Matt Cutts Confirms 301 Redirect Problem…Sort Of

by Matthew Bertulli 3/23/2010

Anybody who has been doing SEO (Search Engine Optimization) for the last few years is well aware that 301 Redirects are a common tool in the average SEO’s belt.  We often use 301 Redirects when migrating client eCommerce sites from their old platform to their new one (i.e. – from Volusion to AspDotNetStorefront). 

In his interview, Matt Cutts confirms, as much as Google ever confirms anything, that 301 Redirects may in fact result in some PageRank loss….maybe…possibly.  Matt Cutts, talking about his own site/domain and the use of 301 Redirects when he moved from dullest.com to mattcutts.com:

Please Note: Any and all references to PageRank decay with regards to 301 Redirects are specifically in relation to moving a site from one unique domain to another unique domain.  He is NOT talking about moving your site, on the same domain, to another platform.

“Matt Cutts: Typically, the 301 Redirect would pass PageRank. It can be a very useful tool to migrate between pages on a site, or even migrate between sites. Lots of people use it, and it seems to work relatively well, as its effects go into place pretty quickly. I used it myself when I tried going from mattcutts.com to dullest.com, and that transition went perfectly well. My own testing has shown that it's been pretty successful. In fact, if you do site:dullest.com right now, I don't get any pages. All the pages have migrated from dullest.com over to mattcutts.com. At least for me, the 301 does work the way that I would expect it to. All the pages of interest make it over to the new site if you are doing a page by page migration, so it can be a powerful tool in your arsenal.”

Now, after Matt Cutts states that his own 301 Redirect testing has shown it to be “pretty successful”, Eric Enge asks him the following question (with Matt Cutt’s answer):

Eric Enge: Let’s say you move from one domain to another and you write yourself a nice little statement that basically instructs the search engine and, any user agent on how to remap from one domain to the other. In a scenario like this, is there some loss in PageRank that can take place simply because the user who originally implemented a link to the site didn't link to it on the new domain?

Matt Cutts: That's a good question, and I am not 100 percent sure about the answer. I can certainly see how there could be some loss of PageRank. I am not 100 percent sure whether the crawling and indexing team has implemented that sort of natural PageRank decay, so I will have to go and check on that specific case. (Note: in a follow on email, Matt confirmed that this is in fact the case. There is some loss of PR through a 301).

So, is this really a major revelation from Google’s #1 blogger?  Or is this just the typical response we’ve been getting from Google for years with regards to their PageRank and search engine result page algorithms?  My vote is for the latter. 

It would be great to see the e-mail that Matt sent back to Eric Enge “confirming” that 301 Redirects result in PageRank decay.  Did he confirm that there is PageRank decay, or that there “could be some loss”?

AspDotNetStorefront V9 – Creating a Custom Search Control

by Matthew Bertulli 3/18/2010

In a recent forum post over on forums.aspdotnetstorefront.com, there was a discussion about manipulating the new Search control that shipped with version 9.  Rather than just posting the solution there, I thought it might be a good idea to throw this up on the blog so that others might find it as well.

With the v9 release came quite a number of changes to how developers are going to interact and customize AspDotNetStorefront going forward. For those who have been on the platform for years, these changes are going to take some getting used to.  For those who are “day job” asp.net developers, the changes are going to be a breath of fresh air.

One of the areas in version 9 that has changed is how common controls/blocks of code are rendered to your site.  In previous versions, much of this was done with XMLPackages and hard-coded templates.  The site search is one of those areas of AspDotNetStorefront that was hard coded html (with some javascript) on the template.ascx pseudo “master page”.  Now, in version 9, the search control is implemented as a standard ASP.NET Server Control.  If you are lucky/smart enough to have source code, all of the controls can be found in the AspDotNetStorefrontControls project (and namespace) under Search.cs.

In one of our version 9 client projects, we had a need to change how the HTML was rendered with this Search control.  Before we show you code, this is a quick snapshot of the before/after of our search control:

BEFORE:

aspdnsf_oldsearch

AFTER:

aspdnsf_customsearchcontrol

 

Building an AspDotNetStorefront V9 Custom Search Control:

1. Copy Search.cs to a new file in your App_Code folder.  In our case, we called this new class /App_Code/DemacSearch.cs.  An example of our new class declaration:

   7: using System;
   8: using System.Collections.Generic;
   9: using System.Linq;
  10: using System.Text;
  11: using System.Web;
  12: using System.Web.UI;
  13: using System.Web.UI.WebControls;
  14: using System.Web.UI.HtmlControls;
  15: using System.ComponentModel;
  16:  
  17: namespace DemacControls
  18: {
  19:     /// <summary>
  20:     /// Custom control used for search functionality
  21:     /// </summary>
  22:     public class DemacSearch : CompositeControl
  23:     {
  24:         
 437:  
 438:     }
 439: }

2. Modify the CreateChildControls method, found around 380.  This is where the control builds up it’s list of child controls to render to the web.  In our case, we needed to add some extra HTML to the rendered output so that we could style it more easily.  Here is what our new CreateChildControls() method looks like:

   1: protected override void CreateChildControls()
   2:         {
   3:             Controls.Clear();
   4:             _pnlContainer.Controls.Clear();
   5:  
   6:             Action<Control> addControl = (ctrl) => { _pnlContainer.Controls.Add(ctrl); };
   7:             _pnlContainer.CssClass = "search";
   8:             addControl(new LiteralControl("<div class=\"searchContainer\">"));
   9:             addControl(new LiteralControl("<fieldset>"));
  10:  
  11:             //DEMAC
  12:             //Lets add some more classes to our elements
  13:             _txtSearch.CssClass = "input";
  14:             _lblSearchCaption.CssClass = "search_text";
  15:  
  16:             addControl(_lblSearchCaption);
  17:             addControl(new LiteralControl("&nbsp;"));
  18:             addControl(_txtSearch);
  19:             addControl(new LiteralControl("&nbsp;"));
  20:             addControl(_btnDoSearch);
  21:  
  22:             if (this.ValidateInputLength && !this.DesignMode)
  23:             {
  24:                 //Controls.Add(new LiteralControl("&nbsp;"));
  25:                 // validator
  26:                 _valMinLength.ControlToValidate = _txtSearch.ID;
  27:                 _valMinLength.ErrorMessage = string.Format(this.SearchTextMinLengthInvalidErrorMessage, this.SearchTextMinLength);
  28:                 _valMinLength.ValidationExpression = "[0-9a-zA-Z ]{" + this.SearchTextMinLength.ToString() + ",}";
  29:                 _valMinLength.EnableClientScript = true;
  30:                 _valMinLength.Display = ValidatorDisplay.None; //.Dynamic;
  31:                 _valMinLength.CssClass = this.CssClass + "_error";
  32:                 _valMinLength.Font.Bold = false;
  33:                 _valMinLength.Font.Italic = false;
  34:  
  35:                 addControl(_valMinLength);
  36:                 addControl(_valSummary);
  37:             }
  38:  
  39:             // assign the default button to trigger
  40:             // once any Enter key was pressed inside the area of this container
  41:             // which is usually after typing on the search text and hitting the enter key
  42:             _pnlContainer.DefaultButton = _btnDoSearch.UniqueID;
  43:             addControl(new LiteralControl("</div>"));
  44:             addControl(new LiteralControl("</fieldset>"));
  45:  
  46:             Controls.Add(_pnlContainer);
  47:  
  48:             base.CreateChildControls();
  49:         }

 

3. Next, modify your web.config <Controls> section and tell your site about the new namespace that contains your custom search control.  Since you’ve placed this code in the App_Config folder there is no need to reference an assembly.  Here is what our modified web.config <Controls> section looks like:

   1: <controls>
   2:         <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
   3:         <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
   4:         <add tagPrefix="aspdnsf" namespace="AspDotNetStorefrontControls" assembly="AspDotNetStorefrontControls" />
   5:         <add tagPrefix="demac" namespace="DemacControls" />          
   6:       </controls>

4.  Now, on your template.master page, you can reference this newly created control like follows:

   1: <demac:DemacSearch ID="ctrlSearch" runat="server" 
   2:                         SearchCaption="<%$ Tokens: StringResource, common.cs.82 %>" 
   3:                         SearchTextMinLength="<%$ Tokens:AppConfigUSInt, MinSearchStringLength %>" 
   4:                         SearchTextMinLengthInvalidErrorMessage="<%$ Tokens: StringResource, search.aspx.2 %>" 
   5:                         ValidateInputLength="true"
   6:                         ShowValidationMessageBox="true" 
   7:                         ShowValidationSummary="false" SearchButtonCSS="go" />            

5.  And just for good measure, here is our CSS that nicely modifies the search box to display an image instead of a button along with prettying up the form a bit.

   1: .search fieldset{ border:none;}
   2: .search .go{ border:none;}
   3: .search{ float:left; width:320px;}
   4: .search .searchContainer{ float:left;}
   5: .search .searchContainer fieldset{ outline:none; float:left;}
   6: .search .searchContainer .go{ width:38px; height:30px; cursor:pointer;}
   7: .search .searchContainer .input{ width:184px; margin:3px 6px; padding:3px 8px; height:16px; font-size:12px;}
   8: .search .searchContainer .search_text{ float:left; font-size:14px; font-weight:bold; text-transform:uppercase;}
   9: .search .searchContainer .search_text{ padding:8px 0 0 0;}
  10:  
  11: .search .searchContainer .go { background:url(images/go.gif) no-repeat; }
  12: .search .searchContainer .input { border:#ffc9a0 1px solid; color:#adadad; }
  13: .search .searchContainer .search_text { color:#ff6e00; }

Hope this helps!