On the 2024 US Elections

Most votes are in. Trump is the projected winner.

Still, I hope Harris and her team are ready to keep fighting. You cannot trust whatever “calls” the media has made. The winners are the people who get the most votes, so count the votes. Recount the votes. This election is too important to give up on. Make sure the result is as accurate as possible.

But, while Harris may still request recounts, it doesn’t seem like any reasonable swing in the recounts could be enough to change the outcome. Trump will be our next President… again.

What am I worried about most now?

A certain percentage of folks on the right see this election as a referendum on hatred. People who were just waiting for confirmation of their views on LGBTQ folks and minorities will feel emboldened to act out verbally and physically. We need to push back on hate wherever we see it. We need to look out for one another.

People will say that’s overreacting and talking like that is itself hurtful or hateful towards conservatives. Fuck off. It’s just words. Grow thicker skin. We lived through 2016 and the first Trump presidency, and we know what to expect. We need to look out for one another.

We see these assholes every day, their “Fuck Biden” flags and the beer cans they throw at our driveway. We’ve seen these assholes get upset at our short haircuts, our clothing, our fuel efficient cars, and anything their TVs and phones told them to be mad about today. We’ve see these assholes as they walk around our neighborhoods, feeling free to shout out “are you really going to vote for that n****?” We’ve seen these assholes standing at bus stops with their assault rifles. We need to look out for one another.

What’s going to happen to the economy, the stock market, and the crypto markets?

The economy has been great and is still great, but the vibes were bad. The media, and of course the guys running against the incumbents, were incentivized to tell you the economy was actually bad. Just like in 2017 when Trump won the first time and inherited Obama’s economy, everything bad about the economy will magically be good now.

So we’ve had a great economy and bad vibes. We’re now going to have a great economy and good vibes. I expect the stock market and risk-on markets like the crypto market to run up for the next year or so at least.

We were already entering the falling rates part of the business cycle, and I don’t see any reason why that wouldn’t continue. The market is going to be full of liquidity and lots of dumb, happy, rich folks will be looking for ways to get into risk-on assets.

Look for talk about “bubbles” to fall as we actually start inflating bubbles. Be on the lookout for bubbles. Remember that bubbles inflate before they pop, and it’s hard to tell when they’re going to pop.

I don’t know exact numbers and timings, but interest rates will fall, and then they will stop falling. Watch earnings to separate the reality from the vibes.

Policy-wise, there are a lot of crazy ideas being floated around like giant tariffs, strategic Bitcoin reserves, and going back to the gold standard. Ignore the talk. Wait for the actual bills to pass and go into effect. Operate in reality as much as possible.

The new government won’t come into office until next year, their dumb economic policies won’t pass until some time after that, and the impact of those policies won’t be felt until some time after that. Remember that mostly these policies just shift around who the winners are. Diversify and avoid timing the market. Stonks go up.

Who cares about the economy? Some real shit is about to go down.

You’re right, and I’ll get to some of the more serious impacts this shift towards fascism will have on our country and everyone living here. But one of the reasons I’m talking about the economy here is because those of us who can take advantage of a bull stock and crypto market should do it.

One of the tenets of this era we’re moving into is “lookout for yourself first” or “get mine”. That doesn’t jive with our values, but just like you need to put that oxygen mask on yourself before helping others, we can look out for ourselves first, to build up capital and power so we can help others.

Some real shit is about to go down, and I am not sure we have the energy to fight back again.

The government is about to be run by a bunch of folks who don’t believe in government and don’t really understand it. The professionals who run our government agencies probably don’t have the leadership or the will to stick it out and resist like they did last time. For lots of technical reasons, expect a wider and deeper dismantling of the government.

We are going to have to relearn a bunch of lessons. We’ll relearn why we need vaccines, why we need women’s rights, why we need immigration, why we need the federal reserve, why we need diplomats, why we need competitive markets, etc, etc.

A lot of people, in all times, have had to live under a government that didn’t represent them, and was often hostile towards them. For many people now, there will be more struggles, more fighting, more stress. But there will also be beautiful days, good times with friends, laughter, and love.

