Building a Membership Plugin for WordPress with Blair Williams

Sponsored by:

In today’s episode, I chat with Blair Williams, a WordPress veteran with lots of great plugins. We’ll talk specifically about MemberPress and what it’s like creating that, the decision-making that went into their pricing, wp-cron, and lots more.

Show Notes:

Intro: Hey everybody and welcome to another episode of How I Built It! In today’s episode, I chat with Blair Williams, a WordPress veteran with lots of great plugins. We’ll talk specifically about MemberPress and what it’s like creating that, the decision making that went into their pricing, wp-cron, and lots more. We’ll get into it next, but first, a word from our sponsors.

Sponsors: This season of How I Built It is brought to you by two fantastic sponsors. The first is Liquid Web. If you’re running a membership site, an online course, or even a real estate site on word press, you’ve likely already discovered many hosts that have optimized their platforms for a logged out experience, where they cash everything. Sites on their hardware are great for your sales and landing pages, but struggle when your users start logging in. At that point, your site is as slow as if you were on three dollar hosting. Liquid Web built their managed word press platform optimized for sites that want speed and performance, regardless of whether a customer is logged in or logged out. Trust me on this, I’ve tried it out and it’s fast, seriously fast. Now, with their single site plan, Liquid Web is a no-brainer for anyone whose site is actually part of their business, and not just a site promoting their business. Check out the rest of the features on their platform by visiting them at buildpodcast.net/liquid web. That’s buildpodcast.net/liquid web.

It’s also brought to you by Jilt. Jilt is the easiest way to recover abandoned shopping carts on woo commerce, easy digital downloads and Shopify. Your e-commerce clients could be leaving literally thousands of dollars on the table and here’s why. 70% of all shopping carts are abandoned prior to checkout. Yes, you heard that right, 70% of shoppers never make it to checkout. That’s why you need to introduce your clients to Jilt. Jilt uses proven recovery tactics to rescue that lost revenue. It’s an easy win that let’s you boost your clients revenue by as much as 15% and it only takes 15 minutes of your time to set up. Jilt fully integrates with woo commerce, EDD and Shopify. You can completely customize the recovery emails that Jilt sends, to match your clients branding using it’s powerful dragon drop editor. Or by digging into the HTML and CSS. Even better, Jilt’s fair pricing means your clients pay only for the customers they actually engage. You get to earn a cut of that through Jilt’s partner program. Whether you have clients that process one sale per month or 10,000 sales per month, be the hero and help them supercharge their revenue with Jilt. Check them out at builtpodcast.net/jilt. That’s builtpodcast.net/J-I-L-T.

Joe: Hey, everybody. Welcome to another episode of How I Built It, the podcast that asks, “How did you build that?” Today my guest is Blair Williams of MemberPress. Blair, how are you today?

Blair: Doing well. Doing great.

Joe: Excellent. Thanks so much for joining me. We met a couple of years ago, and then, recently saw each other again at CaboPress. Is that right?

Blair: Yes.

Joe: Cool, rad. Well, why don’t we jump right into it? Why don’t you tell the folks who you are and what you do.

Blair: I am Blair Williams, like Joe said and I am the founder of MemberPress. MemberPress is a membership plugin for WordPress, so when you install it, it allows you to lock down posts and pages and content, and put them basically behind a paywall so people have to pay in order to get them. It’s great for online courses and also for just all kinds of protect files. Associations use them. There’s a wide range of uses for a membership site. That’s what we do 24/7.

Joe: Very nice. Now, I know that you are quite the developer. Steph Wells mentioned you on her episode, back in season three, I believe it was. You gave her a little push, right, to get into the development world. Is that-

Blair: Yeah, absolutely. Steph’s actually my wife’s, well, I think it’s technically, second cousin, but they’re a little closer than that. Yeah, so I worked with Steph back in the day, and got her … I was like, “You know, you probably ought to think about programming.” Now, they are rocking and rolling with Formidable Forms. She’s just done a ton of work. I just planted the seed. My heck, she’s amazing, and Steve. They’re both amazing.

