Menu Sidebar


I'm on twitter @dancameron and this is my site so you'll want to read my about page too.

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. 

2014, Opportunity Loss

I hoped to write a “2014 Review” post last Thursday (the 1st) but I took the family to Knott’s instead — balance, ‘m I right?

Honestly, I had plenty of time to write this post, it’s not like I didn’t know how things were going weeks before. The real problem wasn’t time, it’s that while I have context, I don’t have a story I want to tell. Then I read Lema’s post about transparency and decided I had to write a backstory of 2014.

Up until the mid-point of 2014 things were smooth, still running a services business with some awesome recurring client work and things looked as though it would be a repeat of 2013 (which was great), but do to some misfortunate events I came to a point that my business had to change. The choices were nuanced but boiled down to: hustling more client work, as I’ve done since going freelance; or build a new product business for myself, something I’ve been doing for someone else for years prior 1.

Obviously I chose the later and built out Sprout Apps.

The business plan for Sprout Apps was always get the product out there, struggle for a few months while building customers and building the product, then build new products while the core app (Sprout Invoices) led the way. It’s been six months and I’m still struggling. Sprout Apps is not a failure but it’s hardly a success.

While I’d welcome the opportunity to write about my $350k+ or $700k+ WordPress product business I can’t. I love Matt’s response for so many reasons but his immediate response to these success stories will make me buy him beer…

That’s over 1 Million in revenue across 3 plugins and 2 businesses. First off, I applaud them as founders and their ability to build products with great teams surrounding them.

Now what about me? 9 fucking grand.

I don’t know about their financial goals for 2014 but mine were simple, that’s probably why writing about my non-success is so frustrating. Since a successful year for me would have been to build a business that sustained me full-time in 2015, with a stretch goal to hire a friend for support and development. That’s it!

Screen Shot 2015-01-05 at 10.51.54 AM

This sales report for 2014 looks awesome, right? Well, I’ll let you on a little secret: that’s a sales chart of a business operating at a loss with a single employee with a modest salary (me). In the coming weeks I’ll have a solid operating cost but from my estimates it’s…hrmmm…not depressing. I surely don’t feel defeated, it’s something I had anticipated. That’s why I’ll continue the challenge of building a WordPress product business through 2015.

The truth is, as Matt and James (from Ninja Forms writes), it takes time and commitment. Two things I’m lucky to have.

My story for 2014, turns into a TL;DR, with:

Sprout Apps operated at a financial loss last year and I will continue to heavily invest in it throughout 2015. Whether this is a “precursor to greatness” I’m not sure, personally I’d settle for a precursor to financial mediocrity and product greatness. 2


  1. I wrote a little about the decision to more into the product business here.
  2. Hopefully I’ll be writing these box reviews quarterly, along with more info about what I’m doing to help grow the business.

Progressive Pricing (with recurring pricing) for Easy Digital Downloads

A little background first…

To celebrate Christmas and get Sprout Apps jump started for the new year I’ve launched a huge discount on Sprout Invoices and Help Scout Desk. The sale sets the cheaper monthly plans of Sprout Invoices to a $1, then each day the price will increase until Christmas day (when I’ll just manually remove the filter I’m using below). This means that SI is a dollar today, two dollars tomorrow, and so on. For the yearly plans (which HSD uses) the price starts at 50% off and progressively decreases until the price is 100% of what it was.

How I’m handling this…

If you’re not using licensing with signup fees than I recommend you find the filter to change the price, then use similar logic to dynamically adjust the pricing. Since I’m using the licensing add-on for EDD with recurring payments than things are a bit more complicated 1.

Here’s a screenshot of the pricing for Sprout Invoices. You’ll see that the “price” is the recurring rate and the “signup fee” + the “price” is what people pay today. Hope that makes sense but I guess if you got this far you understand how the Recurring Payments add-on works.


With this sale I’ll need to change what people pay for the Freelancer license from $34.95 to $1. So how do I do that?

You’ll notice that I’m modifying the signup for all items, with a negative value (depending on the day). Remember that the pay today price is the “Price” plus the “Signup Fee”, so manipulating the signup fee will adjust the initial payment but won’t mess with the recurring price.

For example, the pay now for the Freelancer was $1 yesterday because the signup fee was set to negative $4. Removing the Signup Fee while decreasing the price.

