June 21, 2016

First, we would like to thank our sponsor today, which is Secure WordPress, the WP hosting platform of Network Solutions. With Secure WordPress, you can feel confident that your plugins are up to date, that you won’t have to deal with malware, and that your site is locked down for the ultimate in security. This means you can concentrate on your work and your business without worry. You can check out the product at getnetsol.com/applyfilters.

network-solutions

We get a lot of questions about development and about business in general, so today Brad and Pippin are doing a roundup where we answer our listeners’ questions. The questions came in via Twitter, and we try to get to as many as we can. Some of the topics you’ll hear about include:

  • Singleton vs. no singleton: When and why should they be used? First, a singleton is a structure where a class can have only one instance of it in its memory at one time. Brad and Pippin agree that there is not a right or wrong way that will apply to every scenario, but there are some instances where you clearly will need a singleton or to avoid having a singleton.
  • Page builders for WordPress 4.5: Are they similar to custom post types for WordPress 2.9? Pippin says he sees the similarity, because currently, page builders are a bit rough, but they’re ready to open the door to the natural progression of development, much as the custom post types did when they were new. Brad also talks about some of the differences.
  • How well WordPress fits into the larger PHP ecosystem: Brad says that many people who don’t use WordPress see it as still being a CMS or even a blogging platform. Pippin points out that since WordPress powers 30% of the Web, it’s a big part of the PHP ecosystem.
  • The most effective online marketing methods: Brad has a concrete answer, but Pippin doesn’t, and he explains why it’s so difficult to determine which of his marketing strategies has been the most effective.
  • Premium vs Freemium: Which is better? Pippin says that neither is a perfect fit for every product, but if he had to choose just one, he’d choose Premium. Brad, on the other hand, prefers Freemium much of the time — but not all of the time. Both explain why they feel the way they do.

Links and Resources:

If you’re enjoying the show we sure would appreciate a Review in iTunes. Thanks!

Transcript
INTRO: Welcome to Apply Filters, the podcast all about WordPress development. Now here’s your hosts, Pippin Williamson and Brad Touesnard.

BRAD: Welcome to Episode 63. This time Pippin and I will be answering questions from our audience on Twitter, but first a word from our sponsors.

I registered my first ever domain name in 1999, 17 years ago. Back then, there was one place to register domain names, a company called Network Solutions. Many of you probably already know this, but did you know that Network Solutions also has a WordPress hosting platform? They do.

It’s called Secure WordPress. It’s a managed WordPress hosting platform with an emphasis on security. They automatically keep WordPress core and your themes and plugins up to date. They have daily backups. They provide malware scanning and removal. And they put your site behind a data center class firewall to protect against zero day hacks and DDoS attacks.

They have expert tech support available 24/7 via chat and phone. Network Solutions takes care of keeping your site locked down and up to date, so you can focus on your business. Visit GetNetSol.com/ApplyFilters today to get started today. And now back to the show.

PIPPIN: All right. Let’s jump right in. These are questions that we solicited from Twitter that listeners were kind enough to submit. There are some development questions. There are some business questions and a few miscellaneous. We’re going to do our best to get to all of them, but any question that doesn’t get answered, we will move on over to a second episode of the Mailbag.

All right, let’s go with the first one. This comes from Josh Eby, and I apologize if I butcher your name or anyone else’s. Josh asked: Singleton or no singleton? When and why should they be used or avoided for a plugin? The WordPress Plugin Boilerplate (WPPB) no longer uses a singleton. Why?

Brad, do you want to jump in with your opinions on singletons versus no singletons?

BRAD: Sure. I actually really like the singleton pattern. The way I started developing WordPress plugins when I first started, I just wrote all my functions in the global scope, and I put a little prefix on the front of each one. I think it was usually bt, just my initials, underscore, and then whatever the function name was.

Then I started encapsulating groups of functions into classes. Then eventually I think got to singleton. The singleton allows you to maintain each of those classes as one object. We should probably explain what a singleton is first, right?

PIPPIN: Basically a singleton is a structure where a class can only have one instance of it in memory at a time. Usually with most objects you will instantiate an instance of that object, and you could have one, two, three, or even four instances. A singleton is a very appropriately coined term because it means there’s only ever one single instance of that object in memory.

BRAD: Right. That’s what I was trying to say. What I was doing before I was using singletons, I was just instantiating the class and then making the variable that I would set it to, like, global, I think. Then I learned about singletons and that allows you to maintain it kind of in a better way.

