Skip to main content
Back to Feed
WooCommercePHPPayment Gateways

How to Add WooCommerce Checkout Fee for a Payment Gateway

4 min read

Sometimes, it is necessary to add a Transaction or Checkout Fee on the WooCommerce Checkout page if you want to charge a specific amount from your customer as payment gateway charges. Here’s a simple PHP snippet to add a fee to the checkout for every payment or for a specific payment gateway.

Please do remember that for certain payment gateways such as PayPal, adding checkout fees is currently against their Terms of Service so make sure to check this first.

Just copy this snippet to the end of your active theme's functions.php file or you can use the Code Snippets plugin from WordPress.org repository. Enjoy!

Snippet #1: Add Checkout Fee for all Active WooCommerce Payment Gateways

This snippet will add a fixed Transaction Charge of $5 to the Checkout page for all available action WooCommerce Payment Gateways.

/**
 * @snippet       WooCommerce Add fee to checkout
 * @author        Sayan Datta
 * @testedwith    WooCommerce 4.8
 * @donate $10    https://paypal.me/iamsayan
 */
  
add_action( 'woocommerce_cart_calculate_fees', 'sayand_add_checkout_fee' );
  
function sayand_add_checkout_fee( $cart ) {
   // Edit "Transaction Fee" and "5" below to control Label and Amount
   $cart->add_fee( 'Transaction Fee', 5 );
}

Snippet #2: Add Checkout Fee to a specific WooCommerce Payment Gateway

This snippet will add a fixed Transaction Charge of $5 to the Checkout page to a specific gateway called "gateway". It also triggers checkout updates dynamically when the payment method selection changes in the UI.

/**
 * @snippet       WooCommerce Add fee to checkout
 * @author        Sayan Datta
 * @testedwith    WooCommerce 4.8
 * @donate $10    https://paypal.me/iamsayan
 */

// Part 1: assign fee
add_action( 'woocommerce_cart_calculate_fees', 'sayand_add_checkout_fee' );
  
function sayand_add_checkout_fee( $cart ) {
   $chosen_gateway = WC()->session->get( 'chosen_payment_method' );
   if ( $chosen_gateway == 'gateway' ) { // here gateway can be replaced by paypal, cod etc
      // Edit "Transaction Fee" and "5" below to control Label and Amount
      $cart->add_fee( 'Transaction Fee', 5 );
   }
}

// Part 2: reload checkout on payment gateway change
add_action( 'woocommerce_review_order_before_payment', 'sayand_refresh_checkout_on_payment_methods_change' );
  
function sayand_refresh_checkout_on_payment_methods_change() {
    ?>
    <script type="text/javascript">
        (function($){
            $( 'form.checkout' ).on( 'change', 'input[name^="payment_method"]', function() {
                $('body').trigger('update_checkout');
            });
        })(jQuery);
    </script>
    <?php
}

Snippet #3: Add Checkout Fee to a specific Shipping Method and Country

This snippet will add a fixed Transaction Charge of $5 to the Checkout page to a specific shipping method called "local_pickup" and country called "US".

/**
 * @snippet       WooCommerce Add fee to checkout
 * @author        Sayan Datta
 * @testedwith    WooCommerce 4.8
 * @donate $10    https://paypal.me/iamsayan
 */

add_action( 'woocommerce_cart_calculate_fees', 'sayand_add_checkout_fee' );
  
function sayand_add_checkout_fee( $cart ) {
   $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
   $chosen_shipping = $chosen_methods[0];
   if ( 0 === strpos( $chosen_shipping, 'local_pickup' ) && WC()->customer->get_billing_country() == 'US' ) {
      // Edit "Transaction Fee" and "5" below to control Label and Amount
      $cart->add_fee( 'Transaction Fee', 5 );
   }
}

Does this snippet still work?

I have tested this code with OceanWP theme, WooCommerce 4.8, and a WordPress-friendly hosting on PHP 7.4. If you encounter any compatibility issues or would like to report feedback, feel free to use the comments below!

Discussion (3)

Subir D.

Subir D.

It works great!

Reply
Sayan Datta

Sayan Datta

Thanks 🙂

Soumyendu

Soumyendu

I want to give cash back to customers opted for direct bank transfer; how to do that? Wallet plugins are not having such options. Please help.

Reply