I’m often reminded to focus on the IRL, the real world around me. So I’m going to focus on my family, friends, neighbors, and coworkers. We will take care of each other, make the best of our lives, and do important work together.

I’m often reminded to “tend to the part of the garden I can touch”. It’s a big complicated and dangerous world we live in. We don’t have control over everything, but there are parts of it we “can touch”, and there are small ways we can push things in the right direction.

We got fascism now?

It’s definitely here. The fascist guy is going to be in charge. It’s very easy to imagine how it all goes wrong from here towards phony media, phony elections, and a phony government that takes what it wants at the expense of the people living here. Will it be better for them to leach us slowly or burn it all down and sell it for parts?

Ignoring the challenges we will face in preserving democracy itself, some things we hold dear are going to be targeted by the incoming government. At risk are abortion rights, birth control, gay marriage, trans rights, affordable healthcare, and even citizenship for some Americans. There are too many important issues to list out.

There are a couple of things I will be looking out for that might slow down or even prevent some of this backwards slide.

First, there will be infighting amongst the winning team. While the right seems aligned on many issues (trans people are icky), they disagree on many issues too. They will have a hard time figuring who to award contracts to or just how to exactly do the things they want to do.

Do we like electric vehicles or hate them? Tesla good now. Is First Solar bad? We don’t have to like windmills right? We like manufacturing, but not the Chips Act, cause Biden bad. I hate Apple, but I love my iPhone. I hate Facebook, but I’m addicted to Instagram. Repeal the ACA, but somehow keep everything in it. Do we hate Microsoft again? No, it’s Google right now yeah? On and on… the infighting might distract them.

Second, a lot of the worst things we can imagine aren’t actually goals of the ruling class. They don’t seem to really care or have the curiosity to address issues like immigration head on. Things like tariffs, marriage bans, deportations, and nuclear war often work better as boogieman issues to keep their base engaged. Once you change the policies, you can’t really talk about them anymore. The threat of war might be more useful to Trump than an actual war. The threat of deportations might be more useful to Trump than actual deportations.

I’m not saying bad things won’t happen. Trump really talks a lot about keeping our blood pure and how everyone who disagrees with him is an “enemy within” to be sentenced as traitors, i.e. killed. Politicians have to give their base red meat sometimes, and these people really believe a lot of this heinous shit. I’m just seeing the silver lining that there are incentives for some of them to at least be delayed for a while.

Here are the things I’ll be looking out for, which will indicate a crossing of lines and a step towards the worse.

  • Imprisonment or exiling of any politician or journalist.
  • Americans being stripped of their citizenship.
  • Increased and regular state violence towards protestors.
  • Reversal of nationally recognized same-sex marriages.
  • A US exit from NATO.

I don’t know what we do when these things happen. I don’t know where the resistance organizes. I just know I would get more and more worried as these milestones are met.

This post hasn’t covered everything at stake or all of my thoughts and feelings about the election, the state of our country, and the different information bubbles we seem to live in. If you’re in my bubble, a lot of this makes sense. If you’re in the bubble that voted for the other guy today, most of this sounds crazy. I think the existence of these bubbles and how they conflict with each other or converge is maybe the most important thing to figure out.

In short, I’m going to look out for my friends, family, neighbors and coworkers. I’m going to push back on hate when I see it. I’m going to try my best to stay optimistic, while keeping an eye on things. I’m going to take advantage of the market opportunities while the economy is hot. I’m going to embrace the spirit of “getting mines” while still adhering to my own values around doing good for others and giving back. As things get worse, I’ll try to point it out where I see it. I’ll try to find the resistance where it comes up and help how it occurs to me to help. I’ll continue to live and thrive in this chaotic world that’s also very beautiful.

Fair Value Estimate for Snowflake $SNOW

I wrote up my thought process while doing a fair value calculation for Snowflake stock ($SNOW).

You can read about it in my Tweet thread here:

Or in my blog post at InvestorGeeks here.

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.

Blog less for more views?

The @MrBeast interview on the @joerogan Experience podcast is a good one. Mr. Beast's life story is interesting, but there is also a bit of marketing advice that's useful for businesses trying to produce viral content.