The way you usually do it is you declare a static variable within the class. Is that right? Is that how you do it?

PIPPIN: Yep.

BRAD: Yeah. Then you create a function. Usually it’s called “instance” and that will either get the current object or, if it doesn’t exist yet, create it. It’s just kind of a neater way, I think, of doing it. That’s my opinion. What do you think, Pippin?

PIPPIN: Well, first, I don’t think there’s a right or wrong way that fits every scenario. Singletons are one of those areas that hard-core PHP developers love to argue and spit at each other about because there are people that have very, very firm beliefs on both sides. I think that’s kind of silly and crazy to get so strict about it. There are times when it’s good. There are times that they make less sense.

For me, I use them in most of our plugins, but we use them sparingly. We use them to set up a single instance of the entire plugin. For example, we have an Easy Digital Downloads class in EDD and then we have one in Affiliate WP and we have one in others where that class is a wrapper to all of the other code in the plugin, so other classes, functions, methods, et cetera. That single class, that singleton class, is kind of our main entry point into the rest of the code.

For example, if you want to access the database class, instead of instantiating a new instance of that database, you simply reference the singleton, which then has a property inside of it that contains an object of the database class. That works really well for us.

BRAD: Do you wrap that in a function, because I’ve seen that as well?

PIPPIN: Yes.

BRAD: Maybe you have a function called EDD or something.

PIPPIN: Yep, that’s exactly right. We have a class called Easy Digital Downloads, and then we have a function called EDD. If you want to get the instance of the database class or an instance of the database class, you could simply say, “EDD customers DB,” and you would treat the EDD function as an object because that’s what it returns. That function simply returns the instance of the Easy Digital Downloads class.

BRAD: Right. Then that lends itself to chaining as well, right?

PIPPIN: Yes, which is exactly what we use it for.

BRAD: Right, which it’s just kind of nice code.

PIPPIN: Yep.

BRAD: You can see just so clear and so nice and neat.

PIPPIN: The main time that I would say you shouldn’t use a singleton or honestly I think there are far fewer cases where you should use one than when you shouldn’t. If you are ever going to extend a class for any reason or you might want multiple instances of it, don’t use a singleton.

BRAD: Right. Why?

PIPPIN: Well, because a singleton, inherently there’s only one instance of that class in memory.

BRAD: Right, right. Sorry. I meant why is extending it bad.

PIPPIN: Extending it may be not, not necessarily bad.

BRAD: Yeah.

PIPPIN: I’m going to have a hard time answering that question.

BRAD: Yeah, I’m not sure either, actually.

PIPPIN: It gets tricky, honestly.

BRAD: Yeah. I’m just trying to think of where the problem would lie if you extended it. I don’t think there would be an issue. Technically, you could override a class that’s set up as a singleton.

PIPPIN: Right.

BRAD: And you could still use it as a singleton.

PIPPIN: I know that on our wrapper classes that we used for the plugin loaders, we almost always declare final on them intentionally so that they cannot be extended.

BRAD: Right.

PIPPIN: Because they are not designed to be extended. They are simply a wrapper. They are not an actual object.

BRAD: Right.

PIPPIN: Or they’re not treated like most objects are.

BRAD: Right. Let’s work with concrete examples. If you were writing a class that represented, let’s say, an order in EDD. Yeah, let’s say an order. Then that one, you would probably want multiple instances of an order, potentially.

PIPPIN: Oh, absolutely.

BRAD: Right, so that would be an example that would not work for the singleton pattern. You don’t want an instance method in that class.

PIPPIN: No, because in that case you’re going to run into a problem. Let’s say that you instantiated an order object and it was set up as a singleton. Then a little bit lower down you instantiated a second instance of it. Let’s say for a different customer, it’s not going to work.

BRAD: Right. That makes sense.

PIPPIN: Josh had asked about the WP Plugin Boilerplate saying that it used to use a singleton and no longer does. We went ahead and actually asked Tom McFarland, the original maintainer of the plugin Boilerplate what his opinion was on it. Now, the Plugin Boilerplate has actually been transferred to a new owner at this point, so Tom is not involved any more and was not involved with the decision to get rid of or change a singleton, but he did still have a really good answer, and so we went ahead and get one from him. Here it is.