Joe: Yeah, absolutely. That was one of my favorite conversations because my wife is a nurse. Steph made the move from my wife’s profession to my profession, so I really enjoy talking to her about that. You do MemberPress. Where does MemberPress fall in the timeline of … I know there’s a bunch of membership plugins out there, right?

Blair: Right, so we launched MemberPress in 2013, so there were a handful of other ones, well, there were still quite a few back then, as well. Part of the reason that I started down the road of writing MemberPress was that I had used …

Well, actually previously to even WordPress, I had written membership sites just using custom code. Ruby On Rails, that was my forte back then. I wrote it for a couple of different clients. I don’t know where I heard about it. In 2009, I started getting into WordPress more on the marketing side, and I released Pretty Links, which is an affiliate link management plugin and link shrinker. It’s just on the WordPress directory. Anyway, so I just released that and so I was getting into WordPress, and I found that there were WordPress plugins that did exactly what I had already built for some of my clients. I started investigating it and, of course, I had a couple of other clients that wanted to build membership sites as well so I just started using a couple of them.

There were a couple of plugins out there. I think Wishlist was a big one back then. There was also aMember, which was not a plugin, but it integrated with WordPress. They’re both still going and they’re still good solutions for sure. The thing that I had an issue with was I wanted deep WordPress integration, I wanted unencrypted code, and I wanted just a little bit more of a flexible way to protect stuff and to protect things a little bit more in a more solid fashion. I just got a wild hair and decided to write MemberPress. Initially, I wrote it to sell Affiliate Royale. I had actually written another program or plugin that’s an affiliate. It helps you run an affiliate program on your website. I released Pretty Links and then Affiliate Royale, but in the interim there I had written the first iteration of MemberPress just to facilitate selling the plugin. That’s kind of where it started.

Then I decided, hey, there’s probably a market for this. I think that it was just getting out of getting to know the WordPress environment and seeing what solutions were out there. It’s a developer/founder thing. I didn’t really do a ton of market research other that I knew that I needed it and I thought other people might need it to, kind of a thing. I started getting it ready to sell and 2013 we launched it.

Joe: Nice, very nice. Yeah, okay so you didn’t research in say the traditional sense, right? It was very scratch your own itch kind of thing.You had used other ones, you had some clients…

Blair: Absolutely, yeah.

Joe: Membership plugins could be just these huge … You have the main thing and then you have like a million edge cases. How did you decide what to put into that first build? Was it just the stuff that you needed or did you know you’d eventually release this?

Blair: Yeah. Basically it was the stuff that I thought that I would need. I don’t think I realized even up front that there were going to be so many edge cases. We still get requests for all kinds of different things that people need to do in their business. That’s a good thing for us. It can be difficult to decide what you’re going to put into the plugin, if you’re going to add features or if you’re going to not add them or if you do add them, how do you keep the paradigm of simplicity still in there somehow? That’s a challenge and I’m sure that we’re not perfect at everything, but we really try hard to keep that as a guiding principle to make things click.

Initially when I started writing it, my needs were very simple and I think that the membership systems that I had written for other clients were fairly simple and then they started bolting on custom things, so it wasn’t like … You’re doing it for a client so you have to figure out ways to build it in, right?

Joe: Right, right.

Blair: They became their own customized deal. I think what we have today with MemberPress is you could probably fit any of those needs from back then and weigh more at this point.

Joe: Nice, and so I see you have a pretty interesting pricing structure. You have the basic, plus, pro and that includes a different number of sites, but the thing I want to call out here is that the basic includes PayPal and Stripe support, and then the plus includes Authorize.net. Authorize.net holds, we’ll say special, but a terrible place in my heart because before I started using WordPress for everything and eCommerce stuff integrating Authorize was such a pain in the neck. Is it still, has it gotten better?