Another more complex example, the pay now price for a Business Yearly yesterday was $70 because the signup fee had a negative value of $70; which is 50% off the total price. e.g. $140-$140*(((25-{day})*2)/100). Now tomorrow that percentage off will decrease automatically until the 25 day of the month when it will be 0% 2.

Hope that helps anyone else looking to manipulate the pricing of EDD products with recurring payments. Any suggestions?

Oh yeah. I forgot to mention that I’ve customized the checkout_cart template within the site’s theme so that the discount can be more visible.

Screen Shot 2014-12-02 at 3.44.46 PM


  1. I posted about my issues with discounts and this setup before.
  2. This will likely be adjusted. I think I’ll slow down the progression for these so that people can at least get 10% off.

First! props.

A big change since I started Sprout Apps is putting aside time to contribute back to WordPress more. In the past my excuse of not contributing was always time but honestly bad experiences within core conversations and my lack of confidence held me back 1.

I’ve come to realize my excuses suck and that I have a lot to benefit from “giving back”, i.e. learn.

My first props! I learned a lot working on Trac #12668, most of which I can apply to my own coding practices. Anyway, with the direction of boone I was able to submit a patch (with unit tests) for a feature add and a second patch to tidy things up, that were accepted into trunk.

I’m really grateful that I was able to help and learn from a few exceptional developers…win, win! Only if I realized this sooner.


  1. During my interview on apply_filters we discussed this in more detail if you want to know more about my experiences with contributing and what I’ve come to realize, including the realization of how naive I was.


Over at Sprout Apps I respect our customers and I try to make that as clear as possible in our Terms. However, there’s one condition: we ask, no expect, respect in return.

Today I’ve been dealing with a customer that’s having a bit of buyers remorse. They’ve learned that their sales staff doesn’t want to use Sprout Invoices and instead wants to use another product. Their reasoning is that the “other product” has a few features that SI doesn’t have yet 1 and he’s told me that even though he “personally likes the software” he can’t convince his staff to use it. The customer goes on to say, “I will keep my eye on your progress and we might well convert at a later date…”. Obviously this isn’t an issue with the product not working or a set of false promises; as I see it, the real issue is the customer wasn’t able to “adequately understand what [they were] purchasing and why”. 2

I’m a bit torn. I don’t want anyone customer to be disappointed; I believe in our products and I’m very proud of them; clear messaging, demos, and the free version all offer the opportunity for the customer to understand what they’re purchasing; refunds with software (or digital goods) are tricky since they can’t send back what they received, we don’t (and will never) lock down our products with serials either; trust is extremely important, especially when Sprout Apps is so new.

At this point I’ve tried to appease them by conceding a little. Maybe I shouldn’t take it so personal though and instead just process all requests and move on 3.

How do you handle refund requests?


  1. One feature PDF invoices and estimates, which was SI received an add-on yesterday for.
  2. Compounding the issue: the person I was dealing with passed off the refund request to someone else in his staff. So whatever civility we had was lost when this person started throwing insults and manipulating the refund policy to prove a false point. I do wish this person read the previous conversations before coming out like a bulldog and demanding a refund.
  3. At some point pushing back will be less cost effective.

#WCSF or was it #WCSF14

I’ve been to a lot of the San Francisco WordCamps, including the first 1, and this year’s was the best for me. Everything seemed completely different.

My approach was definitely different this year than any other. Instead of shying away from conversations 2 I embraced them. From the conversations I had I was able to get some great feedback for Sprout Apps, and more importantly make some friends that I hope to see at future conferences. There were still a lot of people I didn’t get an opportunity to meet either 3.

The conference talks were noticeably different too. For the last 5+ years, at WCSF, I’ve been rather bored with the developer talks, this year was the exception. In particular the talks on backbone and node and; talks I believe past WordCamps turned down for something more general. I ended up missing a few others that I hope to watch when they’re available.

If you missed the State of Word you should go watch it, there were some great announcements. Matt has a good write up of the keynote on his blog. Not much different than the previous years but hearing about the past, present, and future of WordPress is fun. The nostalgic pictures of WCSF v1 are great.

