A Busman’s Holiday

A few days ago we returned from a week long working vacation down to the coast. This wasn’t a visit to a client site or a trip to an extension office. It was more of a re-location of current activities. A Busman’s Holiday. Our days were filled with long walks on the beach, trying out the local restaurants and working on special projects. That’s right, working, on vacation.

Being an Indie developer means that you can be somewhat of a Bedouin1 traveling about the countryside laptop in hand. A fast internet connection, a power outlet, and my laptop are all that I really require to be productive. Well, almost. A supportive spouse who has a similar mindset is critical. For the third year in a row now we’ve made this trip down to a sleepy fishing town on the coast and each year great things come from it.

There’s one rule to a Busman’s Holiday. Don’t work exclusively on existing projects. Pick something new that you’ve been wanting to explore or start something that you’ve been wanting to get to. Working on a fun special project multiplies the creative effects of your work and can take you to truly undiscovered territory. In fact, my primary product, Mathemagics, started out this way on a trip a couple of years ago. Last year saw the brainstorm and start of another successful project. And this recent trip was no different in setting the tone for the rest of my year as an Indie.

Have you ever woken up in the middle of the night with the solution to a problem as if your mind was working while you were asleep? Or had a great idea while in the shower? I think this happens because in those situations our minds are closer to a state of relaxation. Stress of day-to-day activities fades away and opens the pathways our brains need to make the leaps of thought that manifest themselves as creativity. A Busman’s Holiday is like that. Removed from your daily work environment and nestled in a relaxing setting the ideas begin to flow and hyper productivity sets in.

So, if you have the means then you might want to take a Busman’s Holiday. Pick a relaxing spot somewhere near where you live, set the expectations for the family that this is just work but somewhere else and go for it. Step outside of your normal daily activities and temporarily relocate to your creative zone.

1. If you are in or near Austin Texas then you can get a weekly dose of nomadic life by attending Cafe Bedouins on Tuesdays.

This post is a part of the iDevBlogADay group of Indie development blogs. Thanks to @mysterycoconut for managing such a great site.


Command Line Fu (Part 2)

This, part deux, continues part 1 of Command Line Fu.

Do This Over There

Spinning up and running a server somewhere on the internet is extremely easy these days. From Amazon EC2 to Slicehost having a remote machine running 24/7 is well within the reach of most devs. It also makes system administrators out of us. The powerful ssh command can help tame your network of servers so that you can spend a little extra time with friends and family. Most people think of ssh as a secure telnet (remember telnet?) but it’s oh so much more than that.

One of my favorite uses of ssh is in remotely executing commands. Here’s what one looks like:

$>ssh username@myserver.com 'apachectl -k restart'

That’s it. Simply put your command in quotes at the end of the ssh command line. The command is executed from your local machine but runs on the destination server. String 10 of those together in a script and you can restart your entire web server farm from your local machine by executing a single script. The ease and automatic nature of this hinges on setting up ssh for auto login.

You can take it to the next level by combining scp with ssh remote command execution. Consider having a stable of scripts that help you manage your servers all kept centrally on your local machine. When the need arises scp one of them over to the target machine and then use ssh to remotely execute it. Keeping all of those scripts locally reduces admin headaches by having copies distributed all over the place.

As an added bonus you can use ssh to securely tunnel out of wherever you happen to be. For example, you find yourself sitting in a strange coffee shop wanting to check your email without having to worry (note pop3 sends your email password in plaintext every single time it checks for new mail). You can easily divert your email over a secure connection so that anyone that happens to be monitoring network traffic doesn’t see your secrets.

$>ssh -f username@myserver.com -L 2000:mailhost.com:110 -N

The -f argument backgrounds ssh, username@myserver.com is your username at your servers hostname, -N tells ssh to not try executing this as a command on the remote machine. The -L argument is where the magic happens. In the args to -L 2000 is the port on your local machine, mailhost.com is your mail servers host name, and 110 is the port on the remote mail server machine. Now simply switch your email client to connect to localhost on port 2000 as your mail server. Now all of your email traffic for that account is secure from the point of your localhost to your server (your server forwards the request out to the real server from there). This technique works with just about any ports that you want to tunnel using your server as a middle man.

Interactive History

After working at the command line for any length of time you invariably need to re-execute some command again. You can either re-type it, often tedious, scroll through previous commands, takes forever, or you can search for it and just hit enter. Searching the command history is easy. Just hit CTRL-R at the prompt and start typing any part of the command. Search results will pop up:

