Archive | Uncategorized RSS feed for this section

Update: Landing Page Redesign Successful

Recently I blogged about how I was redesigning my landing page to increase conversions from AdWords.  I am almost embarassed how well this is working.

That picture pretty much tells the story: for the last 1,000 visitors, the One True Goal button got over 180 clicks, and the (equivalent) sign up free link above it picked up another 40.  When you add in the (not pictured) ways to convert lower on the page, plus ad back in the folks who went off to the home page but ended up converting to the trial later, the conversion rate is about 28%.  Yowza!  For comparison, I generally do well to get 21 to 22% on AdWords.

This means that the same number of impressions results in a third more trial downloads for me, and hopefully thus a third more sales.  Or, to phrase it another way, the cost of customer acquisition for me just declined by about 25%, which is good because AdWords is my largest expense by far.

Because of how Conversion Optimizer works (Google automatically adjusts your CPC bid to target your proposed CPA target), this likely means that over the next few weeks Google will increase the CPC bid I give for placement on sites like About.com and whatnot.  That should increase the number of impressions (and hence, clicks and conversions) that I get.  Cross your fingers for me.

Photo credit to CrazyEgg, obviously.

Using Mixpanel With Ruby on Rails

I wrote up a fairly lengthy article on how to use Mixpanel with Ruby on Rails.  Mixpanel is a new analytics service I’ve been playing around with for the last week or so.  It is probably slightly more technically involved than most uISVs would care for, but the funnel tracking is solid gold.  You can see some changes that lead me to making for BCC, too.

As always, I’d love to hear your comments.  (I am on a bit of an optimization kick lately, aren’t I.  Got to get ready for the school year!  Three more weeks or so and I won’t be able to break the website NEARLY so often.)

Release It, Then Iterate Like Mad

I’m a heavy subscriber to the notion that you should release your application as early as it possibly provides value to anyone, then start iterating based on customer feedback.  Since it isn’t always practical to get feedback, and since customers do not always know what they want, I’d also consider stats about what they do to be among the most useful forms of feedback.

For example: If you add a quick start guide to your software, and twice as many customers manage to save their first document as did the day before, that is probably a sign that you’re doing something right.  If you haven’t quite guessed, I have indeed been working on my quick start feature.

I also have some stats to share about the new web version.  Some of them are already incorporated into my stats page, and the rest will be as I find time to code.  (Major props to OpenFlashChart 2 and the Rails plugin for it, meant it took all of five minutes for me to get the trial & guest account creation stats online.)

Anyhow, in about a week since I launched BCC.net publicly:

Trial signups: 200

Guest signups: 235

Word lists created: 850 (total)

Word lists created from scratch: 540  (Waaaay higher percentage than I expected.)

Bingo cards printed: 3,138  (Booyah.)

Sales directly attributable to online version: 0.  OK, anti-booyah.

Summer is a natural deadzone in my market so I’m not excessively worried by that, but hopefully things will pick up again like crazy come the schoolyear.  My users appear to be sticking, which is nice — about twenty people are already logging in every day, and I’m fairly sure only one of them is me.  Hopefully these and other fine folks will be persuaded to purchase the software once the school year rolls around and they need more than 15 cards from their lists.

What stats do you want to see?

With the new release of the web version of Bingo Card Creator I’m going to spend a portion of my weekend upgrading my internal stats tracking, which means “more stuff to share with you guys”.  Do you have any data in particular you’d like to see that is not already covered on my stats page?

I’m thinking of tracking:

  • daily signups to guest accounts, trial accounts, and purchases
  • daily logins
  • customer lifecycles (how long do people persist with using, how long until they purchase, etc)
  • some light-weight cohort analysis
  • most popular bingo activities among users
  • most popular activities which drive people to sign up

Web Version Gets New Coat Of Paint

I spent 6 hours today with my local designer and the web version of BCC is quickly taking shape.  He has a much better eye for design issues, including UI and usability issues, than I do.  We’ve totally revamped almost all the screens for the web version, with the exception of (ironically) the one users spend the most time on.  It actually now looks almost pretty.  I would include screenshots except I am on Linux and GIMP scares me.  You can see for yourself.

I also started to rewrite some copy in preparation for the launch.  Hopefully this will be out the door to customers by tomorrow evening.

