My OmniFocus Habits – Four Years Later

I’ve been using OmniFocus since the Kinkless days. Over those many years, my life has changed in countless ways, and with it, so has the way I use OmniFocus. Perhaps the best compliment I can give the app, is that it’s always managed to be exactly what I needed it to be at any given moment.

Four years ago, I wrote a long post about how I used OmniFocus to manage the three areas of responsibility in my life: personal, work, and freelance. Those areas have all grown rapidly since then. I’ve had my first child, taken on a more demanding full-time job, and watched my side business grow into it’s own full-time operation.

I figure it’s time to show how my workflow with OmniFocus has evolved to take on the added responsibility in my life.

I’m going to break this post down into three sections:

  1. How I Organize My Projects
  2. How I Define and Implement My Contexts
  3. My Daily Workflow

Let’s get started.

How I Organize My Projects

of4-1

Similar to what I described four years ago, the majority of my projects are sorted into three folders which represent the three primary areas of responsibility in my life:

  1. Personal
  2. Tandum (my day job)
  3. Freelance (my side business)

Other than the different job, that’s pretty much how things were four years ago. What’s different, however, are the three additional folders I’ve added to the bottom.

The first one, “Photo Book”, is for the book I’m writing. It’s a large enough task that I needed to break it down into multiple projects. I could have kept them under my “Freelance” folder since they technically are a side-project, but that felt wrong as writing is such a different beast than software development. And that’s one of the key lessons I’ve learned as my use of OmniFocus has evolved. Don’t feel like everything has to fit into a neat, pre-existing category. Don’t artificially restrict yourself. Feel free to let things land wherever makes sense to you.

The second and third additional folders are special. First, you’ll see that I’ve moved all of my Someday/Maybe/Tickler projects into one folder. I was tired of them littering my other project views, even being on-hold. Grouping them into one location helps my sanity. I also know they won’t be forgotten as they show up automatically at set intervals during my OmniFocus review.

of4-2

The final folder is for template projects. These are projects that have many steps and frequently repeat. Instead of recreating the project from scratch each time, I create it one time and place it on hold. Then, whenever that project occurs, I can drag a copy of it into one of my active folders. The two template examples in this screenshot:

  • New App Release: Every time I release a new version of one of my apps, there’s a concrete fourteen step process to ensure everything goes smoothly. I’ve eliminated most of the chance of error by using this project as a simple checklist for each step.
  • Travel Packing List: This is a great idea I read somewhere else online. I used to worry every time I walked out the door to catch a flight that I had forgotten something. Now, I have a standard list of everything I need to pack that I can confidently go through before each trip. As you’ll see in the next section, each of the items on my travel packing list are assigned to a context of the store where I’ll need to buy them if they’re disposable. (Target, Walgreens, etc).

One rule of thumb I’ve learned the hard way is to never nest folders. Folders within folders just lead to a world of hurt and cognitive load. I’ve found it’s best to keep as flat a hierarchy as possible. Your milage may vary of course.

How I Define and Implement My Contexts

of4-4

One of the most significant changes I’ve made is how I approach my contexts.

I used to go with standard run-of-the-mill contexts that related to the specific tools I needed at hand to complete a task. Things like “Mac”, “Phone”, “Home”, and “Work”. But after re-reading Getting Things Done last year, I came to the realization that most of my tasks are bounded not by what tools I have available, but by my energy level. Tasks such as “Write new blog post” and “Update credit card mailing address” are both something I need to do while at my computer but require vastly different levels of energy and time to complete. This insight led me to categorize my tasks into the following contexts:

  • Full Focus – tasks which I need uninterrupted time and concentration to complete
  • Quick Hits – tasks which I can knock out in just a few minutes, one after the other
  • Brain Dead – tasks which require no energy or concentration

