PMPro Business Update

I wanted to post an update on our Paid Memberships Pro business. In the style of other “transparency reports”, I will share real numbers for our business. I will also share some of my current goals and planning for the business.

Business is Growing

  • $3,000,000 in all time sales.
  • $810,000 in revenue in 2019, a 23% growth over 2018 sales.
  • Active on over 80,000 sites. We had about 4000 paying customers last year.

What About Profit?

Kim and I are the only 2 owners of the company. We also work roughly full time in the business.

Of that $67k/mo we made in 2019, the expenses broke down like this:

  • $50k for salaries and benefits, including for Kim and myself.
  • $5k for travel and marketing, a big retreat, going to and sponsoring WordCamps.
  • $3k for credit card fees and affiliate payments
  • $2k for server and other IT costs.
  • $7k of profit. (A nice portion of this was distributed as a bonus in December.)

Our Team is Growing

  • Went from 8 employees to 10 in 2019. (We hired 2 more in Q1 2020, for a total of 11 full time employees and one part time employee.)
  • We had our first full team retreat in September 2019. All but one of our employees was able to come to our home (and a nearby AirBnB) to spend a week getting to know each other better and planning for the future. Five of us hit up WordCamp NYC the weekend before and really made a presence there in our Nugget shirts. Good times bar hopping and eating pizza and ramen in NYC.

Product Developments in 2019

  • We launched PMPro v2.0, with a newly designed dashboard and support for Gutenberg and the REST API
  • We overhauled our proprietary customer support system used on the PMPro and Memberlite sites.
  • We ran a successful Spring Sale for PMPro and experimented with other sale formats in the fall.
  • We revealed Nugget, our PMPro mascot.
  • We released the Payfast Add-On for PMPro. Payfast is the payments processing service for South Africans and South African websites.
  • We launched PMPro v2.1, with SCA support for Stripe and native 8 decimal support for Bitcoin and other crypto currencies.
  • We finished the initial version of the Sitewide Sales plugin for WooCommerce, our first, non-PMPro ecommerce product.

Why write a transparency report?

Our primary goal as a business is to support the Paid Memberships Pro open source project. Our customers and partners will want to know that our business is sustainable and we will continue to maintain the project and provide quality support.

Many people will have ideas about how big our business is and how well we are doing. Some will think we’re bigger than we are and wonder why it takes so long to reply to support or push new features. Some will think we’re smaller than we are and wonder if we’ll be able to stay in business. If we share our real numbers, we won’t avoid criticism or concern, but at least these interactions will be based on facts.

I also want to help others looking to start a business like ours. By sharing our story, I hope others can learn what to expect when launching a WordPress plugin or a paid support plan around an open source project. These numbers are specific to our business and product, but they can be one more data point for someone deciding whether they should get into a business like this or keep pushing on a side project.

Hang in There

This is what $3,000,000 in sales looks like.

In 2012, one year after our launch, we were making little more than $1000 per month. I hear of so many projects at this stage of income, with the founders wondering if it’s worth it to continue working on the project or move on to something else.

When I hear someone taking a project to $1000 per month, I usually quip “That’s awesome. You’re halfway to $10,000 per month.”

I can only share our own experience, but it is as hard or harder going from $0 to $1000 than $1000 to $10,000. For Paid Memberships Pro, it took 2 years, 2010-2012, to get to $1000 per month. Two years after that, in 2014, we were making almost $10,000 per month. Two years after that, in 2016, we were making about $34,000 per month.

In 2019, we averaged $67,000 per month. If we can grow just a bit more than we did last year, we will cross the magical $1,000,000 per year milestone.

Targets and Budgets for 2020

We are targeting another year of 20% growth for PMPro, which would bring our average monthly revenue to $80k. With that in mind, we have hired 2 more developers to help with technical support and maintenance of the core plugin and Add Ons.

For the past few years, we’ve had this neat little cycle of reinvesting in PMPro that goes something like this:

  • Target a 20% annual growth in revenue.
  • Target a 20% profit margin.
  • Hire and invest in marketing such that we will break even if we match last year’s sales.
  • If we hit our growth targets, we will be on pace to earn 20% profit going forward.

