Add renewal to the end of the current membership period

Renewal of a membership in Paid Memberships Pro can sometimes be a little confusing.

People are often confused how a renewal isn’t the same a recurring billing payment.  It’s common to believe that a membership ‘renews’ with a recurring billing payment.

Manual Renewals in PMPro

Yes, you didn’t misread. Renewing a membership in Paid Memberships Pro parlance is a manual process. 

That means the membership level was with an expiration date. To renew, before their membership expires, the user logs in to the site. Then they click the “Renew” button for their membership level and complete the checkout.

We can look at it from “behind the scenes” perspective. Trying to think as the plugin does. There is no difference between a renewal and a new membership sale.

From a configuration perspective, a “renewal” happens because:

  1. Configure a membership level with an initial payment amount;
  2. Disable “Recurring Billing”;
  3. Enable “Membership Expiration”. 
  4. Set “Membership Expires in” to more than 0 (zero) Day(s)|Week(s)|Month(s)|Year(s), or;
  5. Install the “Set Expiration Date” addon. Then define a date / relative date for the membership level.

The result is a membership record for that user with an “Expiration” date in the PMPro Members List.

The following is a common mistake to make:

Configure the Membership Level with both recurring billing and an Expiration Date.

If you do this, your memberships will likely behave in ways you’re not expecting.

For recurring billing, the membership level does not, and should not, have expirations configured!

Let’s assume you’ve got everything configured as expected . 

You now have a 1 year/month/week/day, non-recurring membership level. 

Your site is a success and you have sold a bunch of these memberships.

Being a conscientious web master, you configured reminder messages for your members. This is to help them remember to take action and renew. You have configured the messages get sent out a month before the user’s year long membership ends.

Without much prompting, your members jump at the opportunity.

One month to go and they have completed the renewal process. Well done!

Being curious, you head over to your “Members List” and review the records for a few of your renewed members.

Wait.. What happened to the renewal???

Your member still had a month to go on their current membership when they renewed. 

Their renewed membership is only valid for a year from the day of their renewal…

How come??

It’s a “quirk” of the Paid Memberships Pro “renewal” process. 

Remember how there’s no real difference between a renewal and a new membership?

That’s what you’re seeing here.

The “renewal” is a standard “new member” checkout process. The difference being that any saved data about the member is pre-filled in the checkout form. That happens because the member logged to “renew”, so PMPro knows the user is active.

But that doesn’t change how PMPro behaves when configuring the membership after payment.

By default, PMPro still calculates the end date for the ‘new’/renewed membership. That end date is based on the date of the most recent checkout. 

In your case, this means “1 year from the day of the renewal action”. 

Unfortunately, it does notmean “1 year from the end of their current membership”.

To get there you can use the following GIST:

Extending the membership at renewal

GST Calculation for Paid Memberships Pro

Taxes isn’t something Paid Memberships Pro does all that well. Foreign taxes, like the Australian GST tax, well…

By default, there is only the single rate state tax field in the “Payment Settings” page for Paid Memberships Pro.

If you look at the United States, there are some 10 000 (yes, ten thousand!) tax municipalities. They all have their own rules. 

Taxes are, in other words, somewhat difficult to get right, and that’s just in a single country.

Then we have “the world” to consider. And, well, then the wheels basically come off.

True, there are WordPress plugin options “out there” that do a more comprehensive job than what the PMPro Tax calculations do. Even then there are (huge) gaps in how well it’s being done, compared to what local tax regulations required.

Since I’m located in the USA, I’m not a tax professional and I don’t have access to one, make sure to run the following GIST by your local tax professional. It’s a GIST to calculate the Australian GST. 

The plugin sets the default country to “Australia” on the PMPro Checkout page. It also adds a checkbox to the Checkout page. This is to ask the buyer to self-identify as an Australian resident, if they indeed are.

This plugin is a best-effort based on input from a customer of mine. You may need to consider it nothing more than a starting point.

If your tax professional decides this is good enough for what you need, please proceed.

Install the plugin by creating a directory on your computer named pmpro-australian-gst.

In that directory, create an empty file. Name it pmpro-australian-gst.php.

Then paste the full content of the GIST I’ve included below into this file.

Before you save the file, update the value of the PMPRO_AGST_TAX_RATE constant on line #40 to whatever tax percentage you need. 

Upload the new file and directory to your web server, in the WordPress plugins directory.

Then, in the “Plugins” list of your WordPress back-end admin interface, activate the “Paid Memberships Pro -Australian GST” plugin.

Bob’s yer uncle!

Access denied messages by Membership Level

Access Denied!

Level specific message

Changing your default “access denied” message for posts and pages is, as you know, fairly easy in Paid Memberships Pro:

But what if you want a custom message for a membership level? A custom message that will be different, depending on the membership level needed to access that post or page?

Doing that is unfortunately not quite as simple…

It requires using a couple of different WordPress/PMPro filters and creating PHP code.

The good news?

We’ve created some custom code you can use (See below).

The code is pretty – we think – easy to add to your site. As simple as a “copy and paste” operation:

  • Create an empty custom_advanced_settings.phpfile in a custom-advanced-settings directory on your computer/laptop
  • Copy the entire contents of the PHP script below
  • Paste it into the new custom_advanced_settings.php file
  • Edit the pca_get_level_messages() function to both match your Membership Level IDs – found on the “Membership Levels” settings page for Paid Memberships Pro – and edit the text for your message.

There are 3 different messages you can edit:

Your not_logged_in message is used when the user attempting to access a post or page (the content) but is not logged in to the system.

PMPro’s rss message is used when someone is denied access to the RSS stream for that post/page.

The non_member message is used when the user is logged in, but they do not have the correct membership level to see the post/page they’ve navigated to.

In the comments, there’s Format: section which explains what the structure needs to look like. It’s a fairly straight forward PHP array() of arrays() structure.

The membership level ID is the key that helps us identify which messages we can choose from. 

Preserve Start Date for PMPro Membership

Paid Memberships Pro: Don't Change the Start Date for a member

How important is the signup date or start date for a membership?

It depends…

Mostly on whether or not you have a content drip feed linked to that membership, or not.

When dripping content, the timing of the content to drip is often directly related to how long the user has been a member of the site.

Drip feeds normally comes in two flavors. Membership level specific content and content that is Member specific.

Sometimes a member is supposed to receive content drips for the duration of the time they have access to your site, regardless of the membership level they have (Member content).

Sometimes, the content drip feed is only accessible when they have a specific membership level (Membership level content).

In Paid Memberships Pro, the default behavior is to link the membership level and start date. This means that every time a user completes a checkout for a membership level, their start date changes to the current date.

This makes sense in most cases.

But not when you’re wanting to drip feed member content (option 1, above).

So for a drip feed of member content, you need to change the default behavior of Paid Memberships Pro. ,

The following recipe will keep/preserve the start date for your members to the day when they first signed up for a membership.