PMPro Update

Version of Paid Memberships Pro is out with a handful of bug fixes. Braintree users in particular will need to update if they are running 1.9.4. There is also fix to the Recaptcha code and an enhancement to the cancelation error email.

Please update Paid Memberships Pro from the plugins page of your WordPress dashboard. You can also get the latest version of PMPro here or version specifically here.

The full list of updates is below.

  • BUG FIX: Fixed serious bug where payment fields weren’t showing up for the Braintree gateway.
  • BUG FIX: Fixed issue where Braintree webhook notifications were failing. We now allow the Braintree library to sanitize the incoming data since our sanitizing efforts were breaking the validation.
  • BUG FIX/ENHANCEMENT: The webhook URL given for Braintree now goes through admin-ajax.php instead of a direct link to a php file within our plugin.
  • BUG FIX/ENHANCEMENT: Updates to the Recaptcha library. (Thanks, Corin Simpson-Bryars)
  • ENHANCEMENT: Made the cancelation failed error email easier to read.

PMPro Update 1.9.4

Version 1.9.4 of Paid Memberships Pro is being pushed out shortly. This update includes fixes that could impact sales, and we recommend everyone upgrade as soon as possible. There are two updates in particular to look out for related to our Stripe integration as well as new frontend layouts for improved display across devices.

The included Stripe PHP Library has been updated to the latest version.

While not necessary, after upgrading it is a good idea to log into Stripe to change your API settings to use the latest version of the Stripe API. To do this log into Stripe, click on API in the left sidebar, then click on “Upgrade Available” and follow the directions.

If you don’t see the “Upgrade Available” link, then you are already running on the latest version of the Stripe API. Be sure to test checkouts on your site after making this change. For 72 hours, you’ll be able to roll back to the previous version of the Stripe API if needed.

“Table-free” Frontend Pages for Improved Display on All Devices

In an effort to improve the display and responsive layout of default plugin pages, v1.9.4 of Paid Memberships Pro has migrated to a “table-free” layout for selected frontend pages. Affected pages include those pages using the following shortcodes: [pmpro_checkout], [pmpro_confirmation], and [pmpro_billing]. These pages have been updated to use a div-based HTML layout where possible instead of a table-based layout.

We’ve done our best to make sure this update has minimal impact on all of our users, but if you notice UI issues after performing the update (in particular users with custom checkout templates or CSS styling might be affected), you can use the Table Layout Add On to revert to the table-based layout on your site. Note that if you roll back PMPro entirely, you will lose the benefit of the 30+ other fixes and enhancements included in this update. So using the table pages add on the preferred way to fix any UI issues that come up.

It is also important to note that this add on is meant as a temporary solution while you update your site to make use of the new div-based layout. We will support the plugin for about a year. During that time, be sure to reach out to use with any issues caused by our add ons and code and take time to update your own customizations to work with the new layout.

Add Ons Updated to be “Table-free” and for 1.9.4 Compatibility

Many of our Add Ons have also been updated to use the new div-based layout or other bug fixes included in this update. Those add ons will have updates available as well, so be sure to update all of your PMPro Add Ons with update notices before you update the core Paid Memberships Pro plugin.

Affected Add Ons Include

How to Update

Please update Paid Memberships Pro from the plugins page of your WordPress dashboard. You can also get the latest version of PMPro here or version 1.9.4 specifically here.