Here’s a link to the podcast. It’s on Spotify. You need at least a free account to listen.

Here's an excerpt on YouTube that I think covers some of the stuff discussed here: 3/

Anyway, what's the advice. It's pretty simple:

Make fewer, better videos.

Mr. Beast says he's helped several channels increase their views and earnings but mostly convincing them to make fewer videos, but spend more time on them.

Specifically, Mr. Beast emphasized having a better idea.

How do you do that? Early on, he would spend at least an hour a day thinking of ideas. He would use random word generators to plant a seed and then riff on that.

Why are ideas so important? It's the algorithm.

The YouTube algorithm optimizes for 2 things: clicks and stickiness. It's most important to get folks to click on your video, and then it's important to get them to watch the entire video.

Having a better idea helps to get those clicks. So does good titles and thumbnails.

How do you get people to watch the whole video? That seems to be the secret sauce. It involves pacing the video to keep it interesting while at the same time teasing the info coming later.

Mr. Beast talks about that some more here:

I found this concept of fewer, better videos fascinating because it goes against the advice I learned in the blogging world which used to work so well. That advice was basically post content as often as possible, and that consistency was key.

Posting a lot made sense in the early days of blogs and RSS, when a typical behavior was to visit a specific site daily to see what was new.

But no one does that anymore. The algorithms control what we see. So optimizing for the algorithm is way to go viral. Duh!

I watched a @neilpatel video this weekend too that also suggested blogging less. Less blogs, better ideas, more time to market your posts. It's a quick video, but has some good specific tips to try.

One thing I like about the old "post as often as possible" strategy is that it really forces you to produce and figure out the process and the medium. Good for starting out. But that's not really useful if you hit a plateau and your content doesn't get any better.

So the current trend, which makes sense based on the role algorithms play, is to produce fewer, better videos and blog posts focused on clicks and stickiness.

Mr. Beast posts Thursdays and Saturdays. Neil Patel posts on Tuesdays, which might be better for biz/work stuff.

Originally tweeted by Jason Coleman πŸ€”πŸ’‘πŸ’»πŸ’Ύ (@jason_coleman) on March 21, 2022.

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 to come up with business ideas and figure out which ones are good.

Saw someone who wanted to start a business asking for ideas, which is odd to me because I have tons of ideas. My handle on many sites is “ideadude”.

So here’s a thread from the ideadude on coming up with ideas and figuring out which are the good ones. πŸ§΅πŸ‘‡

Back in the early days, @colemank83 and I would spend at least one weekend each month working on new ideas. We would build what we could in 2 days, push it out there, and see what stuck.

We got lucky and were able to transition from consulting into a software biz doing well.

In hindsight, there are better ways to come up with ideas for businesses. Here are some.

I recommend reading @jaltucher‘s article How to Become an Idea Machine

https://jamesaltucher.com/blog/how-to-become-an-idea-machine/

The big idea. Write down 10 ideas every morning. Practice coming up with ideas. Most of them will be bad ideas, but that’s okay, it’s the practice you want.

If you like that post, then I would also suggest reading James’ book Choose Yourself. It has many similar ideas.

Once you have ideas, how do you know if they are good?

For that, I recommend reading the great stuff by @amyhoy and @alexhillman at

https://stackingthebricks.com/

Specifically, check out their stuff on Sales Safari

https://stackingthebricks.com/video-sales-safari-in-action/

Ha! In this post Alex calls out the “see what sticks” approach that might have worked out for us, but took too long.

https://stackingthebricks.com/cant-find-audience/

Another related idea I learned from Stacking the Bricks is the “ebomb”.

https://stackingthebricks.com/the-ebomb-recipe-that-works/

The big idea here is to recognize all the questions you are already being asked by email and in person and publish the answers publicly.

If one of your ebomb posts gets attention, it could be a good candidate for building a service, product, or SaaS around.

My final advice is to just step aside from your day to day work and life for a while.

Every time I take a week off, travel away from home, and aren’t forced to focus on work, I come up with tons of ideas on how to improve our business.

Maybe you were able to get away for the holidays and are back and ready to work hard on your business.

If not, plan a getaway now if you can.

