It ended with a bang.
For the last year or so, Panic was typically heads-down quiet. But as 2014 drew to a close, our furious typing came to fruition and a whole lot of magic happened. It felt great.
If you’ll indulge me, I’d like to write a little more about our business than we normally do. Why not?
So many wonderful things shipped in 2014:
Transmit iOS (1.0, 1.0.1, 1.0.2, 1.1, 1.1.1, and 1.1.2)
Yes, a brand new iOS app from Panic! This extremely capable iOS file transfer client is an idea we’d considered in the past but didn’t green-light until Sharing Extensions were formally announced at WWDC — bringing file transfer to other iOS apps made this idea sing. It helps that our engine had already been ported (thanks to Diet Coda), but one interesting note: from start to finish this was a three-month project. I think that’s a tremendous accomplishment given its meaty features and beautiful fit and finish. Feedback has been spectacular — from MacStories to MacUser, people love it.
Prompt 2 (2.0, 2.0.1, 2.0.2, and 2.0.3)
A very welcome update to our popular SSH client for iOS at last went out the door. With a new engineer focused on this project full-time, we updated the UI, added some much-requested new features, and brought Prompt into the modern era. Plus, it was the perfect candidate to help test and implement Panic Sync.
Coda 2.5 (2.5 and 2.5.1)
A monumental — and free — update to our already-monumental OS X web coding app. It took too long to get out the door — I’ll say it’s no fault of the team, but rather a series of difficult decisions (that I’ll detail below) that meant a lot of wasted time followed by writing our own sync server. But we added huge features (local indexer! indentation guides! plugin improvements!) and cleaned up the UI and I think we ultimately delivered on the original promise of Coda 2.0 in a way I think our Coda customers have deeply appreciated.
After lots of discussion, we decided the only way to provide a truly great sync experience for our customers was to control both sides of the equation — the server and the client. So, after a ton of research into what was available, we wrote our own. After successfully launching Panic Sync service, and its web interface, we’ve been adding it to all of our apps, with more to come. At last count, there were over 400,000 sites being synced with Panic Sync — and nearly zero downtime. I’m especially proud of the transparency on our Panic Sync webpage — no solution can be perfect or fully secure, so we thought it was best to put all of our cards on the table.
Each of the app launches has meant we’ve also been continuously updating our webpages and UI to our latest style and palette, and that always feels good. We also created PunchClock, our cool open-source iBeacon project. We discontinued Unison to free up resources for the future, a difficult decision but one that most people seemed to understand. And 2014 was also the year that our video game project, Firewatch, funded by us and built by a great team in San Francisco, started full-scale production. We are extremely excited about this.
Not everything was super easy, of course. Here are some standout difficulties.
We decided to make Prompt 2 a brand-new app. Amazingly, customer reaction was surprisingly neutral or positive — I was prepared for a 6-foot shitstorm and there was none. Why did we charge? The market for Prompt is small, and its revenue would not wholly cover the cost of infinite future development. The only way we could afford to do a 2.0 was to charge for it. The first problem: we have no idea who bought the app, so how do we let them know? Fortunately, we planned ahead, and added our home-grown Soapbox code to all of our apps, including Prompt 1. It allows us to push out a custom web page, one time, to customers on launch, based on a variety of criteria. So we were able to alert Prompt 1 owners that Prompt 2 exists. But still, we’re sure many people dismissed it immediately, and those people will never know they’re stuck with a version of Prompt that will never be updated. There’s also the matter of when it’s too soon to charge for a new version — as we prepare some new iOS updates, we’re still debating if we want to charge for those as well. My gut says no, that full price every single time is rough, but then we’re setting the precedent that maybe not all of our major upgrades are paid upgrades, which we’ve been pretty consistent about in the past. If we could offer traditional discounted upgrades via the App Store, this paragraph wouldn’t exist. This is one area where the App Store feels like one of those novelty peanut cans with the snake inside.
Leaving the Mac App Store
We’ve well-documented our struggles with Coda 2.5, Sandboxing, and the Mac App Store — first a warning in 2012, then this year when 2.5 shipped. Apple tried their best but realistically speaking we simply would have had to cut numerous Coda features, like the Terminal, MySQL local access, editing files as root, and more. To be honest, I was pretty nervous to be pulling Coda from the Mac App Store. But when we finally did it, I felt an incredible, almost indescribable sense of relief — mostly because as we began to wrap up bug fix releases, we were able to immediately post them to our customers within minutes of qualifying them. My god. That’s how it should be. There’s just no other way to put it — that’s how you treat your customers well, by reacting quickly and having total control over your destiny. To not be beholden to someone else to do our job feels just fantastic. (Also to not pay someone 30% in exchange for frequent stress is a fine deal.)
So, how’d it go? After running the numbers, it looks like Coda’s sales have not suffered significantly since leaving the Mac App Store.
Coda was removed from the Mac App Store in mid-October, at the same time version 2.5 was released. Since new releases always generate a short-term sales spike and we wanted the numbers to be fairly representative of “typical sales”, we looked at one month on either side — September and November.
The results were interesting. We sold a couple hundred fewer units of Coda post-App Store removal, but revenue from it went up by about 44%.
Now, two explanations for that: in addition to keeping the 30% that would have normally gone to Apple, we also returned Coda from its sale price ($79) to its regular price ($99) alongside the release of 2.5. Even if those factors hadn’t been in play, though, I don’t think the decline in Coda revenue would have been as dramatic as we originally feared it might be.
Of course we have it easy — it’s an established app with a dedicated customer base. If Coda did not already exist or Panic was not well-known, ignoring the Mac App Store would’ve been a much harder decision with possibly larger ramifications.
The last couple of months of 2014 got classically “exciting” as Transmit iOS was suddenly flagged by the App Review team for a violation — a well-documented situation, both on our blog, and sites like Daring Fireball and MacStories. Thanks almost exclusively to these articles, we very quickly got a very nice call from a contact at Apple, and the situation reversed almost immediately. Everything ended up just fine.
But I can’t comfortably say “the system worked”. It’s still an awful and nerve-wracking feeling to know that, at any minute, we could get thrown into a quagmire of e-mails, phone calls, code removal, and sadness, just by trying to ship something cool.
There’s a little more history here than I’m letting on. We had a very long, very torturous situation with Status Board almost being pulled that we’ve never written up out of sensitivity to our relationship with Apple. I only mention it here because it proves that it is possible to fix these awkward rejection situations without Apple suffering negative PR in the public eye — we did that “offline”. But it took an absolutely massive amount of mental energy and time to work through — positively Sisyphean. I would never want to do it again — I’ve run out of patience, I guess. I can say for certain that the “bad PR” version of the app dispute process is monumentally more effective. Which is a shame.
The ultimate irony, though, is that the press, and the pulling, totally temporarily bolstered Transmit iOS’s sales. It probably introduced the app to a lot of people for the first time. Here’s our sales chart… guess where the news hit?
When these things happen, the hardest part for me is knowing that Apple has a whole lot of good people we admire doing great work that we are inspired by, and that they are often overshadowed by teams and forces beyond their control. It must be infuriating.
Low iOS Revenue
This is the biggest problem we’ve been grappling with all year: we simply don’t make enough money from our iOS apps. We’re building apps that are, if I may say so, world-class and desktop-quality. They are packed with features, they look stunning, we offer excellent support for them, and development is constant. I’m deeply proud of our iOS apps. But… they’re hard to justify working on.
Here’s a way to visualize the situation. First up is a sample look at Units Sold for the month of November 2014:
Wow! 51% of our unit sales came from iOS apps! That’s great!
But now look at this revenue chart for the same month…
Despite selling more than half of our total units, iOS represents just 17% of our total revenue.
There are a few things at work here:
1. We’re not charging enough for our iOS apps. Or Mac users are simply willing to pay more for apps. Or both.
2. We’re not getting the word out well enough about our iOS apps.
3. The type of software we make just isn’t as compelling to iOS users as it is to Mac users. Our professional tools are geared for a type of user that simply might not exist on the iPad — admins and coders. We might have misjudged that market.
It’s really hard to say for sure. One thing is for certain: we are more likely to increase the price of our iOS software over time in an effort to make it make sense. And we’re less likely to tackle any huge new iOS projects until we get this figured out.
We generally don’t like to talk about future plans because it almost inevitably comes back to haunt us in some way. But I can confirm at least two things that will happen in 2015: a significant update to Diet Coda that will overhaul the UI, and the brand new Status Board 2 which adds fantastic features and is already entering beta. Also, Panic Sync will be added to Transmit for Mac in some form. Beyond that, we’ll have to see…
A handful of changes:
- We formally moved onto Slack for team communication. We had nothing like this before, just e-mail. It’s been a huge boost for us, mostly because it keeps everybody on the same page a lot more efficiently, and it’s really good at searching. It can be overwhelming to keep on top of, but the good far outweighs the bad. I basically don’t get much e-mail anymore.
- We moved the majority of our credit card processing over to Stripe.
- We migrated our website into Git, using Vagrant and VirtualBox to allow each web developer here to run a virtualized version of the site on their desktop machine. It’s been great.
- All of our other code projects began migrating into Git and GitLab. This was hard — it’s a lot of change and years of habits — but we’re hoping it will be worth it down the road.
- QA has become a lot more formalized thanks to some heroic efforts.
- We also started to establish the idea that there are two tracks of Panic Projects: evergreens and seedlings. We want to give constant attention to the apps that people love — and the apps that bring in good money. At the same time we want to continuously experiment with new ideas, some that might succeed and some that may never see the light of day. So far, this is actually working, and it’s exciting. (The only challenge with this system is giving a chance for the evergreen engineers to work on seedling projects — their extensive knowledge of critical apps makes it hard to ‘remove’ them. We’ve gotta work on that for 2015.)
Panic is a multi-million dollar business that has turned a profit for 17 years straight.
It just hit me, typing those words, that that’s a pretty insane thing to be able to say. (And, sure, we barely qualify). Believe me, I know it won’t last forever — but wow, what a kind of crazy deal.
If you’re curious about some business stuff, our setup couldn’t be more cut-and-dry. We still have no investors or debt. The overwhelming majority of our revenue goes to employee salaries and benefits, which is just the way we want it. Then there’s our rent, our internet, some donuts and chips, etc. Anything left over goes into the magical Panic Savings Account for future projects or emergencies — we’ve always felt it was important to have some wiggle room for who-knows-what. (In the past we’ve actually reduced that warchest by simply distributing it to employees as a bonus.) We also continue to operate on standard office hours, avoiding weekends and crunchtimes with ferocious overprotectiveness, for better or worse. Maybe the most controversial thing we have is an open office, but since we have no sales or marketing teams things are usually library-quiet.
It’s been a long time since Steve and I started writing apps in our apartment — fifty lifetimes in computer years.
But the story of Panic is not about Steve and I anymore. These days, while both of us constantly dig in all sorts of trenches, more often we’re just the loud (well, I’m loud) backseat drivers — backseat drivers that often unfairly get all the glory. Let me be clear: Panic’s true asset, the thing I’m most proud of building, is the incredible team of 20 people who truly make everything happen, people who design and create these great things as a team, people who aren’t comfortable creating anything less than excellence, people I actually like.
Stepping back, of course, we’d have zero employees if it wasn’t for you — the person who buys our software and supports our work. When I’d play NES games as a kid I always thought it was corny when, at the end of the credits, the game would say “Special thanks to: you!!“. But now I get it. This is not a joke: without you we don’t exist.
We’ve just renewed our lease for another 9 years.
Here’s to the further adventures of Panic!