Starting out with a breakeven budget, then growing 20% in revenue throughout the year, means that we typically end up banking about 10% of our total revenue, which has allowed us to save enough cash to build a comfortable cushion for the company. We could have been taking on debt to grow even faster, but this has been the right level of financial risk for Kim and I with this business.

What if we don’t hit our revenue target? Then we’ll have some hard decisions to make to cut costs or dip into cash or debt. If sales are flat or just growing more slowly, we can adjust our goals for the next year.

Onward

What are we working towards this year besides 20% revenue growth?

We’re looking to officially launch the Sitewide Sales plugin and along with it a generalized platform for us to release future non-PMPro products.

In Q1 of 2020, we implemented a new development planning and scheduling process based on the Shape Up book by Ryan Singer and the Basecamp team. It is going well so far. We will have a true feel for how this has improved things for us as we get through a few development cycles. “You should bid on that next cycle” has become the new “patches welcome” in our chats.

I’m hoping to pause at 12 employees working on PMPro, with a focus on scaling up the skills and effectiveness of the team we have vs hiring new people. This is about the size company I am comfortable with for now. I believe we will be able to figure out the natural boundaries and needs of this PMPro business and make it work with the team we have.

I’m freeing up some time and headspace to explore the various business opportunities related to PMPro and will consider pursuing those projects with smaller independent teams. Some other great companies in the WordPress space have spread out successfully this way. We can look to them as models and also figure out a version of that that works for us.

Follow Me

I’m going to be writing about my thoughts, struggles, and results in business more often going forward. Join my mailing list to get my new posts direct to your inbox.

Mistake #2: Playing Designer

Unless your business is website design or something else in the arts, you don’t need a beautiful website. A nice looking website is a bonus, but make sure you’re working towards a functioning website instead of something that will look great printed out and framed on your wall.

Oftentimes when going over design mockups or newly updated websites, you’ll find yourself leaning back in your chair and staring at your homepage for a minute or two taking it all in.

Stop it! No one browses the web this way.

If you think of your website as a work of art, you surely will find little things here and there that might be smaller or larger or a little bit to the right. Resist the urge to do this.

