Category: Paid Memberships Pro

The WordPress Way

I’m writing down the core values for our business and team. Here is one of our 5 core values:

We are committed to open source and “the WordPress way”.

Stranger Studios, LLC Core Values

What does that even mean? How does this value specifically show up in our actions? Why is this important to us?

What does “open source” mean?

In our case, open source means following the GNU General Public License. I wrote about the GPL and why our code is GPL before, but there are basically 2 reasons we embrace the GPL:

  1. We think using the GPL license will result in the best code.
  2. WordPress uses the GPL license, and Matt Mullenweg and the other WP leaders encourage and expect plugins to be GPL.

Some companies respond mostly to #2 there, and begrudgingly apply the GPL license to their code. For us, reason #1 is more important, and so we have embraced the GPL and try to not only live up to the law of the license but the spirit of it as well.

What does “the WordPress way” mean?

This one is more difficult because what is considered “the WordPress way” is an ever-evolving set of standards and conventions that will change over time, but basically what we mean is that our code, UI, and UX should be familiar to other WordPress developers and users interacting with our software.

What does all of this mean more specifically?

Doing things the WordPress way means making all of our software free and open source, just like the core WordPress software.

It means the plugins we write to integrate with other plugins and third parties are hosted in the WordPress.org repository because that will incentivize both parties to maintain the plugin.

It means our code will continue to work as expected if your paid license expires.

It means providing simple one-line code solutions to disable our upsells or extra gateway fees.

It means using the WordPress coding standards so our code is more readable to developers used to reading WordPress-based code.

It means finding the right hooks and filters to modify the behavior of a site instead of fully replacing existing functionality of WordPress and other plugins.

It means adding hooks and filters into our own code to make it easier for others to modify the behavior of our plugins.

It means striving to have documentation on par with the WordPress Codex.

Why is this important to us?

We believe that embracing open source and the WordPress way is going to result in the best software, and having the best software as our foundation will be a competitive advantage for our business. That’s it.

For sure, it’s not bad business to focus on paying customers, or charge for software, or make decisions to maximize profits. But I also feel that’s not the WordPress way.

WordPress is software designed for everyone, emphasizing accessibility, performance, security, and ease of use. We believe great software should work with minimum set up, so you can focus on sharing your story, product, or services freely. The basic WordPress software is simple and predictable so you can easily get started. It also offers powerful features for growth and success.

We believe in democratizing publishing and the freedoms that come with open source. Supporting this idea is a large community of people collaborating on and contributing to this project. The WordPress community is welcoming and inclusive. Our contributors’ passion drives the success of WordPress which, in turn, helps you reach your goals.

The WordPress Mission Statement

We believe in making money. We’re the “get paid” folks and understand the good that steady income means to individuals and organizations. But we believe that making software that is aligned with our values and the WordPress mission statement is more important than making money.

If a decision comes down to something that will make the software better and something that will make us more money, we choose the option that makes the software better.

For us that means embracing open source and the WordPress way, making our software available for free to get the most users and contributors, and building a business on top of the software we are making by adding value instead of artificially limiting our software and selling the cure.

Here’s one way internet businesses of any kind can help Ukrainians now.

Find your Ukranian customers and email them. Ask them “Is there ANY thing I can do to help YOU?”

I’ve just sent a similar email to a few dozen users in the Paid Memberships Pro website. In this post, I’ll cover how sites running PMPro can find users with a Ukrainian billing address, Ukrainian email addresses, or Ukrainian websites.

You should be able to do similar searches no matter what CRM or ecommerce software you are using. Ask the hosts and developers of those platforms how to do it. If you share ideas with me here, I can include them in this post.


Tend to the part of the garden you can touch.

Like many, I’ve been sad, angry, and scared… devastated by the news of the Russian invasion of Ukraine. In times like these, I feel helpless. What can I do?

