The Case for Using Single Licenses and How to Implement with Easy Digital Downloads & Software Licensing

At Sprout Apps I wanted Sprout Invoices 1 to be the only product that had a license, with all add-ons (or extensions) using that license to receive automatic updates (or validate against). This provides a lot of benefits, mainly:  a better customer experience, and improved recurring sales 2.

If you’re not with me, consider your customer’s point of view when they purchase your main product. Then they purchase a few add-ons, or if they’re awesome a lot. If you’re not using a single license to validate updates against than they’re experience would be similar to this: after happily purchasing a ton of add-ons, they’re excited to use them and download them all but notice that each has their own license key, they install and activate them all, then they go to a page (like the one below) and start copy and pasting all the license keys.

license key problems

Since this customer is awesome, they: didn’t close the browser window with their purchase receipt to easily copy their license keys, didn’t accidentally copy the wrong license key (possibly the key they’re familiar with, that being the main product they purchased last week), and they definitely didn’t forget to enter their license keys. And since you’re awesome too, you made it clear that they needed to enter their licenses so they could get updates and not run a really old version.

I’m awesome, at least I’ve been told that by at least two people, but that screenshot above contradicts this. I was either too lazy or forgot to enter the license key for two EDD add-ons. I’m not lazy…wait, I rather admit that I’m lazy.

Yes. I’m advocating, that the main download is the only license that needs to be renewed.

The only argument I’ve heard against using a license of a main product for add-ons/extension, is the lost revenue from recurring license from those extensions. All I have to say, I doubt the rate of your recurring licenses on your main product is as high as it could be and the rate at which people renew add-ons that get updated every 6 months (because of a bug release, since they’re single feature add-ons) is extremely low. Point being, your main product should drive recurring revenue, not the add-ons.

“So what about shops like Easy Digital Downloads? It has a main product that’s free, and has a ton of extensions.”

Well, Pippin, that’s a great question (I’d love to answer that for you, even if my imagination asked it). Your business model is different, you’re main product is free for starters, so don’t worry about what I just said about recurring revenue. What you should worry about is the license key experience your customers are subjected to. I would recommend you give each user a single license key, use that key to validate and query the user object, use item_id (which will be used in the example below) to lookup if there’s an update and cross reference if the user (which you know via the license key) has an active license for that single item. In this/your case the license key is distinct, it is not a product license key, it’s more like a user API key 3. You can use the item_id argument that I’m going to document for the rest of us below too.

“How would I use single license on my site, like you have at Sprout Apps?”

Another great question, that’s for asking Jonathan. Since you know I used EDD and Software licensing, and you’ve been following this topic since my first pull request in September of last year, it’s rather simple to implement with the latest PR that was merged into version 3.1.4 of Software Licensing for EDD.

The steps below assume that you’re already doing what’s needed to communicate to your customers that you only need the main plugin’s license key; these steps are only for the add-ons/extensions, since the main plugin should work as is.

First, pass the item_id in the args array when instantiating the plugin updater.

Notice that it’s the almost the same as before, except for the ‘item_id’ argument. That value is critical for Software Licensing to know what download/product to get the update information for; it is not the main product’s ID, it is simply the post_id of the EDD download.

Note: Make sure you’re using the latest updater class, otherwise item_id will not get passed within the api_request to your site.

The only other step is to make EDD-SL not validate the license’s item_id with the item_id given, which is the default behavior 4.

Note: I recommend placing this conditional in your wp-config.php file for reasons I don’t want to bother mentioning (in this already long post that I intended to be very short).

That’s how to use a single license key to validate multiple downloads/items with Easy Digital Downloads and the Software Licensing Extension.


Still there? I hope not, that would mean I haven’t convinced you to change how you’re currently handling licenses and you’re waiting to post a rebut in the comments.


  1. Help Scout Desk is another product but at the moment it doesn’t have any add-ons, and I’m not sure it ever will.
  2. I can’t prove improved recurring sales, especially since I don’t have a control group, however when I compare the recurring rates others are writing about and those I’ve experienced using this same model at SeC it’s huge difference.
  3. Which IIRC ever user already has an EDD API key.
  4. Hope that part makes sense. What EDD-SL does it get’s the item_id from the license key, then in a conditional later it checks to see if it matches with the item_id that you just passed, if there’s a mismatch than an error is given in the response and no update info is produced.