Blair: The interface is very similar. I think we’ve pretty much got it dialed in at this point. I think that they have made some changes over time, but it’s definitely nothing like working with Stripe. Stripe is our favorite, of course, in terms of working for the API and all that. Yeah, Authorize, it’s kind of in the plus because as people get more and more volume, Authorize can be a better solution for people with high volume especially because it’s a true gateway interface. People can change out their merchant account or whatever and can sometimes get better rates on those things. There’s still a very viable and still well-used option. Of course, Stripe is a little easier to work with.

Joe: Totally, yeah. Stripe, I made just HTML and CSS site recently just for fun. Make sure I don’t lose those skills, right?

Blair: Absolutely, yeah.

Joe: Integrating Stripe was pretty easy. Even sending the custom information that I wanted to send to the API wasn’t bad at all. I guess the reason I started down this path was how did you decide, because pricing is really hard for everybody, where to include these things? Also how did you decided, “we’re definitely going to support Authorize.net.” How many of those feature requests do you get that you say no to or things like that?

Blair: In our case because we’re a WordPress plugin and I’m sure some of our competitors, they support additional payment options, but one of the things that we do is we offload the recurring part of the subscriptions to the gateway. With Authorize we use their ARB, so their automated recurring billing, and then for PayPal we use recurring profiles, and then for Stripe we use their subscriptions. The benefit that we found to that was that, and I guess this is probably not a good thing for us, it’s a good thing for the customer, is that if they decide, hey, I don’t like MemberPress anymore or whatever, those subscriptions are portable. They can take those.

The other thing is that WordPress historically has not had a good track record … Well, okay, so I’m not going to hate totally on WP-Cron, but that’s basically the only thing that you can guarantee will be present in WordPress install. In Unix or like in custom projects we’ve done in the past, you used a thing called Cron, right, which is pretty reliable and I think that’s how a lot of these … I’m sure Stripe and Authorize and all of them using Cron on the back end in order to do these recurring payments.

For us we don’t have that luxury and so we’ve tried to use WP-Cron which is a simulation of Cron that’s not totally like … We weren’t really comfortable as using that as a way to fire off payments since those are important for people. We rely on the gateways for that.

Long story short, there are certain gateways that we can’t really support if we want to continue doing it that way. Some gateways do not have recurring profiles or that sort of thing, but we do get requests from time to time for other gateways and we definitely evaluate those things. We have a few in the works, so, yeah, that’s how we evaluate it is basically it’s kind of based on the future set and basically how easy it is for our customers to use and to access.

Joe: Yeah, that’s a great point. It sounds like for subscriptions or recurring payments, you have a principle that you follow and then your evaluation is based on that principle. I love that. Now quick clarification for WP-Cron, and I think I know how this works, but I’m going to get expert clarification here. Does WP-Cron only fire … You schedule something and then it fires as long as someone visits the site; is that right?

Blair: Yeah, so what happens is that, yeah, it basically uses JavaScript to fire off a non-blocking request. In theory the person visiting the page won’t notice any lag or anything, but the JavaScript will actually call another thing and it’s not blocking. There are ways that you can actually tie it to real Cron, and that’s what we do in our development environment, because we still use it for reminders and for other kind of maintenance tasks on MemberPress. Yeah, it’s just you’re not guaranteed a specific time that it will fire off and there’s some other limitations of it. It works fine for a lot of things that we do with it, it’s just payment is not one of those things.

Joe: If you want payment to recur at midnight on the date, somebody needs to hit that site at midnight on the date, right?

Blair: Yeah.

Joe: For those listening who are not necessarily super developers, you will notice that if you schedule a WordPress post and then no one visits your site within the window that you were supposed to have that post published, right?

Blair: Yeah, scheduled posts are definitely that way, yeah.

Joe: If you’re wondering, hey, I scheduled my post for 3:03 and it’s now 3:05 and my post hasn’t published, it’s because nobody has visited your site.

