Why we insist on hosting our applications on our own cloud

We are a SaaS company. We have an extremely experienced team. Together our five man team has over 70 years combined experience, two of us have been developing since before 1st grade and have over 40 years just to ourselves. Quality is our #1 goal. If something isn’t working after we’ve said it’s ready, we take it as a failure, no excuses, analyze what went wrong, and make changes so it doesn’t happen again. To achieve this level of quality we have found that we have to have a controlled environment. We’ve found that customers who insist on hosting our applications themselves are usually not as good as we are (sorry, we don’t want to sugar coat it, it’s just usually the way it is). Anytime we’ve setup our applications on someone else’s servers it invariably costs us extra time, money, and more importantly to us: quality.
So aside from the quality our cloud lets us achieve, here are some more reasons it’s the way we do business.

  • We value the value of experts and recognize that even though we have a high degree of confidence in our own skills and abilities, there is a lot we don’t know, and there are always people that know more than us. As such, even though we have 3 experienced Linux system administrators (two of which managed all the servers for a dial-up ISP back in the day) we use server setups and configurations that are standard in the industry and don’t have any weird hacks, tweaks, or funky setups. These are server images / configurations used by thousands of other companies.
  • Our servers are secure, only accessible via http, https, and ssh using a private key. We’ve never yet had an application we host hacked or compromised.
  • We make nightly backups and ship them off to Amazon Glacier (similar to Iron Mountain), as well as keep the last week of backups on site so that we can restore rapidly if we need to (we’ve never had to).
  • We have server monitoring in place, so that if a server does go down, it wakes up whoever is on call and they get it fixed. This happened a half dozen times on one server in February of 2012 while we were experimenting with server configurations, and once in March of 2013 when we forgot to renew our SSL certificate (how embarrassing… it’s now good till 2017, and we have multiple calendar and email reminders in place so it won’t happen again).
  • We have intensive logging and automatic error notifications on our servers, so if something goes wrong at the application level, it emails us, and we fix it before you or your clients even know there is a problem (that is a good feeling, let me tell you).
  • Because our servers are in the EC2 cloud, network availability is EXTREMELY high, and it’s easy to adjust our capacity if needed. So, if you have a product launch, and all of the sudden our integration is getting slammed, we can easily move our application to a dedicated, or larger shared server.
  • Our servers are equipped with an automated deployment system that lets us make and deploy changes / fixes VERY rapidly when needed, as well as minimize the risk of human error in the deployment process.
  • When something does go wrong, we have forensic level logging and tools in place that allows us to do an autopsy on the problem and prevent it from happening again, rather than just waiting to see if it happens again.
  • We’re also working on a High Availability strategy that will allow us to rapidly switch EC2 regions and guarantee up-time in the event of a catastrophic complete failure of an Amazon EC2 region. Right now, we can switch regions in a few hours, but we want to get the time required down so that the limit is confined by DNS ttl’s and not the time it takes us to setup servers.

Why Self Directed Time is Important

Sometimes I love programming, sometimes I don’t.  Recently the importance of pursuing personal projects that you have a passion for has been re-enforced.
I enjoy a simple web game called “Canvas Rider“.  I’ve always wanted to make a cool track for the game, but the editor for the track is not very friendly.  Even making simple shapes takes a lot of work.  So I decided to try to write a converter that would convert files generated in InkScape to work with Canvas Rider.  While doing this I needed a better way to search through parsed xml in php and came across QueryPath (a jQuery like tool for php).
Once I became familiar with QueryPath (which I was highly motivated to do because of the personal interest I had in the project I was working on) I’ve since used it in numerous other projects.  From doing some Screen Scraping to read linked contacts, to auto-generating an sdk for “Wrike” from their documentation.  And now, again scraping a wholesalers site to send real-time inventory notifications to a reseller.
At Novak Solutions, every Friday after 1pm self-directed time starts.  The only expectation is that you eventually report what you did and learned.
Another company “TrackAbout” has a nice blog post about the benefits they’ve seen from implementing 5% self-directed time.  Dan Pink gave a very cool Ted Talk about motivating employees and how autonomy and mastery are 2 of the 3 major factors that impact employee motivation.  Self-directed time breeds these two feelings.
So, give it a try.  Give your employees some structured self-directed time for a little while and see what benefits you get from it.

Getting a BitNami stack running on VMware with VMware tools

We use BitNami for our production servers, and it’s nice to be able to test the same image locally before we push to our production server. This allows us to work out those rare bugs where code behaves differently because of a library or OS difference.
To get a BitNami VMware image to be useable you need to install VMware tools. First thing you need to do is download the BitNami VMware image you want, as well as either VMware Player or VMware Workstation.
Once you have the VM running, go to the player menu and select Manage, and then “Install VMware Tools”.
Next, you need to mount it. Run the following:

