# Cancel Unpaid Bank Transfer Orders After a Few Days

> Automatically cancels on-hold orders paid by bank transfer or cheque that are still unpaid after a set number of days, returning the stock to your shop.

- Type: PHP
- Runs: Run everywhere
- Category: [WooCommerce](https://wpide.com/library/category/woocommerce/)
- Requires: WooCommerce
- Tags: woocommerce, orders, automation, bacs
- Author: WPIDE Team
- Installs: 0
- Updated: 2026-10-28
- Page: https://wpide.com/library/woo-cancel-unpaid-bank-orders/

## Code

```php
$wpide_unpaid = array(
    'days'     => 7,                         // Days before cancelling.
    'gateways' => array( 'bacs', 'cheque' ), // Payment method IDs.
);

add_action( 'init', function () {
    if ( ! wp_next_scheduled( 'wpide_cancel_unpaid_orders' ) ) {
        wp_schedule_event( time() + HOUR_IN_SECONDS, 'daily', 'wpide_cancel_unpaid_orders' );
    }
} );

add_action( 'wpide_cancel_unpaid_orders', function () use ( $wpide_unpaid ) {
    if ( ! function_exists( 'wc_get_orders' ) ) {
        return;
    }

    $orders = wc_get_orders( array(
        'status'         => 'on-hold',
        'payment_method' => $wpide_unpaid['gateways'],
        'date_created'   => '<' . ( time() - $wpide_unpaid['days'] * DAY_IN_SECONDS ),
        'limit'          => 50,
    ) );

    foreach ( $orders as $order ) {
        $order->update_status( 'cancelled', sprintf( 'Cancelled automatically: unpaid after %d days.', $wpide_unpaid['days'] ) );
    }
} );
```

## Notes

Runs daily through WP-Cron, 50 orders per run, and customers get WooCommerce's cancelled order email if it is enabled.

## How to use it

Install the free WPIDE plugin (https://wordpress.org/plugins/wpide/), find "Cancel Unpaid Bank Transfer Orders After a Few Days" in its snippet library and add it in one click; or create a new PHP snippet in WPIDE (or any code snippets plugin) and paste the code above. More snippets: https://wpide.com/library/
