Improving Support One Changelog At A Time

Posted February 14, 2009 by Patrick
Categories: support

sales.rb Revision 539:

Unanticipated behavior: Some customers put Registration Key into Lookup My Registration Key form.  This looks up transactions by order number and email address, thus failing to find any matching records, then informs customer to email me to find their Registration Key.  This is suboptimal.

Fix: If input into LMRK form resembles a Registration Key, search for a line item which had that Registration Key assigned.  If one exists, then it was actually issued to a customer — redirect them to explanatory text with pictures on how to enter a Registration Key into the application, not the website.

If Registration Key does not exist, then tell customer to email me.

Sales Up Massively, My Guesses As To Why

Posted February 13, 2009 by Patrick
Categories: Uncategorized

I have dumb-as-rocks logic on my dashboard that straight-line predicts sales out to the end of the month.  Currently, its suggesting I’m likely to have $3,000+ sales in February.  What is scary is that number is increasing every day — i.e. the projection keeps going up because the last day’s sales beat the straight-line projection.  (Or, in some cases, shattered it.  Today was my best day ever.)

What’s doing it?  Well, its a witches brew:

1)  Early indications are that the new cart that I was so excited about kicks royal buttocks.  There is an A/B test running at the moment.  Suffice it to say that if I told you the improvement I am seeing you would not believe me.  I’m not even sure I believe me.  The results are not statistically bulletproof yet and, against all my instincts to cry it from the rooftops, I’m going to wait until they are to show off.

2)  I am having good results from a really simple change to my Check for Updates page, which is seen by a large portion of trial downloaders.  The basic idea is simple: as long as I have you on my webpage because you’ve demonstrated that you care about having the latest and greatest, why don’t I sell you on the benefits of getting the latest and greatest forever?

3)  I’m having fairly decent results with the testing of the version of the software packaged with Excelsior JET versus the stock Launch4j wrapped executable.  It isn’t quite the murderously one-sided contest that the shopping cart appears to be, but hey, improvements are improvements.  I’ll wait until the test is over to unveil the results, although I gave an interim update here for those interested. 

4)  I made some changes to BCC 2.51 to make it more usable and, at the same time, make it sell better.  One alteration which might slip the notice of programmers was to the UI.  Can you find the change between these two screenshots?

Old version:


New version:

Give up?  Click on the second image and you’ll be taken to the annotated version, with the two important bits called out in red.  Or you could highlight the following text: [The number one reason to buy my software is to get randomly scrambled bingo cards.  Despite the fact that I hammer away at this on my website, many people don’t actually know that the program does this.  I get asked sometimes “How do I scramble the cards?”, which indicates that the whole Sample Cart element was an epic failure at comprehensibility.  Hence the clarification by it.  Similarly, users perceive a need to get unique bingo cards.  There are 24! bingo cards possible from the smallest possible word list.  That is 620 septillion bingo cards.  But users are worried that if they print some insanely big number, like twenty, they will get a repeat.]

Incidentally: if there is an exceptionally nice person out there who could reproduce the first image for me on a machine that has Windows XP on it, I would be very obliged.  Just open any of the Language Arts -> Reading -> Dolch Sight Words lists, and show the program with the word list opened and scrolled down, as that image does.   Thank you, Chris.

5)  BCC 2.51 includes a “soft” timed trial mechanic.  Here is how it works: the user gets to use the software for forever, as they always have been.  The software prompts to be updated once every 15 days, as it has for quite some time.  If a user says they want an update, the software then displays the following dialog after popping the website: 

Yes, that spelling mistake is in the original.  Sigh.  Just noticed it as I was grabbing this screen shot.  I’ll fix it tomorrow.  Anyhow, the idea here is that while nagging first time users of the application would be a little gauche, someone who has used the application for 15, 30, 45, etc days is clearly happy with it and just needs a bit of a nudge over the finish line.  So I offer them an incentive for registration.  

The nice thing about this one is it sounds like “getting something extra” rather than “getting something which was taken away from you”, like the ability to print 16+ cards or the ability to save, both of which are disabled in the free trial.  The upsell screens that pop up when those are triggered still account for the lion’s share of sales from the app, though.

Alright, that’s enough writing for one day.  I’ll keep you aprised as the month moves on.

Big Writeup About The New Cart

Posted February 11, 2009 by Patrick
Categories: Uncategorized

I wrote up approximately everything I know about shopping carts, plus everything I learned from my recent experience rewriting one, and made a proper article about it.  It ginormous.  It is also probably one of the best things I have ever written regarding my uISV, so if the topic interests you, go have a gander.

