macisv

Anniversary Wrap-up and Inside Look

I'd just like to thank everyone who took part in the Atomic Bird five year anniversary last week, including customers (both free and paid), blog readers, and those who contacted me directly by email.

Just a little snapshot to hint at how things went. This is how Mint shows recent traffic to this web site:

mint-five-weeks.jpg

Wow!

I thought people might be interested in knowing how the whole one-out-of-five-free thing worked.

Step 1: Coupons

Free orders were managed with single-use coupon codes which would give a 100% discount on software in the order (CD-ROMs were not free). My orders are processed by eSellerate, and they have a system where it's possible to generate a long list of single-use coupon codes with the same effect and named with the same prefix. For example, "FIVEYEARS-0JL8JCVC" was one of the coupon codes. All of them started with "FIVEYEARS-" and the rest was random.

These coupon codes were set to be valid only for the week of the anniversary (and that one's been used anyway).

Step 2: Distributing Coupons

Giving out free orders to one out of five customers was handled by some custom PHP code on my web server, which would consult my order database to decide when it was time for a free order. I set this up as a web-store redirect script, and modified all of the "buy" links on the web site to point to it. The basic pseudo-code was:

  1. See how many orders had been received since the start date
  2. See how many free orders had been received in that time
  3. If the number of free orders was less than 20% of the total, get a coupon code and give the person a free order.
  4. Redirect the person to my web store, regardless of what happened in the previous step.

Because there's a delay from giving out a free order until it appears in the sales database, this meant that it was likely I'd end up giving out two or more free orders in a row. After one coupon code was given out, someone else might come along before the first person had a chance to use it, and there would be no new entries in the sales database. Free order (again)! Over the course of the week it averaged out, even though at any given moment the proportion of free orders might have been slightly higher or lower than 20%.

I could have just chosen random numbers from 0 to 1 and given free orders if the result was 0.2 or less, but I didn't want to make it too easy to game the system.

I also had to make sure not to give out the same coupon code more than once. Each code could only be used once, and I didn't want someone who should get their software free suddenly find themselves with a used, useless coupon code. For this I loaded all of the codes into a database. It was a pretty trivial database, having only one table with two fields (coupon code and a flag to indicate if it had been used). But it gave me a convenient way to ensure single-file access to the list of coupon codes. With MySQL I'd lock the table for writing, get a code, mark the code as used, and then unlock. If the table couldn't be immediately locked, MySQL would wait until it could.

If traffic through the redirect script got too high when it was free-order time, people might have to wait a moment while the code was retrieved, but I'd know that once they got the coupon that it'd work for them.

Step 3: Making it Make Sense

Despite my best efforts, not everyone knew about the anniversary and the promotion. I needed to make sure that if someone suddenly found themselves getting a free order, they'd know what was going on (they might not mind, but might also be confused). I set up an alternate version of my web store. It was actually the same store, but with a different appearance. This version added a message at the top explaining what was happening in bright, friendly letters that were hard to miss.

Putting it in action

I'm not a PHP guru by any means, but it all worked and that's what counts. I did have a hiccup in the system where it would sometimes fail to apply the coupon (resulting in an unexpectedly non-free order). But Daniel Jalkut and Paul Kim helped me discover them and get them fixed. Remember what I said a few days ago about getting to know other developers? This is where it really helps. It was more than a little disconcerting to have this kind of problem but having friends find it fast definitely helps.

Another error resulted in the first eight orders being free. Duh. But I got that fixed on the morning of the first day, and it still averaged out to 20% of orders being free over the week.

The End

Thanks again to everyone. Now to start planning the 10-year anniversary bash...


Expanding the Product Lineup

For a long time after starting Atomic Bird I had only one app-- Macaroni. It did well for me and became my main professional focus. I continued to tinker with it and it continued to support me.

So what's wrong with this picture? Two things.

First, with nothing else needing my attention as a developer, I developed a severe case of second system effect. I had big plans for Macaroni, and they just kept on getting bigger. I think at some point I must have seemed like a mad scientist set on having his creation take over the world. That made it difficult to actually get anything new into people's hands, because I was too busy building up my baby into a monster.

Second, as this went on, I eventually started to get bored with it. It was the same project, day after day, and at some point I found it hard to keep going. I couldn't bear to look at the Macaroni source code any more, and I had to put it aside.

This is why I haven't released a version 3.0 of Macaroni yet.

I needed something else I could work on, to keep things interesting, to avoid the problem of having it be the same thing day after day. Early last year I found it. March 2006 was the first Iron Coder competition. Iron Coder is a friendly competition between Mac developers that's loosely modeled on Iron Chef. You get 48 hours to write an application of some kind, but you don't find out what kind until the competition starts.

I didn't win. But what I did do was write something called FFMinator. Not catchy, really, but I didn't have a lot of time to think about good names. The cool thing about it was that, as I got near to finishing it, I started to really enjoy using it. This wasn't just something that met the requirements of the competition, it was something I wanted to keep using afterwards.

I also realized that FFMinator was really just scratching the surface of what it could be doing. After Iron Coder I continued to develop it, adding features and polishing it. Then I renamed it MondoMouse and released it to the world. So far it's the only Iron Coder entry to be released in this way.

It hasn't quite set the world on fire, but it did get a positive review in MacWorld and it does have a dedicated and growing following. More importantly it's given me something else to work on, so that it's not exclusively one project all the time. A few months later I released Chimey, which is not a huge project but a nice addition to the mix.

As a result of this I found I was able to go back to Macaroni with fresh eyes and a renewed spirit. After a hiatus it's definitely back in play for me. This time I've worked up a detailed plan for version 3.0 that's going to be way cool while (I think) avoiding the problems of overdesign that I ran into previously. I've even got a specific timetable for it, something I hardly ever do.

And of course, if I get a little tired of it, I have something else to work on.

Customer Mailing Lists: Update

Some of you will recall that I had some trouble with hosting my customer mailing list back in August and ended up moving it to a new hosting company. I don't actually use the mailing list all that often, so that's kind of where things have rested since then. DadaMail was installed and running at TextDrive, and people could subscribe and unsubscribe, but I hadn't actually sent anything to the list since.

Until this week, when I decided to send out an announcement about the 5 year anniversary. And... it worked perfectly, no problems whatsoever. Of course I could have said the same thing when it was hosted at Pair, except that this time I have explicit permission to use the software.

The only unexpected minor detail was my own fault. With DadaMail (and probably with competing tools) you avoid swamping the mail server by having messages sent in batches. That is, send X messages every Y minutes. After consulting with TextDrive support I set this at 25 messages every minute.

That works, but it can take a long time if the list is big. Like, ((number of subscribers) / 25) minutes in this case. Hours and hours, in my case.

The problem? Don't use words like "today" in a message unless you're sure you'll actually be able to send all of the messages before the day ends.

Answers to some of the ultimate questions

As I mentioned a couple of days ago, there are a lot of logistical questions related to getting a small software business off the ground. Even if you've got a good idea for some software, and it's one you can execute, sooner or later you run into questions of how you get people to know about it, how to actually sell copies, how to prevent people from stealing copies, etc. Today I'm going to go into the answers I found to some of these issues.

This post turned out to be much longer than I anticipated, so click "read more" to see the full version.


After launching, then what?

This post picks up where yesterday's post left off.

So I got the business going. Sold a few copies. And... learned a few lessons about testing software before releasing it. Macaroni 1.0 came out on a Tuesday. Then 1.0.1 on Wednesday. And 1.0.2 on Saturday, and 1.0.3 on Monday the 21st. After that things settled out and I could think about adding new features instead of fixing surprise bugs. It made for an intense week.

Early customer map
click for a larger view
One thing I guess I knew but hadn't really thought about is that when you sell online, you're immediately worldwide. I immediately started getting orders from other countries. Mostly Europe, but with a pretty wide spread otherwise. Some places I had to look up, because I had never heard of them. I got a world map and started putting pins in it showing where my customers were.

A popular question from people interested in starting a software business goes something like, should I quit my job to do it, or work on it part time while earning a living somewhere else and quit when I can live off of my profits? In my case there's no way I could have gotten Atomic Bird off the ground while working full time. As I mentioned yesterday, after writing software all day for a living I was pretty much wrung out and couldn't face doing more of it in the evening. Ending up out of work conveniently removed that obstacle.

Regardless of your temperament, I think at some point you need to make a leap of faith if you want to work independently. A day-job salary is a hard thing to just walk away from, even if you're making some money on the side from your own software. Even if you matched the day job salary, quitting would then mean cutting your income in half. I don't necessarily think it's necessary to be unemployed before getting started, but it has a nice way of focusing your energy on making things work. If you've got that regular check coming in it can be easy not to make your own stuff a priority. Just make sure you've got some funds saved up to see you through the slow times.

The other popular one is, how long does it actually take before you can live off of it? Of course it depends on how much money you need to live. I reached that point relatively quickly, but then I have a low mortgage payment and no other debt aside from that. Having your finances in order really helps, because monthly loan payments will make it a lot harder to reach the point where you're really supporting yourself. It also helped that I don't have any kids. In my case it was under a year, probably 8-10 months before I could actually cover all of my expenses and not have that mean living off of ramen.

Macworld, March 2004Macworld, March 2004Not long after that I did have some help, though. In early 2004 Dan Frakes reviewed Macaroni for his "Mac Gems" column in Macworld magazine, and gave it four out of five mice.

The effect on sales cannot really be understated much.

I prefer not to get into actual sales numbers, but it's like this. Prior to the review I had a level of sales in mind that was comfortable, in that it was enough I didn't feel like I needed to think about help-wanted ads. In the month following the Macworld review sales were roughly 10x that amount. After that they declined, but gradually. In the second month it was "only" about 5x that amount, and the same the month after. It was in 2004 that I hired an accountant.

Anyway, this is starting to get long again, so I'll sign off for now. Tune in again tomorrow when our story continues.



Atomic Bird, LLC