How to repair invalid PayPal billing agreements in WooCommerce Subscriptions

WooCommerce Subscriptions can remain marked active even after the underlying PayPal billing agreement is no longer valid. In this case, several subscriptions received PayPal subscr_eot events, which ended the old billing profiles and prevented reliable future renewals. Simply reactivating the subscriptions in WooCommerce was not enough. The working solution preserved the existing subscription records, moved future payment dates past any manually paid cycles, and used each subscription’s Change payment flow to create a new PayPal agreement and profile ID.

Issue background

A WooCommerce store discovered a group of subscription-renewal failures after earlier cleanup work affected several customer records.

Most Stripe-related subscriptions and renewal schedules could be repaired directly. A smaller group of PayPal subscriptions required a different approach because PayPal had sent:

subscr_eot

This PayPal end-of-term event indicated that the old recurring billing profiles had ended. The subscriptions could still appear in WooCommerce, but the old PayPal agreements could no longer be trusted for future automatic renewals.

Initial attempts to use WooCommerce’s Reactivate action were unsuccessful. PayPal rejected attempts to suspend or reactivate the ended billing profiles, and customers continued experiencing renewal or payment problems.

Some affected customers had already paid their missed renewal manually, creating an additional requirement: restoring future recurring billing without charging them again for a period they had already paid.

Diagnosis

The issue existed at two separate layers:

  • WooCommerce subscription status: The local subscription could be set to active and assigned a next payment date.
  • PayPal billing agreement status: The remote PayPal profile associated with the subscription had ended and could no longer process dependable future renewals.

Changing only the WooCommerce status did not recreate the remote PayPal agreement. That is why the subscriptions could appear repaired in WordPress while still failing at the payment gateway.

The more reliable remediation path was to keep each original WooCommerce subscription when possible and have the customer create a new PayPal billing agreement through that subscription’s own payment-method update flow.

This approach allowed WooCommerce to retain the subscription history, renewal schedule, products, and customer relationship while replacing only the invalid payment profile.

Resolution steps

  1. Identify every affected PayPal subscription. Review failed renewals, gateway notes, webhook records, and PayPal IPN events for subscr_eot.
  2. Separate PayPal cases from other gateways. Do not apply the same recovery process used for Stripe or another payment method without confirming gateway behavior.
  3. Verify the remote agreement status. Confirm that PayPal has ended the original recurring profile and that it cannot be safely resumed.
  4. Do not rely on WooCommerce Reactivate alone. Reactivating the local subscription does not create a new PayPal billing profile.
  5. Preserve the original subscription when practical. Keeping the existing record maintains order history, products, customer notes, and reporting continuity.
  6. Review manually paid renewal periods. Determine whether the customer has already paid for the missed cycle through a separate order or manual payment.
  7. Move the next payment date forward. Set the next renewal after the manually paid period so the customer is not charged twice.
  8. Create or verify one future renewal action. Confirm that WooCommerce Subscriptions has a single pending scheduled renewal at the correct date.
  9. Add a clear administrative note. Document that the missed renewal was paid manually and must not be charged again.
  10. Restore local subscription status if necessary. Clear an incorrect end date or cancellation state only after confirming the intended subscription should continue.
  11. Use the subscription-specific Change payment URL. Direct the customer to the payment-method page for that exact subscription rather than a general account payment screen.
  12. Have the customer complete a fresh PayPal authorization. The Change payment flow should create a new PayPal profile ID and valid billing agreement.
  13. Verify the new profile ID. Confirm that WooCommerce now references the newly created PayPal agreement rather than the ended profile.
  14. Check the future payment schedule. Make sure the next renewal remains on the intended date after the payment method is changed.
  15. Test with a controlled renewal when appropriate. Use gateway sandbox tools or a safely scheduled production renewal rather than manually forcing an unexpected customer charge.
  16. Review duplicate or replacement subscriptions. Do not delete or merge alternate records until the correct original subscription and new billing agreement have been verified.
  17. Communicate clearly with affected customers. Explain that they are updating the recurring payment authorization and will not be charged again for a manually paid cycle.

The key customer-facing path is usually:

My Account → Subscriptions → View subscription → Change payment

The exact labels and available gateways depend on the WooCommerce Subscriptions and PayPal extensions installed on the site.

Final outcome

The affected WooCommerce subscriptions were retained instead of being broadly deleted and recreated.

For subscriptions with manually paid missed renewals, the next payment dates were moved forward and administrative notes were added to prevent duplicate billing.

Subscriptions that had been incorrectly cancelled or ended were restored locally when appropriate, with one valid future renewal action scheduled.

Customers were then directed to the subscription-specific Change payment flow so each subscription could receive a new PayPal billing agreement and profile ID.

The key lesson is that WooCommerce subscription status and PayPal billing-agreement status are not the same thing. When PayPal sends a subscr_eot event, changing the local status may restore the appearance of the subscription but not its ability to renew. A fresh gateway authorization is required.

For help repairing WooCommerce Subscriptions, resolving PayPal renewal failures, or preventing duplicate subscription charges, contact Freshy.