TOM: Even though I included the singleton in the Boilerplate and I do use it, I don’t want to push the idea that it’s the single one way to be building classes or that it’s how it should be the de facto way of doing something because, A, if you just have singletons everywhere, you’re kind of defeating object oriented programming. Two, if you are just working on a single point of entry and you have a bootstrap file and you need to start the plugin up, creating a single instance for that main class makes sense, but doing so for all of them doesn’t.

It being removed makes me wonder. I would want to have some context because otherwise you’re just going to have all of these orphaned instances sitting in memory and it’s going to be spitting everything up whenever the plugin starts.

BRAD: Cool. That was a pretty great answer. I think he did a much better job than I did explaining it.

PIPPIN: Tom echoed kind of the way that I think you and I both use singletons as well is using it as that wrapper, basically, for the plugin load process.

BRAD: Yeah. Yeah. Yeah, so should we move on to the next one?

PIPPIN: Yeah, let’s do it.

BRAD: All right, so this one came from Jamie O. He says Page builders around WordPress 4.5 feel like Custom Post Types around WordPress 2.9. Agree or disagree? How to make core get better here?

You understand what he’s talking about here. I think I missed–

PIPPIN: Well, I think I know what you’re talking about, Jamie. If we are completely wrong or mostly wrong, feel free to let us know. We would love to follow up with this.

I think what Jamie is asking, so first he’s saying that originally when custom post types were introduced in WordPress 2.9, they were a little bit limited, but they were also kind of that door to a ton of new features or the door to significant change in the way that WordPress plugins are built, WordPress themes are built, and the way that WordPress sites run the kind of features you have. And so page builders right now feel a bit like custom post types did in 2.9 in that they’re a little bit rough. Everybody is using them differently. But they are kind of that doorway to see what the next ten years of WordPress will be like to true front-end editors that are ubiquitous or a uniform standard, things like that. I think that’s what Jamie is asking and suggesting.

Agree or disagree? I don’t. I’m a little bit torn. I think page builders are a little bit rough right now because they’re a little bit like the Wild West in that everybody is doing them their own way and doing them differently. There is no standard for how to do it. I think they have a lot of potential for pushing WordPress further and changing the way that users use WordPress. I’m a little jaded as well because I personally don’t like them.

BRAD: Right, but is that because they’re immature and you just don’t like kind of the current state of affairs or you just don’t like the idea anyway?

PIPPIN: I think the idea is great. We’ve seen drag and drop interfaces and layout builders for years in tons of different things, I think, like the form builder plugins to — shoot, that’s the best example I have. But drag and drop interfaces where users have the flexibility to tweak and change things they way they want through controls without actually diving into CSS or things like, I mean they’ve been around for a long time and I think they’re here to stay. I do think that page builders are problematic right now because everyone is different and some of them are better than others at not locking users into that page builder. That are some page builders right now that if you use that to build the content on a page and then you want to move to a different page builder, you’re pretty much screwed because of the way that they work.

BRAD: Right, it’s a lock in. Right.

PIPPIN: Right.

BRAD: That’s a good point.

PIPPIN: For me, it’s that everyone is different. There is no consistency between them, and that lock-in effect. I don’t think that those are necessarily things that you can avoid. Those are natural progressions of the evolvement of a feature of interfaces of things like that. We saw that a lot with custom post types at the beginning when they were brand new as well.

Everybody registering their own post types for different things and locking content into those particular plugins, and now we’ve moved away from that a little bit, created some consistency. I think, overall, the comparison is pretty accurate.

BRAD: Yeah. I think the thing that differs the most here is that custom post types was an initiative by the WordPress core team whereas page builders have been largely third party, right? Largely people from the community building products, which is why you have this kind of fragmentation, right? That’s how things go in the free market, which is fine. To solve the problem that you were just talking about, about lock-in, there is only one way to do that, and it’s to get it into WordPress core, right? Do you follow the Fields API kind of stuff in WordPress core?

PIPPIN: I follow it a little bit.

BRAD: Yeah. Isn’t that kind of what they’re tackling there a little bit?

PIPPIN: To me it’s much like the customizer, not to say that the Fields API and the customizer are the same thing–not remotely–but they are both stepping stones to getting some kind of page building interface, front-end editing interface, et cetera into core.

BRAD: Yeah. Yeah, it makes sense. Should we move on to the next one?

PIPPIN: Yep. All right, so Frank Klein asked: I’d be interested in your thoughts about whether and/or how well WordPress fits into the larger PHP ecosystem.