Still needed:

  • “Forgot password” recovery
  • Analytics — can be postponed
  • Integration with purchasing system — still needs testing
  • Tune up of front page copy to address the web version

Happy Fourth of July everyone!

Bingo Card Creator Goes Web 2.0

Three years ago, on July 1st 2006, I released version 1.0 of Bingo Card Creator.  It was ugly, underfeatured, and bug-ridden.  Now, it is ugly, underfeatured, and bug-ridden… with AJAX!

Feast your eyes at this very, very early sneak peak.  You’ll want to click one of the various “sign up now” text links rather than the download a free trial ones.  I haven’t gotten around to sitting down with my design guy and redoing the buttons and the sales pitch for the free download yet.

Featurewise, it isn’t quite competitive with the downloadable Bingo Card Creator, to be honest.  A few of the power-user features, particularly design-focused things like picking fonts, are shockingly difficult to implement in a good way in a web application.  Others, like consistent columns and call lists, I just quite haven’t had time to integrate yet.

I was really impressed that I got the live preview of the bingo cards to work as well as it does.  Check it out — I am very proud of that work, although it is rough around some edge cases.  It took probably half of the development time of the site but I think getting users super-responsive feedback to their actions is worth every minute of it.

AJAX Technical Detail

How does it work?  While users are typing words into their text box, Prototype periodically checks it for changes and, if there are any, serializes the contents of the form and calls an AJAX function on the server.  The server takes the contents of the form and saves it to a “scratch” record in the database, which is not otherwise visible to the user.  The return value from this function overwrites part of the calling web page, including replacing the previous preview image with a new image if the scratch value has changed (same url, new query parameter — this tricks browsers into always requesting the image anew rather than checking their cache).

The path to the image on the server is actually just more Rails code, which checks to see if the scratch record has changed since the last time it produced an image.  If not, Rails tells Nginx “give them the last image we wrote, straight from the disk”.  If yes, then Rails uses Prawn plus a boatload of custom formatting logic to create a PDF, then calls out to ImageMagick to turn that into a GIF and resize it, then writes that to the storage area on the disk and tells Nginx to serve it.  Total time per request: on order of 300 to 800 ms.  My back of the envelope math suggests that my server, with two Mongrels, can probably support about 20 teachers simultaneously editing cards as fast as their fingers can go… after that I need to get worried (or upgrade to a bigger slice, which I might do anyway).

Still To Come

I still have to:

  • rewrite my copy to address the existence of the web version
  • get Bingo Card Creator 3.0 tested, in particular the features where it links to the website
  • give the user workflow a graphical upgrade, because pretty buttons sell B2C software
  • rewrite my page templates to push both the trial and the online service — I sense a lightbox coming up…
  • improve usage stats collection (can be pushed after release)
  • test integration with the purchasing funnel to make sure it works right
  • give some spit-and-polish to some usability issues

I’d love if you have any comments on it.  Take it for a spin and  let me know.  This sneak-peak is not using the production database, which means when the sneak-peak ends you’ll lose anything you did with it.  In the unlikely event you want to use this for something important, make sure you save your cards locally.

Why does cron hate me so?

Once *again*, cron decided that it would stop deleting my Rails cached files after I upgraded to Hardy. I’m totally stumped as to why it happened — the logs say that the rf -rm happened at the scheduled times for the last two weeks, and I was able to successfully do it by sudoing into the appropriate user, but the files were still on disk and being happily served by Nginx, oblivious to the fact that Mother’s Day and Cinco de Mayo had long since passed.

Argh, I hate computers some days…

Dropbox is saving my bacon

About a month and change ago a Japanese coworker asked me “Hey, Patrick, have you ever heard of Dropbox?”  All I knew is that they were some vaguely storage-in-the-clooooooooooooooooooooooud startup, but not really the specifics.  But since he and another coworker were interested in it I did some checking to tell them what they would need to press to sign up & etc.  And, yep, storage in the cloud, painless backup, blah blah.  So I grabbed an account for the heck of it and decided I would get around to backing up my files one of these days.

Sigh.  You think we would know by now, right?  “I’m going to start a backup any day now” ranks right up there with “Hmm, well, we haven’t heard from that freaky serial killer in a while.  I think I’ll stay in the house.”

This is despite Benji and Andy Brice both having recent hard drive failures.  (Andy’s, which was a year ago so I suppose not so recent, even came with the title “Your harddrive *will* fail”.  Yeah yeah, sure, and I bet you think there is a machete-wielding maniac over in the next room.  Bah, I think I’ll take a bath.)