I was reminded of a Jack Kornfield quote that goes something like “Tend to the part of the garden you can touch.” This mantra is helpful in times of helplessness. Some might read it as a message about ignoring the bigger troubles of the world. But in reality, Jack doesn’t mean for you to turn a blind eye to the rest of the world while literally working in your garden. The world is the garden. The key is to recognize the part you can “touch”. There are ways to engage in these big issues that don’t require one to change the minds of politicians and interest groups or change the world all by yourself. Change happens one human interaction at a time.

So with that spirit in mind, I thought, “What can I do to help Ukraine?” I don’t have any close Ukrainian friends, but we have had Ukrainian users and customers in our business. It occurred to me that I could find them and reach out to them to see if we can help.

How to Find and Email Your Ukrainian Users with Paid Memberships Pro

Many membership sites have regional userbases, but if you have a global audience, there’s a good chance some of your members are Ukrainian.

Specifically, I’m going to assume here that anyone with a Ukrainian billing address, email address, or website is in Ukraine or has connection to Ukraine and could use some help now. So what I’m going to do is search for those members.

The top level domain (TLD) for Ukrainian websites is .ua. Less common, but also used are .ukr or .ykp. By default, PMPro doesn’t ask for user websites at registration, but we added it as an option to our own checkout page. So we can search for users with websites ending in .ua. Also, while folks in Ukraine are perhaps most likely to Gmail and other .com email services like the rest of us, some of them route their email through .ua domains. So we can search user emails as well.

Additionally, we can search for anyone with the words “ukraine” or “ukrainian” in their email or website URL, and anyone whose billing address country is UA or Ukraine.

Here are high level steps:

  1. Search for Ukrainian users using the search strings below.
  2. Export the results to CSV
  3. Copy all of the results into one Excel Spreadsheet or Google Sheet.
  4. Remove the dupes and false positives.
  5. Compose your email.
  6. Copy the addresses into the BCC field and send.

Search for Ukrainian users.

The latest version of PMPro that went out yesterday includes a hidden feature that we’ve been using on our own site for a while to make it easier to do searches like this. You can use a colon “:” in your search to search on specific user meta fields. So here are the searches I did. Note, I’m leaving the “e” off the end of Ukraine to get “Ukrainian” variations too. You can also search for the .ukr and .ykp TLDs as well. I had many fewer hits, but did have a couple.

  • user_url:.ua
  • user_url:ukrain
  • email:.ua
  • email:.ukrain
  • pmpro_bcountry:UA
Search for users with *.ua email addresses should look something like this.

NOTE: If you’re not using Paid Memberships Pro or using an old version of it. You can export your entire members list and do similar searches inside of Excel or Google Sheets.

Export the users to CSV.

After each search, click the “Export to CSV” button at the top of the members list to download a CSV file. You can open this file in Excel or Google Sheets to see a tabular view of the members and their information, including email.

Copy results into one spreadsheet.

I don’t have Excel on my computers, so I use Google Sheets.

  1. From the Google Drive homepage, click on “+ New” button.
  2. Click the the “File upload” option.
  3. After the file uploads, click on the title in the lower right.
  4. You will see a preview. Click the “Open In” button and choose “Google Sheets” to view the file as a spreadsheet.

Google Sheets should automatically parse the CSV into the appropriate columns.

Remove dupes and false positives.

Many users who have a .ua email will also have a .ua website URL or a billing address from Ukraine. So this user will show up in all of the exports you did.

  1. Pick one of the sheets you uploaded to be your main sheet.
  2. Copy the rows from the other sheets.
  3. Paste the rows into the bottom of the main sheet.
  4. Click control + a or option + a on your keyboard to “select all” of the sheet.
  5. Go to Data -> Sort Range -> Advanced Sorting Options in the menu.
  6. Sort the sheet by the Email column.

Now duplicate rows will show up next to each other. You can highlight the duplicate rows, right click, and choose delete row to delete them. Here’s a decent post on how to delete duplicate rows if you have a bunch to do.

You will also have false positives. The searches were for .ua, but might have caught something like www.uarts.org as well as website.ua. So look out for those and remove them if they don’t seem to be a Ukrainian user. Maybe reach out to them anyway and see how they are doing.

