Recurring Memberships in Drupal 7
Building a membership site in Drupal isn't so hard, really. The challenge is to have memberships that include recurring fees. That is, a membership that automatically renews, and the member pays automatically. There are several reasons why this is hard. Some reasons include the payment processor - not all payment processors support recurring fees. But mostly, it's the tools we have available that are limiting in their options. But it is possible, though difficult, and fraught with peril. Just for definition, I'm talking about a site that will give a user a Drupal role (which could mean access to more stuff on the site) when they pay for a membership. There are five basic strategies to doing this in Drupal 7:
- Drupal Commerce
I'll take each one in turn, and describe their strengths and weaknesses, and whether or not one can actually get this to work using these tools. First, a note. I have one requirement that does make this more difficult - I want to use PayPal. PayPal does support recurring fees, but many of the modules I'll discuss here for doing recurring memberships do not support PayPal.
Drupal Commerce is a large set of contributed modules that are considered, at this point, the most modern shopping cart system in Drupal. Commerce is the successor to Ubercart. Having used both Commerce and Ubercart, I perfer Commerce, for a variety of reasons. It's entity-ified - that is, everyhing is an entity, which is great. It does have some additional complexity - products are separate from product displays, which either adds an extra step in putting products (like memberships) up, or requires a set of rules to automatically create them. Sadly, getting recurring payments to work in Commerce with PayPal is, from what I can tell at this time, not possible. But if you aren't using PayPal, there are modules you'll need in addition to Commerce: Commerce Recurring Framework, and Commerce Card on File. It seems that you can probably use Authorize.net AmericanExpress Payment Gateway, and Sagepay. One of the problems is that this module is still in development, and the issue queue is rather daunting for anything going into production. Since I had the PayPal requirement, I couldn't go down this road in any event, sadly.
Ubercart is the set of older shopping cart contributed modules. It has been released for Drupal 7, and is still quite popular, even though Commerce is considered the "go to" shopping cart system for Drupal. Ubercart has a module called uc_recurring, which is also available for Drupal 6. There are a lot more sites (3716 vs 333) using this than using Commerce Recurring Framework. This module has an alpha release, but there are some big stable release blockers, and there are a lot of open bugs, some of which are quite problematic. I ended up trying hard to get it to work, but I ran into too many problems with it, so I abandoned it as a strategy. I believe this is the strategy used by drupalize.me, based on discussions in a podcast I listened to recently.
CiviCRM is a stand-alone, full-featured CRM. It integrates with Drupal, WordPress and Joomla, although the Drupal integration is the oldest and probably the most feature-rich. If all you want is a membership site with recurring memberships, CiviCRM is way overkill, since it has an entire CRM behind it. But it does indeed have a full membership suite, and recurring memberships are supported (as long as your payment processor supports it.) A module which syncs CiviCRM and Drupal roles can give you the permissions setup you need to use this as a membership site, but for me, it was too much overhead for that pretty simple purpose.
I actually hesitated putting MoneyScripts in this blog post, but I thought that if I was going to be exhaustive, I needed to. MoneyScripts is a set of premium Drupal modules. I know, you're thinking, "what? Premium Drupal modules?" Unlike WordPress, where paying money for plug-ins is de riguer, or at least, very common, it is exceedingly rare in the Drupal world. I have not bought it, but I did deeply evaluate it. The feature set certainly looks good, and it looks like it should work, but it is a one-man show, and if you read the forums, you'll see that the one man seems to have vanished, leaving his customers in the lurch. So don't bother with this strategy.
Recurly is actually the strategy I ended up choosing. Recurly is a service, and there are two drupal modules: recurly, and recurly roles. These are not used by very many sites (the recurly module is used by 85 sites, and the recurly roles module by 10.) But the module was written by the amazing quicksketch (Nate Haug) who uses it for his business. Recurly has multiple gateway options, but is not especially cheap as a service. It's $99/month, plus a small percentage and transaction fee. But the service is rock-solid, and the recurly module is well done, and works well, even though it isn't used by so many folks. I will, at some point, post a detailed tutorial on setting up Recurly.
Snags, Gotchas, and conclusions
First, it's kind of surprising how hard this is. Membership sites with recurring fees are sort of a dime a dozen, and it would seem that drupal should have this solved by now, for any payment processor that supports recurring fees. It's solved in fifty different ways in WordPress (most of which you need to pay for.)
Second, from what I can tell, only CiviCRM and MoneyScripts make it easy/possible to create a membership at the same time as you create a new account. The other strategies divorce this, and you end up assigning a role to authenticated users after they have paid for a membership.
If you are using one of the methods where payments are triggered by Drupal (as opposed to an external service) you need to be really careful in how you deal with your development site, because you might end up charging your members twice. Make sure that you've got a strategy to prevent that.
I'm hoping that the landscape of this changes in the next while, although It's possible that that's fairly doubtful, as development efforts now are turning away from focus on Drupal 7 to Drupal 8.