3.0.0
CurrentRewritten from the ground up. Everything 2.x could do, it still does — same fee maths, same developer filters, and your settings move themselves.
UPGRADING FROM 2.X
- Your per-gateway fee settings migrate automatically the first time the plugin runs. Nothing to reconfigure, and the old settings are left exactly where they were.
- Fees are now configured in one place: WooCommerce › Settings › Pay for payment. The fields no longer appear on each gateway's own settings page.
- Requires PHP 8.0 or newer, WordPress 6.2 or newer and WooCommerce 7.7.0 or newer.
- The plugin is listed as “Pay for Payment for WooCommerce – Payment Gateway Fees & Discounts” — same plugin, same slug, same settings.
NEW
- One settings screen for every payment method, built with WooCommerce's own admin components — including gateways whose own screens leave no room for extra fields: WooCommerce Payments, Stripe, Klarna and other React-based gateways.
- The screen lists every payment method you have, enabled or not, so you can set a fee up before the method goes live.
- Block checkout support: the fee is calculated and the total updates when the shopper changes payment method, the same as on the classic checkout.
- Fee lines carry
_pay4payment_fee_gatewayand_pay4payment_fee_sourceorder-item meta, so accountants and exports can tell them from any other fee. - Uninstalling removes every option the plugin wrote, including the standalone rows 2.x left behind. The
pay4pay_*keys stored inside each gateway's own WooCommerce settings are left untouched — those are your 2.x configuration, and keeping them is what lets you roll back to 2.x.
CHANGED
- A cart with nothing left to pay for — goods fully discounted and no shipping cost — no longer gets a payment fee. In 2.x the check looked at the cart total before discounts, so a 100% coupon still paid the fee. Paid shipping on free goods still charges.
- “Tax class based on cart items” now also applies when the fee amount excludes tax. In 2.x it only worked for tax-inclusive amounts and quietly fell back to the standard rate otherwise.
- Fees are charged only for the payment methods you have switched on in the settings screen. Everything that charged a fee in 2.x is switched on for you during the upgrade.
- The “Extra Charge” column on WooCommerce > Settings > Payments is gone — WooCommerce rebuilt that screen and removed the hook it was built on. Every method's fee is shown on the plugin's own settings screen instead.
- VAT-exempt customers now pay the net of a fee whose amount includes tax, not the full amount. A fee set to 12.10 including 21 % tax is charged to everyone as 10.00 plus tax; a VAT-exempt customer now pays 10.00 with no tax.
FIXED
- When a payment fails and the customer pays again with a different method, the first method's fee is removed from the order instead of staying on it — on block checkout and express (Apple Pay / Google Pay) orders too, before the amount is authorized.
- Checkout no longer fatals when another plugin puts a cart entry without product data in the basket while the fee's tax class is “based on cart items”.
- The “Standard rate” tax class can be picked again — the screen was sending a value the server rejected, so the fee fell back to the highest rate in the cart.
- A fee you switched off stays off; updating used to switch migrated 2.x fees back on.
- Settings migrate even if the update was applied while WooCommerce was deactivated.
- “Do not charge the fee on free shipping” looks at every shipping package again, as in 2.x.
- “Charge at least” and “Charge at most” accept negative amounts again, so “5% off, never more than 50 off” can be set up once more.
- A fee set up by hand in 3.0 starts from the same defaults as 2.x, so the same numbers produce the same charge.
- Stores using Price Based on Country charge the converted fee again, rather than the base-currency number in the customer's currency.
DEVELOPERS
- All 2.x filters keep their names and signatures, still fire with the same intermediate values, and the fee is still added on
woocommerce_cart_calculate_feesatPHP_INT_MAX - 1. - Those filters now receive one extra trailing argument: the index of the fee rule being calculated. Existing callbacks are unaffected.
woocommerce_pay4pay_get_current_gateway_settingsis rebuilt over the new schema and fires with the same fourteenpay4pay_*keys, so a 2.x snippet runs unchanged. Returningfalsestill switches the fee off.- REST:
pay4payment/v1/settings(GET/POST,manage_woocommerce). - WPML string names are unchanged, so existing translations keep working.
- All five multi-currency integrations are carried over. HPOS and cart/checkout block compatibility are declared.