BRAD: Hmm.

PIPPIN: Do you want to tackle this first?

BRAD: That’s a big question.

PIPPIN: It is a big question.

BRAD: I feel like WordPress is definitely still a CMS for the most part. I think that most people outside of the WordPress community still views WordPress — I mean some of them still view WordPress as a blog system and not even as flexible enough to be a content management system. I think that’s changed a lot, though. I think WordPress gets quite a bit of credit to being a CMS nowadays.

I think, within the community, we think of WordPress now as an app platform. It’s gotten to that point, especially now with the REST API. It’s really kind of going in that direction.

My gut is telling me that I don’t think people outside of the WordPress community in the larger PHP ecosystem really see it that way. I’d say they probably see WordPress as a CMS or a blog.

PIPPIN: I think there are some other ways we can look at it too. The first one is that you’re damn right WordPress fits into the larger PHP ecosystem because it powers 30% of the Web. Whether the PHP world likes that or dislikes it, it is the fact. It’s the way it is. And so that being said, it means that the WordPress user base is a huge chunk of the PHP user base, and so there has to be communication back and forth in both directions.

BRAD: Yeah. I think another way to look at it is I think people outside of the WordPress community, people that develop on more modern frameworks like Larval, for example, they look at WordPress and they see old code that they don’t want to be working with. I think that is a big problem that we face in the WordPress community in attracting talent to work on WordPress plugins or whatever.

Some developers don’t want to touch WordPress. They’re much happier with Larval or another kind of more modern framework that are using name spaces and all the other nice features in the newest versions of PHP. I guess there are all kinds of ways to look at this question.

PIPPIN: I think, as people that spend a lot of time in the WordPress world, I think every WordPress developer should do themselves a favor and pay attention to the outside PHP world because there is a whole lot that can be learned and there’s a whole lot that can be gleaned from it. And, at the same time, I think it should go the other direction. I think the larger PHP community, whether it is Larval or Codeigniter, all of the other different PHP frameworks, I think they should be watching WordPress at the same time.

There are two main examples where I think they would learn from WordPress. Number one is updates. WordPress has proven to have one of the most reliable update systems of any system out there, especially when it comes to fixing security problems. I mean it’s a little bit ironic or maybe not ironic at all, and I don’t think this is a coincidence. WordPress was originally known for not being secure, and yet now WordPress has a single best track record for fixing security problems and getting them pushed out to millions of sites faster than anybody else. That’s something that I think every PHP project should look at trying to emulate. That wasn’t an accident. Number two is that respect for backwards compatibility while also fixing security problems and delivering them everybody within minutes. If there’s any impact that WordPress could have on the world, the entire development world, really, it’s those two aspects, in my mind.

BRAD: It’s interesting, though, the backwards compatibility thing because I’m just thinking of Larval in that context. I think they probably don’t look at backwards compatibility the same way. That they just move forward with the latest, greatest. It’s a little bit different situation, though, too, I think.

PIPPIN: I mentioned updates and security; I mean backwards compatibility and security through the update system. I think you have to look at both of those two together because, honestly, if you want to have an update system that updates every single WordPress site within minutes, you have to treat backwards compatibility as a foundation because, if you don’t, every time you update you break millions of sites, or hundreds of thousands, or however big your user base is. And so those two are intrinsically tied together.

BRAD: I wonder if it’s even fair, really, to compare WordPress to Larval, right? They’re used for two very different things, for the most part. I don’t know.

PIPPIN: Yeah, they really are.

BRAD: Yeah. What do you think about that?

PIPPIN: I don’t think you can compare them in terms of features or focuses or what they do. But I think you can still take bigger picture lessons from each of them.

BRAD: Right. Yeah.

PIPPIN: I think that applies to any kind of project.

BRAD: Cool. Should we move on?

PIPPIN: Yep. All right, so you take this one.

BRAD: Sure. Jonathan Christopher says: Guidelines for determining using a filter that returns true or false versus an internal add action call.

Hmm. What do you think?

PIPPIN: I’m pretty sure Jonathan is asking, like, let’s say if you have a filter and that returns true or false or returns the value from another action or filter. Is there a guideline for determining that? I may completely be misunderstanding that question.

BRAD: I’m not even clear on what you just said.