Compose your email.

Write your email first before you add the email addresses. This way you won’t accidentally send the email early.

You can say whatever you want. The gist of mine was to mention how I got their email, ask them if there was ANY way we could help, offer them free service, mention how websites are possibly not on their mind and offer personal help, and then closed with a personal story and mentioned that for every big story you read on the news about governments, companies, and celebrities helping out, there are dozens of regular people helping other regular people directly. So how can I help?

Copy the addresses into the BCC field and send.

Please use the BCC field or you are going to share everyone’s email with everyone else and cause confusion.

You can select the entire email column from the Google Sheet (leave out the heading), copy it, and then paste it into the BCC field of Gmail or your email software and it should format the addresses fine.

Click send.

You’ll likely get some bounce backs, noting old or invalid emails, that’s expected. But hopefully you’ll also get someone in need that you can help in a personal way.

Good luck.

I’m praying for peace and safety for everyone.

How we do profit sharing for Paid Memberships Pro.

Here's a thread about how we do profit sharing bonuses for @pmproplugin, a company of about 15 people.

Lots of inspiration from @wilreynolds and @Shpigford on this and generally how to treat employees well.

Some lessons learned through the years. 👇🧵

Make It Rain Money GIF

First, why give bonuses vs straight pay increase?

We try to pay good base salaries as well, but on top of that, we give bonuses (a) to share the success and profit of the company and (b) to encourage employees to work toward that success and profit.

We don't give raises as a reward for a job well done. Raises are given to account for inflation and to compensate our employees properly based on the job they are doing and how they've been growing in their roles.

The bonuses we give are one time payments. If next year isn't as good as this year, we can pay a smaller bonus or even skip it.

Employees might be disappointed, but it's much worse to have to lower salaries or let folks go if revenue drops.

Step 4: Profit.

Revenue – expenses = profit.

Bonuses can be based on other goals and KPIs, but our bonuses are profit sharing bonuses. It's works out nicely. Employees get paid if the business gets paid.

We set a profit target for the period. Usually between 15-30%

This changes based on what's going on with the company. If we are hiring and investing into the business our profit target will be lower. Sometimes it's higher.

Anything above the target goes into the bonus pool.

Well, most of the profit above the target goes into the pool. Although there are spreadsheets involved, this all is more an art than a science.

If we expect some tight quarters in the future, we will make the pool smaller.

If profits were low or negative, but we have the cash on hand, we sometimes make the pool larger.

Big one time expenses or future investments might eat into profits in the short term, but if everyone is working hard, we like to have as much of a bonus as we can.

Another important note here is that @colemank83 and I pay ourselves a reasonable salary for the roles we take on in the business. For purposes of the bonus pool, profits are calculated after we pay ourselves.

Here's an example of what our forecasting spreadsheet looks like. These may or may not be real numbers.

So for Q3 here, if our profit margin target was 15%, we would set aside about 4.5% of revenue or 25% of profits for the bonus pool.

That's a forecast above. It starts out as an estimate. I make the numbers light gray. Then as real data rolls in on the revenue and expense side, I make it black.

We're often paying out the bonus before the quarter is over. We use our best conservative guess for the last month.

We have since settled into biannual bonuses. One in June and one in December.

We started out doing quarterly bonuses. Our revenue and expenses are surprisingly predictable, but quarterly fluctuations mean that some quarters are not profitable. We were missing bonuses too often.

Happy December GIF by GIF CALENDAR

Who is eligible for a bonus? Anyone who has been "on the team" for most of the period in question. New hires are excluded, but any other full or part-time employee (we have overseas contractors we treat like employees) is included.

Kim and I also include ourselves in the pool.

Why include ourselves in the pool?

For one, it's nice to mentally tag that payment as a bonus. It's easier to spend that money on something fun like a synthesizer or big trip.

Another reason is that if we were to hire replacements for ourselves, they would need a bonus too.

Once we know the pool size and who is eligible, how do we split it up?

There are many different methods. We've tried a few. Here's what we've settled on…

