Archive by Author

AdCenter Actually Performs Quite Decently

Volume?  Low.  Interface?  Annoying.  Work flow?  Terrible.  Cost per download?  Half of what Google is, and this required no tweaking whatsoever.  I’m buried under about four ads for places like Amazon which apparently bid on every word in the English language, but with no effort the following ad got about 4% CTR and, much more importantly, costs less than 30 cents per download it drives.  That is my target for reasonably profitability with advertising. 

 Print Custom Bingo Cards

Be ready in minutes using our software.  Download our free trial now!

http://www.bingocardcreator.com

 

 This might do a bit better if I did some optimization.  I don’t know if the time invested is worth the volume, though.  We’ll see.

Howdy! I write this blog to share what I've learned in running a small software company. Want more great articles? I keep a list of my best work curated. A brief summary of the last few years is available here. If you like what you see, I encourage you to sign up for the RSS feed. If you'd like an email every two weeks or so with advice for software businesses, see here. Thanks for visiting!

Laugh To Keep From Crying…

I just found this morning, through ironically the same customer that was having difficulties yesterday (this must be karma), that a key feature of my software has been disabled in the build on my website for the last 2 weeks.  I had been seeing traffic higher than ever, double the number of confirmed downloads I had in January, and was wondering “Why am I seeing 20-30% of my usual sales?  Well, it turns out the reason was that I was performing an involuntary A-B test: A with the feature,  and B without, based on what day you had first downloaded the software.  A wins by a longshot.

Here’s what happened: I ship Bingo Card Creator with about a dozen preprogrammed word lists.  Since I’m skeptical of my customers’ ability to do the Open File -> Navigate To Folder -> Select File routine, I make this very easy through a Wizards menu.  Click on the Wizards Menu, click your subject, click the menu item which describes what grade level/skill you are working on.  I had known this was a crucial feature when I included it in 1.02 because it alleviates the “empty screen problem” (I essentially can’t sell to someone who hasn’t seen a card printed out, and if you have to type in 25 words before you can print a card then you’re much less likely to invest the time).  I hadn’t known it was quite so crucial though.

Here’s what happened.  The Wizard menu is autogenerated, and unlike the vast majority of my code the logic is pretty smart.  It spiders a particular subdirectory in the installation, doing a breadth-first search of the file system tree, and making every directory a submenu and every properly formatted file an entry in the submenu it appears in.  This lets me add new items to the Wizard menu without tweaking anything in the Java code.  If a directory is empty, it doesn’t get shown.  If no files are found at all, the Wizard menu doesn’t show, because nothing ticks people off like non-functional programs, right?  (Grumble grumble.)

Anyhow, this feature has worked since 1.02 and I test to make sure it works every time I make a build, because its just so critical and because without the feature I’d actually have to type in word lists to type printing and that is slow.

I test in Eclipse and it works fine.

I test after exporting my JAR and it works fine.

I test after wrapping the JAR in the EXE and it works fine.

I test after building my installer and installing and it works fine.

My customer downloads the installer and sees no Wizards menu.

Can you spot what edge case my testing missed?  Oh, its fun — I accidentally introduced a single extra character into my Inno Setup script.  Since my setup script is not in my Subversion I never even noticed that I had made the change.  This resulted in the setup program copying the SampleLists (where the wizards reside) folder into the application directory, not into the application/SampleLists directory.  On my machine, since I was installing without uninstalling (clobbers identically named files but DOES NOT DELETE files not present in the new installer), I still had the old C:\Program Files\Bingo Card Creator\SampleLists directory with the proper structure, and things worked peachy.  Then my old, loyal customers who were doing updates installed and everything worked peachy.  Then new people downloaded the installer and, boom, no Wizards for two weeks.

After work today I’ll release a .01 “upgrade” to bugfix Download.com and all the other places that cache installers.

Lessons learned:

  • Setup script goes into the Subversion repository so that at any time it is either known-good or marked as changed since the last known-good.
  • Uninstall before installing to do final testing.  If I had another machine lying around I’d even do a virtual machine or something so that I was guaranteed of a fresh test environment.
  • Keep the lines of communication open with customers.  They can save you from yourself.