So there are some resources to learn how to practice your idea machine, do sales research with intention, come up with ideas for targeted content, and find the space to let your mind work.

Tell me your best practices, tools, books, & resources are for coming up with good ideas.

Originally tweeted by Jason Coleman πŸ€”πŸ’‘πŸ’»πŸ’Ύ (@jason_coleman) on January 4, 2022.

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.

Helpless/Boombastic Mashup Teaser

On a recent road trip, we were rocking out to the Hamilton soundtrack, when I realized that the beat is Helpless is pretty much the same as the beat in Shaggy’s Boombastic.

I need to learn how to make a proper mashup and do some artistic mixing around this, but here’s a little clip of the 2 songs pretty much just layered over top of each other with a little bit of EQ.

I think it has a lot of potential. I’d love for a better/more experienced producer to mash this up. I’ll work on a version a bit and see what I can come up with.

How we started running BFCM sales and made an extra $150k

In the early years of @pmproplugin, we never ran sales.

In 2017, we ran our first Black Friday/Cyber Monday sale. Now we run 3 sales per year.

What were we worried about early on? What changed our mind?

If you want sweet BFCM πŸ’°, but have concerns, this thread is for you.πŸ‘‡πŸ§΅

First, what kind of sweet cash are we talking about?

We’ve commonly heard that a BFCM sale can bring in 25-100% of your typical November revenue.

In software, where late November and December are slow times, that can be a nice bump.

Seasonal sites can do even better.

For us specifically, we make an additional 20-30% revenue any month we run a sale. At 3 sales per year, this is about 5% of our annual revenue or ~$150k over 4 years.

For reference, it cost us ~$150k to renovate our garage into a “sweet” home office.

In 2016 though, we were nervous about running sales. We were worried about:

(1) Confusing our customers.
(2) Looking cheap.
(3) Wasting time.

We’ve since made sales software for WordPress sites that addresses these concerns specifically.

I’ll include a link to that software at the bottom of this thread, but first let’s break things down and hear how we got over these fears and are now running successful sales 3x/year.

(1) We didn’t want to confuse our customers.

In 2016, we weren’t even sure if we had our standard pricing down. We were changing our plans and pricing every year or so already. We thought throwing a discount into the mix would confuse our customers.

We thought running sales would confuse ourselves too. Sales would muddy up the data we were tracking.

How could we tell if that price increase to $297 was really working if we sometimes were still selling things for $197?

BTW, consider running a sale when you’re about to raise prices. You’re set up for a natural experiment of sorts where you can honestly say something like:

“This is your last chance to purchase before we raise our prices. Lock in now.”

(2) We didn’t want to look cheap.

This is a big one and almost common knowledge for ecommerce stores.

We were concerned about how discounts, especially running sales too often, could hurt our brand image.

We were already fighting the image we had as “the free membership plugin” since all of our code was fully GPL and available for free.

Running a sale could send the message that our paid services weren’t worth the full price.

In reality, our service was the best and worth more.

We all know how jewelry stores at the mall are perpetually selling things for 50% off the list price, training us to take every price we see and cut it in half.

Even now, in mid Sep, if you visit the websites of traditional jewelry stores, they are littered with sales pricing.

Perpetual sales might work for some businesses, but we didn’t want to send the message that our PMPro Plus membership was “cheap”.

Our plugin was the best. Our service was the best. We should be charging the highest prices, not be “forced” to put our membership on sale.

(3) We didn’t want to waste our time running sales every month.

Each sale involves at least a few hours writing up sales copy and emails. At worst, it involves designing one-time landing pages and custom programming to handle the pricing logic.

What do you do if someone who purchased in July for $197/year is checking out in November for $147/year?

Here’s a small snippet of *some of* the pricing logic we used to have running on the site. The current pricing.php file is about 140 lines of code.