sudo mkdir /media/cdrom
sudo mount /dev/cdrom /media/cdrom

Now copy the tgz file in the cdrom path to your user directory, and untar it:

cd ~; sudo cp /media/cdrom/VMwareTools* .; tar -zxvf VMwareTools*

Now, we need to install the kernel header files so that VMware tools can be compiled (the BitNami VM image doesn’t come with them included). First we need to update the apt-get indexes, so do this:

sudo apt-get update

Next we need to install the kernel headers:

sudo apt-get install linux-headers-$(uname -r)

Now you can run the VMware tools installer:

cd ~ && sudo vmware-tools-distrib/vmware-installer.pl

Hit enter to go with the default option whenever asked a question by the installer.
That should do it, although I do one extra step.  As much as I dislike Linux GUI’s, it’s nice to have a browser on the dev server, the reason being we use *.nlocal.info for all our local development sites, then we setup Apache mod_vhost_alias on our dev machines. This allows us to setup a new dev site on our local boxes without modifying the hosts file at all. All .nlocal.info addresses will resolve to 127.0.0.1.
I need the test browser to be running on the same box as the server. Yes, there are lots of ways to get it to work without a browser, but if we use a browser it means we only have one server config to manage, and it should always “just work” which is what we like. 🙂
To install a lightweight x environment with a browser just do:

sudo apt-get install xorg openbox obconf firefox

If you do this, you’ll need to run the VMware tools config script so that it will enable all the X goodies:

sudo vmware-config-tools.pl

You’ll also want to add vmware-user to the end of autostart file for openbox:

sudo vi /etc/xdg/openbox/autostart

If you’d like x to start automatically when you login, add startx to the end of your profile file:

sudo vi ~/.profile

Now we’re ready to do some work!

Shopping cart field names

On the Infusionsoft forum someone asked what the Infusionsoft Fields in the shopping cart are. Knowing this allows you to pre-fill some of your customer’s information from other sources.
Below is a picture that shows the field name of each text field in the shopping cart (click the picture for a full-size view).
Infusionsoft Cart Fields

Cancel those unpaid Infusionsoft subscriptions

Infusionsoft doesn’t automatically deactivate subscriptions when someone doesn’t pay their bill, but there is an easy way to set this up.
Go to Setup > Misc Settings > Order Settings > Triggers. From the drop down select “When an autocharge attempt is made”.
Select 3rd and successive failure in the screen that comes up, and select all subscriptions on the right side.
Add an action that deactivates all subscriptions.
Now, if a customer’s card fails three times in a row it will deactivate all their subscriptions. If you want it to only deactivate the subscription that the charge failed for, you will need to create a separate trigger for each subscription.

Testing Infusionsoft order forms

Update 4/24/2014: Infusionsoft no longer provides the “Dummy” merchant account provider, so this tip is no longer valid. You have to use a real merchant account in order to test your signup processes.
Testing an order form is something you should always do before going live, and frequently you need to test an order form after it has already gone live! How do you do that?
It’s easy! First, make sure you have a test merchant account. Go to your E-Commerce Payment Options page and add a new merchant account. Select Dummy as the type. Enter anything you want for the details, but leave it set to Test Mode.
Next, open the order form you want to test and at the bottom you will see a “Clone” button. Click this button. It will prompt you for a prefix for the order form and type “TEST ” (no quotes). This will help you differentiate the test order form from the real one.
Now, edit the test order form and set the merchant account to your test merchant account.
Open the order form, fill it out, and for credit card information select Visa and put in 4111111111111111. That is a 4 with fifteen 1‘s after it. This is a generic test Visa card number. It works with almost all merchant accounts in test mode. Put in any date in the future for expiration date, and put in anything you want for the cv2 code. Your order should be processed successfully.
That’s it! Pretty simple huh?

Complete control over Infusionsoft order forms

Update 2/3/2015: This tip is for an extremely old version of Infusionsoft, and does not work with the current version of Infusionsoft. Sorry!
I don’t like self-hosted Infusionsoft order forms. You lose a lot of the elegance of them, and they just look blech.
I wrote a JavaScript library that you can put in the header of your Infusionsoft hosted order form that allows you to paste your own HTML for the order form with special placeholders for the fields, and another special tag for the error list. This lets you make your order form look any way you want.
One of the things you’ll need for this to work properly is a bookmarklet. The Infusionsoft source code editor on the order form header and footer editor is very slow when your HTML gets huge. This bookmarklet will convert the “Big Tiny” editor into a text box so that you can edit your code easily without waiting minutes for the code editor to highlight your code.
Just drag this link to your toolbar: Order Form Header and Footer Code Editor To Textbox