Am I Fanatical About Customer Service?

Dear redacted,

Thank you for your interest in Bingo Card Creator.  There appears to have been an issue with your credit card on Google’s end.  I believe they have contacted you about it, but they do not tell me about your credit card details, in order to protect your financial privacy.  It appears that you put the transaction through three times when this issue resulted in you not promptly receiving your software, which would ordinarily result in you getting billed three times if they accept your credit card pending review.  I am almost certain that this is not what you intended, so I took the liberty of canceling the second and third orders. 

I do not know how long the process will be to resolve the credit card issue with Google.  Accordingly, I’m going to trust that Google will resolve it to our mutual satisfaction, and deliver the software to you now.  If Google cannot resolve the issue and we are forced to cancel the order, feel free to keep the software, and accept my apologies for the inconvenience. 

Your Registration Key is redacted  Please find below instructions on how to input this into your trial version to unlock the software, if you require them.

Thank you for your business.

Regards,

Patrick McKenzie
Bingo Card Creator

*snip of canned instructions*

Heck yes I am fanatical about customer service.  Are you?

That is incidentally far from the best email I’ve ever written… what can I say, I just got back from the gym and was too tired to be writing.  There should have been a reminder that she had ordered Bingo Card Creator earlier that day in the first paragraph (oblique references to “transactions” are shop-talk and should be avoided), and the apology was clumsy and conditional.  Clumsy is forgivable but conditional apologies are the worst thing ever — they make it seem like you’re trying to avoid fault.  That was not the purpose of the excercise.  I’m guessing you understand that the point: when circumstances beyond your control make your customer interaction less than absolutely perfect, control the freaking circumstances.

Sidenote to Google: I love Checkout but I love my customers more.  If this sort of thing happens on anything more than a once-in-a-blue moon basis, that will severely impair my ability to love Checkout.

Timetable For Next Project

I know I said the next project was supposed to happen in the summer, but unfortunately I’ve drunken deeply from the Rails koolaid and am now afflicted with an acute condition known as programming fever.  The plan remains to actually launch in the summer, but I want to see if Rails lives up the the (substantial) boasts of its evangelists, and frankly I really want to get my hands dirty with something because after doing several months of crunch going coding cold-turkey makes me feel bored.  (We’ll see if the resurgence of carpal tunnel syndrome I’m feeling doesn’t cool my desire.) 

So here is the plan.  I want the application to be ready, in the full functional sense of the word, by April 1st.  I plan to devote no more than 20 hours per week on it, and to be reasonably diligent about tracking time that I spend.  This will include any time spent in design, learning Rails, and actual IDE time.  On April 1st, I will evaluate where I am (which should be done), and bring in the outside experts (principally a web designer — I’m going back and forth on whether I need to bring in the lawyer or not) to take the first few steps to make the application into a business.  That will also give me a month and a half or so to save my pocket change to pay for their fees.  (Memo to self: carry really big coin purse.)

I’m decided on developing this semi-publicly — I’ll be publishing the market, the spec, the thinking behind it, pretty much everything but the source code.  This will include sales figures for at least as long as I have a day job.  However, I’m not totally naive in the ways of the world and in particular I don’t want someone domain-name camping me for the project code name or obvious misspellings of the actual name (which I already picked out and registered), so I’ll be keeping those under my hat for a while.  I like the project code name so much I think I’m going to use it as the name for my LLC.  I suppose I should get that filed soon too.  The little bureaucratic hoops you have to jump through to make money are so annoying.

Anyhow, the plan:

Two weeks from now or so: Announce project codename and add category to this blog so people can track the development.  Ideally, establish US-side LLC and transfer Bingo Card Creator to it, which will give me instant business history as a software developer with that name, which will be useful for a trademark application. 

Some time after that: After I’ve got enough of the application done to be reasonably sure that I will indeed launch it, post the problem domain, the spec, and the reason why I chose this market to enter.