<?php
// This is an excerpt from *some of* the custom pricing logic we had running on our site to support legacy prices and sales.
// Our current custom pricing script is about 140 lines long.
/*
If purchasing PMPro Plus and they've had plus or core in the past,
calculate the appropriate price.
*/
if($level->id == 20 && is_user_logged_in()) {
// If the user has a current subscription, use the billing amount on file.
$user_level = pmpro_getMembershipLevelForUser();
if( pmpro_hasMembershipLevel( 20 ) && pmpro_isLevelRecurring( $user_level ) ) {
$level->initial_payment = $user_level->billing_amount;
$level->billing_amount = $user_level->billing_amount;
} else {
// Check if they had a discount in the past.
$paid_47 = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE user_id = {$current_user->ID} AND membership_id IN(6,20) AND total IN('47', '47.00') AND status NOT IN('refunded', 'token', 'error', 'review') AND timestamp < '2017-08-30 00:00:00' LIMIT 1");
if($paid_47) {
$level->initial_payment = '47.00';
$level->billing_amount = '47.00';
return $level;
}
$paid_97 = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE user_id = {$current_user->ID} AND membership_id IN(6,20) AND total IN('97', '97.00') AND status NOT IN('refunded', 'token', 'error', 'review') AND timestamp < '2014-08-30 00:00:00' LIMIT 1");
$paid_147 = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE user_id = {$current_user->ID} AND membership_id IN(6,20) AND total IN('147', '147.00') AND status NOT IN('refunded', 'token', 'error', 'review') AND timestamp < '2017-08-30 00:00:00' LIMIT 1");
$paid_197 = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_membership_orders WHERE user_id = {$current_user->ID} AND membership_id IN(6,20) AND total IN('197', '197.00') AND status NOT IN('refunded', 'token', 'error', 'review') AND timestamp < '2017-08-30 00:00:00' LIMIT 1");
if($paid_97 || $paid_147 || $paid_197) {
$level->initial_payment = '147.00';
$level->billing_amount = '147.00';
}
}
}
view raw gistfile1.php hosted with ❤ by GitHub

When we did client work, some clients were constantly looking for the right discount/invite scheme, and every month we’d have to update their pricing across the site.

And every month, we’d have to write code to handle all these new edge cases we were creating.

So what changed our mind? Mostly it was FOMO.

We had heard from friends (@scottbolinger, @learnwithmattc, @pippinsplugins, and others) who were making 25-100% of their typical Nov sales just over BFCM weekend.

Again, Thanksgiving week was one of our slowest periods. The whole month of December is usually our lowest-revenue month.

Getting an extra month’s worth of revenue during this time helps a lot of smooth things out.

It also gives us a nice bump when we are calculating bonuses.

Here are our November sales from 2016 and 2017 with the BFCM weekend highlighted.

2016 – no sale. 2017 – with sale.

Here is a shot of our revenue from last November, 2020. In addition to extra sales from our promotion that month, we benefit from all the recurring sales year after year.

November went from a slow month to our busiest month.

My friends who had run BFCM sales eased our concerns 1-3 as well.

Q: What about people asking for the discount after the sale is over?

A: It was just a few people the following week and no one after that.

We recommend giving these folks the discount.

Q: Do you think the sale hurt your brand or undermined your pricing?

A: No. People *expect* us to be running a sale over BFCM.

This is the one time of year you can rune a sale without it looking bad.

Q: Are you spending all your time running sales now?

A: Yes and no.

Some of those we talked to run sales almost every month now. Some just a few per year.

The latter appeals more to us, and after some experimenting, we have settled on 3 sales spread throughout the year.

For the past few years, every year, we run a Black Friday/Cyber Monday sale one week in November.

Then a Spring Sale one week in March-May.

Then a Summer Sale one week in June-August.

We experiment with content, pricing, and length, but also have templates we can reuse easily.

That’s our story of how we came to start running Black Friday/Cyber Monday sales, made a bunch of money, built a home office, and now are trying to help others do the same.

I’d love to hear from others who have had similar success, or better yet different struggles with sales.

Oh yeah. Here’s our pitch for Sitewide Sales, a complete BFCM and flash sale plugin for WordPress.

https://sitewidesales.com/

It works with WooCommerce, PMPro, EDD, and other ecommerce plugins.

I said that we address concerns 1-3 directly, and it really does.

Originally tweeted by Jason Coleman πŸ€”πŸ’‘πŸ’»πŸ’Ύ (@jason_coleman) on September 13, 2021.