In terms of number of fixes and enhancements, this is one of our largest updates ever. The full list of updates is below.

  • BUG FIX: Fixed issue where PayPal was not working for amounts over $1000.
  • BUG FIX: Non-decimal currencies now handled correctly with Stripe.
  • BUG FIX: Fixed issue where updating a Stripe subscription from the edit user page could cancel the subscription once the webhook fired.
  • BUG FIX: Fixed issue where “admin_cancelled” memberships weren’t being calculated correctly in membership reports.
  • BUG FIX: Fixed issue where users could not drag and drop to change the order of membership levels.
  • BUG FIX: pmpro_getMembershipLevelsForUser() would sometimes return duplicate levels in the array if the user had multiple active entries in the pmpro_memberships_users table.
  • BUG FIX: Updated includes/metaboxes.php to call pmpro_getAllLevels() instead of relying on the $membership_levels global which is problematic.
  • BUG FIX: Fixed a few strings that weren’t wrapped for translation or were using the old text domain.
  • BUG FIX: Fixed redirect error that occured when the levels page was not set.
  • BUG FIX: Updated getfile.php to support file names with urlencoded characters (e.g. spaces) in them. (Thanks, florent from PMPro blog)
  • BUG FIX: Fixed notice when use the getfile.php script due to using add_filter instead of apply_filters in the mimetype class.
  • BUG FIX: Fixed the all time views column for the logins report.
  • BUG FIX: Fixed fatal error on the logins report, member shortcode and other issues when using PHP7.1+.
  • BUG FIX: Fixed issue with saving arrays using pmpro_setOption()
    up the lines of text.
  • BUG FIX: Fixed typo in the string “Are you sure you want to do that? Try again.”
  • BUG FIX: Fixed a few strings that used the wrong text domain or weren’t wrapped correclty for translation.
  • BUG FIX/ENHANCEMENT: Now bundling Google’s jsapi.js file for use in the reports.
  • BUG FIX/ENHANCEMENT: Fixed issue where some emails (e.g. the password reset email) would not have wpautop applied to them, crunching
  • BUG FIX/ENHANCEMENT: Better checking for Theme My Login compatibility when handling login redirects.
  • BUG FIX/ENHANCEMENT: Better error handling for Braintree.
  • BUG FIX/ENHANCEMENT: Membership stats widget now shows first 3 levels based on level order.
  • BUG FIX/ENHANCEMENT: Added the pmpro_member_shortcode_access filter
  • ENHANCEMENT: Updated the Stripe PHP library to version 5.2.2 and updated Stripe to use the latest version of their API, 2017-08-15.
  • ENHANCEMENT: Changed frontend pages (e.g. checkout.php) to use a div-based layout instead of tables. Important information here if you are using custom page templates or notice UI issues after upgrading
  • ENHANCEMENT: Added pagination to the discount codes page in the admin. Also sorting codes in descending order by ID. Use the pmpro_discount_codes_per_page filter to change the per page limit from 15.
  • ENHANCEMENT: Updated plugin admin pages with better links to documentation and support.
  • ENHANCEMENT: Updated plugin frontend pages checkout, billing, confirmation, and single invoice to remove most table based layouts.
  • ENHANCEMENT: Better error message if trying to checkout using an existing user’s email address.
  • ENHANCEMENT: Added the pmpro_report_levels filter to let users change levels and order of levels for the memberships.php report.
  • ENHANCEMENT: Updated video and copy for readme.txt.
  • ENHANCEMENT: Added user display name to Memberlist search query
  • ENHANCEMENT: Added Russian Ruble as a currency.
  • ENHANCEMENT: Changed the dated term “CVV” to “Security Code (CVC)” when shown on the frontend.
  • ENHANCEMENT: Added .doc and .docx to the mimetype class.
  • ENHANCEMENT: Added Portuguese language files. (Thanks, Secundino Correia)
  • ENHANCEMENT: Updated plugin admin pages with better links to documentation and support.
  • How to Name Your Membership Levels or Subscription Options

    How you name your membership levels is one of the most important components for conversions on your membership on site.

    Let’s spend some time thinking about membership level names. We’ll cover the classic membership site structures and provide examples for naming the membership levels or subscription options for each case. (And there’s even a nifty “level name” playground that tests your name within various plugin-generated phrases.)

    Take a step back and evaluate your membership level names.

    I work with thousands of membership sites and have seen a lack of clarity (and creativity) in this key area. The membership level name identifies what the member is receiving in exchange for their membership fee. In some cases, the name is a badge of pride for your members, turning them from the anonymous “visitor” to a member of the “in-crowd”.

    Putting all of this touchy-feely stuff aside, the level name is also used in various default “phrases” within your membership site system. You need to make sure your level name “reads well” within these phrases. I’ve created a simple tool at the end of this article that provides a litmus test for your level names within the key system phrases in Paid Memberships Pro.

    Membership Site Structures Covered include:

    Tiered/Hierarchical Levels

    This flavor of membership site offers more (or fewer) features based on membership level. This is the structure of our own site here at Paid Memberships Pro. We offer a Free, Core and Plus level. I think the level names are OK, and they do imply a tier (Unlimited being the highest membership option available).

    Here are some level name ideas based on the “tier”

    Tier 1
    • Basic
    • Beginner
    • Starter
    • Primary
    • Bronze
    • Baby Bear

    Tier 2
    • Intermediate
    • Enhanced
    • Standard
    • Secondary
    • Gold
    • Papa Bear

    Tier 3
    • Advanced
    • Ultimate
    • Extreme
    • Professional
    • Platinum
    • Mama Bear (just right!)

    Price/Payment Term Structured Levels

    Use this level naming structure when all membership levels offer the same package of features, but vary based on price or term. First, try to think of something clever based on your specific name, brand or site topic.

    If your membership site was a sports team, what would you call your fans?

    You can give membership an overall brand, such as “Trekkies”, “Bronies”, or “Cheeseheads”. Then use your level names to clarify the price or payment term.

    You may still have an idea of “tier” in this structure, such as a Foodie Box site that offers 3 Month, 6 Month, and Annual subscriptions, with the option to “add on” a dessert box. For this case, I’d suggest reading through my post on price-adjusting Register Helper fields to have a selection at checkout modify the level price. Easy as pie.

    Here are some level name ideas based on the price/term

    • Daily *
    • Weekly
    • Monthly
    • Quarterly
    • Yearly

    • Annual
    • Per Annum
    • Bi-Weekly
    • Bi-Monthly
    • Semi-Annual

    • Half-Yearly
    • Perennial
    • Lifetime
    • Forever
    • Eternal

    * Note that not all integrated gateways offer “daily” subscriptions.

    Content Vertical/Category-specific Levels

    In this type of membership site, the membership levels differ not by features, but by type of content or “vertical”. This is common in a stock or investing site, nationwide membership chapters site, or an online dating site where identifying the member’s “interest” is handled via the membership level selected.

    Here are some level name ideas based on the content vertical

    • Stock/Investing Sites: Technology Sector, Gas and Oil, Retail, Pharmaceuticals
    • Member Chapter Sites: Country Name, State Name, County Name
    • Online Dating Sites: Man Seeking Woman, Woman Seeking Man, Man Seeking Man, Woman Seeking Woman, etc.

    User or Member-type Levels

    This is a category of membership site where the member receives a different level/price/package based on the type of member they are. Check out our Sponsored/Group Members Add On if you have a membership level that offers parent/child account relationships.

    Here are some level name ideas based on the user/member-type

    • Individual
    • Student
    • Parent
    • Family

    • Senior
    • Corporation
    • Volunteer

    • Teacher
    • Non-Profit
    • Military: Active Duty and Veterans

    Content Delivery/Subscription Type Levels

    For this type of membership site, the levels differ by how the content is received. It will make more sense after reading the level names below, but basically this case is used when the content is offered in various formats (online, print, email), and the selected level determines the members’ preferred method(s) of content delivery.

    For this case, you could use the same membership branding concepts covered in the Price/Payment Term Structured Levels section above, then use the level names to clarify content delivery.

    Here are some level name ideas based on the type of content delivery

    • Online Only
    • Print Only
    • Online and Print
    • Email Newsletter

    Sponsorship Level/Benefactor Tiers

    If you’re a non-profit organization, you most likely think about membership a bit differently than most other site types. In your case, membership level is actually sponsorship level, and you have a chance to get really creative in how you name your tiers.

    A great approach to level naming is to pull ideas from the goals of your organization, your location, the group or cause you represent.

    Instead of coming up with my own examples, I’ve compiled a few non-profits and their benefactor/membership tier names below:

    The Franklin Institute’s Benefactor Society

    • Pendulum Partners
    • Baldwin Circle
    • Celestial Circle
    • Ambassador Circle
    • Kite and Key Circle
    • Franklin Fellows
    • Inventors Circle

    Colonial Williamsburg’s Donor Societies

    • Duke of Gloucester Society
    • Capitol Society
    • Colonial Williamsburg Assembly
    • Colonial Williamsburg Burgesses
    • Colonial Williamsburg Associates
    • Raleigh Tavern Society

    The Kimmel Center’s Founders Circle

    • Partner
    • Benefactor
    • Artists Circle
    • Leadership Circle
    • Presidents Circle
    • Chairmans Circle

    Go Forth and Name Ye Levels!

    I hope this post has given you some direction as you brainstorm level names for your new or existing membership site. If you have a type of membership site that wasn’t covered, post a comment below so we can discuss some level naming conventions for your site.

    If you run an existing membership site, you can still rename your membership levels. With Paid Memberships Pro you can simply update the level names under Memberships > Edit Level in the admin. Every member that currently has that membership level will automatically have their membership level name updated.

    Time to Play

    The Membership Level Names Playground below allows you to enter a desired membership level name and see how it will “read” within various plugin-generated phrases. These are the most common phrases your members will see, both on your site and in membership-related emails.

    Test your level name against key phrases in Paid Memberships Pro.

    Enter a level name to test:

    You have selected the My Level Name membership level.
    Shown on the membership checkout page.

    Membership Level: My Level Name
    Shown in most member communication emails and invoices.

    Your My Level Name membership is now active.
    Shown on the membership confirmation page.

    If you have a level name that doesn’t pass the litmus test, don’t fret. Every phrase in Paid Memberships Pro can be “translated”, and I’m not just talking about languages.

    Our blog has several posts on renaming key terms within the plugin, such as this post about replacing the word “Membership” with “Subscription”.

    Depending on your membership site, you may need to use these methods or another approach. Just open a topic in our members forum (provided to PMPro Plus and Unlimited members), and we will help you work out any hiccups between your desired membership level name and the built in phrases of Paid Memberships Pro.

    MailChimp Add On v2.1 Update Notes

    We have just pushed out v2.1 of the MailChimp Integration Add On. This update fixes a lot of bugs, but one of those in particular would have stopped users from being subscribed to MailChimp lists after checkout or registration.

    Please upgrade by visiting the Dashboard -> Updates area of your WordPress site or downloading the latest ZIP file directly here.

    Reconciling Missing Subscribers

    If you suspect that you’ve missed some list signups due to this bug, you can use the export CSV feature of the plugin to generate files to import your members into MailChimp.

    When you import the CSVs, it will not duplicate users already on your lists and will not subscribe anyone who has since unsubscribed through MailChimp.
    We have a guide for exporting subscriber lists by membership level and importing them into MailChimp.

    View the Export/Import Guide for MailChimp

    Support for Localication and Multiple Memberships Per User

    In addition to fixing this subscription bug and a few others, we’ve added localization support to the plugin. This means that the community can now contribute a MailChimp Integration translation via the GlotPress.

    We’ve also updated the add on to ensure compatibility with the PMPro Multiple Memberships Per User Add On, which we’ll be sharing more info about soon.

    The full list of updates is below.

    • BUG: Fixed a variety of bugs related to the MailChimp API, including a bug introduced in v2.0.3 that sometimes kept the plugin from subscribing users to lists.
    • BUG/ENHANCEMENT: Doing a better job of limiting the number of API requests made to avoid API limits.
    • ENHANCEMENT: Supports the pmpro-multiple-memberships-per-user Add On.
    • ENHANCEMENT: Added localization support. (Now should be able to create language files via GlotPress)

    Turn your WooCommerce Store into a Catalog for Non Members 

    Prevent non-members from viewing product prices or purchasing products from your WooCommerce store with this Code Recipe

    This page requires a PMPro Core Account or higher.

    Already have an account? Login Now »

    New to this site? Register Now »

    Approvals Add On Now Available

    The Approvals Add On allows you to set up a unique approval or application process for your membership site. After a member signs up, the admin will have the ability to approve their membership or deny the application.

    View the Add On

    The diagram below explains how approval fits into the standard membership checkout process.

    How it Works

    Using the add on, you can set your membership levels to require approval with a few options. Not only can you set a level to require approval, you can also set a level to require an approved membership from another level in order to complete checkout.

    This allows you to offer a two-step membership application and full membership registration model. You can place an application fee on the application level, and then charge your full recurring membership fee on the primary membership for approved members. Extend your site further by using fields add via the Register Helper Add On to gather member information that will help you decide whether to approve or deny the membership.

    View the Add On


    Enhance Your Membership Levels Page with Member Badges

    We’ve just added hooks to the Advanced Levels Page Shortcode Add On, allowing you to add unique content before and after the level information.

    This recipe integrates the Member Badges Add On and displays the badge associated with each level in the output.

    Member Badges on a Three Column Layout

    The Code Recipe

    This code recipe requires a PMPro Plus Account or higher.

    View Membership Options

    Member Badges on a Table Layout

    The Code Recipe

    This code recipe requires a PMPro Plus Account or higher.

    View Membership Options

    Available Hooks in the Advanced Levels Page Shortcode v.2.4+

    Hooks for the “div” and “column” layouts:

    do_action( 'pmproal_before_level', int $level_id, int string $layout );
    do_action( 'pmproal_after_level', int $level_id, int string $layout );

    Hooks for the “table” layout:

    do_action( 'pmproal_extra_cols_before_header' );
    do_action( 'pmproal_extra_cols_after_header' );
    do_action( 'pmproal_extra_cols_before_body' );
    do_action( 'pmproal_extra_cols_after_body' );

    Note: hooks have not yet been added for the compare_table layout

    Set a Member Author’s Posts to Draft When Membership is Cancelled

    If you allow guest authors on your membership site as a feature of membership, this recipe will demonstrate how to automatically change their posts’ statuses to “draft” when membership is cancelled.

    This page requires a PMPro Core Account or higher.

    Already have an account? Login Now »

    New to this site? Register Now »

    PMPro Update 1.9.1

    Version 1.9.1 of Paid Memberships Pro is out with a handful of bug fixes and some tweaks to our license nag. This fix in particular will help on sites that had multiple plugins using the Stripe API library.

    Concerning Our License Prompts

    The tweaks to our “license nag” (as we’ve named it) deserve a bit of explanation. Almost two years ago we launched our PMPro Plus membership here on the site, which includes access to our paid support forums but also allows you to use the WordPress dashboard to automatically update the plugins that we host on our own servers.

    Since then, we’ve been selling PMPro Plus licenses on the site here, but we weren’t actually requiring a valid license to update the Plus addons.

    There were relatively few people taking advantage of the lack of checks on our update server, so we didn’t bother to turn on the check. Now however, there are quite a few sites running PMPro with Plus licenses that try to update against our servers without valid licenses. We enabled the license check in v1.9 to encourage those sites to purchase a license (or alternatively download zip files from GitHub to update their addons).

    We also added a “license nag” that pops up once a week in the WP dashboard if you don’t have a PMPro license key set. Our intention for this nag is to kindly suggest that sites using PMPro on a production site purchase a support license. These support licenses pay us to support our customers, but they also support the PMPro platform in general by giving us cashflow to pay our developers/etc. I know that as a user of open source software myself, often times the decision of which projects I support and which I don’t comes down to simply whether or not I was asked for support.

    We are still committed to PMPro as an open source project first and foremost.

    All of our code is GPLv2 and available for free on or At the same time, we want to encourage users who are willing to pay to purchase licenses to help support themselves and the platform.

    It’s hard to strike a balance between asking nicely and being annoying. We’re not there yet. The v1.9 update was both unclear and aggressive in how the license notification worked. We’ll continue to monitor things and consider other changes (maybe making it less than once per week for sites without a license), but in v1.9.1 we have made a couple of changes to the license nag:

    1. On new installs, we will wait 1 week before showing the nag at all. This gives new users time to discover our website on their own or to try out the plugin and deactivate it if they aren’t using it. We didn’t mean for the license notification to be so “in your face” when the plugin was activated.
    2. The “Invalid Key” message is no longer showing if you haven’t even tried to enter a key. The error message is also yellow vs. red to note it as a warning vs. an error.

    We’re also working on updates to our pricing page and documentation on the site here to make it more clear who should purchase which license.


    Please update Paid Memberships Pro from the plugins page of your WordPress dashboard. You can also get the latest version of PMPro here or version 1.9.1 specifically here.

    Change Log

    The full list of updates is below.

    • BUG FIX: Fixed the code checking if the Stripe library is already loaded to compatability issues with other plugins bundling the Stripe API library.
    • BUG FIX: Cancel code now properly uses preg_replace when sanitizing the list of level ids to cancel.
    • FIX/ENHANCEMENT: Removed test/doc code from Stripe and Braintree libraries.
    • ENHANCEMENT: Now pausing the license nag for the first week of use and removed the “invalid” error if no key is being used.