If you know the primary goal of your website (see post #1), make sure the design focuses on that goal. Focus your design feedback on how well the design enables sales, mailing list sign ups, contact requests, etc.

As for website design, hire an experienced web designer at a decent rate and trust their instincts for what looks good.

If you hassle your designer with a lot of feedback on what “looks good”, they are going to shut down and move into “code monkey” mode where they just code up whatever requests you have. Unless you are paying bottom dollar (in which case you get what you pay for) you are wasting money by paying designer rates for code monkey work.

More importantly, micro managing a code monkey will not get you as good of a website as one where you control the vision via a strong primary goal, and an experienced designer controls the particulars of the site’s look and feel.

View all posts in this series here.

Mistake #1: Lack of Goals

One of the biggest mistakes made by website owners is to have a website that is totally detached from any business activity.

Maybe your website is beautiful. Maybe it has tons of information about your business. But what is the goal of your website?

What do you want people who visit your website to do?

If you haven’t thought about this question yet, do it. Some good answers are:

  • Buy my product.
  • Sign up for my mailing list.
  • Call me for an appointment.
  • Follow me on social media.
  • Fill out a contact form.
Mistake #1 has a corollary: Too Many Goals.
When asked what the goal of your website is, you might have answered 2-5 things. Great! Throw away items 2 through 5. What was your first answer? Do that. On your homepage.

WordCamp Philly 2012 Scholarship

I’ll be speaking at WordCamp Philly coming up October 20th and 21st this year. Would you like to join me? Do you want to mingle with the smartest folks working on WordPress in the Philly area and beyond? Are you a little strapped for cash and balking at the $20-$25 tickets?

Well have no fear. We’ve raised enough money via CharityGoal (runs on WordPress, show it some love) to provide scholarships for 4 attendees to this year’s WordCamp Philly. Big thanks to Scott Kingsley Clark who donated on behalf of the Pods Framework.

What?

  • One Saturday or Full Weekend Pass (your choice) to WordCamp Philly, October 20th and 21st 2012.

How?

  • Make sure you are available to attend. Did I mention the conference is October 20th and 21st, 2012?
  • Write in the comments here or by email (a) how you would benefit from going to WordCamp Philly, and (b) why we should pick you over the others trying.
  • Optionally, send out a tweet thanking @Jason_Coleman and @ScottClark for the opportunity.

I will pick four lucky winners by October 1st and announce them here.

Don’t Break The Code

Last Saturday at WordCamp Philly, I ran a session on “Building a Plugin in One Night”. Together, with about 50+ attendees, we brainstormed ideas for a new WordPress plugin that I could code that night.

The brainstorming went great, coming up with some good ideas… like plugins to:

  • Help first responders after a disaster (Big Idea!)
  • Add VIM (a Linux editor) shortcut commands to the Visual Editor
  • Disable the Visual Editor on a per-post basis (The Winner)
  • Allow users to create pages from the front end
  • Add easy donations
  • Log into WordPress via Google+ (Brian did it!)
  • Add syntax highlighting to the Visual Editor (Chris did it!)

The concept that the audience voted for me to work on was a way to disable the Visual Editor tab on a per-post basis. The motivation for this is the fact that the autoformatting of the Visual tab will sometimes break a complicated (or not so complicated) HTML structure ruining your code. Folks wanted a way to say, “Hey, WordPress, back off on this page/post”

And someone (you introduced yourself to me later, but I forget your name) came up with a kick ass name: Don’t Break the Code. It explains the purpose and also harkens back to my days at Haverford College, which has a strong social/academic honor code.

CharityGoal.com Launches, Support our Cause

I’m happy to announce the launch of CharityGoal. This is a site we built for a client whose goal is to enable anyone to raise money for any (legal) cause. CharityGoal gives you an easy way to accept donations online, a beautiful landing page, and quick access to social network sharing.

For those interested, the site is built on top of WordPress. “Causes” are custom post types. A custom plugin we developed allows users who have signed up to create new causes through a front end form and to manage that cause. The checkout code was pulled from the Paid Memberships Pro plugin (also developed by us and GPL) and tweaked to work specifically for this site.

So take a look. While you at it, I’d appreciate a donation to our cause:

 

Don’t Call Your Customer a Dick

Yesterday Adriaan Pienaar, a.k.a. “Adii Rockstar” of Woo Themes posted on his blog about a tough client asking, Am I being irrational? He later followed up on Twitter, calling this customer a “dick client”.

So glad not have had a repeat of yesterday’s interaction with a specific dick client (http://t.co/P6six9a) today. :)

@adii

adii

Now I’ve definitely had similar conversations among friendly company in private, but I would never post something like this to my blog or Twitter. I feel bad even propagating the story more, but I’ve seen some similarly toned tweets go out by developers and consultants and I want to (1) talk about why this might be a bad idea and (2) find out why most people seem to be okay with these kinds of expressions.

Judging by the comments on the blog and Twitter, the WordPress community has mostly got Adii’s back on this one. However I think in this situation, while Adii has some good points and understandable “beef” with this client, he is being a bit irrational.

The back story.

You should read his blog post for the proper context and to read Adii’s and others’ comments. I’m going to paste what Adii wrote of the exchange here, even though it’s about 90% of the entire post, because it’s short and I want to be clear about what I’m referencing. Adii writes (emphasis mine):

  1. Customer notes to us that he is struggling to achieve something with our product.
  2. We explain that this is currently a limitation, but immediately update & release a new version of the product to help the customer achieve their goal.
  3. Customer isn’t happy, e-mails us for refund.
  4. [This is where I come in.] I ask the client whether the fix worked in an attempt to determine how I can help the customer.
  5. Customer says they didn’t try it and won’t try it, because they don’t want to be a guinea pig. Insists on refund, threatens with chargeback.
  6. I explain that we released a fix for the problem and hence it’s not about being a guinea pig; we’re just doing our job & helping them out.
  7. Customer ignores last e-mail, rudely threatens to publicize this and again threatens to go the way of a chargeback.
  8. I issue refund and at least attempt to explain our actions in this regard & how we actually tried to help. Still awaiting response (if any is going to be forthcoming).

Now, to be fair, Woo Themes has a “no refunds” policy (see below). So Adii is in his right to refuse a refund initially (though he eventually gave one). And I think the client is lame for threatening to do a charge back through his credit card (which would refund the money and add another fee to Woo Theme’s account). However, despite the no refunds policy, Adii does end up giving one and seems open to giving them with justification. It’s clear that Adii doesn’t think “fixing a bug”, as he called it, is a good reason for a refund. And it’s possible Adii only gave the refund to avoid the bad publicity and bad affects of a charge back. Adii writes in the comment how he is frustrated at the power customers wield in these transactions.

Is this customer irrational to want a refund?

I think the customer here wasn’t being irrational (in his refund request at least, though he may have had an irrational tone). It sounds like this customer bought the theme thinking it already had a feature he needed. It didn’t, and although Woo Themes fixed the issue right away, I think it is okay for the customer to not be satisfied with this. The customer expected one thing and got another. Despite the quick fix, the customer has reason to question the robustness of the “fix”, which is grounds for a refund in my book.

10. [Woo Themes] Refund Policy

Since WooThemes is offering non-tangible irrevocable, digital goods we do not issue refunds after the subscription or individual theme purchase is made, which you are responsible for understanding upon registering at our site.

By the way, just because the customer may have some justification for asking for a refund doesn’t change the fact that it sucks to lose a customer and to have possibly done some work on a feature just for them. It sucks.

What are we even talking about?

Adii seems to want to bring up two points for discussion. One is about the power customers wield with the threat of a chargeback. The other related point is about the desirability of unconditional refunds. The points are related because it seems the chargeback threats are effectively forcing Woo Themes to offer unconditional refunds even though they may not want to.

For the record, I think unconditional refunds are a good idea… especially when it comes to GPL software.

For one, the point about digital good being irrevocable (made in the Woo Themes policy) doesn’t hold as much weight when the software could technically be distributed for free elsewhere due to the nature of the license. I think many are trying to offer GPL software for a fee and basically hoping that a free version doesn’t crop up… or using split licenses to try to keep a free version from cropping up. Despite the legality of charging for the software in this way and mantras of pro-GPL folks that it’s “free as in speech, not as in beer”, GPL software WANTS to be free as in beer too. It’s kind of natural. it’s supply and demand. People will want your software for free… and if it’s GPL and distributed there will be those able to redistribute for free.

I don’t think you need to stop charging for software (there are many benefits to getting the software “from the source” which is worth a fee), but you shouldn’t be upset if someone gets your software for free… whether it’s from Bit Torrent, an official flavor variant, or by asking for a refund after downloading the software. I’ve only come around this this opinion recently, but I believe that to do GPL software right, we need to make sure most of the value is in that “other stuff” around the software: support, documentation, packaging, trust.

Anyway, back to unconditional refunds. In my experience (and from what I hear) they cause more good than harm. A few will abuse them, but this should be more than made up for by the increased number of sales you’ll get since customers will feel safer about buying something they haven’t tried out yet. That is the argument.

What I would do have done.

It’s funny that the same day Adii posts about this customer, we have a similar experience with a customer for Paid Memberships Pro (our “premium” WP membership plugin). In our case, the customer thought we integrated with a payment gateway that we don’t integrate with yet and asked for a refund. I made the refund first, and then replied with our unwritten policy that we’ll add integration for any payment gateway a paying member requests… it just may take a moment. In this case, our potential/lost customer says no thanks. And I understand, because the customer expected one thing and got another.

As I said, I’ve only come around to this kind of thinking recently. Over the past two months, our return policy has changed from one requesting a reason and requiring the customer to delete the software and vow to not use it, to just requesting the information we need to process the refund. (BTW, Bed Bath and Beyond is a bricks and mortar store that does no-questions refunds to good success.)

Another part of what people expect out of a “premium” WordPress product is better support. And it’s funny that in these cases good, fast support was mostly ignored. This sucks. Not everyone is going to be a customer.

And that brings up another idea that is floating around this discussion: irritable, bad, (dare I say “dick”) clients should be avoided. (The customer we lost was very nice about everything by the way.)

Avoid bad customers. Just don’t feed the trolls.

I agree with the general idea (promoted recently by one of the 37 Signals guys — Jason?) that you don’t need everyone to be your client, and you should use pricing and marketing to target better customers. I would just add that you shouldn’t air the dirty laundry when you do manage to shrug off a bad client. Calling them out in public (if they’re not under a rock, they’ll know that you’re talking about them) may bring them back for more. It will definitely send a message to potential clients reading the rant that working with you might be difficult.

Maybe you don’t want clients who are afraid of being called a dick. You only want clients that are willing to spend a lot of money and never ask for a refund. Just be careful that you’re not turning off clients you do want. There is a fine line between “keeping it real” and pushing away perspective clients.

In summary…

In summary, I think Adii probably handled things correctly up to the point that he posted about it on his blog and twitter. He was trying to bring up some things that should be discussed, but I think his emotions lead him to post it too quickly and in a way that makes it obvious who he is talking about… and he used that D word there.

He could be scaring away potential customers. (I mean look what Chris Pearson’s attitude towards WordPress did to his credibility in the community. Our attitudes toward our clients are similarly important.)

Adii, and some others in comments/etc, missed the point that the customer paid for something under false pretenses. Whether this is the customer’s fault.. or if in our opinions the customer should have been happy about the quick fix, he or she still has a decent reason to want a refund: it is valid to question whether the “quick fix” will be as robust as the customer expected. Whether or not one should be granted is up to the business and their refund policy.

Customers threatening chargebacks when they aren’t warranted sucks. I feel in general though, it is more important to protect customers by allowing chargebacks than it is to protect businesses from their misuse. We don’t make money by forcing people who don’t want to pay for our products to pay for them. We make money by making the customers that are willing to pay happy.

The digital nature of software works both ways. Someone can get the software and then chargeback to effectively get something for free. But then it didn’t really cost us much to deliver the software either. Especially when working with GPL software, we should be ready to accept situations where people obtain our software for free.

Alright. Let me know what you think. Maybe I’m being irrational here. I don’t mean to pile on Adii. Like I said, I think he did it right up to the point of blogging/tweeting about it. This is all very subtle stuff. We probably agree about more than we disagree, but I don’t think it’s black and white… which is why I wanted to write a million rambling words about it.

Ok, hit publish already, Jason.

 

I’m Speaking at WordCamp Columbus, June 18th at 11:30am

I’m excited to say that I’ve been accepted as a speaker at WordCamp Columbus this coming Saturday. I was a last minute addition… so thanks to the WCC folks for working that out. (Shout out to Angie Meeker: @angiemeeker / blog)

My talk is on “Licensing and Business Models for Premium Plugins”, which is a fancy way of saying “How I plan to make money with Paid Memberships Pro“. Sadly, the event is all sold out, but if you are going or able to squeeze in somehow, I look forward to seeing you there.

More info on the schedule: http://wordcampcolumbus.com/schedule/

Thanks WordCamp Columbus Sponsors: http://wordcampcolumbus.com/sponsors/

Disable the WordPress Admin Bar for Non-Admins Only

Here is a variation of some code I found on Yoast.com to disable the WP admin bar for non-admins only.

function yoast_hide_admin_bar_settings() 
{
?>
	<style type="text/css">
		.show-admin-bar {
			display: none;
		}
	</style>
<?php
}
function yoast_disable_admin_bar() 
{
	if(!current_user_can('administrator'))
	{
		add_filter( 'show_admin_bar', '__return_false' );
		add_action( 'admin_print_scripts-profile.php', 'yoast_hide_admin_bar_settings' );
	}
}
add_action('init', 'yoast_disable_admin_bar', 9);

Just copy and paste this code into your functions.php or another plugin/theme file that can add hooks. Save/upload and watch it work.

Let me know if you have any trouble using this.