PIPPIN: Yeah. That didn’t really make sense. Let me try this again. Let’s say that you have a function and its return value is either true or false. Then in another scenario you have a function and its return value is a filter, is the value passed through a filter or the value from an action, like a reference array. What’s the guideline for choosing when to do that? So like when should you make your function extendable via a filter? Jonathan, if that’s not what you’re actually asking, follow up. Let us know. We’d be happy to answer it again.

Let’s do this. When should you make a function or, not necessarily a function, a return value filterable or have actions around it?

BRAD: That’s tricky because it depends on the use case or it depends on the scenario because you may want people to be able to extend that or maybe not. It depends.

PIPPIN: In some cases allowing people to extend it is allowing them to break it.

BRAD: Sure. Yeah, or maybe it’s allowing them to circumvent your licensing or who knows what. There are all kinds of reasons you might not want to filter something. Maybe it’s a UI thing. Maybe it’s allowing them to filter it, they could completely change the UI and make your product look terrible or ruin it. Maybe that’s a concern; maybe it’s not.

PIPPIN: Here’s an example that we had recently. Actually, I’m going to change it a little bit. We recently introduced a new class in EDD, and we’ve done this in Affiliate WP as well, but it was a new object for our payment record, so it was basically an order object. We chose to put the keyword “final” on the class because we did not want anybody to extend it yet.

We did that because we were not sure that we had set this class in stone. We weren’t sure that we weren’t going to change it over the next five point releases, and we didn’t want to unintentionally break somebody’s code because they extended it before we were ready for them to extend it. I think can take the same mindset and treat filters the same way, filters and actions.

When you use them, and I do believe you should use them prominently, you should make sure that you’re using them in a way that you’re not going to change in a week or in a month. It’s something that, at least for now, you plan to leave it as is for the foreseeable future because the moment that somebody ties into that filter or that action, you now have a backwards compatibility issue if you choose to change it.

BRAD: Yep. I think let’s go to the next one.

PIPPIN: Jonathan had another question, actually, and he said: What should be an object versus what should be a standalone function?

BRAD: Well, the way I look at this is objects should be objects. An order should be an object. If you’re doing a site for cataloging music, maybe you have albums. That would be an object.

PIPPIN: Then maybe the album contains song objects.

BRAD: Yeah. Yeah, sure, and then maybe it also relates to an artist object. This is basic object-oriented programming stuff. I think, a standalone function in the global scope, we just gave a really good example of that. Your EDD function that kind of launches the singleton for your class, that’s a perfect example of a function that belongs in the global scope.

If you have a function, let’s continue with the album thing, like get_album, in the global scope. Well, if you get maybe that inside that function, it’s actually a call to create a new instance of the album object and return that album object. That might be a good idea to have a global function for get_album so that you can do it with less code. If you’re getting the album a lot, maybe that makes sense instead of having to instantiate the object and then do a get call for every time. Maybe save three lines or four lines of code there.

Generally speaking, though, I would put most of my global functions that I used to put in the global scope, I would put those inside a class now. What about you?

PIPPIN: Yeah, I would echo the same thing. Remember to keep in mind that a function should do one thing and one thing only. A function shouldn’t be doing three things. A function should be doing one.

In this case, get_album, the only thing that would ever do is return an instance of that album object. You could then have a separate function that would say get_album_songs or get_album_date, and all it does I retrieve those properties from that object, but it’s usable in the global scope.

A WordPress core example would be the WP post object. It is an object that contains all of the data for a post in the database, and then there are many global functions like the title, the content, et cetera. All they do is go and retrieve that field from the object.

BRAD: You’re talking about template functions, I guess, there, so that’s another can of worms.

PIPPIN: Yeah.

BRAD: Yeah.

PIPPIN: Okay. Let’s go on to Dan’s question.

BRAD: Dan Beil asks: Your opinions on using classes without ‘real’ object oriented programming.

Do you know what he means by that?

PIPPIN: I like his question.

BRAD: Okay. Can you explain it to me?

PIPPIN: All right, so object oriented programming is the idea of working with objects, so we’ve talked about an album object that maybe then contains song objects, the WordPress post object, an order object, or perhaps a customer object. Those are true objects.

You could also have classes that are nothing more than a wrapper for a bunch of methods inside. Let’s say that you used to have a whole bunch of functions and they’re all prefixed with your unique prefix, so like mine used to be pw_. Brad, I think you said yours was bt_. You could have all of these global functions and they’re all pseudo name spaced, a.k.a. they’re all prefixed with your prefix.