Sponsor: Hey everybody. I want to tell you about a sponsor I’m SO excited to have on the show this week., and that’s Beaver Builder. Beaver Builder is a drag and drop page builder and a platform you can trust with your business. Free up your time and join over half a million websites built on Beaver Builder. I have been using Beaver Builder for a couple of years now and I couldn’t be happier with it. It’s an excellent tool with a lot of flexibility. You can check them out at buildpodcast.net/builder. That’s buildpodcast.net/builder. And now, back to the show.

Blair: Yeah, a simple way around that, you can google it and find that there are ways to tie it to real Cron, but if you don’t have that level of access with your web host or something, just sign up with a service like Pingdom or something like that. You should be using something like that anyway to monitor the downtime and get it to hit your site every five minutes and that will fire off Cron or WP-Cron.

Joe: Right. Cool, so actually that’s a really good transition into the title question, how did you build it? Because I’d love to talk to you about, again, WordPress is running on all sorts of environments like you just talked about. Membership plugins can get pretty complicated, so what kind of tools do you use in developing MemberPress, specifically for testing?

Blair: That has been a hard one historically, at least the testing part of it. Now it’s a little bit better. I’ll start with the first part of your question here. I’m more of an old-school kind of person, and because I was initially starting to do a lot of the development of gateways, it was difficult to do it on a local server initially. There are tools now that will allow you to get those web hooks to come back, because when you set up Stripe or PayPal or Authorize, you have to configure a URL that they’re going to hit back to you. In PayPal a lot of people are familiar with the concept of the IPN, the instant payment notification. When you’re developing on your local machine that historically has been difficult. Of course, there are ways around that now where it can get to you.

I just set up a Linode server, development server, and some environments on that. Then I would just login. I use VIM, well VI formerly, but now VIM for pretty much all my development. I’m not super dialed in with anything, although I have been using Atom a little bit more lately and I think it’s got a good VI plugin that I really like. Development server is what I used in a real test environment and then that way it was easier for me to test what a real environment would be like because it’s on the web. I can set up Stripe and all the different gateways so that I can just not fool around with being on the local environment. Clearly this environment isn’t for everybody. I’m really comfortable in VIM, but it’s got a pretty steep learning curve. Paul Carter who is now the head of support for us, he actually still uses Notepad+ + He’s a Windows guy.

It actually has a cool feature. It uses SFTP behind the scenes sync files with the server. He was able to use that same development server. He actually helped launch MemberPress back in 2012-2013 timeframe. That’s what he has used. I don’t really do any of that. Now I have moved to more of a local environment. One of our developers uses VVVE for all of his stuff. I still am using Flywheel Local, which is actually really nice. Then for testing we, of course, use the WCLI test suite. It’s PHPUnit, but they’ve written some scripts that really make it a lot easier. Yeah, so it’s been really good for us.

In terms of the style, because I and a lot of my colleagues, we were all Ruby developers so, of course, MemberPress and all of the major plugins that I’ve written are in a faux MVC, model view controller, kind of setup. I think it’s really served us well. WordPress actually has a really good … We’ve got controllers which basically we put all of our hooks in one function in the controller and then we load up controllers. Those hooks get loaded on the loading of the plugin. Then we have views which are basically templates that just have straight HTML and some view-oriented, visual-oriented PHP. Then we have models that we use. We’ve actually gotten our framework down. It’s just an internal framework that we just continue to improve for each of these plugins. It’s actually gotten pretty refined now so it’s easy working with … We use WP Shell a lot, so WP Shell is another WPCLI thing.

I’m telling you if you rather not use that, it’s phenomenal because you can just run WordPress commands. It loads up your whole WordPress environment and you have an interactive shell where you can just … If you want to do some quick and dirty testing before you have your automated testing in place or whatever, you just run stuff right in the shell and it’s good.

Joe: I’m going to check that out. I have a follow-up question to that because you came from a Ruby environment and it’s my perception, most of my experience is with PHP and WordPress, but I have a Masters in Software Engineering. I’ve got a lot of software development theory and things like that. Do you feel like your background in Ruby has helped with the software engineering aspects of WordPress? I feel like the WordPress development group is maturing. We’re seeing a lot more automated testing and things like that, but I feel like we’re getting more theories that older generations of coders have had for a while.

