Plugin
PluginUpdated
Paid Memberships Pro
Paid Memberships Pro by Paid Membership Pro is a WordPress plugin for building and managing membership sites.
Product facts
- Version
- 3.9
- Released
- 28 October 2026
- Type
- Plugin
- Licence
- GPL
- Included in
- Every plan, or $0.79 / year on its own
Overview
The plugin lets site owners offer access to content based on login status or membership level. Restriction rules can apply to posts, pages, and custom blocks, giving businesses, clubs, educators, and online communities a way to manage which visitors can view specific material.
Create membership levels with descriptions, prices, and expiration settings, then use the checkout form for free or paid sign-ups. Members can visit account pages to manage profile and billing details, review orders, and see active memberships. WordPress blocks provide options such as pricing tables, login forms, and membership level displays.
Features
- Content access rules: Restrict posts, pages, and custom blocks according to a visitor's login status or membership level.
- Flexible membership levels: Set descriptions, prices, and expiration settings for each level to define the terms of member access.
- Free and paid checkout: Use a dynamic checkout form to register members and accept purchases for free or paid membership levels.
- Member account pages: Give members a place to view and edit profile details, billing information, orders, and active memberships.
- WordPress blocks: Add elements such as membership level displays, pricing tables, login forms, and cancellation options to site content.
- Member billing history: Let members review purchase histories and update payment methods from their account pages.
Best for
- Businesses offering member-only content
- Clubs managing online memberships
- Educators and digital communities
Changelog
Version 3.9 — 27 October 2026
- Security Improved escaping and SQL query preparation throughout the plugin.
- Security Added direct file access protection to plugin files.
- Security Improved request input handling and redirect safety throughout the plugin.
- Security The Authorize.net gateway now verifies TLS certificates when connecting to Authorize.net.
- Security The 2Checkout gateway now verifies TLS certificates when sending API requests.
- Security The [pmpro_member] shortcode is now also removed from newly added post meta saved by users who cannot edit users.
- Security The REST API order endpoint now only includes order notes for users with the pmpro_orders capability.
- Security Values in the members, orders, and logins report CSV exports that start with a spreadsheet formula character are now prefixed with a single quote so they are not run as formulas.
- Security The admin redirect for missing members, orders, subscriptions, discount codes, and levels now only runs for users who can access the Memberships menu.
- Security The Billing page now redirects to the Membership Account page when the requested subscription does not exist.
- New Merged the Subscription Delays Add On into core. The new First Recurring Payment setting on levels and custom pricing discount codes can delay the first recurring payment by a number of days or until a date set with a date pattern.
- New Merged the Set Expiration Dates Add On into core. Levels and custom pricing discount codes can expire memberships on a date set with a date pattern.
- New Added percentage and fixed amount discount code types alongside the existing per-level custom pricing. The discount is calculated from each level's current pricing and can apply to the initial payment, recurring payments, or both, while the billing cycle, trial, and expiration come from the level.
- New Added a migration tool for deprecated gateways, opened from the "Migrate Subscriptions Off This Gateway" button on the gateway's Payment Settings page. It recreates active subscriptions at Stripe (or sets the memberships to expire), can email members, cancels the old gateway subscriptions, and supports a dry run. A final step deletes the gateway's stored API credentials and stops loading the gateway; orders and subscriptions are kept.
- New Added WordPress Abilities API support (WordPress 6.9+) for querying membership levels, orders, subscriptions, and PMPro search results, and for viewing, changing, and cancelling a member's memberships. Abilities are available over the REST API and to MCP clients through an MCP adapter plugin.
- New Added a wp pmpro WP-CLI command set for memberships, members, levels, orders, and subscriptions, and the pmpro_cli_init action for Add Ons to register their own commands.
- New Added /pmpro/v1/memberships, /pmpro/v1/orders, and /pmpro/v1/subscriptions REST API collection endpoints with filtering, sorting, and pagination.
- Improved The Subscription Delays and Set Expiration Dates Add Ons are now automatically deactivated and can no longer be activated. Their saved settings are used as-is, their filters still run, and their helper functions remain as deprecated wrappers. Custom code that removed the Add Ons' own hook callbacks no longer has any effect.
- Improved Added an "Awaiting Payment Method" filter and tag on the Subscriptions list, an admin notice, and a Membership Account page notice for subscriptions migrated to Stripe that have no payment method on file. The default Recurring Payment Reminder email now asks these members to add a payment method.
- Improved Added the "Deprecated Gateway Stripe Migration" and "Deprecated Gateway Checkout Required" email templates, shown on sites that still use a deprecated gateway.
- Improved The "Update Billing Info" links on the Membership Account and Billing pages no longer require the subscription to have an order. The Billing page link now only shows for subscriptions on the active gateway when that gateway supports payment method updates, matching the Membership Account page.
- Improved Added the pmpro_deprecated_gateway_batch_size filter to set how many subscriptions the deprecated gateway migration processes per batch.
- Improved Added a captcha to the login and lost password forms, including wp-login.php, when reCAPTCHA or Cloudflare Turnstile is enabled. The captcha is only shown after a failed login or other suspicious activity from the visitor's IP address in the last 15 minutes.
- Improved Replaced the separate reCAPTCHA and Cloudflare Turnstile settings with a single Captcha setting on the Security Settings page, so only one captcha runs at a time. Existing settings carry over, and sites that had both enabled now use reCAPTCHA. Added the pmpro_captcha_services filter for registering other captcha services.
- Improved Added the pmpro_login_form_before_submit_button action and the pmpro_authenticate_login_checks, pmpro_login_forms_handler_message, and pmpro_login_forms_handler_msgt filters to the login flow.
- Improved A failed payment at checkout or on the Update Billing page now requires a new reCAPTCHA or Cloudflare Turnstile check before the next attempt. Thanks to Freelance Studio for the report.
- Improved Membership Account page now shows when a membership's latest payment is past due and shows a card for memberships with a pending checkout that is waiting on payment.
- Improved Added the pmpro_membership_account_after_pending_level_card_content action for adding content to a pending membership card on the Membership Account page.
- Improved Added an optional Advanced Setting to automatically delete abandoned checkout users (Potential Spam Checkouts) after 30 days. Users with any membership history, users who can edit posts, and users who have written posts are never deleted. Added the pmpro_abandoned_signup_deletion_days filter to change the retention period.
- Improved Added Status, Usage and Level filters to the Discount Codes admin page.
- Improved Added a date filter (All Time, Last 7 Days, Last 30 Days, Last 12 Months, or a custom range) to the Email Log report.
- Improved The Email Log now records the file names of email attachments and shows them in the log details and the personal data exporter.
- Improved Added the {{ billing_update_url }} email template variable to the Payment Failure email and linked to the Billing page in its default body.
- Improved The Admin Activity Email now reports active members and active memberships as separate numbers when they differ.
- Improved Added Product/Offer JSON-LD structured data for membership levels on the levels page, the checkout page, and pages using the Single Membership Level block. It can be turned off with the Structured Data setting on the Advanced Settings page, and developers can customize it with the new pmpro_structured_data_* filters.
- Improved Added an optional Level Image setting on the edit level page, used as the product image in membership level structured data.
- Improved Added Elementor v4 (atomic elements) support to PMPro content restriction controls. Added the pmpro_elementor_atomic_element_types filter to change which atomic elements support restriction.
- Improved Added a new pmpro_view_as capability so the "View As" toolbar in the admin bar can be granted to roles that should not have manage_options.
- Improved Added the pmpro_memberslist_sortable_columns and pmpro_memberslist_sql_join filters and made the First Name and Last Name columns sortable in the Members List.
- Improved Improved Members List performance for the default and single-level views by no longer grouping rows when each row is already one member and level. Added the pmpro_members_list_group_rows filter so custom code that adds joins through pmpro_members_list_sql can turn grouping back on.
- Improved Added the pmpro_is_page() function to safely check PMPro pages, with optional shortcode and block detection for custom pages.
- Improved Added screen reader announcements to the Liquid autocomplete in the email template editor.
- Improved Reworded checkbox labels on the Edit Membership Level and Edit Discount Code screens to describe what each setting does.
- Improved Added pmpro_build_settings_fields() and related helpers for building admin settings screens from field arrays, and converted most core settings screens to use them.
- Improved Added the pmpro_get_memberships() function, an offset argument for MemberOrder::get_orders(), and offset and return_count arguments for PMPro_Subscription::get_subscriptions.
- Fixed Date patterns now resolve consistently for subscription delays and set expiration dates. Day 29-31 patterns use the last day of shorter months, a pattern that lands on today moves to its next occurrence instead of a year later, and monthly expiration patterns use the current month when the day has not passed yet, as in Set Expiration Dates 0.7 and earlier.
- Fixed Fixed the frontend Change Password form changing passwords that contain certain characters before saving them, which locked the member out.
- Fixed Fixed the frontend Edit Profile form removing backslashes from saved names.
- Fixed Fixed values containing quotes being saved or sent with extra backslashes on the frontend Update Billing page, the Payment Settings page, and the Edit Order screen.
- Fixed Fixed the User Fields settings page deleting all saved fields when the submitted settings could not be read.
- Fixed Fixed a fatal error when the reCAPTCHA verification request to Google fails with a network error.
- Fixed Fixed the Billing page losing the selected subscription when redirecting a logged-out member to log in.
- Fixed Fixed the Admin Activity Email counting memberships that belong to deleted users and merging membership levels that share the same name.
- Fixed Fixed the Members per Level report counting a member more than once when they had duplicate active rows for the same level, and showing outdated counts after a user was deleted.
- Fixed Fixed Members List pages repeating or skipping members who share the same registration date.
- Fixed The Stripe webhook now answers 503 instead of 200 when it can't retrieve an event because of a connection error, rate limit, Stripe server error, or an authentication or permission error, so Stripe sends the event again and the failure shows in the Stripe dashboard.
- Fixed With async Stripe webhook processing on, a scheduled run that can't retrieve the event from Stripe now tries again up to five times instead of dropping the event.
- Fixed Fixed an issue where a Stripe payment that failed or needed authentication and was later paid could create a duplicate order and send the Payment Failure or Payment Action Required emails.
- Fixed Fixed an issue where the email greeting used the original recipient's name when an email template had a custom To address.
- Fixed Fixed a fatal error when calling the deprecated pmpror_recurring_emails() or pmpror_recurring_emails_legacy() functions. They now queue reminder emails via Action Scheduler.
- Fixed Usage tracking no longer treats production sites whose hostnames start with
- Fixed Stage
Earlier versions
- 3.8.9 (12 October 2026): 4 improved, 23 fixed, 1 security
- 3.8.8 (6 October 2026): 1 improved, 7 fixed, 4 security
- 3.8.7 (25 September 2026): 3 improved, 12 fixed, 7 security, 1 removed
FAQ
Is Paid Memberships Pro free?
The code of Paid Memberships Pro is licensed under the GPL, so anyone may use, change and share it. GPL 247 is a paid service: a plan or a purchase of Paid Memberships Pro gives you the download and its updates. The developer's own support, licence key and online services are not included.
Which version of Paid Memberships Pro is this?
Version 3.9, released 28 October 2026. New versions appear here when the developer publishes them.
How do I update Paid Memberships Pro?
Install GPL 247 Updater on your site and paste your key from My Account. It installs new versions of Paid Memberships Pro for you.