But what if you wanted to instead of have only one prefix or only one thing that is prefixed? What you can do is you can set up a class. Mine would be pw_ whatever the class is called, and then that contains all of those–what were global functions–as methods without any prefixes, so something like get_order, get_albums, get_songs, get_ whatever I want, and I can have all of these lists of functions. For example, I could have a helper class that is just a bunch of helper methods.

We actually used one in Easy Digital Downloads. Well, we used several, actually. One of them that we use is called EDD HTML Elements. All it does, that class has a bunch of methods that return standardized HTML. We have one for get_product_dropdown, get_text_field, get_select_field, so that we can use these throughout our code base without having to rewrite all the HTML at one time. I have no problem with classes that are not ‘real’ object oriented programming.

BRAD: Right, so they’re classes that don’t represent objects.

PIPPIN: Yes.

BRAD: Yeah, I’m fine with it too. If the alternative is just to prefix a bunch of global functions, I don’t see much difference between that, between the two.

PIPPIN: I will say that this case, these kind of classes are perfect examples of things that I think singletons work really well for.

BRAD: Yes. Your example at the start of the show where you were talking about the EDD or the Easy Digital Downloads class, that’s a perfect example of a class that’s not an object but contains a bunch of methods that are not in the global scope.

PIPPIN: Mm-hmm.

BRAD: Yep. Yeah. Totally fine.

PIPPIN: All right.

BRAD: Let’s move on.

PIPPIN: That’s all of the development questions we have. Now we’ve got a couple of business questions, and we’ve got time for just a few more questions. Any others we don’t get to, we’ll get to on another show.

I’m so sorry. I’m going to butcher your last name. Joe G. — because that’s easier for me.

BRAD: Joe Guilmette, I think, is how you say it.

PIPPIN: Guilmette. All right.

BRAD: That’s how I’m going to say it.

PIPPIN: All right. Joe asked: What has been the most effective online marketing method? To what do you attribute the majority of your sales?

I can’t answer this question. Brad?

BRAD: On the online marketing method? Oh, right, because you did all the word of mouth. Is that what you mean? That’s why you can’t answer it?

PIPPIN: I’ll elaborate in a moment. Do you have a good answer for him?

BRAD: Okay. What’s the most effective online marketing method? It was just blogging for us. We started blogging weekly just over a year ago, and we have, I think, six times the traffic to our blog now than we did a year and a half ago.

PIPPIN: Have you been able to now measure that in sales increase?

BRAD: No. Yeah, I can’t attribute it to sales directly. But, indirectly, people have told us, “I followed your blog. I read a bunch of your blog posts and then I just bought your product because I was just so impressed.” Those kinds of comments lead me to believe that it’s working, but it’s really, really difficult to track exactly what impact blogging is having on sales because we’re also running Facebook ads. We’re running remarking campaigns. There are all kinds of different ways people can be influenced to buy, right?

PIPPIN: Right. It’s hard to say they bought because of that.

BRAD: Yeah. It’s called attribution, to be able to attribute a thing to the sale. It’s extremely difficult, and I’ve kind of just given up, to be honest. A company of our size without a dedicated person that just focused on marketing, we just don’t have the time to be trying to figure out what each sale, how each sale came about. Yeah, we don’t spend any time on that. We just do kind of the things that we think are going to work and kind of use a like a gut feel for is it working, is it not working.

One of the best ways to determine if it’s working or not: Just turn it off; see what happens.

PIPPIN: There you go.

BRAD: Yeah.

PIPPIN: Potentially a costly experiment.

BRAD: Yes, it can be.

PIPPIN: I’ll see if I can now try to give an actual answer. I said I couldn’t answer it originally because part of me doesn’t really know. Again, we have all of these different efforts, just like what you mentioned, Brad. We can measure results from them, but there are so many indirect influencing factors on everything that we do.

Is our email marketing that we do the most successful? Well, we know it works, but how much of it — how many sales did we influence but didn’t get directly attributed to? We don’t know. How much has our blogging done or the community outreach we’re doing at WordCamps? How do all of those affect? It’s hard to measure.

I will say I think there are two or three, really, that I have found to be absolutely successful to varying degrees. Number one is blogging, just like you mentioned. There is no question about it. We don’t necessarily have an exact measure on it, like every time we blog we make $500 more. No, we don’t have anything like that, but we know that consistently it drives traffic and that drives sales.