April 1st: Alpha showing of website (won’t be feature complete or pretty, but should give rough idea of scope).  Bring in web design guy, get the heck out of his way.  Begin dedicated blog (I’ll be keeping this one as my main web presence for the time being, naturally) devoted solely to issues facing target market.

Some time before summer: Launch.  Suffer through a few weeks of catching corner cases which I hadn’t anticipated before.

Summer and beyond: Grow business.  This is the most important part and so naturally I have given it the smallest section of this post and have not done much writing in my design notebook about it.  D’oh.

Budget:

Hosting: $125 for the first year.

Domains: $20 for initial two domains (product and LLC name), possibly $30 for additional ones.  First $20 is spent already.

Ruby Books: $90.  Got them today, they are fascinating.

Logo/Business Identity: Heck if I know.  I have a pretty good idea who I’m going to use for it.  Probably in the $250 range I’m guessing.

Web Design: Heck if I know.  I may do something outside the usual for getting this, we’ll see.  Currently I’m figuring that I’ll need a skin for the application, a simple template for the website outside the application (on the order of complexity of Bingo Card Creator’s, but prettier and thematically coherent with the application skin), and a blog template.  I’ll be blogging on a hosted WordPress blog.

Icons: Not sure if I’ll need them (I already own two sets which may be adequate, but this will largely be up to the web designer).  $100 budgeted. 

Legal: If I hire a lawyer, he is going to be put on a strict $500 leash.  I may not hire a lawyer.

LLC Filing Costs: Owwwwch.  Figuring on $500 for my American LLC and I just weep at the anticipation of having to apply for a Japanese one (suffice it to say that I had to count the number of zeroes in the filing fee a few times to make sure it was correct).  I will file for the Japanese registration after I have achieved significant profitability.

Total Initial Costs: $1,500 to $2,000, probably. 

On the plus side, monthly costs (absent advertising: not budgeting for it yet) are going to be pretty low, so I should be cash flow positive almost instantly again and, I’m hoping, profitable fairly quickly.  I expect revenue growth to be a significant multiple of Bingo Card Creator’s.  More on that at a later date.

The Photo Doesn't Quite Do It Justice

I just got my SwiftCD in the mail (I ordered a copy myself so that I could take photos for the website) and, I must say, it looks rather slick.  In my haste to get a picture I used my cameraphone, which while 2 Megapixels (did I mention I live in Japan?  Phones here can practically perform brain surgery) is not quite the ideal platform for taking a picture of a flat surface.  The green bit is the notebook I was using for a backdrop, which ironically is currently filled with notes for my second project.  Anyhow,  the printing is astonishingly clear (even the teeny-tiny text on the CD is easily legible) and in person it looks very professionally done.  Even the Bingo Card Creator bee is recognizable in all his 1/4th of an inch wingspan glory.

SwiftCD of Bingo Card Creator

Anyhow, the timestamp on this order was sometime on the 9th (America time).  It shipped on the 12th (America time) and arrived on the 19th (Japan time — approximately the 18th US time), which I would consider pretty good since there was a weekend which got in the way before order shipment.  What an age to be living in where you can get a package to a little ricefield on the other side of the world in about a week for 84 cents.

Revenue Growth Is A Wonderful Thing

Sales for the entire year, 2006: $2,100 or so (I subtracted out returns and eSellerate sales, which I never actually received.)

Sales from January 1st, 2007 through February 15th, 2007: $1,050

Still got quite a bit to go if I’m going to make my $1,000 in April and $10,000 in 2007 targets but I think I can do it.  (Profits are, of course, another matter.)

Profits in 2006: ~$1,250

Profits YTD in 2007: ~$825.  I have this funny feeling I will do better than last year.

February 15th Stats Update

I know its not technically the 15th, but I’ve been busy. 

