
WooCommerce checkout hooks used to be the one reliable way to customize the most important page in your store. Then WooCommerce made the block checkout the default, and half the hook snippets on the internet quietly stopped firing.
Two different checkouts, one shared name, and a lot of copied code that only works on one of them.
Stores built before WooCommerce 8.3 usually run the classic shortcode checkout. Newer stores run the block checkout, where the classic layout hooks do nothing at all.
In this guide, we map every hook on the classic checkout page visually, share tested copy-and-paste snippets, and show you which hooks survive on the block checkout and what replaces the ones that do not.
We also walk through the processing hooks that fire when an order is placed, and the six reasons a checkout hook refuses to fire.
Also, if you don't want to dive into custom coding, we’ve got a smarter and more efficient way to create high-converting checkout pages without touching a single line of code.
Table of Contents
- 1 What are Checkout Hooks in WooCommerce?
- 2 First Priority: Check Which Checkout Your Store Runs
- 3 Visual Map: All 31 Hooks on the Classic Checkout Page
- 4 Do Checkout Hooks Work With the WooCommerce Checkout Block?
- 5 Checkout Processing and Validation Hooks
- 6 Why Your Checkout Hook Is Not Firing (6 Causes)
- 7 Don’t Want to Use Checkout Hooks? Here’s a Better Way to Create Beautiful Checkout Pages Without Code
- 8 6 Best Practices to Use Checkout Hooks Safely
- 9 Frequently Asked Questions
- 10 Start Putting These WooCommerce Checkout Hooks to Work
What are Checkout Hooks in WooCommerce?
WooCommerce checkout hooks are predefined points in the checkout code where you can attach your own functions.
They let you add, modify, or remove content and functionality on the checkout page without touching core plugin files, so your changes survive every WooCommerce update.
WooCommerce offers a wide range of hooks to elevate your store experience.
There are two types of hooks on the checkout page:
- Action hooks
- Filter hooks
Checkout action hooks
Action hooks fire at a specific position on the page or at a specific moment in the checkout process.
You attach a function to them to output content or run code at that point.
add_action( 'woocommerce_before_checkout_form', 'fk_checkout_notice', 20 );
function fk_checkout_notice() {
echo '<p class="woocommerce-info">' . esc_html__( 'Orders placed before 2 pm ship the same day.' ) . '</p>';
}To help you understand, the woocommerce_before_checkout_form is the hook, fk_checkout_notice is your function, and 20 is the priority that controls when it runs relative to other functions on the same hook.

Checkout filter hooks
Filter hooks intercept existing data, let you change it, and return it. It do not add anything new to the page.
The most useful one on checkout is woocommerce_checkout_fields, which controls every default form field.
add_filter( 'woocommerce_checkout_fields', 'fk_edit_checkout_fields' );
function fk_edit_checkout_fields( $fields ) {
// Your changes to the checkout fields array.
return $fields;
}A filter must always return the data it receives. Forgetting the return line is one of the fastest ways to blank out your checkout form.
First Priority: Check Which Checkout Your Store Runs
Before you use any hook on this page, confirm which checkout your store uses. Every layout hook in the next section only fires on the classic checkout.
Open Pages » Checkout in your WordPress admin and edit the page:
- If the content is the [woocommerce_checkout] shortcode, you are on the classic checkout. All the hooks below work. Our guide on the WooCommerce checkout shortcode covers this setup in detail.
- If the page contains a Checkout block (a visual block you can click into in the editor), you are on the block checkout. The classic layout hooks will not fire there. Jump to the block checkout section for what to use instead.

WooCommerce made the block checkout the default for new stores in version 8.3, so newer stores usually run blocks while older stores usually run the shortcode.
Many checkout plugins also build their pages on the classic architecture, so hooks continue to work there.
Visual Map: All 31 Hooks on the Classic Checkout Page
The map below shows every layout hook in the exact spot it fires on the classic checkout, from the top of the page to the bottom.