I found great success with splitting up all of my tasks into one of those three contexts. It allowed me to judge what sort of mood I was in and how much time was available before determining what to work on. After a few months of using this strategy, I further segregated things by breaking them out into parent contexts of “Personal”, “Work”, and “Freelance”, which correspond to my primary areas of responsibility. While not strictly necessary, this additional grouping allows me to focus on what’s appropriate depending on whether or not I’m at home or at work.

Of course, not all of my contexts relate to energy levels. I still have a “Phone” context and ones for stores I frequent. (Although, I no longer use OmniFocus for shopping lists other than for big-ticket, future/someday purchases. All of my family’s shopping lists are kept in sync between my wife’s and my iPhones using the wonderful Silo app).

You’ll also notice I have on-hold contexts for tasks that other people owe me. I wrote in detail about how I manage the relationships between tasks and other people a few weeks ago.

My Daily Workflow

The biggest and best improvement I made to my daily workflow was to codify my morning routine for picking what I’m going to work on that day. (In fact, a big part of determining what to work on each day was simply realizing I need to a concrete series of repeatable steps for choosing my day’s tasks.) Back in 2010, I wrote

It’s hard to describe how incredibly powerful Perspectives are until you actually spend a few days with them in your workflow. Other task managers have smart folders or dedicated “Today” lists, but they absolutely pale in comparison to the flexibility that Perspectives afford.

The same is still very much true today. I’ve taken OmniFocus’ perspectives feature and simplified them down to three custom perspectives I use to plan and attack my tasks for the day.

of4-5a

Each morning when I arrive at work, I switch to my “Planning” perspective. This perspective shows me every single task that I could possibly do, grouped by context. I take five minutes and work my way through each task and decide if it’s something I want to focus on today. If it is, I flag it. I try and pick two “Full Focus” tasks that I believe I can accomplish that day. This ties in nicely with my daily goal of doing one (or two!) concrete actions. Additionally, I pay special attention to any tasks in my “Quick Hits” or “Brain Dead” contexts. I try and flag as many of those as is reasonable, since I know there will be times during the day where my time will be limited or where I’ll be low on energy.

of4-6a

Once I’ve flagged what I want to do today, I switch over to my “Today” perspective. This perspective shows all of my flagged tasks in addition to anything that is due or due soon. The list is then sorted by due date. This gives me a complete overview of everything that must be done today (and anything with a due date should really be due that day, otherwise why have a due date at all?) and what I had previously flagged to complete today.

Throughout the rest of the day, I spend nearly all of my time in this “Today” perspective. I simply work my way through my list, item by item, working to get as much done as possible before it’s time to go home.

My final custom perspective is “Waiting”. That’s simply a list in context mode, focused on my on-hold tasks that other people owe me, grouped by person. This is particularly helpful when synced to my iPhone. When I’m in a meeting or run into someone, I can just tap this perspective and see if there’s anything we need to discus. For more details on how I handle the relationship between tasks and people, here’s a post I wrote earlier this year on the topic.

Wrapping Up

So, that’s it. That’s a quick summary of what my OmniFocus setup looks like four years since I last wrote in detail about the app. The biggest difference maker in my daily sanity has been the realization that I can stay on top of everything in my life with very little mental overhead if I simply trust my system and take five minutes every morning to plan my day. That, coupled with weekly reviews, ensures nothing falls through the cracks.

I’d love to hear about your own custom OmniFocus workflows. Feel free to email, tweet, or write to me in the comments below.

Delegating Tasks and Outsourcing Your Indie Business

A few weeks ago there was some discussion online about hiring virtual personal assistants to help offload non-essential business tasks. Around that same time a Twitter user messaged me (and quite a few other indie devs) asking what sort of business tasks we would consider outsourcing. I’m pretty sure this industrious @replier was just looking for job leads, but it did cause me to stop and consider what parts of my business would I be comfortable delegating to an assistant.

The short answer is, not much.