Sales this month started out strong and then Valentine’s Day rolled around and smacked me.  I really need to start anticipating holidays and releasing special versions/ads for them, because otherwise my sales tend to decline to zero around them.  Note that the following numbers are not quite contiguous with the last stats update, because I gave that on the 30th in a month that has more than 30 days, plus I reach the 30th a day before my market does.  Oops.  So you could increase these numbers by 3 sales if you want to have a full accounting of how much money I’ve made since last time.

Gross Sales: $294.45 (11 total, no refunds.  4 CDs requested)

Fulfillment costs:

   CDs: ~$42*

   Paypal: $7.64

Other Expenses (through end of month):

    AdWords: $45

    GoDaddy: $7

    e-junkie: $5

Total Expenses: ~$108

Profit: ~$195

 *Note: This number includes 3 CDs more than customers actually ordered.  One of those is a proof copy of the SwiftCD CD for myself, so that I can see what the customers get their hands on for the purpose of being able to explain it better (sidenote: I would oh so appreciate a live preview feature for making changes — cd-fulfillment doesn’t have one either but they do include some simulated sample invoices, etc, so you have a general idea).  The other two are replacement CDs for two customers who got CDs from cd-fulfillment.com with a graphic that I had sized correctly, resulting in labels which are below my quality standards.

Other statistics: my traffic, number of downloads, and number of confirmed downloads have been at sustained peaks for the last week and a half.  (Wish me luck — typically, my sales peaks trail download peaks by about a week.)  I know average over 400 visitors on weekdays and about 200 on weekends, whereas my comparable figures for, say, November were about 100 and 50.  This is after discounting traffic which I receive from my blog, which has been far higher than usual recently after I had a few high traffic posts.  (The one immediately below about dealing with problem customers has had about 5,000 views and, to judge by the email responses I am getting, has rocketed far out of my normal English-teacher-or-uISV-owner demographic.  I’m getting notes of commiseration from people as diverse as real estate agents and medical malpractice attourneys.)

How To Deal With Abusive Customers

If you weren’t so abrasive and rude, I would’ve refunded your money – even though we are under *no* legal obligation to do so.

I am now marking your email address as spam and your communication will no longer get through. If you don’t want to use our service any more, please cancel your account.

I have taken this conversation completely out of context because context doesn’t matter in customer service (the bold bits are mine, too).  The only thing that matters is you keeping your cool, and this can frequently require having the patience of Job and less ego than a blade of grass.  The above conversation is not one I would consider a good example of conflict resolution on the part of the representative who sent it.  That was Ryan Carson of Dropsend, incidentally, and you can read the context on his blog post about it.  Ryan asked publicly how other folks would have answered.  Here is my response, and the rationale.

The initial stimulus:

Refund me the 5 dollars ASAP

This would set me looking in my transaction records, where I would find that the customer has just done an instantaneously upgrade/downgrade for a subscription service and been charged a pro-rated amount to the end of the month.  Here is my response.

Thank you for using Dropsend [the name of the application at issue].  I received your message asking for a refund of $5, and have instructed our credit card processor to refund you.  Is there anything else I can help you with?

What did that cost me?  $5, thirty seconds of research time, and counting to five before allowing someone’s lack of civility to ruffle me.  The $5 I will get back from this customer next month, and even if I don’t its $5 and that is below my care threshold as a business owner (or as anything, really).  The research time was a sunk cost the moment he said “refund” because I have to check that he is a customer to be physically able to process a payment.  The five seconds is the expensive bit for most people, because that requires suppressing your ego, and that can be irksome.  Regardless, this response a) totally resolves the problem for the customer and b) keeps them happy and ready to pay me next month.  As an actual bonus if the customer is having some support related issue they might email me back and allow me to fix it, improving the quality of my service for the thousands of  customers I have who are not in on this email exchange.  If they don’t mail me back, thats OK too — I’m doing things that matter for the business and not swapping a series of hostile emails with someone which will gain me nothing.