Half of the pool is divided among the team based on each member's base salary relative to the total salaries in the pool.

Someone paid 10% of the total salaries for the team would get 10% of that 1/2 of the pool.

This means folks who make more get a bigger portion of this pool.

We want to compensate everyone (partially) based on the contributions they're making to the business, and we're basically using base salary as a measure of those contributions.

The other half of the pool is divided based on a rating that Kim and I give everyone based on our subjective opinion on how well they performed in the period.

We take 100 points and divvy them up among the team.

Someone getting 10% of those points will get 10% of that pool.

Right now it's just Kim and I setting the scores for the second half of the pool. We try our best, but end up being biased toward "what have you done for me lately?"

As we formalize our employee reviews and 360 feedback processes, we will use that feedback to set those scores.

For each team member we add the first and second halves together to get their portion of the profit sharing pool.

The sheet looks something like this. (These are absolutely random numbers.)

We try to default to transparency, but we also like there to be some mystery in how the bonus is calculated. For example, we don't share our profit targets, the full size of the pool, or the % grades given.

Again, this is more of an art than a science. We want to avoid folks expecting a specific bonus amount, which would be a defacto pay raise.

We want to avoid folks reverse engineering the system entirely and wondering "how come I didn't get more"?

Explaining why we lowered our target profit margin from 30% to 15% might sour the celebration of the bonus. Explaining that we raised our target back to 20% to make up for paying a bonus last time even though we didn't hit our target would be confusing.

Remember the bonus is meant to share our success and profit and to align employees with the goals of the business. It should also be a positive thing that makes us all feel good about working hard together.

If the bonus feels disappointing, it fails.

I know folks on the team are going to read these tweets, and I'm curious to hear from them what they think about all of this. 🙂 Reply here or reach out to me directly.

In review. Every 6 months, we set a profit margin target. Any profit above that goes into the pool for everyone on the team, including us owners. We split half the pool based on base salary and the other half based on a subjective grade for the period. We pay it out.

I feel incredibly blessed that @colemank83 and I are able to do the kind of work we love to do while working with people we love to work with.

Business is great, and I'm grateful to our team for working hard.

I'm happy to be able to share the success of this business with them.

Originally tweeted by Jason Coleman 🤔💡💻💾 (@jason_coleman) on December 6, 2021.

Business Update 2020

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.

5 Tips I Wish I Shared During My Mixergy Interview

My interview with @Mixergy is live. Check it out here: https://mixergy.com/interviews/stranger-studios-with-jason-coleman/

It's great. We cover 15 years of business.

I like getting tactical on podcasts. I know Andrew likes it too. I missed some spots. So here are 5 tips I wish I shared during the interview.

🧵👇

1) During recessions, get close to the money.

I talk a bit about what business was like in 2008. Besides some personal struggles, 2008 was also a time when individuals and businesses were clamping down on spending. So what can you do if you are freelancing through that?

Get close to the money. People will be cutting spending on things that seem superfluous, but any tools, service, or consulting that ties directly to the company's bottom line will be the last to go.

This was part of what encouraged us to focus on membership sites.

I remember some clients we built websites for, even friendly clients (maybe family members ;), saying to me "The website is nice, but it didn't really bring us business."

!!!

We weren't tracking it. The membership sites we helped launched had reporting built in showing $$$.

2) When going up against established competition, don't compete with them head on. Focus your marketing efforts on features and in spaces they aren't addressing.

There were already a couple established membership plugins for WP when PMPro launched.

Making PMPro free and open source was a decision that has lead to better software (what I go into in the interview), but it was also a Judo move to circumvent the competition at the time that was relatively expensive and not OSS.

We didn't waste money to compete with their Google or Facebook ad spend.

We didn't try to recreate the affiliate networks they had already set up.

We focused on becoming the best free membership plugin available on the http://wp.org repository.

3) Speaking of focus. Focus on one project at a time.

When I told Andrew about the frustrations of dealing with 3rd parties changing their APIs when trying to grow WineLog, he asked "Do you have to deal with that kind of thing with PMPro?"