The only regret I have is not sticking around for the Community Summit but I couldn’t. We just got back from Hawai’i and I needed to get back to work on Sprout Apps, especially since my list of tasks has doubled after some great conversations. Maybe next year at WordCamp US.




  1. I know right? That’s how long I’ve been using/working with WordPress and props to my friend for wanting to go.
  2. I’m extremely self conscious when I’m with people that don’t know me.
  3. some twitter friends that I’ve never met in person in particular

Transitioning from Services to Products is Hard

When writing my travel+productivity woes I found myself thinking about reevaluating what I deemed as a “product day”.

In the past I could easily look back at the end of the day (or week) and see something tangible to judge. Even without billable hours to evaluate 1, I could look at the functionality/features/code I created and judge progress and easily apply a sense of accomplishment to my work.

My problem now-a-days is when I look back at the end of the day (or week, or month) I see a lot less achieved. Running a product business at Sprout Apps is completely different than service oriented work at Sprout Venture. My days are completely different, now filled with marketing, biz dev., support, testing and development.

To be completely honest and transparent. The major issue is that Sprout Apps’ sales are low, luckily they’re not miserable, they’re just not good. Aside from my aspirations for immediate success this is something I did expect — so SA will continue to be my full-time job for a long time.

Please don’t jump to the conclusion that I need sales to judge development efficiency, that would be stupid on my part. This is one of those transitions that need to be made, moving away from full-time development services. Instead sales allow me to judge (possibly just feel better about) all of these business oriented tasks that I see achieving very little in the short term.

Activities like WordCamp LA, four days away from (product) development, but four days talking to a lot of wonderful people that gave some awesome advice that I can/have applied to the business. Activities, certain marketing tasks, and business development that have no immediate 2 effect in order to judge productivity.

Without consistent sales it’s hard to judge overall productivity. For now, build and work off milestones and their subset of goals to stay on track and derive accomplishment.

Changing my perspective on my business is turning out to be harder than I thought.


  1. I do flat rate development and I’ve always had a horrible time clocking my hours from projects that weren’t hourly; especially internal projects.
  2. I know a lot of business development have immediate and long term effects.

Travel Hangovers & Productivity

I’m finding that I’m not nearly as productive the days surrounding my travel; which sucks because I’ve been traveling since the beginning of September and I won’t be finished for another few weeks. Don’t get me wrong though, I’ve enjoyed the time off with family and friends; maybe too much since I’m rather unmotivated to jump back into work.

Over the last four weeks I’ve had some extended weekends: WordCamp LAX, Reno for a family wedding, a men’s retreat, and most recently a wedding in Las Vegas. This week was the first full work week I’ve had since August but looking back at my week (now Thursday) I’m a bit disappointed. Instead of diving into a big feature for Sprout Invoices I’ve pushed it aside for three weeks until after our family vacation and WordCamp SF which will be back-to-back (with a day in between).

I’m just frustrated with my work habits. Maybe I need to reevaluate a few things to get my motivation up 1. At very least I need to stop passing blame on traveling since I’m the one that sets my own schedule and goals.


  1. Thinking of splitting that thought into another post

Developers: Stop Blaming Your Users

Someone on the Advanced WordPress Facebook group posted this about how he was frustrated how plugin updates were being handled by a certain developer.

Screen Shot 2014-09-10 at 10.45.50 AM

That arena is definitely not the appropriate place for a post like this and the conversation started to turn into a bashing of the poster and blaming him for having display_errors on his live site; even though he explained that this wasn’t a live site at all, it was a development/staging site.

Since this was a recent issue I went through with SI I had to jump in.

Screen Shot 2014-09-10 at 10.56.57 AM

I tried to have a healthy conversation but there were Joost defenders all over that thread slapping asses and clogging up the conversation…maybe I shouldn’t have told them to quite down…

Anyway, it quickly turned into Joost telling me that my opinion doesn’t count for shit and when I release code that breaks a larger number of sites I could understand.

Screen Shot 2014-09-10 at 10.58.48 AM

Update: The thread was removed. Something that group has has problems with from the start. The problem here was that the thread was critical to an admin, nothing more. Dare I say that I miss the WP-Hackers group 🙂

Update 2: I have the full FB archived, if you want to see it let me know. I don’t think it matters much but it’s pretty silly.

Newer Posts
Older Posts

Dan Cameron

I build stuff with WordPress

I'm currently building Sprout Apps to help small businesses and freelancers running WordPress.