(reverse-i-search)`sq': sqlite3 db/data.sqlite3

From this point you can hit Enter to execute the command or Right Arrow to put the command at the prompt so that you can edit it. If you have many similar results then you can continue hitting CTRL-R once you have a result to cycle through all matches.

Bashing History

Searching with interactive command history is handy. But, we can take it to a whole other level. Bash allows you to refer to previous commands and arguments withing those commands via a simple shorthand. Once you grok the shorthand you’ll be zipping through previous commands.

$>apt-get install git
Permission denied
$> sudo !!
sudo apt-get install git
Reading package lists... Done

The “!!” refers to the previous command in the history. So, executing “sudo !!” puts sudo in front that previous command. How many times have you executed a command only to re-execute it as sudo? Now it’s easy to do, eh? Here are some more variations to refer to previous commands:

!-2            # Refer to the command 2 back in the history (!-3, !-4, etc)
!find          # Previous command that starts with 'find'
!?find?       # Previous command that contains 'find'
!! -la         # Previous command adding -la as an argument
!!:1           # Refers to the first argument of the last command
!!:3-5        # Refers to arguments 3, 4, and 5 of the previous command
!!:0           # Refers to the command (no arguments)
!!:-2         # Refers to the command and the first two arguments

As you can see there is a lot of power there in referring to the previous command and arguments. Say, for example, you’re creating a tar file and realize that you have added an unwanted file (file2).

$> tar -xvf backup.tar file1 file2 file3 file4 file5
-- Ooops. Didn't want 'file2' in the list --
$>!!:-3 !!:5-7
tar -cvf backup.tar file1 file3 file4 file5
a file1
a file3
a file4
a file5

By using a simple shorthand the previous command was quickly executed sans the undesired argument. With a little practice this speedy but somewhat cryptic command structure becomes second nature.

So there you have it. My list of Master Command Line Fu tricks. Study them. Practice them. Before you know it you’ll pick that rabbit out of the hat while everybody sits out there wondering how the hell you did it.1

1. Gordon Gekko: “The richest one percent of this country owns half our country’s wealth, five trillion dollars. One third of that comes from hard work, two thirds comes from inheritance, interest on interest accumulating to widows and idiot sons and what I do, stock and real estate speculation. It’s bullshit. You got ninety percent of the American public out there with little or no net worth. I create nothing. I own. We make the rules, pal. The news, war, peace, famine, upheaval, the price per paper clip. We pick that rabbit out of the hat while everybody sits out there wondering how the hell we did it. Now you’re not naive enough to think we’re living in a democracy, are you buddy? It’s the free market. And you’re a part of it. You’ve got that killer instinct. Stick around pal, I’ve still got a lot to teach you. ”

This post is a part of the iDevBlogADay group of Indie development blogs. Thanks to @mysterycoconut for managing such a great site.


Command Line Fu (Part 1)

Almost every developer needs to get out to the command line once in a while. Some of us almost live there. So, here are a few tips and tricks that I’ve picked up over the years. May they help speed you along to your final command line destination.

Find Exec

Have you ever wanted to execute a command against every file in a directory? Or every file that matched a search? Well then, find with exec is your friend. For example, say we wanted to change the permissions on every file within a directory.

$>find . -type f -exec chmod 744 {} \;

The first argument, the ‘.’, tells find to start the search from the current directory. The ‘-type f’ says to look for only files. The -exec option tells find to execute the following command against every search result. Each result is substituted in the place specified by the {}. The ‘\;’ terminates the command. So, basically this command quickly executes a ‘chmod 744’ against every file found in the current directory. You could also add a ‘-name *.sh’ in order to further limit the search to all files ending in a ‘.sh’.

$>find . -type f -ls

This version of the command (the one with the -ls) simply shows you what files will be operated on as a result of the find. It is good practice to run this command first using all the same options except replacing the -exec with the -ls. The -exec option can be particularly destructive so know what what files you are operating on. Performing a ‘rm -rf’ as a result of a find against the root filesystem will send your day in the wrong direction. So, use the -ls version of the command first to see what files will be used.

Right Sed Fred

“Who’s sed? Sed’s dead baby. Sed’s dead.”1 Forgotten maybe but not dead. Sed stands for “stream editor” and it’s one of those old school neckbeard command line utilities that should be in your arsenal. Sed is prefect for picking through large amounts of text and twisting it to your will. Take this over simplified csv file as an example:

$>cat numbers.csv

With sed you can do crazy cool stuff like the following:
# Delete lines
$>cat numbers.csv | sed -e '2d'

# Print or add lines (prints current line)
$>cat numbers.csv | sed -e '1,2p'

# Substitute text
$>cat numbers.csv | sed -e 's/one/zero/g' | sed -e 's/,/:/g'

The -e on the sed command line tells it to accept what follows as the command. You can also write entire files of sed commands but I never do this. Instead I tend to chain successive commands together using the unix pipe in order to get what I’m after (see the Substitute text example).

The sed command takes the following structure: [address[,address]]function[arguments]. Where [address] can be a line number or a regex style pattern. Here’s a few more examples that use variations of addresses:
# Add the following text after lines where the pattern is found
$>cat numbers.csv | sed -e '/one/a\

# Insert the following text before lines where the pattern is found
$>cat numbers.csv | sed -e '/four/i\

# Read in the file abc.csv and add it after lines where the pattern is found
$>cat numbers.csv | sed -e '/four/r abc.csv'

# Delete lines 2 through 4
$>cat numbers.csv | sed -e '/four/r abc.csv' | sed -e '2,4d'

# Delete the lines found between the two patterns
$>cat numbers.csv | sed -e '/four/r abc.csv' | sed -e '/four/,/e.f/d'

And that’s just the beginning of the power of sed. Getting comfortable with the basic commands and structure of sed can allow you to whip out some minor change or pick through some complicated text in a flash. It’s a quick and powerful tool sitting there on your command line just waiting to be utilized. Man up the man pages (man sed) and check out some of the other cool stuff sed can do.

Before we leave sed here are some powerful sed one liners:

sed -e '$='                              # Count lines (similar to wc -l)
sed -e 'G'                               # Double space a file
sed -e 'n;d'                             # undo double spacing
sed 's/^M$//'                            # convert DOS newlines to Unix format.
                                         # (Press CTRL-V then CTRL-M to get ^M)
sed = numbers.csv | sed 'N;s/\n/     /'  # Number the lines in the specified file
sed -e 's/^[ \t]*//'                     # delete leading whitespace from each line
sed -e 's/[ \t]*$//'                     # delete trailing whitespace from each line
sed -e '/^$/d'                           # delete blank lines


Awk is the pretty cousin to sed. When you have any semi-well formatted data with a known separator awk is your man (or gal). Awk’s power lies in printing various portions of columns of data. Strictly speaking they don’t need to be real columns of data but rather just have a known separating character. For example:

$>echo "one two three" | awk '{print $2}'

Awk’s default separator is conveniently the space. The ‘{print $2}’ is the awk command and tells it, in this case, to print the 2nd column of data as separated by a space. You can also change the separating character with the -F option:

$>echo "one,two,three" | awk -F, '{print $2}'

In this case the comma was specified as the separator. Whatever character immediately follows the -F will be used as the separator. Like sed, awk can make use of addresses to select which rows of text it operates on.

$>cat numbers.csv | awk -F, '/four/ {print $2}'

$>cat numbers.csv | awk -F, '/four/,/seven/ {print $2}'

In the first example, the line with the word ‘four’ in it is selected and the second column is printed (‘five’). In the second example, the lines between the one that contains word ‘four’ and the line that contains the word ‘seven’ are selected and their respective second columns are printed (‘five’ and ‘eight’). You can also have awk read a file directly rather than using cat.

$>awk -F, '/four/ {print $2}' numbers.csv

However, I almost never do this since it limits my ability to chain commands together which is where the real power in sed and awk lie.

To round out awk here are some powerful awk one liners:

awk '{print $NF}'             # Print the last field of each line
awk 'NF > 3'                  # Print each line with more than 3 fields
awk '{print $2, $1}'          # Print the first two fields in opposite order
awk '!/regex/'                # Print only the lines which do not match the regex
awk '/regex/{getline;print}'  # Print the line immediately following the regex

Knock Out Blow

Sed and awk work together to land a powerful one, two knock out blow. Together they can chew through even the most thorny text munging problems. For example, I recently needed a script to determine the process id (pid) of a running process so that I could kill it. Easy with sed and awk at your side.

PID=`ps -aef | grep "unicorn master" | sed -e '/grep/d' | awk '{print $2}'`

What’s going on here? The ps command is listing all processes. This is piped into the grep command which picks out the one that I am looking for (the awesome unicorn ruby http server). The ps and grep together print out something like this:

root 19092 1 0 Feb10 ? 00:00:03 unicorn master -c /etc/unicorn/sites/test/unicorn.rb -E production -D
ubuntu 22562 7121 0 15:42 pts/0 00:00:00 grep --color=auto unicorn master

The pid I want is right there, 19092, but how do I get at it? Easy. Pipe the output into sed to delete the line picking up our running grep command (sed -e ‘/grep/d’) and then pipe that into awk to print out the second column of text, our process id.

$>ps -aef | grep "unicorn master" | sed -e '/grep/d' | awk '{print $2}'

As you can see with sed and awk at your side crunching through nearly any text is possible. And it’s all done right there on the command line.

In the next installment I will move away from sed and awk to explore remote command execution, command looping, and some powerful kung fu master techniques to utilize your command history.

1. Zed is dead.

This post is a part of the iDevBlogADay group of Indie development blogs. Thanks to @mysterycoconut for managing such a great site.


A/B Testing Buy Now Links

The conventional wisdom says that a Lite version of your app draws in more sales to your paid app1. In my experience this has been true. Generally, the Lite version offers a limited experience with an option to upgrade to the full app at a certain point. The Lite version should offer just enough content or functionality to give the user an idea of what the app is like and still leave them wanting more. Getting this balance correct is crucial to the success of the Lite-to-Paid conversion. Other factors also come into play such as the verbiage used at the point of decision.

In order to determine the optimum text I decided to A/B test the text on the link used to launch the user over to the paid version of the app on the AppStore. The button is very visible right on the main screen of the app. Can’t miss it. When the app is first launched it randomly chooses one of four different variations of the text (I know, I know, I should probably call it an A/B/C/D test) and displays that version of the button text to the user. In order to keep things consistent the app tracks which version was selected and continues to show that version to the user from then on. The four variations that I chose were: “Buy, “Buy Now”, “More”, “Get More”.

For tracking purposes I added a signature to my LinkShare link which gets tracked whenever someone clicks on the link. LinkShare not only tracks the click throughs on these links but also purchases made in iTunes which originated from a click on one of them (maybe I will cover this in another blog post if there is enough interest). The system isn’t perfectly accurate since LinkShare tracks ALL sales associated with a link rather than just the sales to the app you linked to. Meaning that if someone clicked over to your app but decided to buy the $150 Beatles Box Set instead then that sale would be attributed to the link signature that was used. However, given a large enough sample space the non-app sales should even out and give a fairly good idea of the relative sales to your app from each version of the button text.

As it turns out I never really did anything with all of this. It’s been in the codebase for a year and a half. Ouch! But, what this does provide is a nice and large sample set to look at. Hopefully, I can put this info to good use at some point. Even better I hope that it is of a more immediate benefit to you.

In the table the ‘Member ID’ column is the custom signature that was set in the LinkShare link (one each for buy, buy now, etc). The clicks are the total number of click throughs (CTR) from the first of June of 2009 until Feb 4, 2011. The Sales column is the total amount of iTunes merchandise purchased as a result of a click on one of the links and Commissions are the LinkShare revenue generated on those sales.

The first thing that stands out are that the buttons with the text ‘More’ and ‘Get More’ generated more than twice the click throughs as the ‘Buy’ and ‘Buy Now’ links. Most likely this is due to the somewhat ambiguous nature of the the terms ‘More’ and ‘Get More’ (unintentional I assure you). I don’t really think the user knows quite what to expect when tapping buttons with those labels and purchasing the app is probably not what many expect. Or maybe it’s curiosity. What’s behind the ‘More’ button?

The ‘Buy’ and ‘Buy Now’ labeled buttons set expectations appropriately. When a user taps on one of them they pretty much know that they are going to a place where a purchase may take place (aka the AppStore). While the raw number of clicks is less than half that of the ‘more’ variety the sales associated with the ‘buy’ labeled buttons confirms this. For instance, for the ‘Buy’ button an average of 0.44 sales occurred per tap (1640/3768 = 0.435). At the same time for the ‘More’ button an average of 0.24 sales occurred per tap (2261/9524 = 0.237).

What does all of this tell us? While the ‘Buy’ links have a much higher conversion rate the ‘More’ links create many more click throughs and have higher raw sales numbers2. I do have to say that to me the ‘More’ style links seem a bit disingenuous in that they do not clearly indicate to the user what is going to happen. So, there you have it grasshopper. With great power comes great responsibility. Use these findings as you see fit.

This post is a part of the iDevBlogADay group of Indie development blogs. Thanks to @mysterycoconut for managing such a great site.

1. Current thinking may slant more in the direction of the Freemium model where the app is free but offers an in-app purchase in order to ‘upgrade’ to the full content.
2. What this also tells us is that Lite versions do work to a certain degree as witnessed in the raw sales numbers across all variations of the label. I will say that the Lite version drove <10% of total paid app sales during that time period however.

Asking for App Reviews

For quite some time I’ve had a dialog in Mathemagics to prompt the user to rate and review the app on the AppStore. In the fast paced world of the AppStore a user may come across your app in the store, download it, use it and never have a need to return to its page on the AppStore. Consequently a potentially happy user of your app never lets you or anyone outside of their close friends know how much they like it. Politely asking the user for a review has been a great success for Mathemagics garnering it 262 written reviews and 1568 ratings thus far. The vast majority of the reviews are quite positive and generally come with a 4 or 5 star rating.

I believe one key to this success is that the dialog asking for a review is non-invasive to the users current actions. It pops up at the end of a successful game, congratulates them, and politely asks for a review on the AppStore. If the user chooses to review the app they are taken immediately to the apps page on the AppStore. If they choose not to rate the app the dialog goes away never to be seen again. Polite and non-invasive.

When the Mac AppStore first launched many apps had a difficult time getting user reviews. In fact, still today many apps don’t have any ratings or reviews. In the trial-less vacuum of the AppStore reviews and ratings give potential customers something to anchor their buying decision on. After Mathemagics for Mac gained enough ratings to start showing an average rating the apps ranking increased by an average of about 10 spots and has stayed there. I attribute this partially to the apps positive AppStore reviews and its star rating.

Considering the success of asking for a review in the iOS version of the app it was a natural for me to add a request for a review in Mathemagics for Mac. However, I took it one step further. Not only does the app ask for a review at a certain point but it will also ask a user who has previously reviewed the app to update their review if they have not done so for the current version of the app. Tracking this is done quite easily by saving off in NSUserDefaults the current version of the app that a review was requested for and whether or not the user clicked through to the AppStore or if they declined. Using this info you can popup a dialog requesting either a new or an updated review (be extra careful to only do this once per app version). At the same time I also added a preference which allows the user to turn off all review requests if they so choose. Remember, polite and non-invasive.

The code to launch the Mac AppStore from a Mac app is quite simple. Here is my version of it:

[gist id=”775603″]

You will notice that the AppStore is opened twice. The first attempt opens the Mac AppStore application if it is not already open. After a short delay the apps Mac AppStore URL is opened a second time which finally opens the apps page. You may need to play with the delay in order to find something suitable for you and yes, be sure to use the URL for your app. That is unless you want to open up the page for my app then that’s just fine be me 🙂

This post is a part of the iDevBlogADay group of Indie development blogs. Thanks to @mysterycoconut for managing such a great site.


How to Find an iPhone Developer

Several times a month, and sometimes per week, I seem to get approached from out of the blue by someone looking for an iPhone developer to work on their project. It may be an individual with an idea, a business, or some other organization. Often these are referrals from friends or acquaintances that I know or have worked with in the past. I’m always honored and humbled to be asked to work on a project but invariably I have to turn them down.

The primary focus of Blue Lightning Labs is the development of our own products. Currently we are in the enviable position of not needing to seek outside work in order to keep the doors open. Now, this is not to say that if the right opportunity came along it wouldn’t be considered. It would. But, primarily the focus is inward on developing products in-house. Contracting out to work on a project for someone else is a tough and noble cause. Many developers prefer it to the all-in highly risky make-or-break business of developing your own products. So, my intent here is to provide ideas and resources for those folks looking for the very best iPhone developers to work on their projects.

  • Start Early

After college I worked for a few years as a Physics Engineer at a large corporation. One of the managing engineers had a great sign on his desk. It read, “A lack of preparation on your part does not constitute an emergency on mine”. Don’t wait until the last minute to find a developer. Start early and take your time to find the right person or firm. Otherwise it will cost you. Figuratively and literally.

  • Get Involved

The iPhone developer community is great and it is flourishing. Many devs get together locally once a month as part of a Meetup group or other local development group. Seek out those groups. Attend meetings, ask questions, learn something about product development. Get to know people one-on-one. This can lead you down the path of finding the right guy or gal to work on a project with you.

  • Don’t be a Douche

Nothing turns off developers quicker than some new media social networking ninja guru trying to get you excited about the next great trend in fart apps. The stereotype of an anti-social developer may be true in some instances but let me tell you, we can all smell social media ninja’s a mile off and instinctively avoid them. Be genuine.

  • Attend Conferences

There are some great iPhone and Mac related conferences out there these days. Some of them are 360iDev, Voices That Matter, NSConference, and of course WWDC. New and experienced developers alike attend en masse. Just remember that devs attending these conferences are there to learn and have a good time. You’ll get a lot further approaching a developer after hours by buying them a beer than you will giving the hard sell in-between conference sessions.

  • Be open

We’ve all signed NDA’s. They have their place and I think most developers respect that. But, don’t expect to get very far with a good developer without letting loose a few details to give them an idea of project scope. When you’re talking about your project most developers will be mentally tallying it’s feasibility, pain points, cool technical aspects and the like. And don’t worry so much about someone stealing your idea. It’s the execution of the idea that as value. An honest developer will respect your idea not to mention the fact that most developers have a stack of their own ideas that they already don’t have time to implement.

  • Development is hard work

A good and experienced developer is going to command a premium. If you find someone willing to work for the same wages as a fast food employee then you might as well donate the funds to a worthy cause. Software development requires an odd mix of attention to detail, creativity and tenacity. It is mentally challenging and an experienced developer is worth paying an honest rate. You might be able to negotiate a reduction in rate in exchange for a percentage of all proceeds from an app. But, these days most devs know that only the lucky hit the AppStore lottery. So don’t expect someone to work for free in exchange for a piece of the pie unless you have a one in a million idea and even then I wouldn’t count on it.

  • Referrals

I started this post mentioning all of the inquiries I get for development work. This is, in fact, still one of the best ways to find a developer. If you have absolutely no contacts in the iPhone space then start developing some by trying some of the approaches mentioned above. The first, second or even tenth dev you approach may not be interested or have time. But, they may have a friend who is. Keep trying.

  • Hired Guns

All of this work and massaging in order to cultivate a relationship with an individual may not be to your liking. If that’s the case then check out the site They Make Apps. There you’ll find a lot of developer with different skills and experiences.

So, there you have it. A few tips on how to approach and find an iPhone developer for your project. In short, be genuine, be persistent, and get involved.

This post is a part of the iDevBlogADay group of Indie development blogs. Thanks to @mysterycoconut for managing such a great site.


Your Website Matters with the Mac AppStore

We’re a little over a week into the launch of the Mac AppStore and by all early signs it’s going to be a hit. I personally couldn’t be more pleased with the launch of my new Mac app, Mathemagics. In fact, it had the good fortune of being an Editor’s Pick at Macworld on Tuesday of last week. I almost fell out of my chair when I first saw the post. Macworld carries some oomph. As you can see the impact on sales was noticeable.

You get one guess to name at what point the Macworld Editor’s Pick went live. Interestingly the iPhone version of the app was also positively impacted. In fact, raw downloads for the day were greater for the iPhone/iPad version of the app vs the Mac version. Though not by much.

At least one new customer emailed support and mentioned that he had seen the Mac version of the app and noticed on the company website that we also had an iPhone version of the app. So, he bought that one too. Cross selling for the win! This sort of cross sell is what we hope for and this particular customer confirmed that it does in fact happen. Now, while this is great and having a decent website that clearly showcases your products played an important part in that cross sell it is not the focus of this blog post. I merely mention it and the above download numbers in order to provide a backdrop for the stats that I am about to provide.

By luck or divine intervention the day prior to the Macworld selection I had a brainstorm on a way to definitively track clicks from the AppStore over to the company website. This, to me, is important. Normally, at least via Google Analytics, such clicks just show up as ‘Direct’ which basically means they could have come from anywhere. As we know, stats about who clicks where within the AppStore, how they found your app page, and where they went from there is a black hole as large as the one at the center of the Milkyway Galaxy. So, any insight into that abyss can be incredibly useful information upon which to make important business decisions.

The AppStores provide a link to your company website that some users take advantage of. Currently, the iPhone/iPad AppStore resides within iTunes and has a completely different layout than its sibling the Mac AppStore. The AppStore on the device (iPhone, iPodTouch, etc) shows a truncated link to your website that is not clickable. I doubt many users take the time to enter it manually into mobile safari if they can happen to decipher it.

Between the three AppStores the Mac AppStore is the most clean and the company link is clearly visible and obvious. Links in iTunes are sandwiched between a truncated version of your description and your app screenshots. I’m in the AppStore all of the time and I know where the company link is . However, I still have to hunt for it in iTunes when I want to take a further look. The company link on the device AppStore might as well not even be there.

This link visibility and obviousness has a profound impact on the number of users clicking though to your website. So, how do I know who clicked directly from the AppStore? I add a parameter to the end of my landing page URL’s and use it only within iTunes Connect for the product page link. Edge cases aside this reveals the number of page views originating as a click directly on the company link within the AppStore. Google Analytics will split out the URL with unique parameters as a separate line item and my webserver will safely accept and ignore parameters that it is not interested in.

Page Views from 1/11/2011 to 1/14/2011

As you can see the iPhone/iPad version of the app had a paltry 13 page views (s=iosas) which originated as a click from directly within the iTunes version of the AppStore. During the same time frame the Mac version of the app had a robust 189 page views (s=mas) that originated as a click from directly within the AppStore. This despite the fact that the iOS app saw slightly more downloads than the Mac app. The above stats are for the short but intense time period just after the Macworld Editor’s Pick. A longer study lasting over a several month period with more normal traffic is warranted. Just the same, I think that since both apps had similar raw download numbers over the same time frame and the Mac app page views far outweigh those of the iOS app the premise has some legs. (As an aside take a look at the Avg Time on Page stats between the two).

The observed click throughs coming from the AppStores is most likely a combination of the poor design in the iTunes AppStore and the fact that most iOS purchases happen on the device. Whatever the cause it is clear that users are clicking through from the Mac AppStore to take a look at your website. Be ready for them! This is your opportunity to stand out, control the setting, and make your sales pitch.

This post is a part of the iDevBlogADay group of Indie development blogs. Thanks to @mysterycoconut for managing such a great site.


Early Numbers from the Mac AppStore

The Mac AppStore is here, the Mac AppStore is here. For the past two months or so I have been heads down creating a Mac version of my popular iOS education app Mathemagics. Mathemagics is an app to help you train for calculating math mentally. The original iPhone version was first released in March of 2009 and has seen moderate success hovering in the top 100 of the U.S. Education category for most of that time. It’s also been featured by Apple 4 or 5 times (many thanks Apple!). So, having developed for the Mac in the past, when the Mac AppStore was first announced it was a natural for me to create a Mac version of the app.

I could have taken a wait and see approach but having been a part of the original iPhone AppStore launch (via another app) I knew that getting in early was worth the effort. There will never be less competition in the AppStore than there is on day one. I think we all realize that more and more apps will continue to poor into the AppStore from here on out. However, it does take significantly more effort and time to create a full featured Mac app as compared to an iPhone app so the flood may be little less torrential. The similar skill sets needed to create iPhone and Mac apps will pave the way for the initiate iOS dev to start creating Mac apps for publishing on the Mac AppStore. Although Cocoa looks like a crufty old man when put up alongside its nimble cousin it is incredibly powerful and does command a learning curve. So, there is some barrier to entry. Maybe it will be just enough to act as a high pass filter and keep the crap out but let the quality in. Only time will tell.

So, how did Mathemagics do in the first few days of the Mac AppStore? Fairly well. The app has been holding steady in the top 10-15 apps in the U.S. Education category.

Rankings appear to be updated regularly but the volatility is much less dramatic than in the iOS AppStores. Most likely due to the lower volume of overall downloads. I suspect that ranking volatility will pick up as time goes on with more apps in the store and more users updating to 10.6.6 and discovering the new AppStore on their Mac.

The top ten apps in the Education category appear in the overall top 180 apps on the AppStore putting Mathemagics somewhere outside of that range. This is in stark contrast to the iPhone AppStore where only the top 1 or 2 apps in the Education category make an appearance in the overall top 200 list.

Sales over the first three days and at those rankings were fairly solid. The Mac AppStore is just getting started and it isn’t yet available to all users so the volume is much less than what you might expect to see on the iOS AppStore. It will probably remain that way simply due to the lower Mac : iOS device count. Existing Mac users will be upgrading to 10.6.6 in the upcoming weeks and I expect that influx of ‘new’ users will help to support sales a bit in the interim. At some point that boost will begin to tapper off by which time I hope that new Macs begin to ship with the Mac AppStore pre-installed. All the same it will take some time before the idea of an AppStore on the Mac begins to embed itself into the fabric of everyday users habits. The existence and mind-share of the iPhone AppStore should help to speed that process.

I am pleased with the actual sales numbers. These aren’t top 10 hit numbers, nor did I expect them to be, but they do make a nice addition to the overall bottom line.

Launch day had the highest number of downloads with the following days starting to trail off. Ranking slipped by a couple of slots late in the day on Saturday and that could have had a small impact on the sales numbers. In either case as time goes on and the AppStore becomes available on more and more Macs coupled with an increased awareness of the store Mathemagics for Mac could become a solid addition to my lineup of apps. In the mean time I’ll iterate like mad to increase the quality and feature set of the app in order to make it the best in its class. Eventually an increase in price of the app will accompany those improvements.

I’m excited to see an AppStore on the Mac and even more thrilled to have been a part of its launch. These are the early days of the Mac AppStore and the road ahead is unknown. Secure in the experience of having lived the emotional roller coaster that is the iPhone AppStore I’m settling in for the long haul.

This post is a part of the iDevBlogADay group of Indie development blogs. Thanks to @mysterycoconut for managing such a great site.


Guerrilla Business Tactics for Indies

Welcome to 2011!It’s kind of hard to believe that another year has come and gone. What’s that about time moving faster the older you get? Enough said. Later this year I will be marking my fourth incredible year as a solo indie Mac and iOS developer. Even so this isn’t the first business I’ve owned (just the funnest). This time of year always brings retrospectives and big plans for the upcoming year. Rightly so. It’s also a great time to approach something inevitable that we all must deal with, the business.

As a developer all I want to do is focus on creating apps. I also, and this is a dirty little secret of mine, enjoy the marketing side of producing a product. However, one aspect of being an Indie that I find hard deal with is the business end of things, specifically taxes. Now, I wouldn’t have been around as an indie for approaching 4 years if I ignored the business end of the business. Instead what I have done is come up with a series of time saving habits that get the pedantic business details over and done with so I can get back to letting my creativity flow. So, for what it’s worth, here are a few of those little time savers that I’ve come to depend on. (Oh, yea, as they say, standard disclaimers apply. I’m no CPA, Lawyer, Doctor, nor an Astronaut. Seek professional help if you need it).

Shred the Checkbook

First, shred your checkbook. You know, that antiquated thing that is basically an IOU with consequences. Well, almost shred it. I write about two checks a year to some arcane institution, or individual, that doesn’t take a credit card. I pay for almost everything with a credit card. And I pay it off at the end of each month. This does take some discipline (and a budget). If you lack it then use a debit card attached to your checking account. Instant accountability. More than buying you a lack of disgruntled stares in the check out lane it gets you statements at the end of each month with each and every transaction accounted for. Just deal with it all at the proverbial end of the month. You still need receipts but we’ll get to that in a bit.

For most of us this probably isn’t that big of a deal. We pretty much live online and most of our transactions occur via some web based portal. But, if you are a living breathing human being you surely get out of the home office once in a while. Right? Well, it’s times like these that the mantra “Charge It” were made for.

Go Electronic

Most major companies who will be sending you end of the month statements will let you opt out of their snail mail to get your statements via the web. Do this. This will require some action on your part once every month or so in that you’ll need to navigate their website and download your statement. Many companies keep anywhere from the last 3 months to the last 18 months of statements online. Invariably you’ll need some statement from 2 years ago and it won’t be available to you. So, download them and save them some place safe along with all of your other business stuff. As a bonus you’ll likely have them accessible when you’re working from the coffee shop should the need arise. I have a recurring Calendar event that fires off once every 2 months to remind me to go download my statements.

Taking this approach has the effect of letting me forget about watching the mailbox for monthly statements and having to file them away. I just deal with it for half an hour or so every other month. In fact, I would love to take even this half hour out of the equation. So, here’s a free business idea for the budding web entrepreneur. Create a service that will automatically login to all of my accounts, download the monthly statements and store them all some place central so that I can easily access them in one location. As a business I’d gladly pay $99/year for something like that.

Keep Everything

I’m a bit of a minimalist. I find it my personal mission to remove unneeded things from my life and because of that I tend to throw things out. Figuratively and literally. But, when it comes to my business I have had to re-train myself to become a pack rat. I save every statement, receipt, invoice, and email that my business produces. Nothing is worse than having to go back two or three years and try to recreate what happened because you didn’t keep the statements. Believe me, if you ever get audited that is exactly what is going to happen. Been there. Done that.

Now, keeping everything doesn’t mean that you’re going to end up looking like Howard Hughes after a bender. Remember, “Go Electronic”. Whenever I buy something online I “Print > Save as PDF” that puppy immediately. I keep a folder in my documents area for each year of receipts. I also name them to save me time later. Here’s the format I use: <date>_<amount>_<topic>.pdf. So, if I just bought Aaron Hillegass’s new book I might name the file something like this: 1.2.2011_27.99_Amazon.pdf. Is that anal? Yes. Does it save me time later when I’m trying to figure out what a transaction was for? Definitely.

Once every few weeks or so a group of us iOS developers here in Austin get together for an iOS Dev Lunch. It’s great to get out and spend a few hours chatting about the business of iOS with your peers. Guess what? That business lunch is a tax write off. It also produces a paper receipt that you now need to track. One of the devs takes a picture of the receipt with his iPhone automatically saving it up to Dropbox. I think that is an awesome idea and this year I will start doing that myself. Nix one piece of paper. For everything else there is a scanner or if you prefer drop the goods into a file folder.

Track and Record

“Hello, my name is Shane and I’m a Quickbooks user”. I admit it. I use Quickbooks. On Windows. But, running in a VMWare instance on a Mac. It’s the only thing I use Windows for any more. I just haven’t come to trust the Mac version of Quickbooks for some reason. In fact, I don’t really like Quickbooks at all. It’s just what my CPA prefers and I haven’t found anything that I like any better. Like it or not all of those statements, receipts, invoices and various other transactions need to be consolidated and recorded into a piece accounting software. I detest this. It’s the antithesis of creativity for me. But, nonetheless once every couple of months, usually when I download my bank statements, I chain myself to my desk with a pair of those eyelid openers that you see in A Clockwork Orange and enter transactions into Quickbooks. The end result is worth it though. With accurate data Quickbooks will happily spit out a Profit and Loss report from which you can tell where your money is coming from, where it’s going, and whether or not you’ll be able to make it another year as an Indie. At the end of the year I print out a Tax Detail statement which is a line item grouping of all transactions by tax category. My CPA thinks I’m her hero.

Two years ago I started tracking my mileage for the tax write off. Granted I don’t drive much for work purposes but on the occasions that I do (iOS dev lunch) I want to get the maximum benefit. Hey, it’s like 50 cents a mile. Last year I knocked hundreds of dollars off of my tax burden and every bit helps as an Indie. The bummer thing is that to do this right you need to keep a detailed log of every trip. More red tape. Enter Trip Cubby. Whenever I complete a business trip I simply whip out my iPhone and spend 30 seconds entering details of the trip (miles driven, date, purpose) into Trip Cubby. At the end of the year I have Trip Cubby send me a CSV file of all of my trips for the year. Mileage log done. More hero worship.

Well, those are a few of my techniques and habits for keeping track of my Indie business in a way that keeps me out of trouble and focusing on what’s important. There are areas for improvement. Such as figuring out a way to avoid entering all of those transactions. But, on the whole I probably spend 2-3 days a year in total dealing with this stuff. That leaves the other 362 days a year for writing code and creating great products. If you do anything that eliminates or reduces the need for dealing with the business end of things do share in the comments.

This post is a part of the iDevBlogADay group of Indie development blogs. Thanks to @mysterycoconut for managing such a great site.



A few months ago an David House of Random Accident and I were discussing ways to boost sales for our education based apps around the back to school time period. Ideas were thrown around and noted for future reference presumably to be tackled at some point in the future. Well, to his great credit David took one of those ideas and ran with it. The idea was an indie dev community focused back to school sale where developers would be able to promote their software to a student and teacher population that was getting back in to the groove of a new school year.

We wanted a site that would require a minimum of supervision from us and allow for maximum flexibility for developers to promote their software. The system that David had put together using Ruby on Rails was pretty automated and allowed developers to add/remove products, determine their own discounts and forward all purchase transactions to their own site. I helped out in the effort by coming up with the overall site look-and-feel and getting the CSS for it coded up. After a week or so of off and on development we had something ready to go. So, we grabbed a domain and iAppsForStudents was born. Hosting was provided by the incredible folks over at Heroku. If you like Ruby on Rails and you like Git then you must try out Heroku!

As part of the community based effort it was decided to open source the back end for the site. So, if after reading this, you decide to run a community based promotion of your own feel free base it off of the iAppsForStudents site. You can grab the entire code base for the site on GutHub.

With the fun development work done we started out on the hard road of promotion. The first phase was to gather interest and bring indie developers into the sale. We promoted the idea and site on Twitter and sent emails to every indie dev we knew (and many we didn’t). The sale was open to any Mac, iPhone, or iPad developer who wanted to participate. Education based apps were great but by no means a requirement for participating in the sale.

By the start of the sale, which was to run from August 15th til September 1st, iAppsForStudents had attracted nearly 80 Indie Dev companies including some of the top names in the Mac and iOS Indie Dev communities. Here’s the final breakdown on participation from the community:

Mac Apps: 114
iPhone Apps: 39
iPad Apps: 8
Companies: 79
Total Discounts: $2526

Not only did devs participate in the sale they also helped out with the next phase, promotion. Many of us sent out press releases set to release at staggered intervals throughout the sale. Others wrote blog posts or mentioned us to press contacts they had developed over the years. We even got a write up in Macworld. This was truly a community effort and a great testament to the strength of our community of developers.

As great as the sale was it wasn’t all peaches and cream. To be honest the response from the press could have been better. The Macworld write up was great but with so many well known devs and such great discounts I had personally hoped for better coverage. Discounting iPhone and iPad apps was also a bit problematic since the discount needed to be applied AppStore wide. It would be great if the AppStore provided a coupon code good for some % off for some duration of time to anyone who used it. I don’t have high hopes of this happening but it would provide yet another avenue of promotion for iOS devs.

So was it worth it? Absolutely. This was a lot of fun to put together and actually doing something to help out the community was priceless. From the looks of it we plan to make this a yearly event so if you missed out head over to the iAppsForStudents site and follow us on twitter or sign up for the mail list so you’ll know when we crank it up again next year.