For developers of a consumer-oriented product I think there might be a strong possibility of being able to hand off documentation writing and lightweight customer support. It would be great if I had someone answering emails that only required a link to an FAQ article, leaving the truly in-depth questions for me to answer.

But for a technically niche product like VirtualHostX, I worry my non-specialized assistant wouldn’t have the technical chops to answer anything but the most basic support questions. Writing documentation would likely also be a problem. However, if they’ve used the software proficiently in the past, the thought of them editing together some instructional screencasts is very appealing – as that’s something I never find the time to do myself. I’d love to build a list of topics and then have them go off and come back with screencasts ready-to-go. I’d easily pay a few hundred dollars a-piece for that service.

So while I’m not comfortable outsourcing my core business tasks, I have begun delegating personal tasks to free up more time for the business. A few months ago I signed up for Fancy Hands. For a few bucks a month I have access to a network of virtual assistants that I can send odd jobs to. Basically, anything non-confidential that can be completed electronically and/or remotely is fair game. I’ve used my assistant to schedule appointments, cancel hotel reservations, price shop, and do online research. I’ve been very pleased so far.

At first I found it difficult to come up with tasks to delegate to the service. A week or two would pass and I’d suddenly think “Oh, crap. I haven’t tasked them with anything lately” and worry about not getting my money’s worth.

So, I created an “on hold” context in OmniFocus called “Fancy Hands” just like I would create for any other person I assign tasks to. Then, during my weekly review or when I’m flagging tasks for the day, I’ll consciously keep an eye out for anything I can assign to them. This helps with remembering to delegate tasks as the possibility of doing so is forefront in my mind.

I don’t have any big conclusion or take-away. These are just my thoughts after actively trying to learn how to delegate tasks while running a one-person company.

Constraints

I often find that constraints, real or artificial, can be a huge motivation and productivity boost when I find myself stalled on a project or piece of work. Forcing yourself to work within a specific limitation can cause you to find a creative solution in a direction you might otherwise never consider.

In my own work, I find time constraints the most useful. When I don’t know where to start developing or writing, I’ll often force myself to do something – no matter how small or tangential – to move the work along for thirty minutes or an hour. The artificial time limit frees my mind to attempt starting points I might not typically choose because I know that even in a worst case scenario, I’ll only lose an hour worth of work if my chosen path is unsuccessful. Similarly, when I find myself lacking motivation and energy to work, I’ll use the pomodoro technique. That gives me the kick in the pants I need to break the ice and get moving, which can often turn into real energy and sometimes even that magical “flow” state.

A few weeks ago on a Friday night I found myself burnt out from my day job. It had been weeks since I had done any recreational programming or development on my side projects. I desperately wanted to move them forward, but simply couldn’t find the energy.

So I tried an experiment.

I decided to give myself thirty minutes to brainstorm and come up with a product idea that I could then build to a shippable state within the next two hours. Further constraining myself, I decided to forgo my two 27″ monitors and do everything exclusively on my 11″ MacBook Air.

I knew the easiest way to come up with a new product idea was to examine my typical day and find a small pain point that I could solve with software. After mentally going through my usual day in my head, I began to focus on my calendar. I realized that I was often checking multiple times throughout the day to see how much time I had until my next appointment, which would influence which task I could take on before I have to be somewhere. (As many developers will know, a programming assignment that will take an hour, often takes longer as there’s a definite lead-up time before you really begin coding where you work to get yourself into the zone.)

I thought “Wouldn’t it be easier if I could just glance up and see how much time I had remaining?”

With that insight, I had my product idea.

Over the next ninety minutes I built a simple Mac menubar app that looks at your calendar and simply displays how long you have until your next appointment. I call it Up Next. I’ve been using it as part of my daily routine for the last few weeks and have found it works great. Without losing place in my current work, I can glance at my menu bar and see “Oh, I’ve got two hours until I need to be somewhere” or “Crap, I’ve only got twenty minutes to wrap this up”.

