The Proration Add On simplifies the complex task of adjusting membership payments when users upgrade or downgrade their membership levels.

Whether a member is moving from a monthly plan to an annual plan, or from a higher-tier membership to a lower one, the Add On automatically calculates the prorated membership payment at checkout, ensuring accurate and fair billing. Here’s some key features and benefits of the Proration Add On:

  • Automatically calculates prorated charges for membership level changes.
  • Keeps recurring payment dates aligned, regardless of upgrades or downgrades.
  • Works with both same-period and different-period membership levels.
  • Supports delayed downgrades so members can enjoy the full benefit of a prepaid period before downgrading.
  • Compatible with sites where members can hold one or more active membership levels.

How it Works

Proration is a complex topic, and everyone you talk to will have a different idea of how to calculate prorated charges. This section provides an overview of how the Add On prorates membership payments for upgrades and downgrades.

Prorating a Membership Level Upgrade

In the context of this Add On, an upgrade is any case when the prorated amount due is more than $0. This can be a case where a member is purchasing a higher tier membership or changing the payment period for the same level of access.

  • When a member upgrades to a level with the same billing period settings, they are charged a prorated amount at checkout based on the number of days left in the current payment period and prices of the old and new level. The member’s recurring payment date remains the same, and the subscription is changed to charge the new amount.
  • When a member chooses to upgrade to a level with different billing period settings, they are charged the initial payment of the new level minus a credit based on how many days are left in their current payment period and the subtotal from their last order. The member’s recurring payment date is reset to be one (new level) payment period from the date of checkout.
Proration example with membership upgrade and reduced amount due at checkout
Proration example with membership upgrade and reduced amount due at checkout

Prorating a Membership Level Downgrade

In the context of this Add On, a downgrade is any case when the prorated amount due is $0 or less. This is most often the case where a member is changing to a lower tier membership or changing to a more frequent payment period for the same level of access.

  • When a member chooses to downgrade, they will not be charged anything at checkout. The Proration Add On cannot prorate below $0. Instead, the membership is set up as a “Delayed Downgrade”. This means that they will maintain their current level of access through the prepaid period. Once that date arrives, the system will downgrade the membership level, and recurring payments for the downgraded level will begin.
Membership Account page where the membership downgrade is delayed through current prepaid term
Membership Account page where the membership downgrade is delayed through current prepaid term

Installation

You must have the Paid Memberships Pro plugin installed and activated with a valid license type to use this Add On.

  1. Navigate to Memberships > Add Ons in the WordPress admin.
  2. Locate the Add On and click Install Now.
    • To install this plugin manually, download the .zip file above, then upload the compressed directory via the Plugins > Add New > Upload Plugin screen in the WordPress admin.
  3. Activate the plugin through the Plugins screen in the WordPress admin.

Settings

This Add On does not have any settings. Once you install and activate the Add On, your site will immediately show prorated membership payments at checkout.

  • Membership levels within the same level group will be prorated only if the group is defined to allow one level per group (the classic “tiered” membership level setup).
  • The system will only prorate membership level changes that remove another level.
  • This Add On will not prorate membership level checkouts within a group that allows multiple level selections.

Sample Proration Calculations

By default, Paid Memberships Pro does not calculate prorated payments. We made this decision because we found that different sites typically require different proration rules. With this Add On, we’ve tried to implement the most common rules, while allowing for further customization through custom code.

Here are a few specific scenarios and how the payments will be prorated:

CaseDay of CycleAmount ChargedLevel Change
Member Upgrades from $5/mo. plan to $10/mo. planDay 15
(1/2 into cycle)
$2.50Immediately upgraded
Member Upgrades from $250/yr. plan to $500/yr. planMonth 3
(1/4 into cycle)
$187.50Immediately upgraded
Member Downgrades from $10/mo. plan to $5/mo. planDay 15
(1/2 into cycle)
$0.00*Downgrade delayed until end of first month
Member Downgrades from $500/yr. plan to $250/yr. planMonth 3
(1/4 into cycle)
$0.00*Downgrade delayed until end of first year
Member Upgrade from $10/mo. plan to $200/yr. planDay 1
(0 days into cycle)
$190**Immediately upgraded
Member Upgrade from $10/mo. plan to $200/yr. planDay 15
(1/2 into cycle)
$195**Immediately upgraded

* Sometimes the calculation results in a negative amount but the system currently has no way to do a credit. In the cases above there could have been a $2.50 credit or $312.50 credit.

** When upgrading to a level with a different billing period, the recurring payment date is reset to one (new level) payment period from the date of checkout.

For Developers: How Proration is Calculated

The Proration Add On applies different rules based on whether the new membership level has the same payment period (e.g., monthly to monthly) or a different payment period (e.g., monthly to annual). This section dives into how these calculations are handled and the flexibility developers have to modify proration logic.

For the Same Payment Period

When upgrading or downgrading to a membership level with the same billing cycle (e.g., monthly to monthly), the system uses the following calculations:

  1. Cost for remaining days at the new level:
    ($level->billing_amount * $per_left)
    This determines what the member should pay for the new level during the remaining days of the current billing period.
  2. Cost for days already used at the current level:
    ($clevel->billing_amount * $per_passed)
    This accounts for what the member should have paid for the current level during the days they’ve already used in the current period.

The member is charged a prorated amount based on these factors:
Amount to Pay = (a) + (b) – (what they already paid on the last order)

In this case, we also hook into pmpro_profile_start_date to ensure the user’s recurring payments align with their original recurring payment date. Small adjustments (one or two days) may occur to account for months with different numbers of days.

For a Different Payment Period

When upgrading or downgrading to a membership level with a different billing cycle (e.g., monthly to annual), the system calculates a credit based on how much time is left in the current billing period:

  • Credit = (Subtotal of their last order) × (Percentage of time left in the current billing period)

The member is charged:
Amount to Pay = (Initial payment of the new level) – (Credit amount)

In this case, we do not adjust the pmpro_profile_start_date. The new subscription is set to renew one (new level) payment period from the date of checkout.

Redefining “Downgrade” and Customizing Proration Behavior

In the latest version of the Proration Add On, downgrades now use a more accurate “cost per day” approach.

Previously, a change from a $100/year plan to a $50/month plan would have been considered a downgrade because $50 < $100. However, since the cost per day for the monthly plan ($2/day) is higher than the yearly ($0.30/day), this is not a true downgrade.

This can be tricky, especially for memberships like $10/month vs. $100/year, where moving from monthly to yearly shouldn’t be treated as a downgrade. This is where the pmpro_is_downgrade filter comes into play.

Proration can get complicated, especially with edge cases like frequent upgrades/downgrades within a single billing cycle. Documenting every potential scenario is challenging, but this Add On handles the most common use cases. Custom code, using the filters provided, is the best way to address unique or edge cases specific to your site.

Screenshots

Proration example with membership upgrade and reduced amount due at checkout
Proration example with membership upgrade and reduced amount due at checkout
Membership Checkout where nothing is due at checkout when there is a prepaid balance for current membership
Screenshot of Member Checkout where nothing is due at checkout when there is a prepaid balance for current membership
Membership Confirmation page showing the membership level will change after the current prepaid period (a Delayed Downgrade)
Confirmation after checkout that showe the membership level will change after the current prepaid period (a Delayed Downgrade)
Membership Account page where the membership downgrade is delayed through current prepaid term
Membership Account page where the membership downgrade is delayed through current prepaid term
Edit Member screen showing a delayed downgrade date with connected membership levels and order information.
Membership Account page where the membership downgrade is delayed through current prepaid term

Action and Filter Hooks

apply_filters( 'pmpro_is_downgrade', $is_downgrade, $old_level, $new_level );

Return true if the new level is a downgrade from the old level.

Using this filter, you can customize the logic of what constitutes a downgrade on your site. Anything not classified as a downgrade is treated the same way. While we currently refer to this as an “upgrade,” in reality, it’s more of a “standard proration” that adjusts the billing to fit the new level, whether it’s higher or lower in cost.

Code Recipe: Example code using the pmpro_is_downgrade filter.
apply_filters( 'pmpro_have_same_payment_period', $same_payment_period, $old_level, $new_level);

Return true if the new level has the same payment period as the old level. We do not recommend using this filter, but you can use it to force the Add On to apply a different proration rule set in certain cases. You can also override the main pmpro_checkout_level filter to implement your own rules.

Code Recipe: Example code to override the main checkout level filter.

Limitations of Prorated Membership Payments

The Proration Add On has the following known limitations:

  • The Proration Add On will only prorate a membership level change from one recurring membership to another recurring membership. This Add On does not prorate changes between fixed-term membership levels.
  • The plugin has no way to apply a credit in cases where the calculated prorated amount is negative. This typically happens when downgrading.
  • If a member upgrades twice within one pay period, only the last payment will be considered when calculating the prorated amount due. This could be handled by summing the total of all orders within the pay period, but we have not used this method as it could also cause conflicts on sites that have multiple unrelated orders (when using Addon Packages or similar price-adjusting customizations). Additionally, payments on edge dates might be accidentally included or not included in the sum.
  • This plugin is not currently compatible with the following Add Ons: Gift Membership

Bonus Tool: Proration Calculator

If you aren’t ready to make the leap to using the Proration Add On for Paid Memberships Pro, here’s a simple tool that can calculate basic proration logic. Use this tool to set up custom discount codes for a member looking to upgrade and receive a prorated price for membership.

The tool will show you the prorated price for the remaining days on the member’s current payment period. This prorated price can be used in combination with the Subscription Delays Add On to preserve a member’s next payment date.

Simple Proration Calculator

Prorated Price:

This is a Plus Add On.

Plus Add Ons are included in all Plus or higher premium membership plans.