Sometimes being a pro is all you've got

It’s Monday morning. I check my email. I see we’ve had a major systems issue overnight while trying to return from our secondary data center to our primary.

This move was planned in advance. It was communicated to our customers. It was run on schedule. And it still went wrong. The best part? The retreat to our secondary data created another major issue wherein we duplicated some credit card transactions, so a handful of our customers were charged twice.

You can read all the gory details here…but honestly, it doesn’t get much worse than this.

FreshBooks has been at this for 7 years. In the process we have created the category we now lead: online invoicing – it didn’t exist before we breathed life into it. Now we’re managing data on behalf of millions of people. We take this responsibility seriously. We’ve built a team of extraordinarily dedicated professionals to ensure our success and that of our customers. And yet, still, mistakes, errors and issues happen…and it hurts like hell when they do.

Right now I am watching the faces of our most talented people. They are moving swiftly to action, measuring every step, taking the whole load on their shoulders and methodically doing what needs to get done. They are heros in my books – I’ll tell them when the dust settles. Why? Because, as I watch them make their moves from within the war room, I know in my heart it could not be done better than they are doing it.

Still, we are here. We’re a little guy, though I don’t accept that as any kind of excuse. It’s no comfort that even the big guys have trouble. I just wonder openly: why, despite the best efforts of hugely talented people does it have to be so hard?

The world is a better place because FreshBooks helps businesses get paid so they can focus on what they love to do. The issues that have occurred this morning are not due to carelessness, more than anything they feel as though they are rooted in growing pains, and that despite our best efforts, things still go wrong.

So I’m reminded that it’s not how you handle things when times are good that matters, it’s how you handle them when they go pear shaped. I’m also reminded how good it is to have real pros working on your problems…and that sometimes being a pro is all you’ve got.

Start begging for forgiveness

We’re at an interesting point at FreshBooks. We’ve grown out of my parents basement, into our third office where we’re expanding our footprint. From Joe and I in 2003 we’ve grown to 40+ people cranking away. Along the way we’ve blown through many stages, and now we’ve come to another one.

While we don’t have a strict top down culture, one of the things I’m finding is we have more of a top down than I ever imagined or ever intended. The solution? My new mantra: “beg for forgiveness, don’t ask for permission”. I don’t want people asking me, “here’s what we are going to do, what do you think?” I want to shift the conversations to “here’s what we did”, so I can ask, “what did you learn?”.

Obviously judgement is needed as there are some things the CEO should be notified in advance, and the truth is I still wear a couple hats. That said, I trust my team to make those calls.

So…we’ll see how it goes. But if you are building a business and find yourself here, ask your team stop asking for permission; ask them to beg for forgiveness.

5 tips for choosing a co-founder

Re-posted from FreshThinking:  5 tips for choosing a co-founder

They say choosing your partner is the most important decision you will make in life. I’d say choosing your co-founder(s) is the most important decision you will make in building your company. Here are five tips to help you choose wisely:

Demand Passion
Starting a company is lonely, thankless and costly. It will test the deepest fibers of your being. The only thing that melts these obstacles away, leaves you raring for more, is passion. You can’t fake passion. It lights up your eyes and charges your voice when you talk about what you love. If you have a great idea, and you want to bring it to life, find someone who is passionate about your vision.

You either have it or you don’t. When the dark clouds come – and they will – you find out really quickly if you trust someone. When your mortgage is on the line, you better have trust. Mistrust is a cancer in relationships; it breeds sleepless nights and suspicion. The good news is you can avoid it by choosing a founder you trust, then work to foster deeper trust in your relationship over time. Keep in mind that it’s a never ending process.

More than Money
There’s more to life than money, and chances are money is a long way off if you are building a company. So again, find someone with passion as they are sure to be in it for more than the money.

Choose your Compliment
Like a partner, a co-founder should be strong in areas you are not. A great compliment to your skills is someone who loves to do things you hate, someone who makes the sum of your parts greater than the whole.

Give them Equity
This may seem like a no-brainer when founding a company, but I meet people who expect others to care as much as them about the business when they don’t own any of it. If you believe they will if they don’t own a piece of the business you are seriously deluded.

Canadian banks are out of control

Just went to a CIBC deposit $400 USD in travellers cheques to give some funds to Sunir as he heads off to BarCampOrlando. Somehow my $400 USD turned into ~$382 USD. Unconscionable.

There are really only five banks in Canada. Oligopolies are bad.
On a somewhat related note for anyone out there building web applications. A similar kind of levy may be exacted if you are collecting dollars in your non-native currency. If that’s you, you may want to have a look at this post I wrote about service to currency exchange and web services. Bit of a plug for a service provider we use, but also a smart way to save some money.

Yahoo's decline aides Open ID

This is a little cynical, but I’m thinking that Yahoo would not have started the Open ID drive had they not been having difficulties.  Being in trouble encourages you to mix it up a little, and I’m (cynical) thinking that grasping at straws brought on this move.  Any way you slice it it’s good for the web.  I was ragging on Microsoft’s Phil Holden over a year back to do something similar…great to see the 800 pound gorillas getting on this thing.

Search and web apps and conversion funnels

The truth about Google Analytics is that it’s not half as helpful as people make it out to be if you are running a subscription based web app. Why? You can’t correlate things like search terms with conversions to paying subscribers. I know you can with trials using their little code snippets, but seriously who cares?! Paying subscribers are what matter.

I wrote an article a while back about tracking conversions for your web app and optimizing your conversion funnel. The following is a technical follow on to that article and describes how we at FreshBooks know which sites – and which search terms – turn traffic into, not just trials, but paying subscribers.

Take it away Jeffrey:

We use cookies set in PHP to track entry pages, referring domains and referring URLs. Cookies are used because their value is stored even if the user leaves the FreshBooks website or if the user closes their browser window.

We set two cookies, the referring URL and the URL used to access the FreshBooks website (entry page). We also set the cookie to expire in 90 days so if they come back at a later date we still have data from the first time they visit us. The code below shows how to do this. It is place at the top of every page on the FreshBooks website

setcookie(“referrer”, $_SERVER[‘HTTP_REFERER’], time() + 3600 * 24 * 90);
setcookie(“entrypage”, $_SERVER[‘REQUEST_URI’], time() + 3600 * 24 * 90);

Because this code is run on every page we have to make sure it does not set a new cookie every time a visitor clicks on a different FreshBooks page and we also make sure we don’t overwrite the users cookies if they are visit us before and came back.

if(!$_COOKIE[‘referrer’] and !$_COOKIE[‘entrypage’] and eregi(“”, $_SERVER[‘HTTP_REFERER’]) == false) {
setcookie(“referrer”, $_SERVER[‘HTTP_REFERER’], time() + 3600 * 24 * 90);
setcookie(“entrypage”, $_SERVER[‘REQUEST_URI’], time() + 3600 * 24 * 90);

Now when a user subscribes it’s as simple as storing these values in a database which can be used for reporting purposes. First we check if the user has cookies set then we use a simple mysql statement to insert these values into the database:

if($_COOKIE[‘referrer’] or $_COOKIE[‘entrypage’]) {
$referring_url = $_COOKIE[‘referrer’];
$entry_page = $_COOKIE[‘entrypage’];
$pieces = explode(“/”, $referring_url);
$referring_domain = $pieces[2];

$query = “insert into tracking (referring_url, entry_page, referring_domain) value (‘$referring_url’, ‘$entry_page’, ‘$referring_domain’);”
$result = mysql_query($query, $connect);

So there you have it folks. This is all based on predefined PHP variables – standard stuff really. Anyone and everyone building web apps should be taking advantage of them. End of story.