Yes! We do. What's different? Focus.

When Google removed wine from their shopping results, it was the final nail in the coffin for WineLog, as we had just spent months building technology on top of those results.

We didn't have the energy, time, or desire to pivot and try something new.

In business, things are going to fail sometimes. What do you do when you have a set back?

If you have other active projects, you can turn to them for what seems like easier progress.

But if you only have one project to focus on, you HAVE to make it work…

… and you will do what what's needed to try again.

Stopping work on WineLog, InvestorGeeks, and the other side projects we had back around 2010, gave us the time and attention needed to make PMPro a success.

In 2015, we made 80% of our income from making membership sites for others.

When we made the switch from consulting to 100% products-based revenue, we turned down $90k in new work over 3 months to focus on a PMPro relaunch.

The relaunched PMPro 4x'd revenue immediately. Focus.

4) Our Auto-Renewal Checkbox Add On caught Andrew's attention while he scanned our site during the interview.

https://www.paidmembershipspro.com/add-ons/auto-renewal-checkbox-membership-checkout/

I glossed over that one to talk about other add ons, but ARC is pretty cool. The idea behind it is insightful even if you don't use PMPro.

On some sites, customers will purchase a recurring subscription and then CANCEL RIGHT AWAY.

They maybe want access to something right away, but don't really see the benefit in extending membership another month or year.

Auto-Renewal Checkbox tries to address these customers.

ARC gives customers an option at checkout to pay just a one time fee for a membership that expires or to lock into a recurring subscription.

You see this kind of UI all the time when donating online.

However, if you notice this pattern on your site, you should try some things.

Why do your customers only want to pay you one time? Figure that out.

Think about how you could create a separate 1-time-payment product. Maybe your subscription is giving TOO MUCH value, and you should break part of it off into a separate product.

People are really focused on getting recurring revenue on their site. It is nice, but you can find yourself shoehorning what's basically a one-time purchase into a subscription product. Don't force it.

I talk more about timing and pricing here:

https://www.paidmembershipspro.com/front-load-membership-pricing-double-revenues/

5) Finally, I missed a chance to talk about the value of disconnecting.

I said it was easier to step away from work in a products company vs a services company.

Andrew said, "Yeah? What's the longest you stepped away?" Maybe hoping for a great sabbatical story, but I had none.

The longest I've stepped away is 1 or 2 weeks, but I'm definitely able to REALLY get away and disconnect 100% when I go on vacation now. And that is HUGE.

*Every single time* I step away from the day to day of my business for a week, I come back with ideas that grow our business at least 10-20%.

I'd say 4 days in the minimum to really get away. Shoot for 7. More could be better.

If you haven't done that in a while, work it out.

Those are 5 tactical tips that I wish I shared during the interview. You get them for free here on Twitter and my blog. 😀

If you can, watch the interview anyway. Like it on the site. Ask a comment there. It really helps to show Andrew you're listening.

https://mixergy.com/interviews/stranger-studios-with-jason-coleman/

Originally tweeted by Jason Coleman (@jason_coleman) on November 9, 2020.

Lehigh WP Meetup Demo: Paid Memberships Pro

What is Paid Memberships Pro?

What is The Real Jason Coleman?

  • My personal web blog. Updates whenever.

The Plan

  1. Install PMPro
  2. Create a free and paid level.
  3. Create a category for paid content.
  4. Setup Stripe.
  5. Bonus: Install PMPro-Mail-Chimp.

Questions

(Jason will post some questions here after the presentation.)

Do these things!

Follow me on Twitter (@jason_coleman)

Checkout Paid Memberships Pro in the WordPress repositoryin GitHub, and at PaidMembershipsPro.com.

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.

A Wild JavaScript Appears: Understanding the Many Ways JS is Used in WordPress

Today’s WordPress developers need to understand a variety of JavaScript methods and frameworks. This article covers the most common methods you’ll see in the wild in both older and more forward-looking WordPress code. Some examples include AJAX with jQuery, ES6, the Heartbeat API, REACT, and Gutenberg blocks.