It includes a bunch of high level theorizing, some stats from BCC, and more code than you can shake a stick at.  (I released the whole cart into the public domain.)

Why put it on my site rather than the blog?  Well, it uses live data and integrates directly into the site, for one thing.  For another, I’m kind of hoping folks will say “Ooh, that is some wonderful stuff” and link to it.

iBox Overlay Doesn’t Scroll

Posted February 10, 2009 by Patrick
Categories: Uncategorized

Hello, Google searcher!  I spent 2 hours so you don’t have to!

Search for the following line of code: = height + ‘px’;

Now add this after it.  Problem solved!

      //causes the overlay to scroll as the page scrolls — necessary for Safari/Chrome/FF3

      if (document.viewport && document.viewport.getScrollOffsets()) {

        var top = document.viewport.getScrollOffsets()[1]; = top + “px”;


OK, back to regular readers of this blog: as mentioned previously, I’m testing a new shopping cart.  There were previously 3 known issues:

  1. the overlay didn’t scroll
  2. the price got all funky in Google Checkout under some conditions
  3. the quantity and price were inconsistent if you switched the item after closing the cart

I’m happy to report:

  1. I patched iBox to avoid this issue, and tested it in five browsers because I just have no life whatsoever.  Please see above code if you need it.
  2. e-junkie continued their years-long practice of above-and-beyond support and corrected my misunderstanding of their API, which let me patch my code around this
  3. I patched my code, in a ho-hum workmanlike fashion.

The more I use Javascript the more I feel that a) all websites I’ve ever used are missing massive opportunities to make their user interaction sexier than they can possibly imagine and b) I can understand why, because coding Javascript is the most painful programming I’ve done since C in college.  

Oh, God, the cross-browser issues!  The sheer complexity of the DOM model!  The paucity of good documentation available in my IDE next to autocomplete!  (Sorry, I will always be a Java programmer at heart.)

Anyhow, if you want to take a gander at the current version of the sample cart or compare it to the current cart, go nuts.  After I alter it a bit tomorrow to make the error handling sexier (i.e. for the disallowed multiple purchase through Google — it has never happened before but, eh, why not ship it right the first time), I am going to start the split test.

Finished My Mini-Development Project, Mostly

Posted February 8, 2009 by Patrick
Categories: Uncategorized

Yesterday I mentioned that I would be making a new shopping cart.  

I’ll be blogging about this much more extensively later, but after pouring 8 hours into the massive black hole of time that is Javascript (aaaaaaaahhhhh I hate you so), I got the new and improved cart working.  It isn’t quite user-ready yet and isn’t anywhere NEAR where I would consider releasing it as code for other uISVs, but you can go play around with it to get the general feel.

Known bug: e-junkie seems to have an issue when you override a price for an item and use a Google Checkout Buy It Now button.  I use this feature to move the pricing logic from the e-junkie servers to my Javascript, where it gets “bugs in your teeth fast” speed improvements.  I will probably delay releasing this until e-junkie fixes that issue or I decide to work around it with a business rule modification.

Known bug #2: If you pick a non-one number in the cart, then close it, then reopen it, your total is calculated incorrectly until you do at least one keypress in the quantity field.  I know what is causing this and will squash it fairly soon, but just feel like “I’m done for the day”.

Old cart, for comparison: Bingo Card Creator purchasing page.

New cart:

How I feel:

  1. The new cart is bugs in your teeth fast for loading.  Mission accomplished.  Currently it takes the same amount of time when you click Checkout as the current cart does, which needs to get disguised a bit better.
  2.  Try adding a CD to your cart in both and tell me which you like better.  I think this is going to be worth significant money for me.
  3. In general, I think the user interaction simplifies markedly.  The new lightbox-esque effect, provided by iBox (a wonderful piece of software with some significant teething issues I’ll talk about later) makes the “Continue Shopping” button redundant.  Gone.  Because I no longer incur an AJAX roundtrip to another server every time the user does anything, I don’t need to tie their updates to the Update Cart button, hence it is gone.  
  4. I sort of like being able to customize the branding a little bit.  For example, while you and I know this is a shopping cart, I think that whole metaphor just confuses users.  Gone.  Instead, slap in logo and text.

Let me know what you think.  After I’ve sanded down the few issues I’m going to start the A/B test and then start packaging this so that other folks can use it.  Expect a very long “making of” post as well — I actually got to solve some fun technical issues for a change, so I’ll tell folks how I did it.

New Mini-Development Project For Me

Posted February 7, 2009 by Patrick
Categories: web design

