How to Save Terms and Conditions Acceptance at WooCommerce Checkout

How to Save Terms and Conditions Acceptance at WooCommerce Checkout
On this page
  1. Why Save Consent Instead of Just Requiring It
  2. Step 1: Save the Acceptance as Order Meta
  3. Step 2: Display It on the Order Admin Screen
  4. Troubleshooting
  5. Frequently Asked Questions
  6. Conclusion

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.

  • 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

PHP
/** 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

PHP
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>';
}
Save terms and conditions acceptance at WooCommerce checkout: the page before adding the code
Before
Save terms and conditions acceptance at WooCommerce checkout: the page after adding the code
After

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.

Leave a Reply

Schedule a call