You can change the default order status per payment gateway in WooCommerce by using each gateway’s own woocommerce_{gateway_id}_process_payment_order_status filter, letting you set a custom paid status (default or custom) for BACS, cheque, COD, or any other gateway individually.
Why Override the Default Status Per Gateway
- Different payment methods naturally warrant different starting statuses — an instant card payment differs from a bank transfer awaiting manual confirmation
- Stores using custom order statuses (like “awaiting-verification”) need a way to route specific gateways there instead of a default status
- It lets fulfillment staff filter and prioritize orders differently based on how reliably a given payment method has actually been received
- Each gateway exposes its own filter, so changes are scoped precisely without affecting other gateways
Step 1: Identify the Gateway’s Filter Name
Each payment gateway (core or third-party) typically exposes a filter named woocommerce_GATEWAYID_process_payment_order_status, where GATEWAYID is the gateway’s internal ID (like bacs, cheque, or stripe).
Step 2: Change the Status for Bank Transfer (BACS)
/** Set BACS orders to "pending" instead of the default "on-hold" */
add_filter( 'woocommerce_bacs_process_payment_order_status', 'set_bacs_order_status_pending', 20, 2 );
function set_bacs_order_status_pending( $status, $order ) {
return 'pending';
}
Step 3: Change the Status for Cash on Delivery (COD)
/** Set COD orders to "processing" instead of the default "on-hold" */
add_filter( 'woocommerce_cod_process_payment_order_status', 'set_cod_order_status_processing', 20, 2 );
function set_cod_order_status_processing( $status, $order ) {
return 'processing';
}Using a Custom Order Status Instead of a Default One
If you’ve registered a custom order status (like wc-awaiting-verification), return its slug (without the wc- prefix) the same way — the filter accepts any valid registered status, not just WooCommerce’s built-in ones.
Troubleshooting
The Filter Doesn’t Seem to Apply
Confirm the exact gateway ID — third-party gateways don’t always use the obvious name; check the gateway’s own plugin code or documentation for its precise internal ID if the filter name you guessed doesn’t take effect.
Order Status Changes Back Unexpectedly
Check for a conflicting plugin or automation (like a status-based workflow tool) that might be reacting to the order and changing its status again shortly after this filter sets it — test with other automation plugins temporarily disabled to isolate the cause.
Frequently Asked Questions
Does this work for every payment gateway, including premium ones?
Most well-built gateways (core and premium) expose this filter following the same naming pattern, but it’s not guaranteed for every third-party gateway — check the specific gateway’s source code or documentation if unsure.
Can I set different statuses based on order total, not just gateway?
Yes — since the filter receives the $order object, you can add conditional logic inside the callback function based on order total, items, or any other order property.
Will changing the default status affect existing orders?
No — this only affects new orders placed after the filter is active; past orders keep whatever status they were already assigned.
Conclusion
Each payment gateway’s dedicated order-status filter gives precise, per-gateway control over what status a new order starts in, whether that’s a built-in WooCommerce status or a fully custom one. Confirm the exact gateway ID first, since a mismatched filter name is the most common reason this doesn’t take effect. Getting this right is really what change the default order status per payment gateway in woocommerce comes down to.
See also How to Choose a Payment Gateway for WooCommerce. Then read How to Disable a Payment Gateway by Country in WooCommerce.
Prefer no code? All-in-One Utilities Woo Add-on adds over 50 WooCommerce features, so you can switch them on without code.