Our Proration Add On automatically adjusts the initial payment for members who upgrade or downgrade membership while keeping their existing subscription payment date.

View the Add On

Some background on proration.

By default, Paid Memberships Pro does not calculate prorated payments. We made this decision because “prorated” means something different to everyone. This add on offers the basis for proration at membership checkout and can be further customized to fit your specific site needs.

In short, this add on calculates what percent of the member’s current subscription payment remains and then credits that against the new level’s initial payment.

If you have a different proration need or upgrade/downgrade payment concept, please open a topic in our members forum and we will help with the right hooks/filters and custom code for your project.

How it Works

When a member chooses to upgrade, they are charged a pro-rated amount for the new membership level immediately and the member’s current payment date is maintained. When a member chooses to downgrade, the initial payment is $0 and the downgrade is delayed until the next payment date. The member’s current payment date is maintained.

Downgrades are defined as having an initial payment less than the current level, but can be altered via filters. It assumes that the level’s initial payment is equal to billing amount.

Sample Proration Cases Covered by this Add On

Case Day of Billing Cycle Amount Charged
Member Upgrades from $5/mo. plan to $10/mo. plan Day 15 (1/2 into cycle) $2.50
Member Upgrades from $250/yr. plan to $500/yr. plan Month 3 (1/4 into cycle) $312.50
Member Downgrades from $10/mo. plan to $5/mo. plan Day 15 (1/2 into cycle) $0.00*
Member Downgrades from $500/yr. plan to $250/yr. plan Month 3 (1/4 into cycle) $0.00**

Sometimes the calculation results in a negative amount but the system currently has no way to do a credit.
(* $2.50 credit, ** $312.50 credit)


  1. PMPro Plus members can install the add on via their WordPress dashboard under Memberships > Add Ons.
  2. Or, download the plugin .zip file and upload the ‘pmpro-proration’ folder to the ‘/wp-content/plugins/’ directory.
  3. Activate the plugin through the ‘Plugins’ menu in WordPress.

How It Calculates the Prorated Amount (for those technical folks)

The system considers two factors:

  • (a) What they should pay for new level = $level->billing_amount * $per_left.
  • (b) What they should have paid for current level = $clevel->billing_amount * $per_passed.

The user is charged what they need to pay = (a) + (b) – (what they already paid).

If the number is negative, this would technically require a credit be given to the customer, but we don’t currently have an easy way to do that across all gateways so we just 0 out the cost. (Initial Payment = $0).

An alternative calculation that comes up with the same number (but may be easier to understand) is:

  • (a) What they should pay for new level = $level->billing_amount * $per_left.
  • (b) Their credit for cancelling early = $clevel->billing_amount * $per_left.
  • What they need to pay = (a) – (b)


One known limitation of this code is 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.

Tagged . Bookmark the . Last updated: . Titled

This could be done with custom code to check registration and block the level “downgrade”. Possibly using the Advanced Levels Shortcode Add On, you could configure to show only the levels you want to offer.

I have a client who made the following request:

“Once a member signs up, their membership expiry date should stay the same each year regardless of when they renew. For example, if someone signs up on 6/17/2017, their expiry date is 6/16/2018. If they don’t pay until 10/31/2018, they still expire on 6/16/2019 the next year.”

So, they don’t want the fee to be prorated, but they do want the expiration date to be advance by one year from their current expiration date.

Is there a way I can adjust this code to do this?

That scenario doesn’t really make sense to me. In your example, a user would have expired on 6/16/2018 and have no membership. Then when they buy membership in 10/31/2018, they would get expiration one year.

Did the member actually expire on 6/16? We can take a closer look at this as part of a support membership.

We have an annual membership fee of $X (January 1 – December 31). Is there a way to prorate a new member coming in say mid-year in July and only billing them half the year?

What if a member wants to upgrade from a month membership to a 6 month membership? Is that a problem?
Also, is there anyway to disable downgrading? Or is there anyway for the system to tell me how much they are owed if they do choose to downgrade? I am happy to manually refund them the difference.

This code should handle changing between periods… /1mo to /6mo.

I’m not sure you want to disable downgrades, but it could be possible to intercept users trying to downgrade and show a message about that.

You could add some code here to email the admin about the downgrade with the amount to be credited:

We can add a filter there to make that easier to do. If you need help with the code for that admin email, post this to the member forums and mention I sent you and we’ll get it written up ASAP.

hello , i want to customize the prorated payments to all memberships level for payment the first of the month , all the payment will be moved to the first of the month
what is the best way to do it

hello jason , hello all the team
i have many ideas for subscriptions @ the first month and the prorated payment , i’am not a developer but i’am working in finance i can help with a human language algo and in many other way
it will be a plusieur for me to participate in the development of the service
you can contact me directly by mail
thank you for all what you are doing
wish you the best

Hi Jason,

I have the same question as Tom Zimmerman. I’m having trouble finding a plugin that will allow me to do this and it’s becoming a hassle. I need everything streamlined. I’d like to know if your plugin can do this before making a financial commitment. Thanks in advance.

I don’t think we’ve helped someone with this in particular, but I’ll check with my team. Again, post to the membership forums (feel free to link here) and we’ll help you out. It’s work, but fairly straight forward and I’d like to help you guys.

The gist would basically combine the prorating (and assume a 1st of the month start date for new users) and set the profile start date to the first for renewals.

Hello Jason,

Did you guys create the code to solve the problem above? I need to do exactly what you stated above which is…

“The gist would basically combine the prorating (and assume a 1st of the month start date for new users) and set the profile start date to the first for renewals.”

I need to charge an initial subscription… pro-rated based on when they join in their first month and then start their full subscription on the 1st of each month. I need all subscriptions charged on the first of each month.

If a person joins on the first of the month then they would get charged the full subscription, but if they join in week2 on a Thursday then they would be pro-rated for their first month (not charged the full amount) and then charged the full subscription on the first of the following month.

Hope that makes sense….Thanks

Dexter M.

Leave a Reply

For faster support related to issues on your specific site please open a ticket in our members support area.

Your email address will not be published. Required fields are marked *