Thankfully I was sufficiently moved by their advice to start keeping backups of my servers at Slicehost, which has the added benefit of protecting my source code (since I have my repositories on those servers).  Most of my critical business data is already off of my laptop — its at a Google server farm, or chilling on a Slicehost server, or over at Paypal, but there is still quite a bit of sentimental value in my photos and nuisance in having to reconfigure, e.g., Eclipse to match my personal setup again when I reinstall it.

Anyhow, today the inevitable happened: my Vista-using laptop decided to start the sputter and die deathspiral.  Thankfully, after an hour of fruitless restarts, I was able to boot into safe mode, where I am right now.  I think the hard disk covering some of the code loaded by all the bells&whistles that autoload when the machine boots is toast.  Luckily untoasted is my ability to read the rest of the disk and run Dropbox.

Which is currently streaming my last few folders of Really Don’t Want To Lose That to safer pastures.  Here’s $100, Dropbox — thanks a million.

Fun tip for Vista users: mklink /D name-of-your-symlink C:\Users\blahblah\Documents\whatever will create a symlink between two places on a Vista OS.  If you have a symlink pointing out of your Dropbox folder, dropbox will perceive the stuff outside (say, a full Cygwin installation) as being inside of the Dropbox, and automatically sync it for you.  I really appreciate that trick, as it meant I didn’t have to copy/paste the files I need to update and risk more harddrive activity at the moment.

2 hours until the last of the files are off the disk.  Go Dropbox, go!

Yay for A Productive Hour

I finally killed that little permissions error (protip: if you symlink a to b, and are wondering why you can’t access a/c, a/d, and a/e despite the preferences on a, c, d, and e all being right, check to make sure you’ve chmod-ed b/. properly.)

I also did my very first push out to github, which was slightly on the painful side (Windows user — I’m used to Rails programming having its share of pain) but cleared up fairly fast. I think I’m really going to like git for source control, although since I already have a SVN repository I’ll probably keep that as my main method.

Here’s what I did: took (a particular version of) Delayed::Job and extended it so that it can accommodate multiple workers at once. You can see the details here.

That too ENTIRELY too long

Well, on the plus side, the last three days have probably been my most productive programming spring ever.  On the minus side, a lot of it was spinning my wheels fighting against problems rather than making forward progress.  I blame fatigue.

What I Have Done:

Bingo Card Creator 3.0.  Whee.  It can interact with the server to save user’s word lists in the cloooooooooooud.  Which is apparently the $10 buzzword for a client-server application these days.  For extra bonus points I threw in PDF generation on the server — How hard can it be? – and then got to rediscover the joys of heavy duty fat client Java application development.  Did you know that there is no way in Java’s standard library to copy a file from point A to point B?  Or that if you open the desktop in a Java open/save window it will show you some GUIDs as possible folders?  Fun stuff.

What I Have Mostly Working

Delayed Job integration.  If somebody tries to generate a thousand bingo cards on Prawn, that essentially takes one of my Mongrels and ties it up for a minute.  Behind that, requests start piling up and not getting executed.  Plus, should they have a connection hiccup, well, guess I lose.  So rather than generating PDFs in the request/response cycle, they get queued up for execution in the near future, using Delayed Job.  

Why is it only “mostly” working?  Well, following standard Linux best practices, the user that is supposed to execute the jobs has very little in the way of privileges.  Apparently too little to actually touch his directory.  I have tried everything I can think of to fix this, with no dice, so its time to walk away and come back fresh later.

What Isn’t Even Started Yet

The web version of the software.  (Well, OK, technically the PDF-ification and most of the existing infrastructure will get reused, but I still have to actually make the screens for it, and then tie them into the purchasing pathway.)

I hope to get the web stuff mostly working this weekend and then open 3.0 up for beta testing.  If you’re interested in helping out, please drop a comment, particularly you Mac freaks out there.  

You can see the newly redone PDFs and GIFs for most cards at http://staging.bingocardcreator.com .  Still got some bugs to iron out of that, though…  (Prawn + Imagemagick is literally fifty times faster than rendering through the Windows printer and then screenscraping Adobe Acrobat reader then pasting into Paint — automated, naturally — for cropping out a GIF screenshot, incidentally.)