That little bit of awareness doesn’t distract me from getting in the flow, yet keeps me persistently time boxed and motivated.

If you find yourself similarly lacking motivation throughout the day, I encourage you to try placing a constraint on your work. And if you think Up Next might be useful to you, you can give the app a try.

Paul Kim on His Indie Journey

I want to give a big thumbs up and a hug to everything in this fabulous post by Paul Kim. I missed it back in August when this discussion was initially happening but came across it on Gus’s blog this morning. Paul writes about his expectations starting out with Hazel and what he’s discovered looking back on his success. This portion specifically speaks to my (moderate) success and what I’ve learned:

But it wasn’t easy and it wasn’t overnight. A common sentiment I see among a lot of new devs is that if they aren’t living full-time off their app in the first year, it’s a failure. I know when starting out there is the hope that your app will be an immediate success. It’s fine to hope that; after all, its our dreams that drive us to succeed. But you shouldn’t expect it. I would say it took about three years before I could be comfortable living off of it full-time.

That’s exactly one of the points I was trying to make when I wrote about my own journey. My initial expectations for VirtualHostX were very tempered – I just wanted to earn enough money over the lifetime of the app to install hardwood floors in our tiny house. But, as the app and my audience grew, I would occasionally readjust my expectations – eventually to the point where I could financially sustain myself by my app revenue alone.

Jalkut says the same thing in a tweet from July:

If you release your 1.0 with awareness that you may not succeed until 5.0, you’re in good shape.

Paul’s other point about luck is also worth keeping in mind:

One thing that I did learn is to have a healthy respect for randomness. Luck plays a huge role and you can’t always attribute one’s success or failure solely on their decisions and actions….That doesn’t mean you sit back and just let fate decide; you still need to work to improve your chances. Just realize that there’s a big chunk you can’t control and that on some level, you need to be ok with that.

While I’ve poured a lot of time, energy, and work into my apps, I’m very much aware that a lot of their success is just dumb luck. Case in point: I was extremely fortunate that of all the apps I could have built, I happened to pick a niche market without any serious competitors. Not only did that make me the only game in town, but it also allowed me time to breathe and let my app grow organically to meet my ever growing list feature requests from my customers. Sure, picking a niche in an underserved market is business school 101, but for the dumb twenty-four year-old that I was, that was a supremely lucky break.

In any case, if you have any interest in a successful indie journey, give Paul’s post a read.

Marching Through the Wilderness

(How could I not title this post after one of my favorite David Byrne songs?)

Gus has a terrific post on his blog about what he calls “the wilderness” – a period of time between major software releases “where I’m pretty lost, and I don’t know what to do.” His working theory on the matter is that it’s basically a forced period of rest put upon you by an overworked brain. How do you get past it? The same way you walk out of any wilderness – “One foot in front of the other…You can walk for miles and maybe months in the wilderness. Just keep on going.”

I take comfort in knowing that I’m not the only one who experiences periods of low energy slogging through work like this. Unlike Gus, however, I don’t blame it on a stressed or over tired mind. For me, as someone who suffers from depression, I know that these periods aren’t just a symptom of working too hard, but that they’re actually just one part of a cycle between times of depression and times of whatever the opposite of depression happens to be.

I’ve been tracking my mental health through copious notes and journaling for three years as a way to better understand what triggers my depression, how long it lasts, and what I can do to work my way out of it. The biggest lesson I’ve learned is that these periods always have an end. They’ll pass. If you have faith that that’s true, then it becomes easier to listen to your mind and not try and force things when the timing and mood isn’t right. In the same way that I take advantage of my mentally high states and code like a crazy person, I know to divert my focus to other more doable tasks when I’m at a low point. Rather than coding, I’ll update my FAQ articles, record screencasts, or do a deep dive into my marketing analytics safe with the knowledge that I’ll come through to the other side and return to coding in a better state of mind.

