Hi there! I’m a front-end software developer from Montreal, Canada. I’ve worked for organizations like Khan Academy, DigitalOcean, Concordia University, and Gatsby Inc.
My original plan was to finish the course in 3-4 months. After 6 months, in March 2021, I was only about halfway through 😅. Not wanting to spend a year working on something that might flop, I decided to open pre-orders for 1 week, with the goal of selling $50k. The response was overwhelming—I wound up selling about $550k in that one week!
So in March 2020, right near the start of the pandemic, I injured my ulnar nerve.
Frustratingly, I found I wasn’t able to type without pain. For several months, I could only type for a couple of minutes before my elbow would start burning. It was a tricky predicament to be in as a software developer!
Fortunately, I was able to find a way to be productive without the use of my hands, and after about 8 months, I regained the ability to type. But the experience was harrowing, and it taught me a valuable lesson: life is short, and being able-bodied is temporary.
I chose to focus on CSS because I know so many JS developers who find CSS frustrating. Ask a typical React or Vue developer, and they’ll tell you that their least favorite part of the job is writing CSS. A lot of us really don’t like working with CSS 😅
CSS isn’t inherently bad, though! It’s a really elegant language. The problem is that it’s implicit. The rules of the language are concealed, and if you don’t understand those rules, you’re not going to have a good time.
So, I did a bunch of stuff wrong, at least according to the indie-hacker best practices.
There are off-the-shelf course platforms I could have used, things like Teachable or Podia. The smart move might’ve been to pick one of them, but they weren’t sufficient for what I wanted to do. My vision was to create a rich, interactive course loaded with explorable examples and mini-games. So for the first couple of months, I focused on building the platform from scratch.
The big benefit here is making the content interactive. This is an active course, not a passive thing where you sit back and watch videos.
It also meant I could customize the experience and make something unique and premium, and whimsical. For example, I’m pretty sure my course is the only one that celebrates your enrollment with live-animated fireworks.
After those first couple months, I divided my time between content and platform. Once I had a couple of modules ready, I invited about 30 people to test-drive it. I offered free invitations to former students of mine, from when I taught a web-development bootcamp at Concordia University.
I got some good feedback from this process, but it wasn’t really ideal; the bootcamp alumni were busy in their job hunt, and because they hadn’t paid for the course, they weren’t really invested. They were checking it out as a favor to me, not because they were highly motivated to level up their CSS skills.
Towards the end of 2020, I started building in public. I shared quick GIFs of things I was working on, previews of the content and the platform.
This helped build some early traction, and I started covertly selling the course to people who had emailed me asking about it. I got a ton of valuable feedback this way.
By January 2021, I realized that I was still nowhere near completing the course, so I planned an “Early Access” launch. This would essentially be a crowdfunding campaign; for $129, people would get instant access to the first 5 modules, and they’d get to follow along with the course development.
As I mentioned, I set what I thought was an aggressive target of $50k. I wound up hitting that mark in about 10 minutes. 😅
I only kept sales open for 1 week because I still had a ton of work to do finishing the course and knew that a constant drip of new students would divide my attention too much. By the end of the week, I had sold almost 5000 copies:
It was a heck of a week. There were a bunch of technical issues (the downside of building your platform from scratch!), and I spent most of that week trying to catch up on an ever-growing mountain of support requests. It was stressful and exhilarating.
Of course, people weren’t paying for a half-baked CSS course. So after taking a couple of days to breathe, I got back to work on the course.
It’s currently August, and I plan to launch the course in full next month, on September 27th.
My primary strategy has been to be as helpful as I can be! Both because I enjoy being helpful and because it’s a great way to show folks what they’re getting with me. If I’ve helped you solve a problem in the past, you’ll be more likely to trust my course!
I’m active on Twitter, sharing “quick tips” and small digestible bits of developer knowledge.
I also have a blog, joshwcomeau.com.
The blog posts are essentially “deep dive” versions of the tweets. They’re mainly on the topic of JS and CSS, though I have some posts about career and personal development.
My goal in mid-2019 was to publish 1 post every 2 weeks. My nerve injury got in the way of that goal, but I’ve managed to publish about 60 posts since then. It gets between 60-90k unique visits a month, according to Google Analytics.
When people visit my blog, they’re asked to join my newsletter. About 20k people have opted in so far.
I have two other email lists managed with ConvertKit.
Email has been the most significant lever for me so far, and the only reason I have an email list is my blog.
Twitter has also been helpful (responsible for about 14% of sales, according to the referrer), but email is king.
It’s been a busy 6 months since the Early Access pre-launch!
I’ve been spending the bulk of my time working on the course, filling in the last 5 modules. I’m also active in my course’s Discord, helping students who have been going through the course from the Early Access period.
In the future, I don’t think I’ll do things this way. It’s a surprising amount of pressure to be on the hook for delivering something that people have paid for! I’d rather work with a small group of test students and open sales to the public once the course is fully completed.
The flip side is that I’m not too worried about the launch in terms of revenue. The pre-launch has already funded the business for a few years, so any additional sales at this point are just frosting on the cake.
Organizationally, the “team” is just me and a part-time couple-hours-a-week contractor who helps with general admin tasks (customer support, video captioning, etc.). My expenses are pretty low, probably about $1000 per month.
I’m not looking to grow too quickly; I’m a fan of Paul Jarvis’ Company of One, and growth for growth’s sake isn’t something I’m interested in. For now, my focus is on creating a sustainable business for myself. Though I expect my ambitions will grow over the next couple of years!
So, super tactically: don’t do limited-edition coupons.
The night before the prelaunch opened, I sent an email to the waitlist with a coupon for $20 off. It was limited to the first 50 people who used it.
That coupon got used up in the first 90 seconds.
It takes more than 90 seconds for an email broadcast to complete, so there were people who clicked the link the moment they got the email, only to discover that the coupon code didn’t work. Dozens of people emailed me telling me that the coupon was broken.
Worse, about 50 people were shown that the coupon was successfully applied but later realized they were charged the total amount because the coupon expired in the seconds between when it was applied and when the checkout process was completed. I issued partial refunds for everyone affected, but it was chaos for those first couple of days.
More broadly, I think that the pre-launch was so successful because I have such a high-quality bar. It’s trendy in certain circles to ship quickly, start with a barebones MVP, and iterate. And while I do agree that perfectionism can be dangerous, I do think it’s worth spending the time required to make sure you’re delivering something solid.
It’s a nice idea to spend 2 weeks on a proof-of-concept to validate demand, but what if the only thing you’re validating is that people don’t want to buy something that only took you 2 weeks to build?
If you’re doing something totally unprecedented, then this is probably a good idea. But if you’re following in the footsteps of successful businesses, as I was with Wes Bos and Kent C. Dodds, the demand is already validated. You just need to nail the execution.
I mentioned the coupons, right? 😅
The biggest challenge has probably been how difficult it is to forecast work accurately. This won’t come as a surprise to anyone working on a technical product, but stuff always takes longer than you think. I had expected to finish this course in 3-4 months when in reality, it will have taken more than a year of full-time work.
I’m reminded of Hofstadter's Law: It always takes longer than you expect, even when you take Hofstadter's Law into account. If you think something will take 2 weeks, so you give yourself 4 weeks, it’ll probably take 8 weeks.
In terms of tooling, I don’t use a ton of services. And the ones I do use are pretty run-of-the-mill.
I will say, for the developers reading this: Next.js is fantastic, even for complex full-stack applications! You don’t need a separate Node API; you can do everything with Next.js.
Another one for devs: join the Blogging for Devs community! It’s been a fantastic resource, a great place to learn about blogging and SEO.
Here are some books and podcasts I found helpful: