Category: Stranger Studios

Don’t Call Your Customer a Dick

Yesterday Adriaan Pienaar, a.k.a. “Adii Rockstar” of Woo Themes posted on his blog about a tough client asking, Am I being irrational? He later followed up on Twitter, calling this customer a “dick client”.

So glad not have had a repeat of yesterday’s interaction with a specific dick client (http://t.co/P6six9a) today. :)

@adii

adii

Now I’ve definitely had similar conversations among friendly company in private, but I would never post something like this to my blog or Twitter. I feel bad even propagating the story more, but I’ve seen some similarly toned tweets go out by developers and consultants and I want to (1) talk about why this might be a bad idea and (2) find out why most people seem to be okay with these kinds of expressions.

Judging by the comments on the blog and Twitter, the WordPress community has mostly got Adii’s back on this one. However I think in this situation, while Adii has some good points and understandable “beef” with this client, he is being a bit irrational.

The back story.

You should read his blog post for the proper context and to read Adii’s and others’ comments. I’m going to paste what Adii wrote of the exchange here, even though it’s about 90% of the entire post, because it’s short and I want to be clear about what I’m referencing. Adii writes (emphasis mine):

  1. Customer notes to us that he is struggling to achieve something with our product.
  2. We explain that this is currently a limitation, but immediately update & release a new version of the product to help the customer achieve their goal.
  3. Customer isn’t happy, e-mails us for refund.
  4. [This is where I come in.] I ask the client whether the fix worked in an attempt to determine how I can help the customer.
  5. Customer says they didn’t try it and won’t try it, because they don’t want to be a guinea pig. Insists on refund, threatens with chargeback.
  6. I explain that we released a fix for the problem and hence it’s not about being a guinea pig; we’re just doing our job & helping them out.
  7. Customer ignores last e-mail, rudely threatens to publicize this and again threatens to go the way of a chargeback.
  8. I issue refund and at least attempt to explain our actions in this regard & how we actually tried to help. Still awaiting response (if any is going to be forthcoming).

Now, to be fair, Woo Themes has a “no refunds” policy (see below). So Adii is in his right to refuse a refund initially (though he eventually gave one). And I think the client is lame for threatening to do a charge back through his credit card (which would refund the money and add another fee to Woo Theme’s account). However, despite the no refunds policy, Adii does end up giving one and seems open to giving them with justification. It’s clear that Adii doesn’t think “fixing a bug”, as he called it, is a good reason for a refund. And it’s possible Adii only gave the refund to avoid the bad publicity and bad affects of a charge back. Adii writes in the comment how he is frustrated at the power customers wield in these transactions.

Is this customer irrational to want a refund?

I think the customer here wasn’t being irrational (in his refund request at least, though he may have had an irrational tone). It sounds like this customer bought the theme thinking it already had a feature he needed. It didn’t, and although Woo Themes fixed the issue right away, I think it is okay for the customer to not be satisfied with this. The customer expected one thing and got another. Despite the quick fix, the customer has reason to question the robustness of the “fix”, which is grounds for a refund in my book.

10. [Woo Themes] Refund Policy

Since WooThemes is offering non-tangible irrevocable, digital goods we do not issue refunds after the subscription or individual theme purchase is made, which you are responsible for understanding upon registering at our site.

By the way, just because the customer may have some justification for asking for a refund doesn’t change the fact that it sucks to lose a customer and to have possibly done some work on a feature just for them. It sucks.

What are we even talking about?

Adii seems to want to bring up two points for discussion. One is about the power customers wield with the threat of a chargeback. The other related point is about the desirability of unconditional refunds. The points are related because it seems the chargeback threats are effectively forcing Woo Themes to offer unconditional refunds even though they may not want to.

For the record, I think unconditional refunds are a good idea… especially when it comes to GPL software.

For one, the point about digital good being irrevocable (made in the Woo Themes policy) doesn’t hold as much weight when the software could technically be distributed for free elsewhere due to the nature of the license. I think many are trying to offer GPL software for a fee and basically hoping that a free version doesn’t crop up… or using split licenses to try to keep a free version from cropping up. Despite the legality of charging for the software in this way and mantras of pro-GPL folks that it’s “free as in speech, not as in beer”, GPL software WANTS to be free as in beer too. It’s kind of natural. it’s supply and demand. People will want your software for free… and if it’s GPL and distributed there will be those able to redistribute for free.

I don’t think you need to stop charging for software (there are many benefits to getting the software “from the source” which is worth a fee), but you shouldn’t be upset if someone gets your software for free… whether it’s from Bit Torrent, an official flavor variant, or by asking for a refund after downloading the software. I’ve only come around this this opinion recently, but I believe that to do GPL software right, we need to make sure most of the value is in that “other stuff” around the software: support, documentation, packaging, trust.

Anyway, back to unconditional refunds. In my experience (and from what I hear) they cause more good than harm. A few will abuse them, but this should be more than made up for by the increased number of sales you’ll get since customers will feel safer about buying something they haven’t tried out yet. That is the argument.

What I would do have done.

It’s funny that the same day Adii posts about this customer, we have a similar experience with a customer for Paid Memberships Pro (our “premium” WP membership plugin). In our case, the customer thought we integrated with a payment gateway that we don’t integrate with yet and asked for a refund. I made the refund first, and then replied with our unwritten policy that we’ll add integration for any payment gateway a paying member requests… it just may take a moment. In this case, our potential/lost customer says no thanks. And I understand, because the customer expected one thing and got another.

As I said, I’ve only come around to this kind of thinking recently. Over the past two months, our return policy has changed from one requesting a reason and requiring the customer to delete the software and vow to not use it, to just requesting the information we need to process the refund. (BTW, Bed Bath and Beyond is a bricks and mortar store that does no-questions refunds to good success.)

Another part of what people expect out of a “premium” WordPress product is better support. And it’s funny that in these cases good, fast support was mostly ignored. This sucks. Not everyone is going to be a customer.

And that brings up another idea that is floating around this discussion: irritable, bad, (dare I say “dick”) clients should be avoided. (The customer we lost was very nice about everything by the way.)

Avoid bad customers. Just don’t feed the trolls.

I agree with the general idea (promoted recently by one of the 37 Signals guys — Jason?) that you don’t need everyone to be your client, and you should use pricing and marketing to target better customers. I would just add that you shouldn’t air the dirty laundry when you do manage to shrug off a bad client. Calling them out in public (if they’re not under a rock, they’ll know that you’re talking about them) may bring them back for more. It will definitely send a message to potential clients reading the rant that working with you might be difficult.

Maybe you don’t want clients who are afraid of being called a dick. You only want clients that are willing to spend a lot of money and never ask for a refund. Just be careful that you’re not turning off clients you do want. There is a fine line between “keeping it real” and pushing away perspective clients.

In summary…

In summary, I think Adii probably handled things correctly up to the point that he posted about it on his blog and twitter. He was trying to bring up some things that should be discussed, but I think his emotions lead him to post it too quickly and in a way that makes it obvious who he is talking about… and he used that D word there.

He could be scaring away potential customers. (I mean look what Chris Pearson’s attitude towards WordPress did to his credibility in the community. Our attitudes toward our clients are similarly important.)

Adii, and some others in comments/etc, missed the point that the customer paid for something under false pretenses. Whether this is the customer’s fault.. or if in our opinions the customer should have been happy about the quick fix, he or she still has a decent reason to want a refund: it is valid to question whether the “quick fix” will be as robust as the customer expected. Whether or not one should be granted is up to the business and their refund policy.

Customers threatening chargebacks when they aren’t warranted sucks. I feel in general though, it is more important to protect customers by allowing chargebacks than it is to protect businesses from their misuse. We don’t make money by forcing people who don’t want to pay for our products to pay for them. We make money by making the customers that are willing to pay happy.

The digital nature of software works both ways. Someone can get the software and then chargeback to effectively get something for free. But then it didn’t really cost us much to deliver the software either. Especially when working with GPL software, we should be ready to accept situations where people obtain our software for free.

Alright. Let me know what you think. Maybe I’m being irrational here. I don’t mean to pile on Adii. Like I said, I think he did it right up to the point of blogging/tweeting about it. This is all very subtle stuff. We probably agree about more than we disagree, but I don’t think it’s black and white… which is why I wanted to write a million rambling words about it.

Ok, hit publish already, Jason.

 

I’m Speaking at WordCamp Columbus, June 18th at 11:30am

I’m excited to say that I’ve been accepted as a speaker at WordCamp Columbus this coming Saturday. I was a last minute addition… so thanks to the WCC folks for working that out. (Shout out to Angie Meeker: @angiemeeker / blog)

My talk is on “Licensing and Business Models for Premium Plugins”, which is a fancy way of saying “How I plan to make money with Paid Memberships Pro“. Sadly, the event is all sold out, but if you are going or able to squeeze in somehow, I look forward to seeing you there.

More info on the schedule: http://wordcampcolumbus.com/schedule/

Thanks WordCamp Columbus Sponsors: http://wordcampcolumbus.com/sponsors/

Disable the WordPress Admin Bar for Non-Admins Only

Here is a variation of some code I found on Yoast.com to disable the WP admin bar for non-admins only.

function yoast_hide_admin_bar_settings() 
{
?>
	<style type="text/css">
		.show-admin-bar {
			display: none;
		}
	</style>
<?php
}
function yoast_disable_admin_bar() 
{
	if(!current_user_can('administrator'))
	{
		add_filter( 'show_admin_bar', '__return_false' );
		add_action( 'admin_print_scripts-profile.php', 'yoast_hide_admin_bar_settings' );
	}
}
add_action('init', 'yoast_disable_admin_bar', 9);

Just copy and paste this code into your functions.php or another plugin/theme file that can add hooks. Save/upload and watch it work.

Let me know if you have any trouble using this.

Fix for WP Page Tree Plugin in WP 3+

The WP Page Tree plugin is a nice plugin. It shows a tree view of pages in your WP site… but it’s been broken since about version 3 or so.

I’m sure there are other tree view plugins that work well, but I liked that one. And it is actually an easy fix to get it working in WordPress versions 3+.

The issue was that the links generated in the tree view pointed to the old admin URLs for editing pages (page.php?action=edit&post=#). The new more generalized URLs for editing pages is (post.php?post=#&action=edit).

So, what you want to do is find line 404 in wppagetree.php (of version 2.8 of the plugin) and change page.php to post.php. That’s it. The whole block of code around there should look like:

if ($public) {
	// Create our own link to edit page for this ID
	$out .= "<a class=\"$pageStatus\" href=\"$pageURL\">" . $pageTitle . "</a>";
}
else {
	$out .= "<a class=\"$pageStatus\" href=\"" . get_bloginfo('wpurl') . "/wp-admin/post.php?action=edit&post=$pageID\">" . $pageTitle . "</a> <a style=\"font-size: 10px;\" class=\"$pageStatus\" href=\"$pageURL\">#</a>";
}

Or download this zip here which has version 2.8 of the plugin plus that one fix. I may upload it to the WP directory sometime, but then I’d have to maintain. Feel free to do it for me. ;)

Download: page-tree-fixed.zip

WordCamp Philly 2010 Presentation Slides

Here are slides from my talk. I was told a video of the presentation will be up at WordPress.tv sometime soon. I’ll post a link when it is. And I’ll try to get these in SlideShare or something similar. I was having trouble with their site earlier.

Business Models for WordPress Plugin and Theme Distribution
What You Need to Know About the GPL

Download: ppt, pptx

SS-Downloads WordPress Plugin

Testing our new SS-Downloads plugin. It basically will require an email address before serving a specified file. Right now, I’m using a zip of the pre-release plugin for testing. I will update this to point to the latest version once it’s ready.

Should see a form or download link here.

Enter your email address to download ss-downloads.zip

Future plans:

  • Option to require account creation (instead of just an email address). Done
  • Option to email file as attachment instead of showing a link. Done
  • Icons for files in template.

Jason Speaking at WordCamp Philly October 30th at Temple University

I will be speaking on Business Models for Plugin/Theme Distribution. What You Need to Know About the GPL at WordCamp Philly October 30th, 2010 at Temple University in Philadelphia.

With lots of sweat and little luck, we’ll have our membership plugin available for some sort of release by then. But really I’m excited to share my thoughts on how to distribute, market, and make money off this plugin… and more interested in others ideas about the same.

If you want to hear me speak or are otherwise interested, get your ticket now.

Duplicate comment detected; it looks as though you’ve already said that!

Not sure how long WordPress has been doing this, but there is a check for duplicate comments. If the same user/email posts the same exact comment on the same post, the user will get a message like:

Duplicate comment detected; it looks as though you’ve already said that!

This is great actually, and keeps people from submitting the same comment twice if they get impatient waiting for moderation or otherwise click that submit button twice.

As a blog owner and WordPress developer, there may be situations where you want to allow people to post the same comment. If you want to enable duplicate comments on your blog for some reason, you can use this code here. Just add it to your theme’s functions.php or put this in a .php in your plugins folder and enable it.

function enable_duplicate_comments_preprocess_comment($comment_data)
{
	//add some random content to comment to keep dupe checker from finding it
	$random = md5(time());	
	$comment_data['comment_content'] .= "disabledupes{" . $random . "}disabledupes";	
 
	return $comment_data;
}
add_filter('preprocess_comment', 'enable_duplicate_comments_preprocess_comment');
 
function enable_duplicate_comments_comment_post($comment_id)
{
	global $wpdb;
 
	//remove the random content
	$comment_content = $wpdb->get_var("SELECT comment_content FROM $wpdb->comments WHERE comment_ID = '$comment_id' LIMIT 1");	
	$comment_content = preg_replace("/disabledupes\{.*\}disabledupes/", "", $comment_content);
	$wpdb->query("UPDATE $wpdb->comments SET comment_content = '" . $wpdb->escape($comment_content) . "' WHERE comment_ID = '$comment_id' LIMIT 1");
 
	/*
		add your own dupe checker here if you want
	*/
}
add_action('comment_post', 'enable_duplicate_comments_comment_post');

For reference, here is the dupe check code in wp-includes/comment.php. A newer version should probably have a hook above and/or below to allow people to override the dupe checker more directly.

// Simple duplicate check
	// expected_slashed ($comment_post_ID, $comment_author, $comment_author_email, $comment_content)
	$dupe = "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND comment_approved != 'trash' AND ( comment_author = '$comment_author' ";
	if ( $comment_author_email )
		$dupe .= "OR comment_author_email = '$comment_author_email' ";
	$dupe .= ") AND comment_content = '$comment_content' LIMIT 1";
	if ( $wpdb->get_var($dupe) ) {
		do_action( 'comment_duplicate_trigger', $commentdata );
		if ( defined('DOING_AJAX') )
			die( __('Duplicate comment detected; it looks as though you’ve already said that!') );
 
		wp_die( __('Duplicate comment detected; it looks as though you’ve already said that!') );
	}