Blair: Yeah, it’s interesting because I think part of that, though, is just WordPress actually deprecating some of the older versions of PHP. I wish that they would deprecate some more, because PHP has made huge strides in that space. When I started with Prelinks, you had to code to PHP4 which didn’t even have true object oriented programming. Those were the battle days, man. It was hard. Now as a developer it’s just so much better in WordPress because you have these extra tools, too, like WPCLI is a great one to use the crap out of and there’s VVV and there’s all these things that didn’t even exist back then. Back then it was just like-

Joe: Yeah, open up Notepad.

Blair: … google it and Stack Overflow

Joe: Yeah, there was a couple like that, right?

Blair: Yeah, I would just google stuff.

Joe: Yeah, that’s a really good point, the version of PHP, because for a while I remember the switching from 4 to 5 and coding for both of those and are you going to do things functional and backwards compatibility and all these things that you have to consider for true object-oriented programming.

Blair: Exactly. I think it has served me well the old skills that I’ve had. I feel like the plugins are coded using real solid software engineering concepts, object-oriented design and all that kind of stuff. We’re using MVC pattern. We use singletons, we use all these things throughout the code base that I feel like makes it a little bit easier for us. One of the things that we started using as soon as PHP4 was deprecated was auto loading which has made a lot of really good improvements for us. There are other things that hopefully we can start utilizing once PHP2 is deprecated. That will be really nice. There are a lot of places in the code that I’d like to have rewritten.

Some of the downsides of it, though, I would say coming from that background is that I feel like there are people that have always been in the WordPress environment and have always been … that’s how they’ve learned. WordPress historically hasn’t always been super consistent on how you should be doing things. There’s been some questions here and there and I’ve gone off half cocked a few times. This is how I know how to do it and so I’m just going to do it. One of my buddies, like Brandon Dove or somebody, “Actually you shouldn’t be doing that, Blair. You should …”

A good example of that would be when custom post types first came out and I was still writing custom database columns for things … I still believe that there are definitely important places for database columns or tables. Man, you can do a lot of cool stuff with custom post types for sure and taxonomy.

That’s been the downside is that sometimes I’m not … I know a way to do it and I just start doing it and then I have to reevaluate later, oh, no WordPress already does some of this.

Joe: Absolutely. I think that’s a trap that a lot of … That’s what I think my biggest fear as a developer is one day I’ll just be like, “I don’t feel like learning new stuff,” and then I don’t.

Blair: I’m just going to keep coding in COBOL and just-

Joe: Forever.

Blair: Actually, with that if you did know COBOL you’d probably be making a lot of money at this point.

Joe: Yeah, I’d be one of five people.

Blair: Now everyone’s retired. Yeah. Let’s do this.

Joe: That’s awesome. I’m going to link in the show notes to COBOL, too, for fun.

Blair: Do it.

Joe: Sweet, so we talked a little bit about this and so I feel like we should elaborate a little bit more. We’re coming up on time, but I want to know what your plans for the future are. You talked about maybe refactoring some things, what’s coming down the pike for MemberPress?

Blair: Yeah, this year we’re doing a lot of code, refactoring and enhancements. We’re going to be doing a few new add-ons that I think are going to be pretty useful to people. Yeah, just continuing on down that road just honing the product. This last year a lot of it was about … We did some rebranding, a lot of rebranding work. We did a lot of analytics kind of work. We’re trying to get better with our marketing and figuring out what our customers want and need and dialing in all of our business processes. This next year I feel like we’re going to be dropping some cool add-ons. Generally, a lot of it is going to be about product improvement. I, of course, think it’s fantastic, but it’s also software, right?

Blair: There’s always things that you want to clean up and make sure they’re working properly and performance enhancements and all of that. We’re going to be doing a lot of that this year as well.