Here’s the full checkout hooks list, grouped by page section.
Before the checkout form
- woocommerce_before_checkout_form
Fires above the entire form, before the login and coupon prompts. Ideal for store-wide announcements or trust messages.
- woocommerce_checkout_before_customer_details
Fires just before the billing and shipping columns begin.
Billing section
- woocommerce_checkout_billing
This new WooCommerce checkout hook outputs the billing form template on the checkout page.
- woocommerce_before_checkout_billing_form
Fires directly under the Billing details heading, before the first field.
- woocommerce_after_checkout_billing_form
Fires after the last billing field. A common spot for delivery notes or field instructions.
- woocommerce_before_checkout_registration_form
Fires before the account registration fields, when guest checkout with optional registration is enabled.
- woocommerce_after_checkout_registration_form
Fires after those registration fields.
Shipping section
- woocommerce_checkout_shipping
Outputs the shipping form template.
- woocommerce_before_checkout_shipping_form
Fires before the shipping address fields, under the “Ship to a different address?” toggle.
- woocommerce_after_checkout_shipping_form
Fires after the shipping address fields.
Order notes and customer details
- woocommerce_before_order_notes
Fires before the order notes textarea. See our guide on WooCommerce order notes for what customers use this field for.
- woocommerce_after_order_notes
Fires after the order notes field. This is where we add the custom field in the example later in this guide.
- woocommerce_checkout_after_customer_details
Fires after both the billing and shipping columns close.
Order review and totals
- woocommerce_checkout_before_order_review_heading
The particular hook was added in WooCommerce version 3.6.0 and is triggered in the checkout template before the order review heading.
- woocommerce_checkout_order_review
Outputs the entire order review area, including the totals table and the payment section.
- woocommerce_checkout_before_order_review
Fires between the heading and the order table.
- woocommerce_review_order_before_cart_contents
Fires inside the order table, before the product rows. Anything you output here must be wrapped in <tr><td> tags.
- woocommerce_review_order_after_cart_contents
Fires inside the table, after the product rows.
- woocommerce_review_order_before_shipping
Fires before the shipping row in the totals.
- woocommerce_review_order_after_shipping
Fires after the shipping row.
- woocommerce_review_order_before_order_total
Fires just before the order total row.
- woocommerce_review_order_after_order_total
Fires just after the order total row. A popular position for savings messages.
Payment and place order
- woocommerce_review_order_before_payment
Fires above the payment methods list. A strong position for trust badges and guarantees.
- woocommerce_checkout_before_terms_and_conditions
Fires before the terms checkbox area. Pair it with our guide on the terms and conditions checkbox.
- woocommerce_checkout_terms_and_conditions
Fires inside the terms area, alongside the checkbox itself.
- woocommerce_checkout_after_terms_and_conditions
Fires after the terms checkbox area.
- woocommerce_review_order_before_submit
Fires directly above the place order button. The highest-visibility hook on the page.
- woocommerce_review_order_after_submit
Fires directly below the place order button.
- woocommerce_review_order_after_payment
Fires after the entire payment box closes.
After the checkout form
- woocommerce_checkout_after_order_review
Fires after the full order review column (includes the order details table and payment section).
- woocommerce_after_checkout_form
Fires below the entire checkout form. Useful for FAQs, support links, or reassurance content.
Let’s now look at how you can add or remove these checkout hooks. You can easily remove the sections by pasting the code to the functions.php file in your theme or, preferably, the child theme.
You can even add the code to WordPress code snippets, too.
Default actions you can remove
WooCommerce attaches a few of its own functions to these hooks. You can unhook them to strip elements off the page:
- woocommerce_checkout_login_form: The user login form before the checkout form
- woocommerce_checkout_coupon_form: The coupon form before the checkout form
- woocommerce_order_review: The order review table on the checkout form
- woocommerce_checkout_payment: The payment method table on the checkout form
To remove these actions, use the following code:
// Remove the "Returning customer?" login prompt.
remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_login_form', 10 );
// Remove the "Have a coupon?" prompt.
remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form', 10 );
// Remove the order review table and payment box (advanced, rebuild them elsewhere).
remove_action( 'woocommerce_checkout_order_review', 'woocommerce_order_review', 10 );
remove_action( 'woocommerce_checkout_order_review', 'woocommerce_checkout_payment', 20 );Match the priority number in remove_action() to the one used in add_action(); otherwise, the removal fails silently.
Do Checkout Hooks Work With the WooCommerce Checkout Block?
The honest answer is no because the classic layout hooks do not work on the block checkout.
The official WooCommerce developer documentation marks every layout hook in the map above, from woocommerce_before_checkout_form to woocommerce_after_checkout_form, as not supported in the Cart and Checkout blocks. (Source: WooCommerce developer docs)
The block checkout is built in React and rendered from the Store API, so PHP output hooks have nowhere to print.
If your snippet works on a product page but does nothing on checkout, this is almost always why.
Here's what to use instead on the block checkout:
| Task on classic checkout | Block checkout alternative |
|---|---|
| Add a custom field with woocommerce_checkout_fields | The Additional Checkout Fields API (woocommerce_register_additional_checkout_field) |
| Output content around sections with layout hooks | Slot/Fill components such as ExperimentalOrderMeta, or inner blocks placed in the editor |
| Save order meta with woocommerce_checkout_update_order_meta | woocommerce_store_api_checkout_update_order_meta |
| Run code after the order is created | woocommerce_store_api_checkout_order_processed |
| Update customer data during checkout | woocommerce_store_api_checkout_update_customer_from_request |
| Adjust fees with woocommerce_cart_calculate_fees | Same hook, fully supported on blocks |
Here are some noteworthy points:
- Data hooks still work: Lifecycle hooks that run on the server, such as woocommerce_cart_calculate_fees and woocommerce_before_calculate_totals, work on both checkouts. It is the layout and output hooks that break.
- Editing core fields is not supported on blocks: The woocommerce_checkout_fields filter can add fields through the new API, but it cannot rename or restyle the core billing fields on the block checkout.
- Some stores simply switch back: If your customizations depend on classic hooks, replacing the Checkout block with the [woocommerce_checkout] shortcode restores every hook instantly. WooCommerce still fully supports the shortcode.
Checkout Processing and Validation Hooks
Layout hooks control what the page looks like. Processing hooks control what happens when the customer clicks Place Order. These are the hooks you need for validation, saving data, and post-purchase automation.
On the classic checkout, the hooks fire in this order when an order is submitted:
- woocommerce_checkout_process: Runs during form submission. Use it with wc_add_notice() to add validation errors that stop the order.
- woocommerce_after_checkout_validation: Runs after core validation, with access to the full errors object for advanced checks.
- woocommerce_checkout_create_order: Runs just before the order is saved. You receive the $order object here, which makes it the best place to attach custom meta.
- woocommerce_checkout_update_order_meta: The legacy meta-saving hook. It passes an order ID rather than the order object.
- woocommerce_checkout_order_processed: Runs once the order exists, before payment is processed.
- woocommerce_new_order: Fires whenever a new order is created, from checkout or elsewhere.
- woocommerce_payment_complete: Fires when payment succeeds for supported statuses.
- woocommerce_thankyou: Fires on the order received page. Be careful because some payment methods never return the customer to the thank you page, so critical logic should not live here. If you are customizing that page anyway, see our guide on the WooCommerce thank you page.
On the block checkout, the sequence is different because orders flow through the Store API. The three hooks to know are:
- woocommerce_store_api_checkout_update_customer_from_request
- woocommerce_store_api_checkout_update_order_meta
- woocommerce_store_api_checkout_order_processed
If your post-purchase code must run on both checkout types, hook it to both the classic hook and its Store API counterpart, or use a shared hook like woocommerce_new_order that fires in every flow.
Why Your Checkout Hook Is Not Firing (6 Causes)
“My code works on the product page but does nothing on checkout” is one of the most common reports in WooCommerce support threads and communities.
Work through these six causes in order:
- You are on the block checkout
By far the most common cause since WooCommerce 8.3. A quick test you can do is to hook the same function to woocommerce_before_single_product.
If it prints there but not on checkout, your checkout page uses blocks. Fix it with the block alternatives above or switch the page back to the shortcode.
- Your theme overrides the checkout templates
Themes can copy form-checkout.php or review-order.php into their own folder, and strip hooks out.
Check your-theme/woocommerce/checkout/ for overridden files, or switch to Storefront temporarily to confirm.
- Wrong priority or timing
If another function on the same hook runs at priority 10 and yours needs to appear after it, raise your priority number.
If your remove_action() runs before the target was added, wrap it in an init or wp action so it runs later.
- AJAX refresh wiped your output
The order review area reloads through checkout fragments whenever the address or shipping method changes.
Content injected there with JavaScript disappears on refresh. Output it server-side through a woocommerce_review_order_* hook instead, so every refresh redraws it.
- You echoed bare text inside the order table
Hooks like woocommerce_review_order_before_cart_contents sit inside an HTML table.
A bare paragraph gets pushed out of position or hidden. Wrap your output in <tr><td colspan="2">...</td></tr>.
- Caching issues
Page caching or a stale object cache can serve the old checkout markup. Clear all caching layers, then retest in a private window.
After any fix, run a complete test order from product page to thank you page. Our guide on how to test the WooCommerce checkout has a full checklist
Don’t Want to Use Checkout Hooks? Here’s a Better Way to Create Beautiful Checkout Pages Without Code
Hooks are the right tool for developers. If you want the same control without maintaining code snippets, we recommend FunnelKit Funnel Builder.
It replaces the default checkout with conversion-optimized templates and includes a drag-and-drop field editor, so adding, renaming, reordering, and removing checkout fields takes clicks instead of PHP.
Two things make it relevant. First, FunnelKit checkout pages run on the classic checkout architecture, so every hook in this guide keeps firing on them. Your existing snippets continue to work even as core WooCommerce pushes new stores toward the block checkout, where they would not.
Second, its built-in checkout field editor covers the add, validate, and save workflow from our example above without any of the code.
FunnelKit offers a free version that includes optimized checkout templates and the field editor.
The Pro plan starts at $99.50/year and adds express payments, order bumps, one-click upsells, and A/B testing.
Let’s learn how you can create fascinating checkout pages for your WooCommerce store.
Step 1: Create a store checkout
Navigate to FunnelKit ⇨ Store Checkout and click on the ‘Create Store Checkout’ button.