Next is our email list, getting people subscribed to that. We’ve had a few ways that we’ve been very successful with it. The main one inside of Easy Digital Downloads is rewarding people with a discount code and an email subscription if they will opt into anonymous data tracking. If you install EDD on a WordPress site, you will see that you’re asked if you would like to opt in. If you do, you get a discount and you get put into an email list that then has some automation routines.

I think the automation routines in our email list are incredibly important. For example, we have some email flows that happen the moment you get subscribed to the list. We have other email flows that happen any time you purchase a particular extension. There are other flows that happen the moment you purchase anything from the store. There are all of these automated follow-up emails, and those are absolutely valuable and work really, really well.

BRAD: I have something to add to this as well.

PIPPIN: Yeah.

BRAD: Dave Collins is kind of an expert on SEO, and he’s pretty smart. He knows a lot about paid advertising, and he was on the RogueStartups podcast a little while ago. They were talking about attribution.

He brought up how, in the past, marketing companies didn’t know exactly. They couldn’t track every single person. It’s only with the Internet that we can actually set a cookie and track people exactly where they go and everything. We’ve got all this data now, but really no good way of making any sense of it.

But, in the past, you would take out an ad on a billboard beside the highway or something. That was part of a larger campaign, right? There were billboards. There were magazine ads. There were TV ads. There were all these things that made up the whole campaign. They would just measure the affect on sales of that campaign. If you ran the campaign in May, how did it affect May’s sales?

What I took away from that is that I should stop being so granular. Stop looking at all the details and just kind of look at the bigger picture.

He also told a story about one of his customers, how they just turned off their Google ads because they couldn’t figure out if they were working or not, and their sales plummeted. And so they turned–

PIPPIN: So they were working.

BRAD: They turned them back on immediately. Yeah, so they were working. Yeah. We have all this data, but it’s not necessarily–

PIPPIN: I think right there you just made maybe an important takeaway for anybody. It’s hard to say what works and what doesn’t if you’re constantly doing all of these different things. But, if you want to test the effectiveness, turn it on, turn it off, and do that a few times. Then start comparing.

Maybe if you’re doing a whole bunch of email marketing, do it and then don’t do anything for a month. Do it; don’t do anything for a month. Now, that might be a little dangerous because you don’t always want to play with fire, but I think that’s a good way to figure out the effectiveness. If you turn something off and you discover there is zero change, you should probably stop doing that.

BRAD: Yeah. It’s also dangerous to not know, though, too.

PIPPIN: Yeah.

BRAD: Right?

PIPPIN: True.

BRAD: You could just be flushing money down the toilet, so it is probably a good idea to test that things are working. I’ll link up to that podcast in the show notes. I highly recommend. Dave is a genius with SEO and paid advertising, so check that out.

PIPPIN: Great. Do we have time for one more?

BRAD: Sure. James Northard asks: Freemium or premium model? Which do you prefer and why? Growing leads seems easier with freemium.

Ooh, this is a good one. I’ve got a lot to say about this, but do you want to start?

PIPPIN: Sure. Well, first, there’s not one perfect fit for every product. It’s a little bit cliché, but I think it’s absolutely true.

If I had to pick one, though, I would go premium only, and that’s based purely on my own experience of having done both models and variations of both models overall. I personally enjoy the premium model more. I think it’s a lot easier to maintain. It’s easier to work within.

All right, well, since we’re talking marketing and business, I’m going to put it this way. It’s a heck of a lot easier to get $59 out of somebody if you are a premium only product than if you’re a freemium. That’s simply because, if they want it, they’re going to pay for it. If they don’t, they’re not.

You don’t have to worry about people that come in, use the free version, and then spending hours or multiple emails or anything trying to up-sell them to get them to actually upgrade to a paid version. If you have a premium, they’re either in or they’re out. That would be my main reaction.

BRAD: Right. Easy Digital Downloads would be considered freemium, I think.

PIPPIN: Uh-huh.

BRAD: Then Affiliate WP, because you don’t have a lite version or any free version anywhere, that would considered premium, right?

PIPPIN: Yup.

BRAD: Only.

PIPPIN: Then Restrict Content Pro would pretty much be premium as well.

BRAD: Right.

PIPPIN: It does have a free version, but it’s not even the same plugin.