Oh, sure, you can go searching for a rationale on why allowing yourself an ego (I’m using this in the non-pejorative sense of the word) is a good idea.  “They’ll walk all over me”.  “We have a policy against this.” “If I do it for him I’ll have to do it for everybody”.  Hogwash, irrelevent, and don’t care.  The overwhelming majority of your customers in the software business will never ask for a refund or contact support (I’m talking about packaged software or services here which are substantially identical for all customers).   Suppose some fraction of your support requests walk over you — so what?  Support requesters make up a tiny fraction of your turnover every month, and a tiny fraction times a tiny fraction equals a “cost of doing business”.  Your blood pressure is more important than that .1% of customers who want to wheedle over $5.

Another reason to kill this exchange after the first email is that it prevents escalation.   Escalation is what takes you from “My, didn’t this chap’s mother ever teach him manners?” to “FINE!  I DIDN’T WANT YOUR MONEY ANYWAY!”  Its easy to see it in hindsight but, in the heat of the moment, most people don’t recognize they are doing it.  As a result, you want to practice what the IR/polisci buffs call a commitment strategy — basically, you decide beforehand that if someone has an issue you are going to be obsequious about it.  Obsequious.  What a lovely word — did you know that there are several ways to say it in Japanese and that not all of them are considered negative?  I often wish English had a word for when you need to be a spineless craven lickspittle in a good way.  Learn from the Japanese, they have the “I can put a polite reserved face on this for the sake of our continued relationship even though I’m absolutely fuming on the inside” down to an art form.  (That face is called tatemae, the feeling on the inside is called honne.  There, you learned your bit of linguistic trivia for the day.)

See, if you start escalating, you will allow yourself to be drawn into an argument with your customer.  You can win an argument with your boss.  You can win an argument with your wife.  You can even win an argument with God.  But you will never win an argument with your customer.  You might get the last word in, and puff out your chest, and then find that they cancel their subscription and/or chargeback you.  And in the pursuit of a lousy five stinking bucks you’ve just lost a $50 revenue stream over the next year, which is almost pure profit because you are selling a software service which requires no marginal work, you’ve risked getting bitten for $15 by Visa when they chargeback and having to waste an hour of your life repeating the argument to a series of bored Visa representatives who are all thinking “Why did I sign up to do this job?  Everyone acts like children” (you’ll lose the chargeback, by the way), and worst of all you’re stressed.

You might think you would be stressed if you suppressed your ego.  True, for the first two weeks or so.  After that it just becomes a habit.  You learn to mentally shut out the torrent of abuse in your ear and skip over the written invective, and when you get a word in edgewise say “OK, what can I do to help?”  Trust me, I worked in a call center — if you learn how to do this, you can work in a call center for your entire life and not get tired.  If you don’t, you will burn out in a matter of months.  Just pretend you’re like that character from Firefly who, when faced with a stressful situation, repeats a mantra: “I am a leaf on the wind.  Watch me soar.”  And, well, ignore the fact that those were his last words.

 Ah, the company has a policy against refunds.  Here is the great thing about running your own business: you are the boss.  If your company has a policy against refunds, you can break it at will.  Call it an exception, call it a special accomodation, call it a goodwill expenditure, call it whatever the heck you want — the policy is a few bits on a server somewhere.  If you refund this customer, who will fault you for it?  Certainly not your boss — you are the boss!  And, as long as you’re the boss, why don’t you rewrite your policy against refunds saying that you’ll gladly give out refunds.  Its the key to getting your fantastic customer service to scale.  This chap you’re giving the refund to might tell a friend or write a blog post… of course, he’ll probably tell no one.  However, a nice prominent guarantee like “We’ll refund your last payment anytime, for any reason.” gets seen by every prospect who is worried “Hmm, what if I’m not happy?”

Even if you have some darn good reason to be a Scrooge in print in your policy, don’t get trapped into the “If I make an exception once I’ll have to make an exception for everyone”.  Says who?  Your boss?  You are the boss.  Boolean propositional logic?  You’re a businessman, not a computer programmer.  If the accomodation advances your business goals make it, end of discussion.  Your customers are an incestuous bunch but they mostly don’t talk about how easy it is to screw you over (mostly: in some markets they might.  I hope you’re not doing business in those markets).  Instead, they typically talk in terms of ecstatic, happy, and furious.  If they never have a problem, they’re happy.  If the last time they had a problem, you bent over backwards, they won’t think “This guy is a pushover!” (even though you are!  And good for you!) but they’ll think “Wow, the service here is amazing!”  And if you have a two year long relationship with a customer, without any previous bad incident, and then you send them one teensy-tinesy email saying “I would have refunded your money, but decided to keep it.  Nyaa nyaa.”, now they’re furious.  And they will never ever again be anything but furious.