Gus equates escaping these periods with putting one foot in front of the other and continuing to walk until you find your way out. For me, I see it more as riding waves on a boat. There’s going to be low points just as there are high ones. The key is to keep sailing.

Assigning Relationships Between Tasks and People in OmniFocus

For years I’ve used on-hold “waiting” contexts named after coworkers and family members to denote tasks that I’ve assigned to other people and am waiting on them to finish. But a few weeks ago I had a realization that there are two other types of relationships between tasks and people that I haven’t been tracking. And with a few quick modifications to how I title my tasks, it’s possible to track them in OmniFocus.

Let me explain.

There are three types of relationships between tasks and people:

  1. A task can be assigned to another person by you.
  2. A task can be assigned to both you and another person.
  3. A task can be assigned to you by another person.

Number one, tasks assigned to another person, can be handled as mentioned above by giving the task a context corresponding to the name of the person it’s assigned to. So, if I’m waiting on Jeff to complete a design document, I’d give that task an on-hold context of “Jeff”. This lets me quickly filter tasks that Jeff owes me whenever I run into him. Great. I’ve been doing this for years.

But it would also be super useful to track tasks that are shared between you and someone else. How can you do this with OmniFocus?

The best solution I’ve found is to add the other person’s initials to the task title surrounded by parentheses. For example, a task that I’m working on with Mike Davis would be titled “Review design specs (MD)”. Then, much like focusing on a context assigned to a person, it’s easy to view all of the tasks you’re doing with someone else. Just perform a search for their initials inside the parentheses like “(MD)”. You can even perform a search and save it as a custom perspective for people you frequently need to review. And don’t forget the parentheses – they’re important. It prevents your search from finding task titles with words that contain the initials you typed.

Taking the initials trick a step further, I add initials inside square brackets for tasks that I owe someone else. For example, instead of creating a task titled “Complete TPS report for Jack Posey”, I title it “Complete TPS report [JP]”. Again, this lets me perform a search for anything I owe Jack.

You could go even further and use additional sentinel characters to define other relationships between tasks and people. For example, you could use curly braces { } or angle brackets < >. I don’t use those myself, but it’s nice knowing they’re available if there’s another relationship type you frequently need to assign.

Big or Small

I’ve always gone with portability and sleekness over outright power and versatility. I bought an 11″ MacBook Air the day they came out. I switched to an iPad Mini from the bulky third generation iPad. I walk around with a slim wallet. I keep my iPhone naked in my pocket – no case.

So I was hesitant but very curious about the iPhone 6 Plus. I’ve always scoffed at Android users with huge phones – mainly because I never saw the benefit. Very few Android apps adapt themselves to take advantage of the extra screen real estate. Most users spend all day with stretched and scaled up apps that could just as easily run on a smaller screen device. But with Apple’s recent advancements in AutoLayout, size classes, and their keynote demo, I love the idea of the additional UI elements a larger screen iPhone could provide.

That said, it goes against my very nature not to get the most portable device I can afford.

But after spending a day with a Samsung Note III in my pocket as a size comparison, I came to a realization I hope comes true.

The 6 Plus may be a huge phone, but it might just allow me to give up my iPad (which I don’t use very often) and consolidate down to only one iDevice.

In that sense, going with the Plus actually is the smaller option.

How I Manage My Email

I’m probably not going to say anything new. But I wanted to put down on paper my system for staying on top of email since I so often see people with overflowing inboxes. And I’m not trying to specifically call out anyone I’ve worked with in the past with an unmanaged inbox. I’ve known plenty of very productive people who can’t stay on top of their email. This is just my solution for taming the crazy.

Every morning when I wake up, I typically have 20 – 30 new emails across my three inboxes. (Personal, Freelance, and Work.) Usually, while standing in the kitchen drinking coffee, I’ll open my iPhone email client of choice (Dispatch – it’s truly amazing) and switch to the combined “All Inboxes” view. Then…