BRAD: Right. I actually only do freemium. Our two plugins have lite versions and then we’re up-selling to premium. I personally like that better to give people a taste of the quality of your product, et cetera. I find it’s hard to do trials with WordPress plugins because you kind of give it away if you just give people the product.

I do like freemium and up-selling people, but I do think you have to charge a price from day one. If I had to choose between having a paid version on day one and no lite version or having just a lite version, I would choose having just the paid version on day one because it sets the expectation for the product, right? If people only see the free version ever and no up-sell to the pro, their expectation is that it’s always going to be free and new features are always going to be free. I feel like a lot of it is about expectations.

PIPPIN: Expectations are one of the reasons why I like the premium only as well. There are a lot of people that will be mad, with a freemium model, freemium, will be irritated, disgruntled, mad, what have you if they’re using a freemium version and then they discover that the feature that they need is in the premium version. For whatever reason, the experience of upgrading is often harsher or more difficult for users to cope with than it is if you just had to purchase it to begin with. I don’t know why that’s true, but it seems to be that way. I think, overall, at least our own interactions with customers tends to be more positive with a premium only as opposed to trying to push upgrades onto free customers.

BRAD: Right. Huh.

PIPPIN: Now, I could be completely wrong, and that’s entirely subjective and it’s based on my own experience. It’s not going to be the same for everybody, but that’s my thought.

What about the next part of his question about growing leads seems easier with freemium? What do you think?

BRAD: Yeah, I kind of was just going to bring that up. Is the WordPress.org repository worth it, because you can’t put a premium plugin in there? So your only option, if you want that marketing channel, is to put a free plugin in there that does provide value and support it, a little bit anyway. I mean not everyone does support their free products, but what do you think on that?

PIPPIN: I think it’s definitely easier. It’s very successful for us with EDD because every time that somebody installs a free version, we ask them if they would like a discount code in exchange for their email address and anonymous data tracking. I’ll tell you there is a lot of people that will opt into that. The majority do, actually. And so we get tons of leads. Our email list is huge because of that. And, if we didn’t have that, our email list would be significantly smaller. The Affiliate WP email list, for example, is minute in comparison, and it’s because we don’t have that access to the leads from WordPress.org.

Now, that being said, that does not mean that those leads are inherently valuable. As it stands right now, Affiliate WP and EDD are almost equal in terms of their monthly value in revenue, and one of them has hundreds or thousands of leads every single month from WordPress.org and one has zero.

BRAD: Right, but also what’s the support casts between–

PIPPIN: Right.

BRAD: –difference between EDD and–

PIPPIN: (Indiscernible)

BRAD: Because you’re supporting all those free, the free users, you do have to support.

PIPPIN: Right. Yep. I’ll tell you EDD is much more difficult for us to support than Affiliate WP by multiple magnitudes.

BRAD: Right. Right, so there’s another kind of argument for the premium model against freemium.

PIPPIN: Yep. I don’t think there is one answer for anybody. I think it’s very subjective. It largely depends on what’s the product, how do you want to run it. But I think it’s important to look at the positives and the negatives of both sides.

BRAD: Yeah, I agree. It depends on the nature of the product as well, I think.

PIPPIN: Definitely.

BRAD: I think EDD is better served as a plugin, like a free base plugin with add-ons, it seems anyway.

PIPPIN: Yeah, I think so. I’m not sure that EDD would work as a premium only product. It might. I can’t answer that because we’ve never done it. I wish there was a way that I could answer that question and figure it out because I’d love to know, but that would be a pretty tough experiment.

BRAD: Right. There is no other e-commerce plugin for WordPress that’s paid only, is there?

PIPPIN: There used to be. Shopp plugin was paid only, originally.

BRAD: Right. What’s its current status?

PIPPIN: They changed to the freemium model.

BRAD: Oh, they changed to freemium. Wow. That would be a good question to ask them then, “Why did they change?”

PIPPIN: It would.

BRAD: And how is it going?

PIPPIN: And was it a positive or negative in the end.

BRAD: Right. Maybe for a future episode we’ll have someone on from Shopp.

PIPPIN: That’d be great.

BRAD: Yeah.

PIPPIN: All right, well, we’ve got a few questions left. We will include them in another episode of the Mailbag. If you have any questions, feel free to send them to us on Twitter or via email or through the website. We’d love to hear them.

BRAD: Great. Thanks, everybody.

PIPPIN: Thank you.