You’ll see different store checkout templates to choose from. Select the page builder and hit the template you want to use.
Here, we’ll select Elementor and preview the ‘Shoppe’ template.
Choose the number of steps you want on your checkout page template, whether you want a one page or multi-step checkout.
Then, hit the ‘Import This Funnel’ button and name your store checkout.

Clicking on ‘Done’ will import this template into your funnel, including the checkout page and thank-you page.
Step 2: Edit the design of your checkout page
In this section, you’ll learn how you can customize your checkout page design without using WooCommerce checkout page hooks.
Click on the name of your checkout page to start editing it.

On the ‘Design’ tab, you can customize the checkout page template with Elementor.

Drag and drop the different content widgets to design the checkout page the way you want.
Use the left menu to upload logo, design your checkout form, including breadcrumbs of your checkout page steps, button styling, checkout form field widths, and more.

You can also add terms and conditions and secure checkout icons to make your checkout page conversion-friendly.
Step 3: Customize your checkout form fields
Go back to your store checkout funnel and scroll down under the Design section to customize the checkout form fields.
The built-in checkout form field editor lets you add and modify the fields and sections on your checkout form.
Just drag and drop the fields you want to place - you can even rearrange the sections within your checkout form.

You can even add custom fields to your checkout form.
All you have to do is click on the ‘Add New Field’ button and enter the information about your custom field.
There are many custom field types you can choose from - text, checkbox, radio button, number, and more.