I have a deep, abiding affection for e-junkie, which is my payment processor of choice.  So much so that I’ve been called their Local Sales Rep on the Business of Software forums.  Probably true — have I mentioned they’re the best $5 a month you will EVER spend in your life?  Sorry, had to do some shillin’ like a villain to make up for what I’m about to say.

I’m thinking of not using their shopping cart anymore.  Not because it isn’t an amazing piece of technology which manages to work for thousands of people without writing code, because it is all of that and more.  The lift I got in conversions from using it has made me thousands, which for about 5 minutes of integration work means the hourly effective wage is sweet indeed.  Its just that my web programming abilities are improving these days, and I’m starting to chafe at a few of the necessary restrictions from using a third party solution.

My big issues:

1)  Forcing people who buy a CD to put in their zip code twice — once in the cart, once at the actual checkout screen.  I’m working on the assumption that that probably kills CD conversions, and I’m not sure those conversions come back

2)  It is slow.  Clicking on the cart gives you a loading message for two or three seconds.  I still think it beats the pants off of a pageload when updating a shopping cart, I just want the perceived speed to be “bugs in my teeth fast”.  (This is where people ask me “Well, why do you need a shopping cart at all when you can just have a Buy Now button?” and where I say “I’ve tested both alternatives and the cart makes me oodles of money by simplifying the customer experience.”)

I was partially inspired to do this by my buddy Yakob at Mixed In Key, who a) has something really cool coming down the pipe which if you are reading this blog will interest you intensely and b) has a really sweet shopping cart implementation.  Try it, you’ll like it.  That’s what I want mine to work like.

I think I can repurpose some of the Widget Factory Javascript code to achieve it fairly easily.  The actual transaction will still be handled by e-junkie, but I want the cart constructed locally.  If I can do it fairly cleanly, I’ll open source this so that anybody else can apply it to their sites — otherwise, I’ll just do the usual kludging and split test it against the genuine e-junkie cart on mine.  I’m thinking the lift in conversions is going to be sizeable enough to justify a few hours of fighting with Javascript (once).

Sidenote: My dashboard informs me that I might hit $3,000 in sales this month.  Whee for new records!  Recession, what recession, 73% year over year growth.  (Watch me jinx myself.)  

What’s doing it?  Same old same old:

  • AdWords doing well as it always does near secularized holidays (Valentine’s Day bingo is always hot, and while I’m not winning that SERP the people who are thankfully slap AdWords all over the place)
  • organic SEO efforts on website paying off (~1,200 visitors from Google on average weekday these days)
  • version 2.51 converts pretty decently (subtle changes, big difference in effects, tell you about it later)
  • a few tweaks to the website are paying nice dividends

CrazyEgg Makes Me Serious Money… Again

Posted February 4, 2009 by Patrick
Categories: web design

It has been a really long time since I did any testing of webpage elements and I was thinking “Hmm, what am I paying $20 a month for CrazyEgg if I haven’t logged in since summer?”  So I sat down for a moment and thought of something I could add.  Ahh, I know — maybe I’ll try adding another download button after my benefits spiel and before the ginormous 566×545 pixel sample bingo card, whose scroll-inducing enormity comes before the one visual download button in my main body.

Four days later I come back to CrazyEgg and see the result of 4,200 visitors:

86 clicks, or 10.4% of clicks on the page, on that one stinking extra button.  This increases the conversion of my main page by about 20% (some clicks are presumably “stolen” from other ways to reach the same goal).  Since my main page is also my AdWords landing page this started decreasing the amount I was paying for conversions instantly, and of course increasing the number of trials downloaded will hit the bottom line pretty darn directly.  The naive assumption is that 20% more trials is 20% more sales.

Sadly, my main page does not account for 100% of conversions, but my quick back-of-the-envelope calculation is that the main page causes about 40% of trial downloads directly, which implies that it drives something like $800 of revenue a month, so a 20% increase in that is $160 added to the bottom line (plus assorted cost savings from AdWords which I will not get into because the math gets heady).

Putting a button there is kind of jawdroppingly obvious… I’m not sure why I didn’t do it before.  Sure, there is one button visible to the left when you open the page, and the first text link in the content area is to the download (I have previously tested this and highly recommend it, because the first text link in the content area gets a huge portion of user interaction).  But if someone scrolls down to actually read the benefits list, then they’re left high and dry with nowhere to click unless they scroll past the huge image or scroll upwards.  Neither of those activities “flows” well after you’ve just read a benefits list, not nearly as well as “click here” does.

Well, lesson learned. 

I don’t think I’ve said this in a while: I love you, CrazyEgg.