Terms and Conditions per Product for WooCommerce

Description

WooCommerce gives you one Terms and Conditions checkbox for the whole store. Some products need their own: a non-refundable deposit, a digital download you cannot take back, an age-restricted item, a rental with a damage clause, a booking with a cancellation window.

This plugin adds a Terms URL to any product, variation, product category or product tag. When that item is in the cart, its own checkbox appears at checkout, and the customer cannot place the order until every box is ticked. Everything else about your checkout stays as it is.

Important: This plugin is an extension of the WooCommerce plugin and it cannot function independently.

How it works

  1. Edit a product and open the Advanced tab. Paste the URL of your Terms page and, if you want, the link text.
  2. The checkbox appears at checkout for every customer with that product in the cart, once per product, however many times it appears in the order.
  3. The customer ticks it and the order goes through. With the Premium version, the acceptance is written against the order with a timestamp, the user and the exact Terms link that was shown.

Stores that use it

✅ Shops selling both ordinary goods and items with their own conditions, where a single store-wide checkbox says nothing useful.
✅ Digital products and downloads with a no-refund policy.
✅ Age-restricted goods, where you need the customer to confirm before checkout.
✅ Rentals, hire and equipment, with a separate damage or return agreement.
✅ Deposits, made-to-order and custom work, where the cancellation terms differ per item.
✅ Services and bookings, where each service carries its own cancellation window.

Free

✅ Terms and Conditions URL and link text on any product.
✅ Different Terms on each variation of a variable product.
✅ A checkbox per product at checkout, on both the classic checkout and the WooCommerce block checkout.
✅ Server-side validation. Acceptance is checked again on the server before payment is taken, so an order cannot get through without it.
✅ Optionally require the customer to open the Terms link before the checkbox unlocks.
✅ Optionally show the Terms on the single product page.
✅ Optionally hide the default WooCommerce Terms checkbox when custom Terms apply.
✅ Filters and actions throughout, for developers.
✅ Translation ready.

Premium

✅ Terms per product category and per product tag, so a whole range is covered by one setting.
✅ An acceptance log on the order screen: who accepted what, when, and which link they were shown. Useful the day a customer disputes a charge.
✅ Open Terms in a modal instead of a new tab, for your Terms and for the default WooCommerce ones.

Built for current WooCommerce

Block checkout is supported in full since 1.4.0, on WooCommerce 9.9 and above. The checkboxes render inside the checkout block, they rebuild themselves when the cart changes mid-checkout, and the acceptance is verified again through the Store API before stock is reserved or payment is taken. HPOS (High-Performance Order Storage) is supported on the order screens.

What this plugin does not do

It does not write your Terms and it is not legal advice. You host your Terms on your own page or PDF. The plugin links to them, requires the tick, and records it.

Documentation | Plugin homepage | Changelog

Using it and it works? A 5-star review is the one thing that moves a small plugin. Questions: contact us.

Screenshots

Installation

  1. Upload the “Terms and Conditions per Product for WooCommerce” plugin into the directory wp-content/plugins/.
  2. Enable the “Terms and Conditions per Product for WooCommerce” plugin.

FAQ

How do I add different terms to different products?

Edit the product, open the Advanced tab and paste the URL of the Terms page that applies to it. Repeat on the next product with a different URL. Each product carries its own, and a customer only ever sees the checkboxes for what is in their cart. On a variable product you can go a level deeper and set a different URL on each variation.

Can I set terms for a whole product category instead of each product?

Yes, in the Premium version. Edit a product category or a product tag, set the Terms there, and every product in it is covered. A product with Terms of its own overrides the category. The plugin checks the variation first, then the product, then the category or tag, and the first level with a URL wins.

Does it work with variable products?

Yes. Each variation gets its own Terms and Conditions fields on the product edit screen. A variation with no Terms of its own falls back to the ones set on the parent product.

Where is the proof that the customer accepted?

In the Premium version, every acceptance is written against the order. Open the order in the admin and the “User Accepted Terms” box lists what was accepted, when, and the exact Terms link the customer was shown, so you are not relying on what that page says today. It works on the classic and the block checkout, and on both legacy and HPOS order storage. The free version enforces the checkbox but keeps no record.

Does this make my store GDPR compliant?

No plugin does that on its own. What this one gives you is a record that a named customer accepted a specific document, at a specific time, on a specific order, which is the part most stores are missing. Whether your Terms themselves and the rest of your data handling meet GDPR is a question for your lawyer.

Is this plugin compatible with WooCommerce Checkout Blocks?

Yes, since version 1.4.0, on WooCommerce 9.9 or newer. The Block Checkout then works the same way as the classic checkout:

  • Your custom Terms are displayed on the checkout.
  • “Place Order” is blocked until every Terms checkbox has been ticked, and the customer is told which Terms are still missing.
  • The check is repeated on the server before payment is taken, so an order cannot skip it.
  • Acceptance is recorded against the order and shown on the order screen. [Premium]

The Terms also keep up with the cart. If the cart changes while the customer is on the checkout, the Terms checkboxes are rebuilt to match it.

On WooCommerce older than 9.9 the Block Checkout cannot be used. The checkboxes are still drawn, but the browser has no way to report what was ticked back to the store, so the order is refused when the customer tries to place it. The classic checkout is unaffected and keeps working as it always has.

One exception is described in the next question.

Do the Terms apply to express payment buttons?

No. Express payment buttons, such as Apple Pay, Google Pay and the PayPal button, sit above the checkout form and place the order straight from the payment sheet. The customer never reaches the Terms step, so there is nothing to tick and nothing to record, and the plugin lets those orders through rather than blocking them at a point where the customer cannot do anything about it.

If you need consent recorded on every single order, turn off express payment buttons in your payment gateway’s settings, so that all customers go through the checkout form.

Does “Customer must open the Terms link” stop someone ticking the box without reading?

It stops the obvious case. The checkbox stays disabled until the Terms link has been opened, on both the classic and the Block Checkout.

This runs in the customer’s browser, because opening a link is not something a website can confirm from the server. Treat it as a prompt to read the Terms, not as proof that they were read. What is recorded in the acceptance log is that the checkbox was ticked.

Is this plugin compatible with all WordPress themes?

Compatibility with all themes is practically impossible, because they are too many and differently built. Still, if themes are developed according to WordPress and WooCommerce guidelines and practices then the plugin should work as intended.

Can I translate the Terms and Conditions per Product?

You can translate Terms & Conditions Per Product into your language.

I am facing a problem using this plugin. What can I do?

Post detailed information about the issue in the support forum or contact us on our site [Premium].

Where can I find Documentation for this plugin?

On our website, you can find detailed information in the documentation section.

What are Terms and Conditions

Terms and Conditions are the rules and regulations that govern the use of a website or a service. They are also known as Terms of Service or Terms of Use.

Reviews

Caamsaa 6, 2026 4 replies
I clicked the upgrade button in the free plugin, it took me to Freemius, I completed payment and it redirected to my dashboard and said it was processing then the plugin page says 'click the link in the email to opt in'. Never received an email and plugin still says free. No premium features available. I'm at a loss.
Onkololeessa 30, 2023 1 reply
I highly recommend this plugin! Its functionality is incredibly useful, and the developer's responsiveness in resolving an issue caused by a third-party theme was exceptional. They provided an effective solution promptly. Thank you!
Read all 13 reviews

Contributors & Developers

“Terms and Conditions per Product for WooCommerce” is open source software. The following people have contributed to this plugin.

Contributors

“Terms and Conditions per Product for WooCommerce” has been translated into 2 locales. Thank you to the translators for their contributions.

Translate “Terms and Conditions per Product for WooCommerce” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

1.4.0

  • Feature: Full WooCommerce Block Checkout support. Terms acceptance is now validated on the server before payment is taken, instead of in the browser alone. Because of this WooCommerce 9.9 is now the minimum supported version.
  • Feature: Terms acceptance is now fully recorded in the User Acceptance log for Block Checkout orders, the same as for the classic checkout. [Premium]
  • Feature: The Terms checkboxes on the Block Checkout now follow the cart. If the cart changes while the customer is checking out, the checkboxes are rebuilt to match, keeping any boxes already ticked.
  • Feature: Express payment buttons, such as Apple Pay and Google Pay, are exempt from the Terms step, because the customer never sees it. See the FAQ.
  • Tweak: The Block Checkout now shows a message next to the Terms that were not accepted, instead of disabling the “Place Order” button with a tooltip.
  • Fix: The Block Checkout assets are now loaded whenever the page contains the checkout block, including a block nested inside another block and a checkout page that is not the one set in WooCommerce settings.
  • Fix: “Open terms in a modal” and the “Open WooCommerce terms in a modal” now works on the Block Checkout, which renders those links with different markup to the classic checkout. [Premium]
  • Fix: Acceptance is recorded once per order, so retrying a failed payment no longer creates duplicate log records.
  • Refactor: The checkout rows, the single product page and the Store API now share one Terms renderer.

1.3.2

  • Fix: The Terms acceptance log no longer writes records when the log setting is switched off or the site is on the free version.
  • Fix: Acceptance log records are now rebuilt from the order’s own items, so a product that sits in more than one category with Terms no longer produces duplicate records, and only products actually in the order can be recorded.
  • Fix: Terms text saved on a product category or tag no longer keeps escape slashes, so apostrophes and quotes are stored as typed.
  • Security: Saving Terms on a product category or tag now requires the manage_product_terms capability.
  • Performance: The WooCommerce Checkout block check no longer parses page content on every front-end request, only on the checkout.
  • Performance: Per-product Terms lookups are now reused within a request instead of being repeated for the checkout display, the validation pass and the default-terms check.
  • Refactor: Checkout display, checkout validation, the single product page and the acceptance log now share one deduplicated Terms builder, exposed through a new tacpp_checkout_terms_items filter.
  • Tweak: Restyle the “Rate us” admin notice to match the Checkout Guard promo banner and show it above that banner.
  • Tweak: Redesign the Checkout Guard promo banner on the settings page and make it dismissible.
  • Feature: Add a promotional banner for the Checkout Guard plugin on the settings page.
  • Update: Freemius SDK to 2.13.4