Joe: Nice, that’s awesome. I want to follow up on something you said about getting better with marketing. At the time of this recording, “Post Status” published an article from Scott Bollinger about the WordPress theme and plugin ecosystem and how you used to be able to build something and then eventually people would buy it if it was good. That’s getting harder now. Have you noticed that?

Blair: Oh, yeah. There’s been a really dramatic, I think over the last five years, change in the WordPress community. You can see it coming out of being a hobby for people into this is my livelihood or this is my life blood kind of thing. This is one kind of question that I’ve had a lot because we’ve experienced growth every year, not like rocket ship growth, but good steady. You have to wonder how much of that is tied to WordPress’ growth, because WordPress is just exploded. You see it everywhere now and it powers so much of the web now that it’s got a lot of attention. It’s a bigger market. It’s not quite as much as everybody knows everybody kind of feel anymore. You have to do marketing now, right? You have to go out there and figure out SEO and Google ads and yada, yada, right?

Joe: Yeah.

Blair: The whole thing. I’ve noticed, too, that the branding has gotten really professional across the board, I think, with these sites. Then you’ve got entities like Woo and iThemes and stuff that are just getting bigger and bigger and more and more big business, man, than it has been in the past, right?

Joe: Yeah, absolutely. That’s some really great insight and I like that a lot. I feel like we’ve already gotten a trade secret. I’m going to end on my favorite question, which is do you have any trade secrets for us?

Blair: Twizzlers and Red Bull.

Joe: Twizzlers and Red Bull.

Blair: I think that one of the things that I think is a trade secret, at least for the developer/founder, is that first of all if you are going to develop a product, if you want to go from services into product, you pretty much have to control your own schedule and your work environment. Then the other thing is I think is another one, just don’t be afraid to work outside of general work hours. I know it’s hard balancing family and work and all that kind of stuff, but I think it can be done. I think it’s not a super huge … it seems common sense, but it’s how you do it. It’s all about the hustle, right?

Joe: Yeah, it’s all about the hustle, absolutely. I like that. I have a wife and daughter now and I try to be really cognizant of spending time with them, but on the same token there are some work days where I’ll knock off and play with them with the understanding that I’m going to have to make that time up maybe over a weekend or at night sometimes.

Blair: Yeah.

Joe: Finding balance especially when you work for yourself, especially for products, because your own schedule is really tough. I think that’s really great advice, especially for people who are just now wading into the product space.

Blair: Yeah. It can be tricky, but it can be done.

Joe: Yes, and then when you do it, I’m sure it feels like a lot of fun to most people.

Blair: Oh, yeah, it’s great. I love what I’m doing right now. It’s like play almost. Don’t tell my wife that, though, okay?

Joe: Mums the word.

Blair: I’m slaving away right now, right?

Joe: Absolutely. Awesome, well, that’s all I have. Blair, thanks so much for your time on the show.

Blair: Absolutely.

Outro: What a great conversation – thanks again to Blair for taking the time to talk to us today!

And Thanks again to our sponsors – make sure to check out Liquid Web for managed WordPress hosting. I use them on all of my important sites – they are that good! And they recently rolled out Managed WooCommerce Hosting too. They are at buildpodcast.net/liquid. If you want to save your clients (or yourself) money through recovering abandoned carts, check out jilt. They are over at buildpodcast.net/jilt. And finally, if you want to build incredible websites at a fraction of the time and cost, check out Beaver Builder. I use it and I love it. They are over at buildpodcast.net/builder/

For all of the show notes, head over to streamlined.fm/66/. If you like the show, head over to Apple Podcasts and leaving us a rating and review. It helps people discover us! Finally, last week I published my brand-new Patreon page. It offers a lot better rewards, and great goals, and I’m really doubling down on it. So if you like the show and what to support it directly, head over to patreon.com/howibuiltit/. You can support the show for as little as $1/month.

And until next time, get out there and build something!

2 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *