Menu Sidebar
Menu

WordPress paginate_links Customization, with Bootstrap compatibility example

I’m not ashamed to say that I use Bootstrap, it’s one of the main reasons I was able to get Sprout Apps launched so quickly last year. It may be a bit bloated and there are some other great frameworks/tools for prototyping and this example should help.

What I am ashamed of is not getting around to adding pagination to SA until today 😁

Navigating the Mess that is PayPal APIs: Advantages of Express Checkout

I’ve been working with PayPal’s APIs for over six years and I still don’t completely understand what the fuck is going on over there. It seems every other year they have a new API and not once (to my knowledge) have they deprecated something useless. Just look at the “Classic APIs Product Page“. They even re-branded a while ago to make it simpler, Standard and Pro; only it caused more confusion because when we developers look at the docs the terminology is still out of date. I guess keeping a bazillion different docs for a single API up-to-date across hundreds of different sub domains of paypal.com isn’t easy to do…sigh.

Before you get too far and start wondering [this isn’t a comprehensive post about how I can really figure out which API to use], it isn’t a comprehensive post that will help everyone. Instead the point of this article is to help developers specifically looking to use PayPal for basic payments and subscriptions with one basic rule…

Don’t ever use PayPal Payment Standard. 1

Why? There are a lot, seriously a lot but the main reason is the deficiency of PayPal IPN.

PayPal IPN can’t be trusted and if you’re relying on it to validate a purchase you’re going to have some unhappy customers. 2

If you’re handling subscriptions it’s even worse because there’s no way to validate the payment profile from a subscription payment made via Payment Standard. You need to rely on IPN 100% of the time to update the status of a subscription, which can easily cause a subscription to inadvertently expire 3, IPN issues can also cause a subscription to continue after it’s been cancelled 4.

Instead use PayPal Express Checkout.

With EC you can validate a purchase, check payment status, capture a pre-approved payment, and manage a recurring payment profile including checking the status. All you need to do is make a single API call with the transaction id, there’s nothing special, nor is it much more complicated to develop.

There’s are lot of misconceptions with Express checkout. One being that it requires that the PayPal merchant pay for PayPal Pro, this is wrong. The merchant will only need Pro for onsite CC processing.

Another is that Express Checkout requires the customer to confirm their payment on your site before processing. This is the feared “extra step”, the extra step that would cause people to reconsider their purchase, the extra step that someone might not notice because they thought they were done. Sorry but I don’t like these excuses one bit.

Extra Step: If the customer is going to reconsider their purchase and leave the checkout process without ever coming back because of the final confirmation page is absurd.  Yes, it’s likely to happen; do you want these customers anyway? Highly unlikely because they’re the ones that will ask for a refund a day later after causing hours of support. I want customers that truly want to purchase the product, you should to.

UX: You should be able to easily signify that the customer needs to finalize the payment by submitting the confirmation, if you can’t there are other areas of your site that need your attention. I “know of some” that have contemplated doing an auto submit after X seconds or just skipping the confirmation and eschewing the PP policy, “they” never did go that route because the numbers didn’t show a drop the purchase funnel.

Falsities: I’ve heard that EC limits payment methods, something to the effect that the customer couldn’t use a credit card, which is nonsense. The only difference that I’ve noticed is that the checkout pages at PayPal use their new design…which is great.

Anyone using PayPal Standard over Express Checkout? I’d like to know why.

Notes:

  1. Not to be confused with the customer product of PayPal Standard.
  2. This is why I built EC into Sprout Invoices as the default payment processor. SI doesn’t even support PayPal Standard Payments. I can’t imagine the customer support that IPN incurs on other developers distributing a product that relies on IPN, e.g. EDD or Woocommerce.
  3. Expired account issues has been a real issue with Sprout Apps, since it uses EDD and for months ran the PayPal Standard because the EC extension didn’t support subscriptions. I’ll post about how I updated it another time.
  4. Over at Smart eCart we had around 100 active “subscribers” with cancelled accounts because of IPN
Screen Shot 2015-03-25 at 12.09.18 PM

Making the Plugin Installer Easier for Premium Products

This morning I helped a new customer of Sprout Invoices install his recently purchase pro version. The customer didn’t know that the plugin they just purchased needed to be installed, instead they expected to input their new license key and the Pro features of SI would be enabled with the free version of Sprout Invoices already installed; along with that misunderstanding came the confusion that they couldn’t search for “Sprout Invoices Pro” on the Add Plugin screen to install the Pro version that is available for download within their purchase email receipt or their account page at sproutapps.co.

Obviously this was a rather frustrating support thread because I don’t want anyone’s first time experience with our products to be confused, especially this early.

Resolution

What I’ll be doing is working on the on-boarding experience via triggered emails after purchase, improving the email receipts, and documentation.

Not an Oddity

That said, I’m still a bit nervous that WordPress users without (most of) our personal history with the platform that the ease of use is harming premium product sales. Consider that the new customer I described above isn’t an oddity, he’s definitely not; as WordPress becomes more user friendly to broaden it’s reach people will expect that the only place to get a plugin 1 is via the admin. Improving the on-boarding of these customers can only go so far.

Resolutions

I don’t expect .org having a plugin marketplace anytime soon, or while I’m still in the WP product business. Which leads me to a couple ways that I could prevent this type of issue again and improve the overall experience of purchasing a premium product:

Drop the freemium model – Like so many others don’t offer an upgrade at all. Build a business around a free product with extensions/add-ons, i.e. easydigitaldownloads. Link to your own marketplace or build one into the admin that allows for purchasing and easy installs.

Build an upgrade routine into the free product – I want to dislike this idea because it means that the free plugin (from the repo) would need to either: download the pro version from an external source, activate it, and then delete itself; or download & install files from an external source into itself. I could see this as being an issue for any plugin review team member.

Have the free version modify the search results – Have the search results return the pro version, which links to a download (or purchase) link. I don’t ever see this passing the plugin review team.

What am I going to do?

I already have plans on building the add-on marketplace into the admin, which will permit purchasing and easy installations/activations. That solution (I believe) resolves familiarity issue, where installing plugins from the admin is easy. The issue of someone expecting for those add-ons or pro upgrades in the main plugins search results will likely always be an issue regardless of how much I improve my messaging.

Notes:

  1. This includes themes.

Thoughts about the Debate on Auto-Updating of WordPress SEO

Let me start off by saying that I have a hate-hate relationship with WordPress SEO; admittedly it’s not an objectionable opinion, even though I can easily find some faults, rather it’s a personal opinion because of how I see them treat their users. For that history alone I really wanted to hate the decision the WordPress.org API team made to force an auto-update WordPress SEO on millions of sites after a security exploit was released but I don’t, not one bit.

To have a team committed to the security of our sites and millions of others strengthens WP’s legitimacy (period). IMO forcing the update to millions of people, wether they knew about it, wanted it, or didn’t care, has more to do with a perception of security than any concern over a single site being hacked. Maybe the individuals on the team are more idealistic; regardless the bigger picture is that WordPress has had a stigma as “not being secure”, auto-updates has helped fixed that perception and actions like these will only help improve WordPress as a whole.

Now Fight!

Now, if you’re in the echo chamber that is the WordPress development community you’ll see that some valid concerns have been raised. I especially like the healthy debate on twitter from this tweet…

All of which can be boiled down to false expectations, hopefully now those expectations are being reasonably set, certainly looks like it.

Misdirected Frustration?

An indirect argument that isn’t getting traction is the increasingly distrust for WordPress SEO plugin, instead it’s a piece of the broader argument of trusting auto-updates. I strongly believe if WooCommerce or even All in One SEO was updated yesterday we would not have heard this outcry. I’m not alone in thinking that we can’t trust a WP SEO update.

So, I pose the question to those that were immediately concerned with WP SEO being updated yesterday:

Did you really have issues with your site receiving a security update to a plugin OR was there a fear over an WordPress SEO plugin update?

I would imagine the majority invested in this issue would agree with the later.

Let’s expect more from plugin authors, and appreciate the teams working hard to making WordPress more secure.

Update

As I’m catching up on twitter and reading some more posts I’m seeing some great reactions. Tom’s “Is there a Lack of Integrity in WordPress?” compliments my post well.

E-Mail Marketing for the Win! I hate myself…

If that is your reaction to someone saying “email marketing” or “drip email marketing” I want to be your friend, I have the same reaction too but I’m going to get through this…

…and before I go into how I’m using Customer.io for Sprout Apps, I’d like to share some personal history about why I had thought the only way for me to be productive in  “email marketing” involved watching a piece of my soul being slowly peeled off like a bandaid on a three year old, and eventually hating the monster I had become.

I have an idealistic stance on sending marketing email, it’s simple — it should never be sent.

The pointed eared hairy footed trolls in marketing think differently, they see the value of sending unsolicited e-mails. E-Mail is astonishingly cheap for customer acquisition when compared to any other channel; CPC (adwords, Facebook ads, etc.) isn’t just expensive, it’s tough to get right even with single digit conversion rates.

That’s why when I was a Director 1 at my last real job, “real job” means I was required to wear pants, I was tasked to send out millions of emails a week. Yes, millions; I’m not kidding. A lot of which were to people the company had absolutely no relationship with, past or present. Their idea, or belief, was an email address is simply another mailbox for them to stuff junk into; some people will bite just like some respond to junk snail-mail  2.

I cringed every time I scheduled those “blasts”. The result they saw and wanted: five figure returns on every blast, on a list they bought for very little; the result I saw, loyal customers unsubscribing from the bombardment, the company not caring because they could “buy more to fill the list”, ultimately a shit load of people now seeing the company as “spammers” & untrustworthy, 3.

E-mail “marketing” can be different.

Before Sprout Invoices launched I was directed by a few people that I needed to “build my list”, I threw up a little in my mouth and shook it off. Then came Pressnomics 4, where I was able to talk to a few others on how they’re using services like customer.io and I soon found out that it’s possible to send an email to a prospective customer with respect.

Build a relationship first, or partner with someone that has a relationship with the people you want to contact.

I don’t send e-mail to people that didn’t explicitly give Sprout Apps their email. Simple as that. I’m not about to buy a list and blast out an email to thousands of people that don’t know about Sprout Invoices or other Sprout Apps; leave marketing to those individuals to those that have a relationship already.

For example, tidyrepo.com recently sent out an email reviewing Sprout Invoices. Their users have a relationship with tidyrepo, so when those read the review, there’s weight behind it. If I were to send an email to that same list, an expected response would be “who the hell is this…where’s that spam button”, that’s not a first impression I would ever want to make.

Introduce yourself and offer help.

At the moment I only have a few triggered emails setup for  Sprout Apps; one in particular sent to someone that received errors during checkout and didn’t complete their purchase in the last 30 minutes. With this triggered email I’m not only helping someone with their purchase but I’m hoping to get their attention while they’re still considering purchasing; otherwise, they’ll just forget about it and move on.

I’ve found introducing myself helps, letting them know who I am shows I’m personally engaged.

There are a lot of creative ways to help your potential customers, one might be to send an email with a discount if they’ve reviewed the pricing page after reviewing the product details page for an extended period but never added the item to the cart.

If to help is promotional, bury the lead.

That last “creative way” of sending a message to help someone is on the verge of spammy. Remember, I want to build a relationship with the customer. This is especially true before trying to motivate them via a “discount”. Maybe I’m overthinking this because of my idealistic take on sending email, that’s why I’m currently running an A/B test to see if throwing something like “Hey you, here’s an awesome discount for my shit because I noticed you can’t afford it. Any questions let me know…” is better than “Hey, I’m Dan Cameron and I built this shit. You have any questions?…PS, I’d like to extend you a limited time offer…”. If the former wins I’ll question everything I believe in humanity, as if I just read comments under a political article.

Be personal, gain trust, bury the promotional motivation, and start small.

This is how I started…slow 5.

customer.io chart

I only have four triggered emails at the moment, one is not automatically sent instead a draft is created. I can then review the user activity and understand if the person could be helped with the email, if not it’s deleted.

Don’t half ass it.

If you wanted to be a dick and just send out a bunch of email you would have stopped reading a while ago, maybe because they were offended with me calling them hairy trolls or they’re busy making google work off a “purchase e-mail lists for cheap” query, instead you’re vested. Reading this post proves you can take it slow and build write the introductions you need.

It took time me a while to write the integration I wanted; luckily for some I did the work for you. That said, the hardest part was writing all the emails for each triggered email and A/B split. Getting the introduction right is tricky, I don’t have the answer for everyone but helping people works.

It really does work.

On a pure marketing level, when compared to CPC and other channels these numbers are awesome. Not shown is how I’ve been able to get valuable feedback from the conversations started with these triggered emails, the hidden upside hidden from the “Converted” column.

Screen Shot 2015-02-20 at 2.35.16 PM

 

Notes:

  1. I was not officially in a “Director” position, although I had the same responsibilities without the paycheck.
  2. Obviously, a lot of companies do this, not the dirt bags I worked for.
  3. The company is still around, I’m not sure about their financials but I’m willing to bet their still cornering their market, spammers or not.
  4. That conference was awesome. I wish I had wrote a post about it a couple weeks ago…maybe in the future.
  5. That blip at the beginning can be attributed to testing and holding off a triggered email to be manually sent instead of automatically.

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.

Notes:

  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. 
logo vert gradient solid background

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

Notes:

  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.

sprout-invoices-pricing

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

Notes:

  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.

Notes:

  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.
Older Posts

Dan Cameron

I build stuff with WordPress

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