I read the subject of every email. If I don’t know what the email is from the subject, I’ll tap and read the body.

Every email is read. Without fail. Nothing is skipped.

For every email, before I move on to the next one, I do one of four things with it:

  • Delete it
  • Send it to spam
  • Archive it
  • Leave it in my inbox in an unread state

Those first three actions should be mostly self-explanatory.

If it’s trash, I delete it.

If it’s unwanted, I mark it as spam. I know some people will just delete spam emails, but that does yourself a disservice. At least with Gmail, by marking a message as spam, Gmail will learn to mark future similar emails automatically as spam – leaving you with one less email to triage.

If it’s a legitimate email that does not require a reply, I archive it. Gmail has blessed us with practically infinite email storage. You never know when you might need to refer to an old email, not matter how mundane, and it’s absolutely no bother to archive an email just in case you may one day need it.

With those three options out of the way, that only leaves emails in your inbox that require a response or an action on your part. If an email requires an action, I send it to OmniFocus and then (you guessed it) archive the email.

If the message requires a reply, I leave it in my inbox until later in the day when I have time to reply. And immediately after reply, I archive it.

Throughout the day I’ll get new email. I feel no need to check it immediately. When the time is right, I repeat the above process on any new emails.

And during the day when I have time to reply to email, I know every message left in my inbox needs a reply without having to reassess them or make any decisions. Just open an email, reply, and archive.

I follow this routine ruthlessly. The result is a completely manageable and under-control email experience. No emails ever get lost in the shuffle or forgotten. Everyone who needs a reply from me, will get one. And any email that requires an action will be acknowledged.

All The Services and Tools I Use to Run My Software Business

When I started selling my first Mac app in 2007, there was no App Store. I don’t even think “app” was a word. And there certainly wasn’t any ready-made infrastructure for selling software online that you could simply plug into. That meant, like every other independent developer, I had to piece together my own solution for accepting payments, hosting downloads, activating license codes, and delivering app updates.

As I wrote about back then, I rolled my own web app called Shine to coordinate all the disparate services I use to run my business.

August 2014 was the seventh anniversary of my first product release, so I thought I’d take some time and describe what my current setup looks like and all the tools and services I’m using to keep my business humming along.

Shine – My Indie Control Panel

Shine still powers the core of my business. It’s the controller that connects all of my other web services together. You can read a more detailed description of the software here. But, in general, here’s a list of all the functions it handles…

  • Order processing
  • Validating upgrade eligibility
  • Manual order creation
  • Order history and lookup
  • Generating invoices and receipts
  • Generating coupons
  • Basic sales and business stats and charts
  • Generating serial numbers
  • Software activations
  • Collecting and storing user submitted feedback and support requests
  • Searching for, displaying, and archiving mentions of my company and products on social media
  • Coordinating new app version releases, which means accepting a zip file of the app, storing it in Amazon S3, and pushing the new update to users via Sparkle
  • Generating publicly viewable changelogs
  • Sending transactional emails
  • and many other little, but essential, tasks

I literally couldn’t run my business without Shine. Well, I couldn’t in 2007. Services like GumRoad, FastSpring, and Stripe could handle for me much of what Shine does. But I’m so invested in the software it’s hard to move on at this point. Also, I love the ability to control the code which means I can dictate features and business logic exactly as I see fit.

Payment Processing

I originally used PayPal to accept accept orders. Their IPN API would ping Shine whenever a new order came through, and Shine would generate a license code and email the customer. In 2009 I switched to FastSpring. You can read about my experience making the change from PayPal to FastSpring. tl;dr FastSpring is way better. They take over as the seller of record and handle all aspects of order processing. When an order comes through, FastSpring sends the order information to Shine for safe-keeping, and Shine returns a license code. FastSpring also handles emailing the customer a receipt and their license information. They’re also where I go whenever I need to process a refund. Twice monthly they deposit my sales into my bank account minus their commission.