MicroISV on a Shoestring Reader

When folks ask me “So how exactly did your uISV come about?”, I generally tell them to go to the start of the blog and start reading.  Unfortunately, blog software is generally designed to be read from most recent to oldest.  Anyhow, a gentleman named Rizal mailed me today and said he created a “MicroISV on a Shoestring Reader“, which is a mashup that displays the blog organized in chronological order.  Its simple and effective.  Thanks a bunch, I’m sure some folks will find it useful.

Switched to SwiftCD

As I mentioned earlier, I had been contemplating switching to SwiftCD for a while for CD fulfillment over cd-fulfillment.com.  I just completed the transition yesterday and had my first order with the new system processed while I slept.  Yay.

The reasons I made the switch

  1. My recent retooling of my purchase page has made roughly half of my customers reuest CDs.  That means that I get to do a manual order entry nearly every day, and that if I miss checking email someone has paid me meney but is not getting their product.  I did order entry for two years and hate it (love talking to customers, hate typing addresses).  This literally quadrupled my support burden (I get four CD orders for every email that requires a response) and added no value to the customers.
  2. When I posted to this blog that I was considering switching to SwiftCD, they contacted me and pulled out all the stops trying to get me to switch.  Full disclosure: I think that is probably because they think I would probably write up a positive evaluation of them, and hey, thats what I’m doing, so discount this report to whatever degree you think appropriate.  (Its certainly not so they can capture my awesome volume.  10-20 CDs a month or so times thin margins = not a lot of money.)  When I say “Pulled out all the stops” I’m not exaggerating: they had a company designer redesign my CD label to demonstrate their printing prowess, the CEO mailed me a half dozen times asking on my progress, and they even worked with e-junkie to make sure the integration went well.
  3. Easy integration with e-junkie.  After finding the instructions and setting up my CD on the SwiftCD side integration took about 15 seconds on e-junkie’s site and about 30 seconds replacing two links on my purchasing page.  Now rather than waking up 30 minutes early and checking my email to see if any CDs were purchased so I can copy, paste, copy, paste, copy paste name, email, address, transaction number, etc etc, e-junkie forwards the shipping details directly to SwiftCD and I can get some extra sleep in the morning.
  4. The Registration Key gets automatically printed on the mailer (called Product Key or something).  I can live with that.

I also had a slight difficulty with cd-fulfillment.com in the last week.  I uploaded a label using a template of theirs, it ended up printing very badly, and as a result I shipped two products which were not up to my quality standards althought they would run without difficulty.  This was totally unrelated to my decision to switch — cd-fulfillment did exactly what I would expect, which was shipping the order and telling me there was a problem.  I contacted the customers myself to make amends (“I’m sorry, I goofed, I will ship another CD at my expense”, at paragraph length).  cd-fulfillment has been pretty good to me for the duration of our business relationship, and I think they’re still a wonderful service for many people (and cheap, holy cow — just eating international shipping charges is amazing).  If they had easy e-junkie integration, I would have probably stayed with them, and I’ll keep them around as a backup in case SwiftCD suffers any hiccups.

Anyhow, since I don’t intend to hold SwiftCD to their price matching guarantee, I think I’m probably going to be on the hook for slightly more than the $5 I charge for the majority of my CDs.  $5.38 or so for US customers, for example.  I will happily underwrite the difference for the moment, since the convenience is important to me and many of my customers won’t buy without the CD option.

Speaking of prices… I have been considering a $5 price increase for both versions, probably tied to the 1.06 release.  We’ll see if I implement it or not.