I try to write these transparency reports every so often. You can find some previous transparency reports here:
I wrote most of this down last year, but it’s taken a while to publish. The 2021 Transparency Report should come out soon after this one.
The COVID 19 Pandemic
In early 2020 the COVID 19 virus spread around the globe, causing a worldwide pandemic. With a global team, it was interesting to see different countries responding at different times and in different ways. As lockdowns started, a lot of our friends were off from work or shutting down their brick and mortar businesses. They were worried about being paid, earning income, finding money to pay their employees or their rent.
It was odd for me that our life, and work life in particular, wasn’t changing that much.
In many ways, things continued as usual. We all already worked from home. People were still buying membership software and building membership sites. In fact, there was more demand for our software and service as many organizations and businesses had a more urgent need to collect payment online.
At the same time, we were all very distracted and impacted by the virus, the lockdown, kids at home, and just the general malaise that was happening around the world.
Leading this team through COVID, from a business standpoint, was the greatest challenge I had yet as a CEO and business owner. I felt I really needed to step up and be there for my team.
Early into the lockdown, another online business owner tweeted something along the lines of “this is the time to go on offense, double down, and hit those business goals”. I thought, are you crazy? It seemed like an insensitive thing to put out there while people were dying and many businesses were incapable of running at all, let alone going on offense. I replied “Nah. We’re on defense…”
I learned that there was a time and place for subtweets. This is maybe minor in the context of a global pandemic that was spiraling out of control at a time when we had know idea how bad things would get, but it was a genuine lesson. That business owner was talking to his customers and motivating them in good faith and also looking to make a living himself. While I disagreed with his stance, instead of replying to the tweet, I could have tweeted it by myself. Maybe he would have seen it and followed up with me there, but it would have been more out of sight of his customers.
In any case, we were on defense. Support was busy, about twice as many tickets as usual. We stopped our development and marketing cycles and all focused on supporting our customers and each other.
New sales were double their pre-COVID levels. We were making a lot of money. But we didn’t use that money to go on offense in any way. Who knew what would happen going forward. We saved. We share a lot of that profit in a bonus that summer. The team deserved it more than ever.
April and May of 2020 were especially busy and new sales slowed down a little bit, but not by too much. Instead of a 100% YoY increase each month, we were seeing a 50% YoY increase, which was still above our earlier targets and honestly our ability to handle.
In the summer development cycle, we focused on improvements to our support system to allow our support engineers to be more efficient and better able to stay on top of their tickets. Later in the year, we standardized our processes around escalating tickets.
Our support team did a remarkable job keeping up with things despite the chaos around them. Everyone on the team leveled up and supported not just our customers but each other.
New Hires
In the 2019 Transparency Report, I wrote “I’m hoping to pause at 12 employees working on PMPro,” and we stayed around that size. We hired a support engineer early in 2020 who has since grown into an important part of our dev team. We had another dev hire who didn’t make it out of the second trial phase. (We often run a 2 week and then 3 month trial for new hires.)
With a few part timers coming and going, we generally stayed around 12-14 employees, including Kim and myself.
Shape Up
We continued to run the Shape Up system to manage our product development.
The Shape Up system is useful for lots of teams, but was built specifically for Basecamp. We made some tweaks to make it work better for us. We tested different lengths of cycles and other variables to find a pace that fit our product and team.
The 2 big differences between our company and Basecamp are (1) our product is open source and (2) our team is smaller with less defined roles.
Because our software is open source, we can’t just push out intermediate work with the ability to change it later. Once it’s out in the wild, people are using it, and it becomes harder to refactor. To help with this, we do fewer cycles with longer time in between so we have time to properly launch things.
Because our team is smaller, we all have “day jobs” within the business outside of development. All of us are involved in customer support, marketing, and handling day to day management of the platform and products. To help with this, we assume each resource is only 50% available for cycle work and basically double our estimates for how long things will take.
We’ve settled into a nice schedule that looks like this:
- We have 4 cycles per year, roughly one per quarter.
- Cycles are 7 weeks long, with 6 weeks in between.
- We added a floating “off” week for each person in the middle of the cycle. People either really take off or more often use that time to catch up on day to day responsibilities.
- In between cycles we wrap things up for launching, work with marketing, and also focus on dangling day to day activities that were put off during the cycle.
Using the Shape Up system has helped us to prioritize our work and stay focused as a team. I know some other companies in the WordPress space are using Shape Up as well. I’m hoping to share some more specific details about how we use Shape Up in future posts and videos.
What major features or add ons did we push out?
In 2020, we finally launched our own frontend login and profile pages. People have often asked for or just expected this out of a membership plugin. Until recently, we would recommend a separate free plugin that did the job better than we could. When that plugin went premium, removing some of their features from the free plugin, we were further motivated to build our own versions of these features.
We really embraced the task and worked to build a login and profile UX that works how we want it to. There are a lot of little touches we put into the UX to make things feel as seamless as possible… when configured properly and free of conflicts.
WordPress logins are extremely confusing and prone to issues. So many other plugins, themes, and mu-plugins installed by hosts are interested in tweaking how the login works. Compatibility issues come up a lot. About half of the code in our /includes/compat/ folder is to help with login issues.
We were already helping our customers with a lot of login issues. I knew that once we had our own login page, we would get a ton more support tickets related to login issues, and that has been true. We help our customers through those issues and whenever possible find ways to avoid the issues for other users. The nature of WP makes this an inevitable problem, so we’re working on a troubleshooting guide to address login issues on any WP site. This should be out by 2022.
We put Stripe Connect on hold, but it’s coming soon.
Stripe Connect is a new way to interface with Stripe that “connects” your Stripe account more closely with Paid Memberships Pro. Among other things, this adds some security to the connection and gives us some greater ability to debug issues with your Stripe account.
From a business perspective, the big motivating feature of using Stripe Connect is that we would have the ability to charge an additional % fee on top of each transaction. This, along with lots of encouragement from Stripe, is why almost every ecommerce plugin for WordPress uses Stripe Connect now.
I believe that we deliver incredible value in our software and deserve to apply this fee to transactions. A lot of our resources go into maintaining our Stripe integration and the extra revenue helps with that.
That said, I also believe that we must always put the needs of our users ahead of the needs of the business. I didn’t want to integrate with Stripe Connect just because we could make money from it. I needed the Stripe Connect integration to truly be better than the alternative of using your own “legacy” keys. It wasn’t. I felt like we were being pushed to implement Stripe Connect to make money for ourselves and some Stripe sales people. It didn’t feel like a decision in the interest of our users. Despite spending a lot of time developing the new integration and having it nearly complete, we didn’t launch the Stripe Connect feature in 2020.
I’m actually editing this in 2021. This past August we DID launch Stripe Connect. You’ll have to read my next transparency report to find out why I changed my mind. There is some information on how PMPro uses Stripe Connect here.
Other Product Updates
We added digest emails that go out every day, week, or month and update you on how your membership site is going. Our motivation for this was to create something that would basically remind our users that PMPro is powering their website and helping them to grow. Digest emails were an opportunity to give useful information to our users while also keeping our PMPro brand in their minds.
We got together to figure out what site owners would want to see in that email and have come up with something that I think works great. We also worked hard to avoid spamming our users and make it easy for them to control how often, if ever, they get that email. We don’t have tracking stats, but I expect most users appreciate that email. (Although, it can be a little depressing on sites that aren’t growing. That’s something we can work on as we iterate this feature.)
We added REST API endpoints to the core PMPro plugin, which makes it easier to integrate PMPro with other services and apps.
We launched a minimal “Words” theme for Memberlite. This is the theme I’m using on this very blog right now. It’s a great theme for a blog. We likely won’t be focusing on theme development for a while, as Gutenberg and block-based design has taken over WordPress, but we may work on specific child themes like this that work perfectly with PMPro.
We launched Apple and Google Pay for Stripe. This work also prepared us for future Stripe and general checkout page updates. There is a lot more work to do here, but it’s nice to offer 2 of the most common and fastest payment methods to any PMPro site integrated with Stripe.
Finally we launched a new notification system for PMPro inside of the WP dashboard. You will notice these as green bordered banners showing up on the PMPro settings pages asking you to review PMPro or consider an add on of ours. Banner and notification spam is a huge issue in WordPress, and we did our best to come up with something that wouldn’t add to that. I think we’ve done that, and I may do a future write up on how our notification system works so it might be adopted by others or we can learn how to improve it.
At year end our revenue was up 50% from $800k in 2019 to $1.2m in 2020.
Revenue-wise, we had a phenomenal year, growing exactly 50%. Our profit margin was around 30%. We were happy to share much of this profit with our team in a second bonus in December.
We attributed much of the rise in revenue to what we and others call the “COVID bump”. Staying connected through online membership sites became much more important in the world, and lots more folks were investing into their technology.
It was hard to tell how much of our growth was from the bump or other growth initiatives we had. Based on what we heard from some other businesses, our YOY growth was a bit bigger than some other companies. So we must have been doing something else well.
We stopped giving discounts on renewals.
Before March 2020, we used to discount the second and recurring years of membership. So if someone paid $297 when they first checked out, they would only pay $197 in subsequent years. This was based on the idea that we generally don’t have to support existing members as much as new ones. Most of their support needs come in the first year. Having a lower renewal price that more closely matches the perception of value provided will help with retention and can help you to make more money overall.
This pricing structure wasn’t optimal for us. We were fielding a lot of support queries from people who were confused about the discount they were getting. “I thought this was $297? Why did I pay $297 last year if it’s only $197.” In the minds of our customers, they weren’t paying extra for extra support in year one. They were paying for PMPro and the support is just expected to be part of that. They didn’t see our discount as a discount on the second year, it seemed like a tax on the first year.
So we decided to run an experiment. Let’s remove the renewal discounts and see what happens. A few more people cancelled in year 2 for sure, but it wasn’t enough to cancel out the extra revenue from charging 50% more on all recurring members. Our pricing is already fair. We run regular sales for folks who can’t afford full price. All in all, this change in policy probably accounts for a 15% rise in revenue.
We tried to launch Sitewide Sales again and it didn’t go so well.
Another big initiative for 2020 was to launch the Sitewide Sales plugin, which was spun off from a PMPro Add On the year before. The launch did not go so well. We sold only a handful of licenses and haven’t gained much usage outside of the folks who were already using it with PMPro. To really grow, we need WooCommerce sites to use the plugin.
I think we have a good product here, but we’re struggling to position it and find product-market-fit. Over the summer in 2020, I offered to give away the plugin for free and even set it up for folks all free of charge. I had no takers. Not a single one. I used to charge at least $300/hour for my consulting, and now I can’t even give it away for free.
It has been tough to focus on Sitewide Sales when there is so much we can do to shift the needle with our core PMPro product, but we have some ideas and will try again in 2021.
In Summary
It was a long year, and a challenging year in so many ways. Despite not being able to meet up in person, our team has grown closer together over this year. We’re working better than ever. I’m proud of the work we are doing and the impact our software has on so many people’s lives.