For six months in 2013 I switched away from FastSpring and handled the entire order flow in-house on my website using Stripe. I really liked owning the entire solution – and especially liked Stripe’s much, much lower transaction fees. It also enabled me to use Stripe’s Objective-C API to build a store directly into my apps, so customers could enter their payment information without ever have to open a web page. Unfortunately, I saw a decrease in conversions. I also wasn’t able to calculate VAT and sales tax on my own, so I switched back to FastSpring.

Also worth noting, it’s super easy to integrate FastSpring’s checkout process with your Google Analytics account. The result is all of your sales data, products, and goal conversions nicely tracked and charted in your Analytics account.

Managing Mailing Lists

I’ve been a happy MailChimp customer for five years now. You can read more about how I use and manage my mailing list.

For the last month I switched over to using Drip for sending out my VirtualHostX welcome emails, and they were great. But better analytics, better email template designs, and higher conversion rates led me back to MailChimp.

Sending Transactional Emails

MailChimp is great for sending email blasts, but for transactional emails I use Postmark. Their pricing is affordable and their API is super simple to work with. Whenever an order comes through to Shine, I use Postmark to send out the customer’s order receipt and license information. They do a very good job of managing their outbound email servers’ reputations, so I’ve never had any problems with the emails I send getting flagged as spam.

While I’m 100% satisfied so far with Postmark, I am looking into switching to RackSpace’s Mailgun service so I can send delayed emails. I’d like to automatically send a followup email to customers asking if they have any questions a week after purchase, but I’d prefer not to handle the queueing logic myself. Mailgun’s API has a simple, optional parameter when sending email that allows you to specify a future date when the email will be sent. That’s very appealing to me. I’ll post my results if and when I make the switch.

Web Hosting

All of my servers are hosted at Linode. That includes my primary web server, which hosts all of my domains and the Shine web app, plus the proxy servers which handle VirtualHostX‘s Lift Off service.

I originally started out on SliceHost, and then migrated to RackSpace when they acquired Slice. RackSpace was great, although very expensive compared to AWS. Still, they treated me wonderfully (including a dedicated account manager), so I stuck around. Eventually though, I had to move away after years of them never getting around to supporting two-factor authentication. I just had so much of my livelihood hosted on RackSpace, I couldn’t afford the danger of getting compromised, even using a strong password. (So, if you’re reading this RackSpace, 2FA is the primary reason I left – and, yes, I’m aware of your 2FA beta program, but that came too late.) I’m now on Linode and very happy. Their all SSD machines build my Jekyll site in two seconds, compared to the 14 it took RackSpace’s spinning disks.

Source Code Hosting

I was a very happy paying GitHub customer since 2008, but switched to GitLab in 2013. The short reason for the switch is my GitHub monthly cost ballooned to $50. So, I spun up a $20/month DigitalOcean box, installed GitLab, and now host all of the private repositories I want. You can read a detailed account of why and how I switched from GitHub to GitLab.

My Website

As I noted above, my website is hosted on a Linode instance. It used to run on WordPress, but I found it much simpler to maintain by switching to Jekyll. Another huge consideration was the speed of serving static HTML files with Jekyll versus database backed WordPress pages. Here’s a Pingdom chart showing my site’s average response time before and after switching to Jekyll.

PingdomResponseTime

Content Delivery Network

All of my static website files and app downloads are stored in Amazon S3. My website serves those files over MaxCDN‘s content delivery network using my S3 bucket as a pull zone. Their bandwidth runs me about $100 a year and it’s lightning fast. I could use Amazon’s CloudFront as my CDN, but I find MaxCDN’s control panel for occasionally purging the cache much simpler to use.

Phone Support

I use Grasshopper for my phone support. It costs about $20/month for my own, dedicated 1-800 number. In practice, I rarely do phone support and let most of the incoming calls go to voicemail, but I’ve heard nothing but positive comments from customers who appreciate that there really is a dedicated toll-free number they can call if needed. It makes them feel like there’s a reputable company behind my software. (There is!) Even if you never answer the phone, I highly recommend getting at least a voicemail box where customers can get in touch.

Crash Reporting

All of my Mac and iPhone apps use the HockeyApp SDK for crash reporting. I’ve found their crash symbolication service to be top-notch. Because I already have my own infrastructure setup with Shine, I don’t need a lot of their other services, but the $10/month I pay for crash reporting is completely worth it.

Email Hosting

I use Gmail for all of my company email. You can’t beat their price, search capabilities, and keyboard shortcuts. But, as a backup precaution, I’ve had all of my personal and company email forwarding into two FastMail accounts for the past few years so I can immediately switch providers if it should come to that.

Domain Names

I moved all of my domain names from GoDaddy to I Want My Name four years ago. I knew I wanted off GoDaddy, and at the time, IWMN was the only reputable registrar I could find offering .io domain names.

All of their features and support are great. My only complaint is their dashboard is sloooooow – on the order of 5-7 seconds between page reloads.

SMS Messages

My Mac app Minion has a need to send text messages to users. Twilio was my first choice and they’ve served me well. Their API was a little confusing at first, but now that I’ve got it up and running it’s been rock solid. Their pricing is on par with every other provider I’ve looked into.

Personal Assistants

I recently started using the FancyHands virtual assistant service to offload some of the more mundane tasks of running my business. I’ll have them do research, book and cancel hotels, and whatever other small tasks I don’t want to deal with myself. I’m still testing the waters, but I hope they can become an integrated part of my workflow.

So, that’s it. Off the top of my head, those are all the major services and tools I use to run my indie software business. As I’ve grown up as a business person these last seven years, I’ve learned to delegate and pay money for services that can do a job well instead of trying to handle everything in-house myself.

First Impressions of Using Drip for Email Marketing Automation

About six months ago I began collecting the email addresses of folks who downloaded my app, VirtualHostX. This was entirely opt-in. I simply placed a MailChimp signup form on my download page. I promised users who join a three email course introducing them to a few of the major VirtualHostX features and a 10% off coupon for when they purchased. My goal wasn’t to collect their email addresses and, later, market to them. I simply wanted a way to automatically communicate with users new to the software and make sure they got off on the right foot.

Setting this up in MailChimp was surprisingly simple. They’ve got a whole section on email automation. Kudos to them.

A couple weeks ago, however, I ran across a new marketing product called Drip. It’s founded by the author of a book I really enjoyed about solo entrepreneurship. Drip promises to handle email automation similar to MailChimp but with better goal tracking and higher conversion rates.

I was intrigued.

After going back and forth for a week, I ripped out my old MailChimp form and installed Drip’s pop-up box last night. MailChimp has served me great, but I’m ready to go beyond simply sending emails and towards measuring the actual effectiveness of them. I’m hoping Drip’s goals and conversion tracking will give me those insights.

All of this is influenced by a realization I had earlier this year. VirtualHostX has reached a mature, stable state. There are plenty of more features I can add – my todo list is overflowing – but I’m wondering if I’m starting to see diminishing returns with regards to how many more sales I make compared to how many new features I build. I’m wondering if I could see a bigger difference in sales simply by upping my marketing game. I hope to find out that answer, to a small degree, with Drip.

Anyway, I plan on writing a full review of Drip and what success it does or doesn’t bring me in a few months once I’ve had time to see its effects on my mailing list. But for now, I just wanted to offer my sincere amazement at what a well-executed service it is. As far as I know, Drip is one of the small players in the industry. And I honestly wasn’t expecting much fit and finish. But I’m seriously impressed so far. Their entire onboarding process was stellar. And the workflow that led me through setting up a campaign, building my email course, and getting their JavaScript and tracking installed on my website was phenomenal. They’ve done a really, really great job.