https://www.gpldownloads.com/downloads/paid-memberships-pro/changelog/
Latest Updates
Back to Paid Memberships Pro

Paid Memberships Pro changelog

Release notes for every version we have on record, newest first.

Latest 3.9 · 27 Oct 2026 40 versions Since Nov 2024

2026 19 versions

3.9 Latest 27 Oct 2026 7 new29 improved19 fixed10 security
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. #3630 (@dparker1005, @kimcoleman)
  • 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. #3630 (@dparker1005, @kimcoleman)
  • 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. #3727 (@dparker1005)
  • 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 ga...
  • 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. #3736, #3757 (@mircobabini, @dparker1005)
  • 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. #3740, #3757 (@flintfromthebasement, @dparker1005)
  • Added /pmpro/v1/memberships, /pmpro/v1/orders, and /pmpro/v1/subscriptions REST API collection endpoints with filtering, sorting, and pagination. #3740, #3757 (@flintfromthebasement, @dparker1005)
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. #3630 (@dparker1005)
  • 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. #3700 (@dparker1005)
  • Added the "Deprecated Gateway Stripe Migration" and "Deprecated Gateway Checkout Required" email templates, shown on sites that still use a deprecated gateway. #3700 (@dparker1005)
  • 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. #3700 (@dparker1005)
  • Added the pmpro_deprecated_gateway_batch_size filter to set how many subscriptions the deprecated gateway migration processes per batch. #3700 (@dparker1005)
  • 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. #3765 (@dparker1005)
  • 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. #3765 (@dparker1005)
  • 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. #3765 (@dparker1005)
  • 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. #3885, #3887 (@dparker1005)
  • 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. #3714 (@kimcoleman, @dparker1005)
  • Added the pmpro_membership_account_after_pending_level_card_content action for adding content to a pending membership card on the Membership Account page. #3714 (@kimcoleman, @dparker1005)
  • 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. #3737, #3901 (@dparker1005)
  • Added Status, Usage and Level filters to the Discount Codes admin page. #3896 (@dparker1005)
  • Added a date filter (All Time, Last 7 Days, Last 30 Days, Last 12 Months, or a custom range) to the Email Log report. #3692 (@dwanjuki)
  • The Email Log now records the file names of email attachments and shows them in the log details and the personal data exporter. #3773 (@faisalahammad)
  • Added the {{ billing_update_url }} email template variable to the Payment Failure email and linked to the Billing page in its default body. #3892 (@dparker1005)
  • The Admin Activity Email now reports active members and active memberships as separate numbers when they differ. #3768 (@flintfromthebasement, @dparker1005)
  • 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. #3735 (@flintfromthebasement, @dparker1005)
  • Added an optional Level Image setting on the edit level page, used as the product image in membership level structured data. #3735, #3906 (@flintfromthebasement, @dparker1005)
  • 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. #3709 (@dparker1005)
  • 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. #3786 (@faisalahammad)
  • 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. #3805, #3902 (@faisalahammad, @dparker1005)
  • 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. #3833 (@flintfromthebasement)
  • Added the pmpro_is_page() function to safely check PMPro pages, with optional shortcode and block detection for custom pages. #3810 (@faisalahammad, @dparker1005)
  • Added screen reader announcements to the Liquid autocomplete in the email template editor. #3819 (@kimcoleman, @RachelRVasquez, @dparker1005)
  • Reworded checkbox labels on the Edit Membership Level and Edit Discount Code screens to describe what each setting does. #3874 (@dparker1005)
  • 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. #3721 (@dparker1005)
  • Added the pmpro_get_memberships() function, an offset argument for MemberOrder::get_orders(), and offset and return_count arguments for PMPro_Subscription::get_subscriptions(). #3736, #3740 (@mircobabini, @flintfromthebasement)
  • Settings screens built with the new field helpers show and hide dependent rows with a data-pmpro-depends attribute instead of inline scripts. The Advanced Settings Hide Ads setting's ID changed from pmpro-hideads to hideads, the pmpro_updateHideAdsTRs() JavaScript function was removed, and the Recurring Subscription, Custom Trial, Membership Expiration, and Disable New Signups checkboxes on the...
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. #3630 (@dparker1005)
  • Fixed the frontend Change Password form changing passwords that contain certain characters (such as "
  • Fixed the frontend Edit Profile form removing backslashes from saved names. #3858 (@dparker1005)
  • 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. #3829 (@dparker1005)
  • Fixed the User Fields settings page deleting all saved fields when the submitted settings could not be read. #3829 (@dparker1005)
  • Fixed a fatal error when the reCAPTCHA verification request to Google fails with a network error. #3765 (@dparker1005)
  • Fixed the Billing page losing the selected subscription when redirecting a logged-out member to log in. #3892 (@dparker1005)
  • Fixed the Admin Activity Email counting memberships that belong to deleted users and merging membership levels that share the same name. #3768 (@flintfromthebasement, @dparker1005)
  • 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. #3768 (@flintfromthebasement, @dparker1005)
  • Fixed Members List pages repeating or skipping members who share the same registration date. #3833 (@flintfromthebasement)
  • 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 (such as a revoked API key), so Stripe sends the event again and the failure shows in the Stripe dashboard. #3890 (@terminalstate)
  • 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. #3898 (@terminalstate)
  • 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. This was most likely when Stripe webhooks are processed asynchronously. #3897 (@dparker1005)
  • Fixed an issue where the email greeting used the original recipient's name when an email template had a custom To address. #3854 (@faisalahammad)
  • 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. #3900 (@dparker1005)
  • Usage tracking no longer treats production sites whose hostnames start with "stage" or "localhost" followed by other letters (such as stagecoach.com) as development sites, and now treats hostnames that start with dev, stage, test, or testing followed by a dash or number (such as dev-2.example.com) as development sites. #3894 (@flintfromthebasement)
  • Fixed MemberOrder::get_order() returning the site's newest order instead of the matching order when passed an order code. MemberOrder::get_orders() now supports a code argument. #3908 (@dparker1005)
  • Fixed PUT and PATCH requests to the discount_code REST API endpoint not updating existing discount codes, and fixed the billing_limit and expiration values sent for levels being saved incorrectly. #3910 (@dparker1005)
  • Stripe subscription cancellation errors are now recorded in the notes on the subscription's most recent order, and an error while looking up open invoices no longer leaves the Stripe subscription active without notifying the admin. #3923 (@dparker1005, @ashwaniarya)
Security
  • Improved escaping and SQL query preparation throughout the plugin. #3827 (@dparker1005)
  • Added direct file access protection to plugin files. #3828 (@dparker1005)
  • Improved request input handling and redirect safety throughout the plugin. #3829 (@dparker1005)
  • The Authorize.net gateway now verifies TLS certificates when connecting to Authorize.net. #3916 (@dparker1005)
  • The 2Checkout gateway now verifies TLS certificates when sending API requests. #3917 (@dparker1005)
  • The [pmpro_member] shortcode is now also removed from newly added post meta saved by users who cannot edit users. #3921 (@dparker1005)
  • The REST API order endpoint now only includes order notes for users with the pmpro_orders capability. #3918 (@dparker1005)
  • 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. #3922 (@dparker1005)
  • The admin redirect for missing members, orders, subscriptions, discount codes, and levels now only runs for users who can access the Memberships menu. #3920 (@dparker1005)
  • The Billing page now redirects to the Membership Account page when the requested subscription does not exist. #3919 (@dparker1005)
3.8.9 12 Oct 2026 4 improved23 fixed1 security
Improved
  • Added the pmpro_account_profile_list_items filter to customize the profile items on the Membership Account page. The Username and Email items now also have their own CSS classes. #3870 (@dparker1005)
  • Added edit and view page buttons to the Terms of Service setting. #3881 (@dparker1005)
  • Applying an empty discount code at checkout now shows an error message. #3866 (@dparker1005)
  • When an admin refund fails, the notice now includes the payment gateway's error message. #3883 (@dparker1005)
Fixed
  • Fixed the membership required message showing twice on restricted content when Elementor and Yoast SEO are both active. #3879 (@dparker1005)
  • Restricted Elementor widgets are no longer rendered as empty styled containers for users without access. #3875 (@dparker1005)
  • Fixed the level confirmation message losing its paragraph formatting in checkout emails. #3861 (@dparker1005)
  • Fixed the default "More Information" heading not showing for the checkout_boxes field group, and the pmpro_default_field_group_label filter being ignored. #3859 (@dparker1005)
  • Fixed a deprecation notice when using the pmpro_default_field_group_label filter. The legacy pmprorh_section_header filter is now the one flagged as deprecated. #3888 (@dparker1005)
  • Textarea user field values now keep their line breaks when displayed. #3878 (@dparker1005)
  • Fixed [pmpro_account] shortcode attributes being ignored when the same page also has a [pmpro_account] shortcode or Membership Account block without attributes. #3877 (@dparker1005)
  • PMPro page settings are now cleared when the assigned page is trashed or deleted, and restored if the page is restored from the trash. #3872 (@dparker1005)
  • Page Settings no longer shows edit and view buttons for an assigned page that isn't published. #3886 (@dparker1005)
  • Renew links and the redirect for already-submitted orders now use the pmpro_level URL parameter instead of level. #3876 (@dparker1005)
  • Gateway cancellations now cancel memberships for members whose level is hidden by the pmpro_has_membership_level filter, such as unconfirmed Email Confirmation members. #3867 (@dparker1005)
  • Gateway cancellations for deleted users are no longer logged as errors. #3882 (@dparker1005)
  • Fixed fatal errors when checkout email or password fields were submitted as arrays. #3855 (@dwanjuki)
  • Recurring levels now save a billing cycle number of at least 1. #3865 (@dparker1005)
  • Deleting an order now also deletes its order meta. #3869 (@dparker1005)
  • Deleting an order now keeps all Orders list filters, sorting and the current page. #3868 (@dparker1005)
  • Paginating or sorting after deleting a discount code or order no longer repeats the delete request. #3863 (@dparker1005)
  • The personal data exporter now shows array user meta as readable text instead of serialized data. #3860 (@dparker1005)
  • Fixed a PHP warning in pmpro_has_membership_access() when the post doesn't exist. #3862 (@dparker1005)
  • Failed AJAX and REST API logins no longer redirect to the login page. #3864 (@dparker1005)
  • The Logins report now tracks visits after a member logs in or out. #3871 (@dparker1005)
  • The membership section and Edit Member link are now hidden on Network Admin user profiles. #3880 (@dparker1005)
  • Updated the GPL license link on the License page. #3856 (@dparker1005)
Security
  • Fixed an issue where a failed Cloudflare Turnstile check allowed later checkout and billing update submissions in the same session to skip the security check. #3884 (@dparker1005, Freelance Studio)
3.8.8 6 Oct 2026 1 improved7 fixed4 security
Improved
  • Pending checkout uploads are now deleted when their order is deleted. #3847 (@dparker1005)
Fixed
  • Fixed a fatal error when changing membership levels while WP Fusion Lite is active but not connected to a CRM. #3834 (@andrewlimaza)
  • Checkout now stops with an error when the chosen username could not be used to log in, instead of silently saving a different username. #3837 (@faisalahammad)
  • Fixed the file field Delete button showing to all users when allow_delete was set to admins. #3847 (@dparker1005)
  • Fixed user field file uploads being rejected when the file extension's case did not match the field's allowed file types. #3850 (@dparker1005)
  • Fixed a PHP warning and a missing file extension on temporary upload files for checkouts that are completed later, such as Stripe Checkout and PayPal Express. #3851 (@dparker1005)
  • Fixed export downloads failing when a plugin filters random_password to add special characters to generated passwords. #3849 (@dparker1005)
  • Stripe webhooks no longer try to update a subscription's application fee on sites using API keys, which logged failed requests in Stripe. #3852 (@flintfromthebasement)
Security
  • Files uploaded through user fields are now stored in uniquely named folders, and are deleted when the user is deleted. #3847 (@dparker1005, @GrayOM)
  • Fixed restricted post excerpts showing in RSS feeds, embeds, and the Post Excerpt block when "Show Excerpts to Non-Members" is off. #3853 (@dparker1005, @Feldspar-AI-Agent)
  • The member edit screen's User Info panel now requires permission to edit the specific user being edited, and only accepts a password when creating a new user. #3835 (@dparker1005)
  • User fields can no longer save to the user meta key that stores roles and capabilities. #3848 (@dparker1005)
3.8.7 25 Sep 2026 3 improved12 fixed7 security1 removed
Improved
  • Added a Stripe connection test to the payment settings page that checks daily and on demand whether Stripe and the Paid Memberships Pro Connect server can be reached and whether Stripe accepts the saved keys, with an admin notice when a key is rejected. #3792 (@dparker1005)
  • Added additional PHP file extensions to the default extension blocklist for the getfile script. #3798 (@dparker1005, @kta1kri)
  • Members List username row actions now use the same markup as the other PMPro list tables. #3817 (@kimcoleman)
Fixed
  • Connecting to Stripe now refuses to overwrite an existing connection with a different Stripe account. #3792 (@dparker1005)
  • The Stripe webhook notice no longer reports a missing webhook when Stripe is actually rejecting the saved credentials. #3792 (@dparker1005)
  • Refunding an order whose charge was already refunded in the Stripe dashboard now marks the order as refunded instead of failing. #3811 (@dparker1005)
  • Fixed Stripe webhook errors for charge.failed and charge.refunded events when another plugin loads an older version of the Stripe library. #3796 (@faisalahammad)
  • Guest comments no longer show the post author's PMPro avatar. #3822 (@flintfromthebasement)
  • Membership managers can now print order invoices. #3807 (@faisalahammad)
  • The Pay by Check gateway description now reflects that orders are marked as paid at checkout, and links to the Pay by Check Add On for manual payment approval. #3802 (@faisalahammad)
  • Fixed quotes in email template variable descriptions showing as HTML entities in the editor autocomplete. #3818 (@dparker1005)
  • The required asterisk is now shown only once on radio user fields. #3795 (@faisalahammad)
  • Fixed the styling of the Export to CSV button on admin list pages when it is rendered as a button. #3824 (@kimcoleman)
  • Expanded rows in the Orders, Members, Subscriptions, and Discount Codes list tables now take the full table width on mobile. #3816 (@faisalahammad, @kimcoleman)
  • The PMPro admin banner no longer overlaps the Screen Options and Help tabs on small screens, and list table row actions are tidied on mobile. #3815 (@kimcoleman)
Security
  • Fixed a REST API authorization bypass where route capability checks were case-sensitive while WordPress routes are not. #3823 (@andrewlimaza, @kta1kri)
  • PayPal Express, Website Payments Pro, Payflow Pro, and PayPal Standard API requests now verify PayPal's SSL certificate. #3830 (@dparker1005, @kta1kri)
  • PayPal gateway error messages for invalid API responses no longer include the API request, which contained the merchant's API credentials. #3830 (@dparker1005, @kta1kri)
  • Add On downloads from the license server no longer skip SSL verification and are now always requested over HTTPS. #3831 (@dparker1005, @kta1kri)
  • Fixed an issue where the Orders admin search could be used to modify the database query. #3825 (@dparker1005)
  • Added nonce checks to the license key form, usage tracking opt-in links, Stripe Connect fee acknowledgement, and several admin notice links. #3826 (@dparker1005)
  • Added a missing capability check to the Setup Wizard save handler so it only runs for users with the pmpro_wizard capability. #3784 (@faisalahammad)
Removed
  • Deprecated PMPro_AddOns::http_request_args_for_addons(), which no longer changes request arguments. #3831 (@dparker1005)
3.8.6 8 Sep 2026 3 improved5 fixed
Improved
  • Changed the "Edit Membership" button on the Edit Member memberships panel to "Update Membership" to make it clear that it saves the level change. #3781 (@flintfromthebasement)
  • The password visibility toggle now shows only the eye icon in the log in widget and on narrow screens so the field label and the toggle no longer wrap into each other. #3769 (@kimcoleman)
  • Wisdom tracking data now reports whether the site is running on PMPro Hosting. #3770 (@dparker1005)
Fixed
  • Stripe Connect sites now refresh the platform publishable key from Paid Memberships Pro instead of using the key saved during the initial connection forever, so onsite checkout keeps working after the platform key is rotated. #3791 (@flintfromthebasement)
  • Liquid tags that the visual email template editor wrapped in paragraph tags no longer produce empty or unbalanced paragraphs in sent emails. #3782 (@dparker1005)
  • The 3.8.4 upgrade script no longer fires order update hooks (e.g. Zapier) for every order whose Stripe transaction IDs were recovered. #3790 (@dparker1005)
  • Fixed the Stripe Connect environment lookup in has_connect_credentials() so that Site Health checks the credentials for the active gateway environment, and avoided a PHP notice after a failed Stripe Connect disconnect response. #3777 (@flintfromthebasement)
  • The "Error:" prefix in Stripe Connect failure notices now renders in bold instead of as literal HTML. #3774 (@flintfromthebasement)
3.8.5 24 Aug 2026 1 improved1 fixed3 security
Improved
  • Removed the notices on the Stripe payment settings recommending the deprecated Add PayPal Express Add On. #3751 (@flintfromthebasement)
Fixed
  • Guarded the pmpro_setMessage() calls in PMPro_AddOns so that activating Paid Memberships Pro while the Update Manager Add On is active no longer causes a fatal error. #3763 (@dparker1005)
Security
  • Fixed an issue where the payment amount was not re-verified after Strong Customer Authentication (3D Secure) in the Stripe on-site checkout. #3767 (@proxydom)
  • Fixed an access check bypass in the getfile service that could allow protected files to be served through admin-ajax.php without a membership access check. #3762 (@dparker1005)
  • Added missing capability and nonce checks to several admin AJAX and service handlers. #3758 (@flintfromthebasement)
3.8.4 6 Aug 2026 1 improved3 fixed
Improved
  • Added new --pmpro--btn--border-radius, --pmpro--btn--top-bottom-padding, and --pmpro--btn--left-right-padding CSS variables so that button styles can be customized separately from other elements that share the base variables. #3747 (@RachelRVasquez)
Fixed
  • Fixed an issue where Stripe Checkout orders paid with delayed notification payment methods such as SEPA Direct Debit could be completed without their subscription and payment transaction IDs, which prevented membership cancellations from being sent to Stripe. An upgrade script now recovers the missing IDs for previously affected orders. #3745 (@dparker1005)
  • Fixed an issue where a user field could be shown at checkout even though its field group was hidden from checkout if the field overrode the group's profile visibility setting. #3744 (@dparker1005)
  • Fixed an issue where duplicate recurring scheduled tasks, such as those inherited from a cloned or migrated database, would run simultaneously indefinitely. Duplicate chains are now cancelled automatically, keeping the earliest scheduled task. #3746 (@dalemugford)
3.8.3 30 Jul 2026 3 improved6 fixed
Improved
  • Site Health now detects the PMPro SMTP Add On as the site's email sending service when a connector is configured. #3729 (@dparker1005)
  • Added translator comments to localized strings containing placeholders so translators have context for each variable. #3730 (@jahidhasan018)
  • The discount code lookup in PMPro_Discount_Code::save() now uses $wpdb->prepare(). #3734 (@andrewlimaza)
Fixed
  • Multi-value user fields (multiselect, select2, and grouped checkboxes) now display correctly when their values were imported from a CSV file as a comma-separated string. #3742 (@flintfromthebasement)
  • Fixed a fatal error that could occur when returning from an offsite gateway if the checkout data was missing from the order meta. #3741 (@dparker1005)
  • Fixed PMPro core and Add Ons never auto-updating in the background because the update hooks were only registered on admin_init, which does not fire during WP-Cron where automatic updates run. #3738 (@dalemugford)
  • Set new_version on no_update entries so up-to-date Add Ons no longer trigger an undefined property warning in WP-CLI and other consumers of the plugin update transient. #3738 (@dalemugford)
  • The bulk user delete confirmation screen now counts membership history for every selected user instead of only the first. #3733 (@jahidhasan018)
  • The level group selection message is no longer shown on the Membership Levels page for groups that contain only one level. #3731 (@jahidhasan018)
3.8.2 13 Jul 2026 4 fixed2 security
Fixed
  • Read-only user fields are no longer saved on form submission and are now escaped when displayed. This also fixes read-only checkbox and select field values being erased on profile update. #3726 (@dparker1005)
  • Fixed broken CSV exports when an exported value contained a quotation mark. #3716 (@dwanjuki)
  • Fixed checkout failures that could occur when the matching Stripe price had been archived in the Stripe dashboard. #3717 (@flintfromthebasement)
  • Fixed an issue where users with the pmpro_reports capability could not view email content in the Email Log popup. #3718 (@dwanjuki)
Security
  • Restored sanitization of user field values on save, which had been inactive since v3.4. #3726 (@dparker1005)
  • The Authorize.net Silent Post handler now requires Authorize.net API credentials to be configured on the site. #3724 (@dparker1005)
3.8.1 29 Jun 2026 3 improved6 fixed
Improved
  • Added a new style attribute to the [pmpro_checkout_button] shortcode to render it as a link or a button, and improved its styling. #3708 (@kimcoleman)
  • Improved the HTML validity and accessibility of frontend forms and pages, including fixing duplicate id attributes and invalid fieldset/legend markup. #3707 (@kimcoleman)
  • Added a new pmpro_restrictable_taxonomies filter, allowing Add Ons to register custom taxonomies whose terms can be restricted by membership level from the term edit screen. #3704 (@kimcoleman)
Fixed
  • Fixed a fatal error on the Membership Billing page when a subscription's gateway object could not be loaded. #3706 (@kimcoleman)
  • Fixed the Members List CSV export so the exporting admin is no longer incorrectly included when exporting filtered or searched results. #3711 (@andrewlimaza)
  • Fixed a 404 error when viewing email log details in the modal on sites using Plain permalinks. #3712 (@dwanjuki)
  • Fixed select fields overflowing the viewport on small screens. #3705 (@kimcoleman)
  • Saving a membership level no longer clears term restrictions, such as tag restrictions, that were set from the term edit screen. #3704 (@kimcoleman)
  • Restricted posts are now correctly hidden from searches and archives when a term's ID and term taxonomy ID differ. #3704 (@kimcoleman)
3.8 15 Jun 2026 2 new7 improved7 fixed2 removed
New
  • Upgraded the email template editor to the standard WordPress visual/text editor with built-in Liquid syntax autocomplete for variables, tags, and filters. #3695 (@dparker1005)
  • Added a new [pmpro_membership_level] shortcode for displaying membership level details. #3087 (@kimcoleman)
Improved
  • Added Divi 5 compatibility for PMPro module-level restrictions and no-access message handling. #3620 (@JarrydLong)
  • Added a new level_group_id email template variable to every email template class that exposes membership_id. #3684 (@kimcoleman)
  • Allowed shortcodes in the account page message. #3682 (@kimcoleman)
  • Removed the misleading "Advanced Settings" hint from the no-access message controls. #3699 (@dparker1005)
  • Clarified the user field meta key hint on the user field settings page. #3698 (@kimwhite)
  • Added an Add On icon for the MemberPress Migration Toolkit. (@kimcoleman)
  • Removed unused pmpro_userfields_get_group and pmpro_userfields_get_field AJAX handlers. #3672 (@dparker1005)
Fixed
  • BUG FIX/ENHANCEMENT: Now hiding the recurring trial settings on membership level and discount code edit pages when the active gateway doesn't support recurring trials. #3628 (@dparker1005)
  • BUG FIX/ENHANCEMENT: Added a fallback for email logging when SMTP plugins (e.g. Gravity SMTP) bypass the wp_mail_succeeded and wp_mail_failed actions. #3697 (@andrewlimaza)
  • Cleaned up orphaned membership level relationships when a level is deleted. #3693 (@dparker1005)
  • No longer shows the membership confirmation message when the order has not been confirmed. #3682 (@kimcoleman)
  • Fixed a fatal error on the Membership Billing page for logged-out requests. #3694 (@flintfromthebasement)
  • Fixed the Orders list table appearing blank on mobile by setting the order code as the default primary column. #3696 (@dparker1005)
  • Cleared stale card information when a recovered Stripe payment uses a non-card payment method. #3703 (@dparker1005)
Removed
  • Deprecated the credit card expiring email template. #3688 (@dparker1005)
  • The Membership Billing page no longer writes pmpro_b* user meta on save, and the email field has been removed from that page. #3668 (@dparker1005)
3.7.4 28 May 2026 4 fixed
Fixed
  • BUG FIX/ENHANCEMENT: Skip the pmpro_visit cookie when WP_CACHE is active so page caches like Surge, Cloudflare, Varnish, and WP Super Cache aren't bypassed on anonymous front-end requests. Added a new pmpro_set_visit_cookie filter to override the default behavior. #3690 (@flintfromthebasement)
  • Fixed Stripe recurring orders silently saving tax = 0 after the Stripe API version bump by deriving tax from invoice->total_excluding_tax instead of the deprecated invoice->tax. #3685 (@dwanjuki)
  • Fixed Site Health reporting a false-positive Action Scheduler library conflict on Windows hosts by normalizing the library path before the conflict check. #3687 (@dparker1005)
  • Fixed button icons no longer being inline in the WordPress 7.0 admin and the "Show" label floating to the right of the levels dropdown on the Members List screen. #3689 (@RachelRVasquez)
3.7.3 14 May 2026 4 improved6 fixed2 security
Improved
  • Added new action hooks to the subscriptions panel of the Edit Member screen and the single subscription view. #3666 (@kimcoleman)
  • Added nonce checks to read-only admin AJAX handlers (pmpro_orders_print_view, pmpro_get_order_json, login_report_csv, sales_report_csv, membership_stats_csv) for consistency with other admin AJAX endpoints. #3673 (@dparker1005)
  • Added the new pmpro_use_advisory_locks filter as a system-wide escape hatch to disable MySQL advisory locking on hosts where persistent MySQL sessions or other environment quirks cause stuck locks. #3649 (@dparker1005)
  • Replaced the vague "Stripe dashboard settings" wording with a direct link to the Stripe Radar rules page in the billing address field description. #3677 (@dparker1005)
Fixed
  • Prevented concurrent Stripe webhook deliveries from racing on the same order by introducing a MySQL advisory lock around webhook processing. This fixes cases where "at least once" Stripe delivery from multiple infrastructure nodes could create duplicate membership rows or cancel a freshly-created subscription. #3649 (@dparker1005)
  • Fixed the Old Members CSV export to exclude users who currently have any active membership, matching the logic already used by the expired and cancelled filters. #3680 (@dwanjuki)
  • Fixed a PHP warning and a missing payment transaction ID when Stripe checkout sessions complete asynchronously (e.g. Bank Transfer), where the PaymentIntent has no latest_charge at completion time. #3655 (@dwanjuki)
  • Honored the configured currency decimals in pmpro_get_price_info()'s amount_string so zero-decimal currencies (JPY, KRW, VND, UAH, ALL) no longer produce strings like "25.00" that PayPal billing rejects. Also fixed pmpro_get_currency() so it actually honors the $currency parameter it advertises. #3676 (@dparker1005)
  • Allowed updating billing for subscriptions without a successful order on file, so manually-linked subscriptions in the admin no longer redirect users away from the billing page. #3667 (@dparker1005)
  • Fixed the Restricted Files protection self-test reporting "Unable to determine" on sites with no member uploads, by writing a non-dotfile marker (pmpro-protection-test.txt) alongside the existing .htaccess. #3675 (@dalemugford)
Security
  • Added a nonce check to the Update Billing Information page to prevent CSRF, and tightened the gate so enforcement only skips on sites explicitly opted into a pre-3.7.3 custom billing template. The billing template version has been bumped to 3.7.3. #3671 (@dparker1005)
  • Tightened the checkout page nonce enforcement gate so it only skips on sites explicitly opted into a pre-3.0 custom checkout template, closing a gap where sites with a pre-3.0 custom checkout.php in their theme could bypass nonce checks without opting in. #3674 (@dparker1005)
3.7.2 1 May 2026 6 improved6 fixed3 security
Improved
  • Reworked the Email Settings and Security Settings admin pages to detect the active email sending method and security provider, surface that information in Site Health, recognize PMPro Max as a provider, and remove the legacy built-in SendWP integration. #3656 (@kimcoleman)
  • Renamed the Builder and Plus Add Ons to Max throughout the admin and labeled all paid Add Ons under the new Premium license tier. #3650 (@dparker1005)
  • Added the new PayPal Gateway Add On to the Payment Gateway settings page, surfacing it as "Enabled (via Add On)" when active as a secondary gateway. #3657 (@dparker1005)
  • Added new filters for avatar upload location and render location to support multisite installations. #3648 (@kimcoleman)
  • Updated the Design Settings page link to a direct URL so tracking parameters work without a redirect. #3625 (@kimwhite)
  • Added/updated Add On icons including a new MailerLite icon for an upcoming Add On. #3627, #3652 (@kimcoleman)
Fixed
  • BUG FIX/ENHANCEMENT: Fixed three bugs that caused member CSV export downloads to return 403/404: deferred export record cleanup until after the file is served, extended download token TTL to 7 days and hardened the URL builder when no token is available, and prevented zero-record exports from creating a ghost "complete" state. Introduced the pmpro_restricted_file_served action and buffered hand...
  • Fixed a deprecated pmpro_changeMembershipLevel() call when deleting a WP user. #3660 (@kimwhite)
  • Fixed deprecation notices in pmpro_cleanPhone() when the phone value is null. #3654 (@dwanjuki)
  • Fixed the All Levels member export producing duplicate rows and omitting members with higher user IDs in large exports. #3632 (@flintfromthebasement)
  • Fixed the checkbox_grouped field input not receiving the correct CSS selectors. #3646 (@kimcoleman)
  • Skipped content visibility controls for unsupported blocks in widget editors to prevent JS errors. #3653 (@dwanjuki)
Security
  • Tightened ownership check in the /pmpro/v1/order REST permission callback to bail early for anonymous requests, require a non-empty order ID, and use a strict integer comparison. #3643 (@flintfromthebasement)
  • Scoped the /pmpro/v1/quick_search users meta lookups to custom profile fields by skipping internal WP/plugin meta keys. Added the pmpro_rest_api_quick_search_meta_key_blocklist filter so sites can extend the blocklist. #3644 (@flintfromthebasement)
  • Fixed a non-functional capability guard in PMPro_Field_Group::save_fields() where a literal string comparison made the current_user_can( 'edit_user' ) check unreachable. #3645 (@flintfromthebasement)
3.7.1 25 Mar 2026 2 fixed2 removed
Fixed
  • Fixed some admin pages not saving due to POST redirect in list table referer cleanup. #3624 (@kimcoleman)
  • Fixed PHP 8.1 deprecation warnings in restricted files functions on Windows servers with misconfigured upload directories. #3623 (@flintfromthebasement)
Removed
  • Deprecated the PayPal Express gateway. PayPal is retiring the NVP/SOAP API that PayPal Express relies on. A new PayPal integration is coming soon. #3622 (@dparker1005)
  • Renamed the Website Payments Pro gateway slug from paypal to paypalwpp to free the paypal slug for the upcoming PayPal REST API Add On. #3622 (@dparker1005)
3.7 23 Mar 2026 4 new17 improved6 fixed4 removed
New
  • Added native profile picture (avatar) support, allowing members to upload custom avatars managed entirely within PMPro instead of relying on Gravatar. #3597 (@ideadude)
  • Added a Quick Search feature for navigating Memberships admin pages. #3563 (@dparker1005)
  • Added Liquid-style template rendering for email bodies with support for variables, filters, and conditionals. #3584 (@dparker1005)
  • Added email logging for all emails sent by PMPro. The new pmpro_should_log_email filter can be used to enable email logging for non-PMPro emails as well. #3573, #3581 (@dparker1005)
Improved
  • Added sidebar filter panels for the orders and subscriptions admin pages with support for level, status, date range, discount code, gateway, and total filters. #3602 (@dparker1005)
  • Added To, CC, and BCC settings to the Email Templates editor. #3588 (@kimcoleman)
  • Members and orders CSV exports now use Action Scheduler for improved reliability on large datasets. #3543 (@dalemugford)
  • Added optional Action Scheduler support for deferrable webhook events. #3589 (@dparker1005)
  • Added Site Health critical issue notification when plugins are using incorrect folder names. #3553 (@andrewlimaza)
  • Added a restricted directory check to detect and report issues with the protected files directory. #3557 (@dalemugford)
  • Improved support for reCAPTCHA v3 with score validation, defaulting to 0.5 and customizable via the pmpro_recaptcha_v3_min_score filter. #3564 (@andrewlimaza)
  • Adjusted the Update Billing page to no longer automatically redirect away to the account page. #3566 (@andrewlimaza)
  • Updated the Subscriptions admin screens to match the orders admin screens for view, edit, and link styling. #3568 (@kimcoleman)
  • Removed use of the deprecated SQL_CALC_FOUND_ROWS modifier across all queries. #3571 (@dparker1005)
  • Consolidated membership signup and cancellation queries for improved performance on dashboard reports. #3574 (@dparker1005)
  • Now caching the Members Per Level report for improved dashboard performance. #3580 (@dparker1005)
  • Added membership_id as a default column in the Members List CSV export. #3604 (@andrewlimaza)
  • Now supporting light-dark values for contextual message CSS custom properties. #3606 (@kimcoleman)
  • Added PMPro icon to the admin menu and updated the top menu bar to use an icon with screen reader text. #3607 (@kimcoleman)
  • Refactored the Stripe webhook handler into a new PMPro_Stripe_Webhook_Handler class. #3589 (@dparker1005)
  • Removed unused test scripts. #3600 (@dparker1005)
Fixed
  • BUG FIX/ENHANCEMENT: Updated the checkout form submit handler to improve reliability of payment processing. #3545 (@dwanjuki)
  • BUG FIX/ENHANCEMENT: Updated the capability check for viewing admin user fields to use pmpro_edit_members. #3561 (@dparker1005)
  • Fixed dependencies for the content visibility block component to prevent enqueue issues. #3538 (@dparker1005)
  • Fixed a default height prop warning in block editor components. #3540 (@dwanjuki)
  • Fixed a console warning in WordPress 6.3+ by moving block asset enqueuing to the enqueue_block_assets hook. #3549 (@andrewlimaza)
  • Fixed slashed level names displaying with backslashes in the setup wizard. #3617 (@dparker1005)
Removed
  • Marked the Subscription Check Add On as deprecated on the Add Ons page. #3601 (@dwanjuki)
  • Reading webhook status via pmpro_doing_webhook() is now deprecated. Use pmpro_doing_webhook( $gateway, true ) for write mode only. #3603 (@dparker1005)
  • The pmpro_before_members_list_csv_export and pmpro_after_members_list_csv_export actions are deprecated and no longer fired. #3543 (@dalemugford)
  • Removed bundled core translation files to reduce the shipped plugin package size. #3605 (@dparker1005)
3.6.6 13 Mar 2026 2 fixed2 security
Fixed
  • Fixed an operator precedence bug causing corechart.js to load on all report pages. #3609 (@flintfromthebasement)
  • Fixed an "Attempt to read property ID on null" warning in display post states. #3599 (@dwanjuki)
Security
  • Added capability and nonce checks to Stripe webhook AJAX management endpoints. #3615 (@dparker1005)
  • Added shared-secret token validation for the deprecated Authorize.net ARB Silent Posts integration with a configurable pmpro_authnet_silent_post_token option in gateway settings. #3598 (@dparker1005)
3.6.5 26 Feb 2026 5 improved6 fixed1 security
Improved
  • Updated links to the Member Directory and Podcasting Use Case landing pages and hubs. #3593 (@kimcoleman)
  • Added a new pmpro_memberships_widget_periods filter to allow customizing the time periods shown in the Memberships Report widget. (@kimcoleman)
  • Added a new icon for the PMPro Kit Add On. #3575 (@kimcoleman)
  • Now clearing the object cache when user fields are created, updated, or deleted to ensure changes show immediately when using persistent object caching. #3565 (@dalemugford)
  • Updated the WP Fusion Lite integration through v3.47.6. #3583 (@dparker1005)
Fixed
  • BUG FIX/ENHANCEMENT: Now ignoring PayPal error code 11556 when cancelling a subscription that is already inactive to avoid unnecessary admin notifications. #3572 (@dparker1005)
  • Fixed an issue where the field group description was not showing due to an incorrect variable reference. #3591 (@mircobabini)
  • Fixed an issue where failed Stripe recurring payment orders were missing card info and billing address data. #3590 (@dparker1005)
  • Fixed an issue where the membership level billing amount could be recalculated incorrectly when processing checkout via webhook, potentially losing discount code pricing. #3585 (@dparker1005)
  • Fixed an issue where the timestamp for new orders created in the admin could default to 1970 when the site timezone is not UTC. #3582 (@dparker1005)
  • Resolved PHP 8.5+ deprecation warnings for non-canonical cast names. #3560 (@dwanjuki)
Security
  • Gated the unverified Stripe webhook event fallback behind a new pmpro_stripe_webhook_allow_unverified_post_event filter, which defaults to false. #3592 (@dparker1005)
3.6.4 8 Jan 2026 3 improved2 fixed
Improved
  • Adding a new !!order_url!! email template variable to checkout email templates. #3555 (@kimcoleman)
  • Now limiting failed payment emails to be sent a maximum of once daily per subscription. #3552 (@dparker1005)
  • Now cleaning up library conflict records that are older than 7 days. #3554 (@dalemugford)
Fixed
  • BUG FIX/ENHANCEMENT: Discount codes now expire at the end of the date set as the "Expiration Date" instead of at the start of that date. #3559 (@dparker1005)
  • BUG FIX/ENHANCEMENT: Now ignoring Stripe charge.failed webhook events for subscriptions that have already been cancelled in Stripe which could interfere with processing the subsequent customer.subscription.deleted webhook event. #3556 (@dparker1005)

2025 20 versions

3.6.3 15 Dec 2025 4 fixed1 security
Fixed
  • BUG FIX/ENHANCEMENT: Updated membership actions to run more frequently to improve support for hourly memberships. #3547 (@andrewlimaza)
  • BUG FIX/ENHANCEMENT: Improved the styling for nested .pmpro_card elements. #3539 (@kimcoleman)
  • Fixed the HTML structure when displaying image-type file fields to improve appearance. #3537 (@kimcoleman)
  • Corrected the links shown for the Stripe Tax setting. #3546 (@dwanjuki)
Security
  • No longer prepopulating the password field on the checkout page after a failed checkout attempt. #3551 (@dparker1005)
3.6.2 20 Nov 2025 3 improved3 fixed
Improved
  • Stripe subscriptions will no longer be created with an application fee or will have the fee immediately removed when the initial payment is complete. Application fees will then be added per-invoice during the invoice.created webhook to ensure that fees are only charged when PMPro is actively managing the subscription. #3535 (@dparker1005)
  • Updated the Stripe webhook handler to remove application fees from existing subscriptions over time during the invoice.upcoming webhook event. This helps to ensure that websites that have stopped using Stripe Connect will not be charged the 2% application fee. #3535 (@dparker1005)
  • Updated the PayPal IPN handler to use the add_order_note() method when adding the IPN ID to an order. #3534 (@dparker1005)
Fixed
  • Restored fallback logic for pulling billing addresses from Stripe customer objects and previous PMPro orders when a Stripe recurring payment is received without a billing address set on the payment method. #3533 (@dparker1005)
  • Fixed an issue where correcting data in fields with validation errors did not clear the error border from the input. #3531 (@andrewlimaza)
  • Fixed an issue where the Edit Member sidebar may not show the correct user field panels after changing a user's membership level. #3532 (@dparker1005)
3.6.1 12 Nov 2025 3 improved5 fixed
Improved
  • Now showing TOS Consent information on the admin "View Order" page. #3520 (@kimcoleman)
  • Added a new helper method add_order_note() to the MemberOrder class. #3524 (@dparker1005)
  • Added icons for WP Activity Log and WP Fusion Lite. #3521 (@andrewlimaza)
Fixed
  • BUG FIX/ENHANCEMENT: Now updating the next payment date for subscriptions when there is a failed payment. #3526 (@dparker1005)
  • Fixed an issue where post restrictions could not be removed when using the classic editor. #3530 (@dparker1005)
  • Fixed an issue where page contents would not load in the Beaver Builder editor if the post is restricted. #3529 (@dparker1005)
  • Fixed an issue where plus characters in usernames may be converted into spaces when shown in login page error messages. #3519 (@andrewlimaza)
  • Fixed a deprecation warning when installing Add Ons from the Membership > Add Ons screen. #3525 (@andrewlimaza)
3.6 21 Oct 2025 1 new16 improved9 fixed
New
  • Added compatibility with WP Fusion Lite. #3461 (@jarrydlong)
Improved
  • Added a new admin “view order” page before the “edit” step. #3467 (@kimcoleman)
  • Now saving orders in pending status when a Stripe or PayPal recurring payment fails. #3491 (@dparker1005)
  • Now updating the email address for customers in Stripe when the corresponding user is updated in WordPress. #3454 (@dparker1005)
  • General improvements to the Add Ons page including filters for active and inactive Add Ons. #3488 (@dalemugford)
  • Now automatically adjusting the content-disposition header for restricted files based on the file type. #3473 (@andrewlimaza)
  • Added a new filter pmpro_restricted_file_content_disposition to dynamically adjust the content-disposition header for restricted files. #3473 (@andrewlimaza)
  • Added a new filter pmpro_order_action_links to allow modifying the action links when viewing an order on the frontend. #3465 (@dparker1005)
  • Added a new action pmpro_after_updating_post_level_restrictions to run code after the level restrictions for a post is updated. #3462 (@dparker1005)
  • Now repairing membership-based course enrollments when LifterLMS courses are saved while streamline is enabled. #3462 (@dparker1005)
  • Now removing membership-related LifterLMS engagement triggers when streamline is enabled. #3439 (@kimcoleman)
  • Updated Stripe API version to 2025-09-30.clover. #3459 (@dparker1005)
  • Improved styling of “file” type user fields. #3498 (@kimcoleman)
  • Added a new function pmpro_get_gateway_nicename() to retrieve a gateway's nicename by its slug. #3508 (@andrewlimaza)
  • Added abstracted functions for processing recurring successful and failed payments during webhook/IPN handlers. #3491 (@dparker1005)
  • Created a new class PMPro_AddOns for managing Add Ons. #3488, #3497 (@dalemugford)
  • Added an abstracted function pmpro_update_post_level_restrictions() for setting the level restrictions for a post. #3462 (@dparker1005)
Fixed
  • BUG FIX/ENHANCEMENT: Fixes member list exports including “expired” in the file name when exporting “old members”. #3500 (@andrewlimaza)
  • BUG FIX/ENHANCEMENT: Added Brazil to the list of countries that do not allow Stripe Connect application fees. #3490 (@dparker1005)
  • BUG FIX/ENHANCEMENT: Optimized queries when showing “old members” on the Members List. #3494 (@dparker1005)
  • BUG FIX/ENHANCEMENT: Now hiding links from the Account page if the linked page is not set. #3516 (@dparker1005)
  • BUG FIX/ENHANCEMENT: Now saving the Stripe invoice ID as the PMPro order’s payment transaction ID whenever an invoice is generated in Stripe. #3464 (@dparker1005)
  • Fixed an issue where incorrect tax values may be set on orders when using Stripe Checkout. #3489 (@dparker1005)
  • Adding back the !!membership_id!! email template variable to the “admin_cancel” email template. #3503 (@kimcoleman)
  • Fixed localization in the email header and footer templates. #3492 (@dwanjuki)
  • Fixed an issue where LifterLMS access plans meta boxes may still show when streamline is enabled. #3439 (@kimcoleman)
3.5.6 10 Sep 2025 1 improved4 fixed
Improved
  • Added styles for frontend tables with data filter options. #3482 (@kimcoleman)
Fixed
  • Fixed an issue where a generic error message may be shown at checkout instead of the intended error message. #3483 (@JarrydLong)
  • Fixed an issue where recurring PayPal Express payments would not be recorded in PMPro if the associated subscription did not already have orders present on the site. #3484 (@dparker1005)
  • Fixed an issue where PayPal subscriptions may remain in "paused" status after being marked as cancelled in PMPro. #3485 (@dparker1005)
  • Fixed an issue where Stripe application fees could be updated for invoices that did not originate from PMPro subscriptions. #3487 (@dparker1005)
3.5.5 26 Aug 2025 4 improved4 fixed
Improved
  • Improved readability of order notes by adding line breaks before appending data via automated processes. #3480 (@kimcoleman)
  • Added formatting for the Polish zloty currency. #3478 (@warnaa)
  • Updated the Gocodebox_Banner_Notifier library and prefixed the class with PMPro_ to avoid plugin conflicts. #3474 (@dparker1005)
  • Moved some compatibility code from the PMPro_Action_Scheduler class to separate compatibility files. #3475 (@dalemugford)
Fixed
  • Fixed performance issues that may occur when the plugin is in "pause mode". #3476 (@dparker1005)
  • Fixed an issue where some admin banners could not be dismissed. #3472 (@dparker1005)
  • Resolving a PHP warning that may show when deactivating the plugin. #3475 (@dalemugford)
  • Corrected the description for the Credit Card Expiring email template. #3471 (@kimwhite)
3.5.4 18 Aug 2025 7 fixed
Fixed
  • BUG FIX/ENHANCEMENT: Now marking restricted Elementor content as "dynamic content" to prevent it from being cached by Elementor. #3469 (@andrewlimaza)
  • Fixed an issue where "Payment Reminder" emails may go out daily depending on the site's set timezone. #3463 (@dalemugford)
  • Fixed an issue where some restricted Elementor data may not have successfully migrated after the PMPro v3.5 update. #3466 (@dparker1005)
  • Fixed an issue where the "Rebuild Webhook" button on the Stripe Payment Settings page would not create a new webhook. #3457 (@dparker1005)
  • Fixed an issue where PMPro checkouts would not complete if the Stripe Checkout session was set to "no_payment_required" status. #3458 (@johnorourke)
  • Fixed an issue where PayPal subscriptions may be set to "paused" status instead of "cancelled" after recurring payments are suspended due to failed payments. #3468 (@dparker1005)
  • Fixed a PHP deprecation warning that may show when updating billing information. #3460 (@dparker1005)
3.5.3 25 Jul 2025 6 improved7 fixed
Improved
  • Added a new !!renew_url!! email template variable to expiration and cancellation email templates. #3448 (@kimcoleman)
  • Extended the checkout spam protection setting to also protect the login form. #3450 (@ideadude)
  • Added a startdate column to the Members List CSV export. #3443 (@dparker1005)
  • Changed the name of the "Membership Recurring" email template to "Recurring Payment Reminder". #3451 (@kimwhite)
  • Added an "Action Scheduler Health" section to the PMPro Site Health report. #3453 (@dalemugford)
  • Now cleaning up PMPro Action Scheduler scheduled tasks when the plugin is deactivated or uninstalled. #3440 (@dalemugford)
Fixed
  • BUG FIX/ENHANCEMENT: Now avoiding cases where duplicate PMPro Action Scheduler scheduled tasks may be created. #3444 (@dalemugford)
  • Fixed an issue where the Admin Activity Email would not be sent. #3441 (@dalemugford)
  • Fixed an issue where "Recent Members" metabox may not show correctly on websites using custom database table prefixes. #3442 (@dparker1005)
  • Fixed an issue where an incorrect level name may be sent in renewal emails when level for the associated subscription had changed. #3449 (@dparker1005)
  • Fixed an issue where sorting columns on the Subscriptions List Table would not work when a search term was set. #3447 (@dparker1005)
  • Fixed a rare plugin conflict that could prevent Elementor data from completing the migration included in PMPro v3.5. #3445 (@dparker1005)
  • Fixed an issue where Wisdom data would only ever be sent on the first day of each month. #3446 (@dparker1005)
3.5.2 14 Jul 2025 5 fixed
Fixed
  • Fixed an issue where members may receive multiple recurring payment reminder emails for the same payment. #3437 (@mircobabini)
  • Fixed an issue where gateway settings may not show for some gateways. #3436 (@dparker1005)
  • Fixed an issue where "Recent Members" metabox may not show correctly on websites using custom database table prefixes. #3434 (@jeiseman)
  • Fixed a PHP error that would occur when the postnot_in parameter of WP_Query is not an array. #3438 (@dparker1005)
  • Added back a missing argument for the deprecated pmpro_email_template filter. #3432 (@dparker1005)
3.5.1 9 Jul 2025 2 improved2 fixed
Improved
  • Added caching to the pmpro_getMembershipCategories() function to improve performance. #3421 (@dalemugford)
  • Optimized the query used to retrieve the list of members to show in the Members List table. #3413 (@dalemugford, @dparker1005)
Fixed
  • Removed code added in 3.5 that would slow down the query to retrieve the list of members to show in the Members List table. #3430 (@dparker1005)
  • Fixed an issue where the subscription ID may not be shown in some Stripe webhook log messages. #3429 (@dwanjuki)
3.5 7 Jul 2025 3 new15 improved9 fixed2 removed
New
  • Now using Action Scheduler to handle scheduled tasks. #3393 (@dalemugford)
  • Now allowing files to be restricted using the new pmpro_can_access_restricted_file filter. This is currently used to ensure that log files generated during gateway webhook handlers can only be viewed by administrators. #3308 (@dparker1005)
  • Added content restriction settings when using Bricks Builder. #3342 (@MaximilianoRicoTabo)
Improved
  • Added additional widgets to the Memberships > Dashboard page and updated the layout to be more customizable. #3412 (@dalemugford)
  • Updated the Memberships > Settings > Payments settings page UI to have a separate page for each gateway. #3398 (@dparker1005, @kimcoleman)
  • Updated orders search to support searching by specific properties using [property]:[value]. #3382 (@kimcoleman)
  • Now adding the option to automatically install the Update Manager during the setup wizard. #3411 (@dalemugford)
  • Updated the content restrictions in Elementor to match how restrictions are set in the block editor. #3144 (@MaximilianoRicoTabo)
  • Now encoding the pmpro_last_known_url option to improve compatibility between "pause mode" and site migrations. #3400 (@mircobabini)
  • Now allowing linking to a filtered result via URL parameters on the Memberships > Add Ons page. #3377 (@kimcoleman)
  • Now supporting showing information from level meta when using the [pmpro_member] shortcode. #3276 (@kimcoleman)
  • Added new functions pmpro_get_countries() and pmpro_get_default_country() to avoid relying on global variables. #3353 (@dparker1005)
  • Added new hooks pmpro_added_subscription and pmpro_updated_subscription. #3357 (@mircobabini)
  • Added a new filter pmpro_deprecated_gateways to allow developers to filter the list of deprecated gateways. #3404 (@dparker1005)
  • Updated the PMPro_Email_Template class to streamline the process of sending test emails for each email template. #3340 (@MaximilianoRicoTabo)
  • Updated Wisdom data sharing to be an opt-out system. This will not change the selected option for existing sites. #3411 (@dalemugford)
  • Added a new pmpro_no_download parameter to CSV exports to prevent downloading the CSV file during Toolkit tests. #3417 (@dalemugford)
  • Now using the Gocodebox_Banner_Notifier class to display banner notifications. #3399 (@brianhogg)
Fixed
  • BUG FIX/ENHANCEMENT: Now syncing application fees with Stripe before recurring payments are charged to ensure that fees reflect whether the site has an active license key. #3403 (@dparker1005)
  • BUG FIX/ENHANCEMENT: Improved accessibility for the hidden honeypot field on the checkout page. #3416 (@andrewlimaza)
  • BUG FIX/ENHANCEMENT: Now using a MutationObserver instead of the deprecated DOMSubtreeModified event to detect changes to the checkout message container. #3386 (@getjohn)
  • BUG FIX/ENHANCEMENT: Improved the error message wording for subscriptions with the level ID set to 0. #3359 (@mircobabini)
  • BUG FIX/ENHANCEMENT: Now trimming whitespace for user field options where only the value is provided. #3379 (@mircobabini)
  • BUG FIX/ENHANCEMENT: Now avoiding extra whitespace in the payment description sent to PayPal Express. #3414 (@JarrydLong)
  • Fixed an issue where membership expiration emails may show the incorrect level name for users who have multiple levels. #3347 (@MaximilianoRicoTabo)
  • Fixed a PHP error on the sales reports page and fixed some closing HTML tags that did not match. #3406 (@mircobabini)
  • Fixed an issue where application fees were not set correctly when setting up Stripe subscriptions. #3358 (@mircobabini)
Removed
  • No longer using crons for scheduled tasks and removed the /scheduled/ directory. #3393 (@dalemugford)
  • Marked the pmpro_set_application_fee_percentage filter and the reduced Stripe application fee as deprecated. #3403 (@dparker1005)
3.4.7 12 Jun 2025 4 fixed
Fixed
  • BUG FIX/ENHANCEMENT: Now explicitly setting the Stripe API version when processing Stripe webhook events. #3409 (@dparker1005)
  • Fixed an issue where recurring Stripe orders may not be recorded on sites connecting with API keys if the Stripe account was created or its API version was updated after 2025-03-31 (Stripe API version 2025-03-31.basil or later). #3409 (@dparker1005)
  • Fixed an issue where membership levels could be moved to the first level group when using the search function on the Membership Levels settings page. #3407 (@dparker1005)
  • Fixed an issue where users may not receive cancellation emails after a PayPal subscription is cancelled due to failed payments. #3395 (@dparker1005)
3.4.6 21 Apr 2025 1 fixed
Fixed
  • Fixed fatal error related to redefining pmpro_getAddonBySlug when activating PMPro Core with the PMPro Update Manager active. (@ideadude)
3.4.5 21 Apr 2025 3 improved10 fixed
Improved
  • Now including First Name and Last Name in Zapier trigger data. #3356 (@dwanjuki)
  • Adjusting categories for the Add Ons page and fixing hub links. #3371 (@kimcoleman)
  • Applied WPCS to the method sendCheckoutAdminEmail. #3367 (@andrewlimaza)
Fixed
  • BUG FIX/ENHANCEMENT: Now supporting a fixed layout table (even width columns) on frontend tables. Also adjusted the responsive layout so table rows look more defined. #3370 (@kimcoleman)
  • BUG FIX/ENHANCEMENT: Basic styling for password visibility toggle when a site is using the minimal global style setting. #3369 (@kimcoleman)
  • BUG FIX/ENHANCEMENT: Fixed a warning message that was encoding the > on output as well make the message more clear where the settings are to add a license key to PMPro. #3368 (@andrewlimaza)
  • BUG FIX/ENHANCEMENT: Update "delete level" confirmation text to match behavior. Associated subscriptions ARE deleted. #3354 (@dparker1005)
  • BUG FIX/ENHANCEMENT: Avoiding a warning when saving the header or footer email template. #3348 (@MaximilianoRicoTabo)
  • Fixes a race condition when activating Paid Memberships Pro after the Update Manager is already activated. #3372 (@andrewlimaza)
  • BUG FIX: Fixed an issue where admin confirmation emails was not sending the "Free" template and was defaulting to "Paid". #3367 (@andrewlimaza)
  • Fixed an issue where depends was not working with radio buttons. #3366 (@andrewlimaza, @salihkulangara)
  • Prevents a fatal error when accessing a non-existent report in the admin area. #3361 (@kimcoleman)
  • BUG FIX: Updated the localization file location structure. Now it looks for it under wp-content/languages/plugins/. #3360 (@andrewlimaza)
3.4.4 19 Mar 2025 2 improved4 fixed
Improved
  • Improved accessibility and styling for pagination HTML generated by the pmpro_getPaginationString() function. #3343 (@kimcoleman)
  • Updated the pmpro_int_compare() function to allow passing '!=' as the comparison operator. #3344 (@andrewlimaza)
Fixed
  • Fixed an issue where date user fields would not output the correct value when using the displayValue() method. #3336 (@kimcoleman)
  • Fixed an issue where order totals would not be formatted correctly in refund emails. #3341 (@MaximilianoRicoTabo)
  • Fixed a PHP warning that would occur when using the [pmpro_member] shortcode to view information about a member that does not exist. #3337 (@andrewlimaza)
  • Fixed a PHP warning that would occur when rendering the "single level description" block in the editor for a level without a description set. #3335 (@kimcoleman)
3.4.3 6 Mar 2025 1 improved14 fixed2 removed
Improved
  • Now hiding the "Members Only" access plan in LifterLMS when the Lifter Streamline is enabled.
Fixed
  • BUG FIX/ENHANCEMENT: Now showing the correct email template variables for the header and footer templates. #3314 (@dparker1005)
  • BUG FIX/ENHANCEMENT: Updated the styling and content of the admin activity email. #3318 (@kimcoleman)
  • BUG FIX/ENHANCEMENT: No longer adding tags to the "pay by check" instructions when the textarea is saved. #3295 (@derekashauer)
  • BUG FIX/ENHANCEMENT: Updated the PayPal Standard gateway message to recommend PayPal Express as an alternative. #3319 (@kimcoleman)
  • BUG FIX/ENHANCEMENT: Now setting the line height of PMPro font sizes. #3324 (@kimcoleman)
  • Fixed a PHP fatal error when viewing a subscription in the Subscriptions List whose gateway does not exist. #3325 (@dparker1005)
  • Fixed a PHP fatal error that could occur when using the Update Manager Add On and sending the admin activity email or telemetry data. #3321 (@dparker1005)
  • Fixed an issue where duplicate members may be shown in the Members List CSV export. #3291 (@MaximilianoRicoTabo)
  • Fixed email template variables missing '!!' from the start of the variable name on the edit email template page. #3315 (@dparker1005)
  • Fixed an issue where user creation fields may incorrectly be shown as required when they are not needed. #3326 (@dparker1005)
  • Fixed an issue where level descriptions would not show correctly in the block editor. #3328 (@kimcoleman)
  • Fixed an issue where custom coded columns with a value of '0' would not be displayed. #3311 (@dparker1005)
  • Fixed a PHP warning when processing a Stripe completed checkout webhook for a one-time payment. #3317 (@dparker1005)
  • Fixed a PHP warning when deleting a Stripe webhook. #3310 (@mircobabini)
Removed
  • Marked the pmpro_member_shortcode_access filter as deprecated. Use pmpro_has_membership_level instead. #3322 (@MaximilianoRicoTabo)
  • Removed the !!subject!! email template variable from the list of documented email template variables. #3316 (@dparker1005)
3.4.2 18 Feb 2025 1 improved1 fixed
Improved
  • Added the Albanian Leke to the list of supported currencies. #3305 (@MaryOJob)
Fixed
  • Fixed an issue where sites using the Payflow gateway would no longer be able to use that gateway after it was marked as deprecated. #3306 (@dparker1005)
3.4.1 14 Feb 2025 3 improved6 fixed
Improved
  • Added a !!refund_date!! email template variable to the refund email template. #3301 (@kimcoleman)
  • Added a !!check_gateway_label!! email template variable to the checkout check email template to show the set gateway label. #3301 (@kimcoleman)
  • Updating some email template class names to match the email template slug. #3304 (@dparker1005)
Fixed
  • Fixed an issue where sending test emails would always show an error message. #3301 (@kimcoleman, @derekashauer)
  • Fixed an issue where checkout emails may show the expiration date for the wrong level. #3300, #3303 (@dparker1005)
  • Fixed an issue where the admin's name may be mistakenly shown instead of the user's name in some admin email template variables. #3298 (@dparker1005)
  • Added missing email template variables for the membership recurring email. #3296 (@dparker1005)
  • Fixed an issue that may cause incorrect data to be sent in test emails. #3294 (@derekashauer)
  • Fixed localization and spacing for the default bodies of email templates. #3301 (@kimcoleman)
3.4 11 Feb 2025 2 new15 improved17 fixed2 removed
New
  • Now pulling localization files from https://translate.strangerstudios.com. #3211 (@andrewlimaza)
  • Added a new Membership Account Message level setting to show a level-specific message to members on the Membership Account page. #3271 (@andrewlimaza, @kimcoleman)
Improved
  • Email template variables shown when editing an email template will now be specific to the email template being edited. #3234 (@MaximilianoRicoTabo, @dparker1005)
  • Now allowing filtering the Sales and Revenue report by multiple levels and discount codes. #3258 (@dparker1005)
  • Now allowing custom date ranges for the Sales and Revenue report. #3257 (@dparker1005)
  • Now showing the raw Sales and Revenue report data in a table under the chart. #3256 (@dparker1005)
  • Now showing the raw Membership Stats report data in a table under the chart. #3260 (@dparker1005)
  • Improved how user field values are displayed. #3223 (@dparker1005, @kimcoleman)
  • Improved the accessibility of the Memberships > Add Ons page. #3268 (@kimcoleman)
  • Now localizing formatted dates in the PMPro_Subscription class. #3195 (@andrewlimaza)
  • Now supporting setting a profile_start_date directly on a checkout level. #3233 (@dparker1005)
  • Added a new function pmpro_get_membership_levels_for_user_in_group(). #3267 (@dparker1005)
  • Now supporting subscription transaction IDs up to 64 characters. #3274 (@dparker1005)
  • Added a new filter pmpro_membership_account_after_level_card_content to allow additional content to be added to level cards on the Membership Account page. #3271 (@andrewlimaza, @kimcoleman)
  • Created an abstract PMPro_Email_Template class and child classes for each email template. #3234 (@MaximilianoRicoTabo, @dparker1005)
  • Cleaned up user fields code throughout the plugin. #3223 (@dparker1005, @kimcoleman)
  • Removed potentially problematic caching from the pmpro_getLevelAtCheckout() function and began passing the checkout level to all relevant hooks instead. #3246 (@dparker1005)
Fixed
  • BUG FIX/ENHANCEMENT: Now pulling the discount code from the checkout level object at checkout instead of the globals which may not be set. #3247 (@dparker1005)
  • Fixed an issue where required user fields may not be highlighted when submitted with an empty value. #3251 (@kimcoleman)
  • Fixed an issue where the "Signups vs. Cancellations" and "Signups vs. Expirations" reports would not display. #3260 (@dparker1005)
  • Fixed an issue where the last day of each month for daily Memberships reports would show 0 signups. #3280 (@dparker1005, @kimcoleman)
  • Fixed an issue where reset password errors would not be handled correctly. #3262 (@mircobabini)
  • Fixed an issue where the "Activate" button may not show immediately after installing an Add On on the Memberships > Add Ons page. #3255 (@MaximilianoRicoTabo, @dparker1005)
  • Fixed an issue where courses would not be assigned correctly when users have multiple membership levels while using the LifterLMS streamline option. #3286 (@dparker1005)
  • Fixed a PHP fatal error if pmpro_getAddons() fails to retrieve the list of Add Ons. #3249 (@dparker1005)
  • Fixed an issue where notifications may be incorrectly shown when a callback does not exist. #3279 (@andrewlimaza)
  • Fixed a PHP 5.6 fatal error in the admin activity email class. #3253 (@andrewlimaza)
  • Fixed a styling issue when there are multiple paragraphs in a contextual message. #3250 (@kimcoleman)
  • Fixed a styling issue where there may be a gap when Turnstile is enabled but not visible. #3273 (@kimcoleman)
  • Fixed an incorrect path when loading the paid-memberships-pro text domain. #3282 (@andrewlimaza)
  • Fixed a PHP warning when loading the checkout page template without the preheader (e.g., when loading the checkout block in the editor). #3287 (@MaximilianoRicoTabo)
  • Fixed a potential PHP warning when building plugin action links. #3264 (@mircobabini)
  • Fixed a potential PHP error when attempting to display a subscription that does not exist in the Subscriptions table. #2383 (@dparker1005)
  • Corrected the refund policy on the license page to reflect recent changes. #3272 (@kimcoleman)
Removed
  • Marking PayFlow, PayPal Standard, and Braintree as deprecated. Websites that are already using these gateways can continue using them, but they will not be shown as an option on new websites. #3184 (@dparker1005)
  • Removed references to PayPal from the Membership Billing page which has not been supported for some time. #3252 (@kimcoleman)
3.3.3 8 Jan 2025 6 improved8 fixed
Improved
  • Added a "Recheck Payment" option for token orders on the Edit Order page to allow admins to check whether the payment has been completed and, if so, complete the corresponding checkout. This currently only works for Stripe Checkout orders. #3226 (@dparker1005)
  • Added the Bangladeshi Taka to the list of supported currencies. #3239 (@kimwhite)
  • Updated the fr_FR language files to include translations from the base fr language files. #3231 (@andrewlimaza)
  • Updated the es_ES language files to include translations from the base es language files. #3216 (@MaximilianoRicoTabo)
  • Added an icon for the Abandoned Cart Recovery Add On and the upcoming Testimonials Add On. (@kimcoleman)
  • Simplified the composer.json file to remove unnecessary dependencies. #3237 (@andrewlimaza)
Fixed
  • BUG FIX/ENHANCEMENT: Updated the post_restrictions API endpoint to check whether the user has access to edit the specific post. #3243 (@dparker1005, @MaximilianoRicoTabo)
  • Fixed an issue where checkout might fail for new users when using PayPal Express. #3225 (@JarrydLong, @dparker1005)
  • Fixed an issue where CloudFlare Turnstile validation would fail for PayPal Express checkouts. #3232 (@andrewlimaza)
  • Fixed an issue where some REST API endpoints would mistakenly require the pmpro_edit_members capability. #3243 (@dparker1005, @MaximilianoRicoTabo)
  • Fixed an issue where Stripe Checkout would always overwrite the tax value set on an order even if tax isn't being calculated by Stripe Checkout. #3242 (@dparker1005)
  • Fixed an issue where formatted billing addresses without a state omitted the city and postal code. #3240 (@dparker1005)
  • Fixed a broken link to gateway settings documentation on the Payment Gateway settings page. #3244 (@kimcoleman)
  • Fixed a PHP notice when editing a post in Elementor that did not have a "require membership" setting saved. #3235 (@dparker1005)

2024 1 version

3.3.2 21 Nov 2024 3 improved8 fixed
Improved
  • Updated the "Checkout Spam Protection" security setting to also check for spam when trying to apply invalid discount codes. #3208 (@ideadude, @dparker1005)
  • Added a new filter pmpro_registered_reports for registering reports. #3200 (@mircobabini)
  • Now showing the Stripe API version being used by PMPro in site health instead of on the Payment Gateways settings page. #3204 (@dparker1005)
Fixed
  • BUG FIX/ENHANCEMENT: Fixed an issue where Stripe error messages at checkout would not show at the bottom of the checkout page. #3194 (@andrewlimaza)
  • BUG FIX/ENHANCEMENT: Now setting the discount code for an order during the saveOrder() method at checkout and when updating an order in the WP admin. #3190 (@dparker1005)
  • BUG FIX/ENHANCEMENT: Improved the logic to get random order codes to help prevent duplicate order codes. #3191 (@dparker1005)
  • Fixed doing_it_wrong notices for strings that are localized before the init hook which started showing after sites updated to WordPress version 6.7. #3200 (@mircobabini)
  • Fixed an issue where the value '0' for a user field would be overwritten with the field's default value when displayed in the checkout form. #3189 (@dparker1005)
  • Fixed an issue where IP addresses may not be detected correctly when using the pmpro_get_ip() function. #3192 (@andrewlimaza)
  • Now ensuring that the SITENAME constant is not already defined before defining it. #3196 (@dparker1005)
  • Fixed a fatal error that would occur on the confirmation page if an invalid user ID is set on the order object being shown. #3207 (@dparker1005)