Plus, FunnelKit Funnel Builder lets you edit your checkout form fields, too.
Just hit the field you want to edit. Let’s say you want to edit the shipping address - click on it and choose the fields you want to display.

Once you’re satisfied with your checkout fields, click on ‘Save’.
This process is much easier than the custom coding method with WooCommerce checkout hooks.
Step 4: Optimize your checkout page for faster checkout
Checkout optimization should be your priority when setting up your checkout page. This helps streamline your checkout process and reduces the cart abandonment rate.
You can add checkout optimization techniques such as:
- Express checkout payment options: Add express checkout payment methods such as Google Pay, Apple Pay, Amazon Pay, PayPal Express, etc. This allows you to enable one-click checkout, encouraging quick purchases in your store.
- Auto-fill address suggestions: Enable the Google Address auto-completion feature on your checkout page so shoppers can select suggestions as they type their addresses. It automatically fills up street address, city, zip code, state, and country fields, reducing incorrect address queries.
- Auto-apply coupon codes: Incentivize shoppers with discount coupons at checkout. It automatically applies a discount to a shopper's order without them having to enter a coupon code manually.
- Multi-step field preview: This feature is enabled in multi-step checkout pages. It allows you to preview the entered information in different fields at each checkout step as you move through the checkout page. This way, you can check whether you’ve entered the correct information. If not, you can go back and change them anytime.
Go to the Optimizations section and enable the options you need on your checkout page:

FunnelKit Funnel Builder offers various checkout optimization options, including smart customer login, enhanced phone field, inline field validation, and more.
It offers an additional advantage because you cannot apply these optimizations using WooCommerce checkout hooks.
Furthermore, you can even add order bumps and one-click upsells to maximize revenue with each order.
Similarly, you can customize your order confirmation page to carry the conversation forward with your customers.
Step 5: Activate your store checkout
Once everything is set, toggle the store checkout to make it live.

This is how your custom checkout page looks without using programming codes or WooCommerce hooks.

Well done! This is how you can set up a high-converting checkout page without code.
6 Best Practices to Use Checkout Hooks Safely
- Keep one task per snippet
Separate snippets for separate customizations; this makes debugging and removal painless when something conflicts.
- Prefix every function name
Generic names like custom_function collide with other plugins and cause fatal errors. Use a unique prefix such as fk_ or your store name.
- Test on staging first
Checkout is your revenue page. A single typo in a hooked function can block every order on the live site.
- Sanitize input and escape output
Run posted values through sanitize_text_field() and printed values through esc_html() to keep the checkout secure.
- Use priorities deliberately
Lower numbers run earlier and the default is 10. Matching priorities is also required when removing default actions.
- Review release notes before major updates
Checkout hooks are part of the public API and stay stable, but deprecations are announced in advance in the WooCommerce changelog.
Frequently Asked Questions
We’ve answered some common questions related to WooCommerce checkout hooks:
While basic implementations may be accessible, you’d need a deeper understanding of code to maximize the potential of checkout hooks in WooCommerce.
Yes, there are risks involved with using checkout hooks. Like any customization, improper implementation can lead to conflicts or vulnerabilities on your website. It’s best to adhere to best practices that mitigate these risks.
Yes, there is an alternative method to create high-converting checkout pages and streamline your entire buying process without implementing any code. You can use the FunnelKit Funnel Builder (discussed in this post).
You can use woocommerce_new_order or woocommerce_thankyou hook. This will create a WooCommerce order hook that is triggered after an order is successfully received, regardless of how the user paid.
Yes, absolutely. I regularly use 5 to 10 hooks on complex checkout implementations. Just ensure your priorities are set correctly to control the execution order.
Hooks are part of WooCommerce's public API and remain stable across updates. However, occasionally hooks are deprecated (usually with 2+ years' notice). Always review WooCommerce release notes before major updates.
Yes. On the server side, woocommerce_checkout_update_order_review fires on every fragment refresh.
On the client side, you can listen for the updated_checkout jQuery event to rerun JavaScript after the order review redraws.
The hooks themselves are. What changes is how you save data: use $order->update_meta_data() on the order object instead of update_post_meta(), because HPOS stores orders outside the posts table.
Start Putting These WooCommerce Checkout Hooks to Work
The checkout is the highest-leverage page in your store, and hooks are the cheapest way to tune it without template overrides, core edits, or anything an update can wipe out.
Bookmark the visual map and keep the tested snippets close.
Before you paste anything new, run it past the block compatibility table, because that one check is the difference between a customization that ships and a snippet that silently does nothing.
And if you’d rather ship these customizations without maintaining code, FunnelKit Funnel Builder gives you the same control visually, on checkout pages where every classic hook keeps working.
From order bumps to one-click upsells, FunnelKit empowers you to elevate the user experience in your store.
The choice is yours: Spend time tweaking hooks or take the easy, scalable route with FunnelKit Funnel Builder.
Get the FunnelKit Funnel Builder and transform your WooCommerce checkout experience!

Editorial Team
August 7, 2026Tired of losing sales because of a clunky checkout process? More than 70% of online shoppers abandon their carts, and one big reason is the hassle of typing in long,...

Editorial Team
August 7, 2026WooCommerce checkout optimization guides mostly list the same tips without telling you which ones move revenue. This one ranks 7 fixes by impact and effort, so you fix the expensive...

Editorial Team
August 7, 2026WooCommerce checkout add-ons are the two questions a good florist asks before you pay. Do you want it wrapped, and do you want a card with a message on it?...






