To save terms and conditions acceptance at WooCommerce checkout, hook into woocommerce_checkout_update_order_meta to store the customer’s checkbox choice against the order, then display it on the single order admin screen — giving you a record you can point to if a dispute over accepted terms ever comes up.
Why Save Consent Instead of Just Requiring It
- WooCommerce requires the checkbox to be ticked before checkout completes, but doesn’t store that fact anywhere by default
- A stored record protects you if a customer later disputes having agreed to your terms
- It’s useful for order audits, especially for stores in regulated industries
Step 1: Save the Acceptance as Order Meta
/** Save Terms and Conditions checkbox acceptance to the order (HPOS-compatible) */
add_action( 'woocommerce_checkout_update_order_meta', 'save_terms_acceptance_to_order' );
function save_terms_acceptance_to_order( $order_id ) {
if ( ! empty( $_POST['terms'] ) ) {
$order = wc_get_order( $order_id );
$order->update_meta_data( '_terms_accepted', 'yes' );
$order->save();
}
}Using $order->update_meta_data() and $order->save() (rather than update_post_meta() directly) keeps this compatible with High-Performance Order Storage, since HPOS stores order data outside the standard posts table.
Step 2: Display It on the Order Admin Screen
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_terms_acceptance_on_order_admin' );
function display_terms_acceptance_on_order_admin( $order ) {
$accepted = $order->get_meta( '_terms_accepted' );
echo '<p><strong>Terms & Conditions:</strong> ' . ( 'yes' === $accepted ? 'Accepted' : 'Not recorded' ) . '</p>';
}

Troubleshooting
The Meta Value Never Saves
WooCommerce’s default checkout field name for the terms checkbox is terms — if you’re using a custom checkout field name or the block-based checkout, confirm the actual POST key matches what your snippet checks for.
Old Snippets Using update_post_meta() Stopped Saving
If you migrated to High-Performance Order Storage, direct update_post_meta( $order_id, ... ) calls may no longer persist reliably — switch to the $order->update_meta_data() and $order->save() pattern shown above.
Frequently Asked Questions
Does this also record a timestamp of acceptance?
Not by default — add $order->update_meta_data( '_terms_accepted_date', current_time( 'mysql' ) ) alongside the acceptance flag if you want a timestamp too.
Will this work with the WooCommerce Checkout Block?
The classic checkout hooks shown here target the shortcode-based checkout — the block-based checkout requires registering a custom checkout field through the Checkout Blocks API instead.
Can I show the acceptance record on the customer invoice too?
Yes — add the same get_meta( '_terms_accepted' ) check inside a custom email template or the woocommerce_email_order_meta hook.
Conclusion
Saving terms and conditions acceptance at WooCommerce checkout takes one meta-save hook and one admin-display hook — using the order object’s own methods rather than raw post meta keeps the record reliable across both legacy and HPOS order storage.
See also How to Show Per-Product Terms and Conditions at WooCommerce Checkout. Then read How to Display and Save a WordPress User Field at WooCommerce Checkout.
Prefer no code? All-in-One Utilities Woo Add-on adds over 50 WooCommerce features, so you can switch them on without code.