1.3.1

  • Fix: Move uninstall.php cleanup logic to the Freemius after_uninstall action so uninstall events and user feedback are reported correctly.

1.3

  • Security: Hardened input sanitization, output escaping, AJAX nonces, and capability checks across admin and checkout flows.
  • Security: Bundle Popper, Tippy, and jQuery Modal locally instead of loading from third-party CDNs.
  • Security: Replace register_uninstall_hook() with uninstall.php so cleanup runs reliably on every removal.
  • Performance: Cache the custom-terms post count behind the rate-me admin notice in a transient.
  • Performance: Only enqueue admin scripts and styles on plugin-related screens.
  • Fix: Rate-me admin notice no longer compounds threshold suffixes across iterations.
  • Fix: Drop deprecated SQL_CALC_FOUND_ROWS from the acceptance log query.
  • Fix: Activation now seeds default settings on fresh installs without overwriting existing values.
  • Refactor: Extract variation Terms & Conditions handling into its own class.
  • Translations: Move HTML out of translatable strings, add translator comments, regenerate POT.

1.2.18

  • Check: WordPress 7.0.0 compatibility
  • Check: WooCommerce 10.7.0 compatibility
  • Update: Freemius SDK to 2.13.1

1.2.17

  • Check: WordPress 6.8.1 compatibility
  • Check: WooCommerce 9.8.5 compatibility
  • Update: Freemius SDK to 2.10.1

1.2.16

  • Security Fix: Add admin settings security fix

1.2.15

  • Check: WooCommerce 9.6.0 compatibility
  • Update: Freemius SDK to 2.11.0

1.2.14

  • Feature: Add modal to product page terms (if setting is enabled)
  • Fix: HTML and JS code
  • Update: Freemius SDK to 2.10.1

1.2.13

  • Update: Add links and restyle the User Accepted Terms in Orders
  • Translations: Update translations and texts
  • Update: Freemius SDK to 2.9.0

1.2.12

  • Update: New POT file for translations
  • Check: WordPress 6.6.1 compatibility
  • Update: Freemius SDK to 2.7.4

1.2.11

  • Fix: Remove the checkout enqueued JS and functionality from pages that do not contain the Gutenberg checkout block.

1.2.10

  • Update: Enable Block Checkout functionality
  • Update: Enable HPOS compatibility for admin edit order page.
  • Remove: Information page

1.2.9

  • Fix: Enable HPOS flag to avoid wrongfully flagging the plugin as HPOS incompatible

1.2.8

  • Update: Styling changes
  • Update: Freemius SDK to 2.6.0
  • Fix: Remove duplicate Get premium version message.
  • Declaration: WC Checkout blocks incompatibility

1.2.7

  • Check: WordPress 6.4 compatibility
  • Check: WooCommerce 8.2.1 compatibility
  • Feature: Make single product terms function static so it can be removed using WP hooks

1.2.6

  • Feature: Hide the default WooCommerce terms when there are custom ones.
  • Update: Freemius SDK to 2.5.10

1.2.5

  • Feature: Force users to open the term’s link before checking the terms.
  • Feature Premium: Add user acceptance log
  • Check: WordPress 6.2 compatibility
  • Update: Freemius SDK to 2.5.6

1.2.3

  • Check: WooCommerce 7.3.0 compatibility
  • Update: Freemius SDK to 2.5.3
  • Update: Texts

1.2.2

  • Feature: Added option to show terms in the product page.
  • Feature Premium: Add terms and conditions to product tags.
  • Feature Premium: Open WooCommerce terms in a modal.
  • Optimization: Load assets only on the required pages.
  • Styling: Added switches instead of checkboxes on the admin page.

1.2.1

  • Fix: PHP 7.3 backward compatibility.

1.2.0

  • Feature: Added Premium Version
  • Feature: Added custom text for simple product terms
  • Feature Premium: Add terms and conditions to product categories
  • Feature Premium: Show product terms in modal
  • Update: WooCommerce 7.1 compatibility check
  • Update: Added new filters to replace old ones starting with gkco_
  • Add admin notifications

1.1.0

  • Update: WordPress 6.1 compatibility check

1.0.15

  • Update: Readme.txt and WordPress version

1.0.13

  • Fix: PHP 8 compatibility issue

1.0.12

  • Fix: Not reaching meta variable outside of class

1.0.11

  • Fix: Hooked actions

1.0.9

  • Feature: Added partial links to Terms’ text using [link][/link] tags

1.0.8

  • Feature: Added extra terms and conditions input fields per variation (WC variable products).
  • Styling: Remove float from checkout fields.

1.0.7

  • Fixed duplicate Terms and Condition checkboxes when the same product appeared more than 1 time in a cart (different items).

1.0.6

  • WP test

1.0.5

  • Fixed an issue for variable products
  • Moved the Custom terms and conditions field from “General” to the “Advanced” product tab.

1.0.4

  • Add extra translation features and extra filters

1.0.3

  • Remove custom fields from external product types

1.0.2

  • Fix missing style

1.0.1

  • Links updated

1.0.0

  • First Edition release