My goal is to help you feel more comfortable opening up any JS file you come across in the WordPress world.


Matt Mullenweg - Learn JavaScript Deeply

Jason Coleman - Which JavaScript should you learn?

A few years ago, Matt Mullenweg asked us to learn JavaScript deeply.

I think Matt meant for PHP developers to learn JavaScript and for us to learn vanilla JavaScript in particular so we could program with it regardless of framework. Learning JavaScript deeply was important, because over the next few years, framework development continued quickly. Every year a different library, framework, or flavor of JS would become popular.

Vanilla JavaScript developed quickly as well with the base language itself gaining new features. Different browsers adopted the new features at different rates, requiring polyfill solutions, requiring compilers and package managers. I honestly don’t know how new developers pick this stuff up. The JavaScript landscape seems very confusing right now. Maybe it’s more confusing for folks like me who have been using JavaScript since the 1995.

The following sections go through 10 or so examples of JavaScript you will see in the wild with the intent of helping you to detect what kind of JavaScript, libraries, frameworks, and tools are being used.


Commonly Found Examples of JavaScript in WordPress

  1. Vanilla JavaScript Example

    Vanilla JavaScript

  2. Minimized JavaScript Example

    Minimized

  3. Minimized JavaScript Example with Malware

    Minimized (Malware)

    • Photo Credit: https://www.pokemon.com/us/pokedex/Tangela
    • Code Example: Actual Malware.
    • Used For: Breaking into your admin dashboard. Inserting spam links into your posts.
    • Identifying Features: Code that is inserted inline into PHP and HTML files are usually not minimized. If you see an eval() like this in a .php file, especially if it is out of place or the same code in multiple files, it is usually malware. Use scanners.
    • Learn More: https://sucuri.net/
  4. jQuery JavaScript Example

    jQuery

  5. AJAX JavaScript Example

    AJAX

    • Photo Credit: https://www.pokemon.com/us/pokedex/Claydol
    • Code Example: https://github.com/bwawwp/bwawwp/blob/master/chapter-09/example-08.js
    • Used For: Asynchronous JavaScript and XML. Asynchronous = making many calls back and forth with the web server once a page is loaded. Usually sending small amounts of data rather than the full page. Originally used XML as the primary data format. Now use JSON a lot.
    • Identifying Features: ajaxurl, data, error, success, complete jQuery really made it easier to do AJAX requests. Before that you would use the XMLHttpRequest and use a bit more complicated code to manage the state of the requests. Modern JavaScript has the fetch command, which is more similar to how jQuery and other libraries use AJAX without requiring a library. (I’m looking for a good fetch example to add if you have one in some real WordPress code.)
    • Learn More: https://codex.wordpress.org/AJAX_in_Plugins
  6. JSON JavaScript Example

    JSON

  7. Inline vs JS File JavaScript Example

    Inline vs JS files

    • Photo Credit: https://www.pokemon.com/us/pokedex/Rotom
    • Code is From: https://github.com/strangerstudios/paid-memberships-pro/blob/master/includes/profile.php (Same example as the jQuery slide.)
    • Used For: If you have a single use script meant to be used exactly on one page/template/etc, I still think it’s okay to put JavaScript into a <script> tag in your PHP code. In general tholugh, you should put JavaScript in a .js file and get data into your scripts through wp_localize_script and AJAX.
    • Identifying Features: script tags. found in .php files. If one piece of inline JavaScript breaks, it will halt the execution of all inline JavaScript. One of the many reasons putting JS in its own file is better.
    • Learn More: https://codex.wordpress.org/Using_Javascript
  8. NPM JavaScript Example

    NPM

  9. ES5 / ES6 / ESNext JavaScript Example

    ES5 vs ES6 vs ESNext

  10. Babel JavaScript Example

    Babel

  11. Webpack JavaScript Example

    Webpack

  12. REACT JavaScript Example

    REACT

  13. Gutenberg Block JavaScript Example

    Gutenberg Block


Watch the talk here