Get in touch
  • WordPress
  • Sales and conversion
  • v1.0.1

Age Verification 18+ for WooCommerce — customer age check per product and category, checkout blocking, verification log for DE/AT/CH

A WooCommerce plugin for shops selling alcohol, tobacco, vapes, knives, fireworks or chemicals into Germany, Austria and Switzerland. The minimum age is set on a category, product or variation; the customer gives a date of birth only when such a product is actually in the cart, and an order without confirmation goes through neither the classic nor the block checkout. The answer is written into the order and into a verification log. The base version is free; Pro adds a minimum age per delivery country with DE/AT/CH presets, limited shipping and payment methods, a delivery note and CSV export of the log.

Download Free
Pro · one-year licence The more sites, the less each one costs
Compatibility
WordPress 6.2+ · WooCommerce 7.0+ (tested on WordPress 7.1 and WooCommerce 11.1) · PHP 7.4+ · classic and block checkout · HPOS and legacy order storage · interface in English and German
Licence
one site, annual
Trial
7 days, no card, one per site
Updated
September 2026
Or all 144 Pro modules with All Access — 4 990 ₴ / year

What Free has,
and what Pro adds

The free version works with no time limit. Pro adds the rest of the features in the table.

Feature Free Pro
Minimum age on a product category — inherited by subcategories ✔ ✔
Own age on a product and on a variation; 0 on a product exempts it from the category rule ✔ ✔
"Whole shop" mode — for shops where everything is sold from a certain age only ✔ ✔
Age gate with a date of birth (day / month / year) or one-click confirmation ✔ ✔
Server-side order blocking on the classic and the block checkout — a closed dialog or disabled JavaScript changes nothing ✔ ✔
No adding to cart without confirmation, and a gate on the product page (switched on separately) ✔ ✔
18+ / 16+ badge on products in the catalogue and on the product page ✔ ✔
Confirmation in the order: order note, order data and a panel on the order screen (HPOS and legacy) ✔ ✔
Verification log: what was required, what was declared, date of birth, result, order, country, reference number ✔ ✔
IP in the log hashed by default or not stored at all ✔ ✔
The answer is remembered for a set period; after several failed attempts the gate locks, with an optional redirect to your page ✔ ✔
Custom heading, text and rejection text with {age} ✔ ✔
Works with full-page caching (tested with WP Super Cache) ✔ ✔
Interface in English and German (de_DE) ✔ ✔
Minimum age per delivery country with Germany / Austria / Switzerland presets — ✔
Only selected shipping methods for age-restricted orders: a carrier that checks the ID, or pickup — ✔
Hide payment methods for age-restricted orders — ✔
Hand-over age-check note in the order and in customer e-mails — ✔
CSV export of the log for a date range — ✔
Automatic deletion of old log rows — ✔
Your logo and colour in the age gate — ✔

What it looks like

Age Verification 18+ gate on a product page: day, month and year of birth
The gate on a product with a minimum age of 18: the customer enters a date of birth, the cursor is already in the “day” field. Twenty Twenty-Five theme; the dialog uses the theme font.
WooCommerce block checkout refusing a whisky order without age confirmation
The customer closed the gate and pressed “Place order” on the block checkout — no order is created, the banner names the product and the required age.
"Rules" tab (Regeln) in German: minimum age per category and the inherited "18+ (aus Spirituosen)"
The “Rules” tab in the German admin: the “Spirituosen” category is set to 18, the “Whisky” subcategory inherits 18+. Below are the per-country rules, which are Pro.

Key points

What the customer sees

The customer opens a product with a minimum age — an 18+ badge sits next to the name.

What the shop owner gets

The settings live under WooCommerce → Age verification in four tabs: “Log”, “Settings”, “Rules” and “Licence”.

Pro: age per delivery country, and the delivery itself

Age limits differ between countries, so Pro lets you set a minimum age per delivery country — for everything restricted or for a specific category.

The trial starts when you ask

A fresh install is the free version, nothing switches on by itself. The “Try Pro for 7 days” button → e-mail → the key right in the window and by e-mail.

One key — one site

Moving the store? Unbind the licence on the old domain and activate it on the new one yourself. If our server is unreachable, Pro keeps working for 14 more days. For studios — keys for 5 or 25 sites, or unlimited.

Technical requirements

  • WordPress 6.2+ and WooCommerce 7.0+. End-to-end run on WordPress 7.1 and WooCommerce 11.1.
  • PHP 7.4+. The full shop run was on PHP 8.3; on 7.4 the syntax and the plugin’s own tests were checked.
  • Checkout. Classic (shortcode) and block — both tested. Orders — HPOS and legacy storage.
  • Themes. Tested with Twenty Twenty-Five and Storefront; the gate uses the theme font.
  • Page cache. The gate asks the server whether to open, so a cached page neither shows it again to someone who has answered nor hides it from a new guest. Tested live with WP Super Cache; other caches were not. Pages without age-restricted products make no extra request.
  • Languages. Interface and gate in English and German (de_DE). No Ukrainian or Russian: the plugin is made for the DACH market.

Version history

v1.0.1 Current September 2026

First public release as Age Verification 18+ for WooCommerce.

Frequently bought with Age Verification 18+ for WooCommerce

4 modules in one order — 40% cheaper than separately

“Store starter” bundle Age Verification 18+ Nova Poshta Premium LiqPay Telegram notifications and Viber/SMS for customers Need more — all 144 modules in All Access for 4 990 ₴.
3 590 ₴ / year instead of 5 960 UAH bought separately
Buy the bundle →

Full module description

Age Verification 18+ for WooCommerce is a plugin for shops that sell age-restricted goods into Germany, Austria and Switzerland: alcohol, tobacco and vapes, knives, fireworks, hazardous chemicals. Most age-check plugins put a single splash screen in front of the whole website. For a mixed shop that is awkward: someone buying shampoo gets asked their age, and nothing ends up in the order.

Here the age belongs to the goods. You give a category (or a single product or variation) its minimum age, and the shop asks only when such a product is actually in the cart: on the product page, on adding to cart and before checkout. An order without confirmation goes through neither the classic nor the block checkout — the check sits on the server, not only in the dialog. The answer is written into the order and into a log the shop can show when asked whether it checked the age.

What the plugin does not do. A date of birth typed into a browser is a statement by the customer, not an identity check. The plugin does not replace identification and does not make a shop “legally compliant” by itself: whether such a process is enough for your goods is for your legal adviser to decide. It documents that the shop asked, stops orders that fail the rule and, in Pro, lets you close the gap where it can really be closed — on delivery, with a carrier that checks the ID at hand-over.

What the customer sees

The customer opens a product with a minimum age — an 18+ badge sits next to the name. If the product-page question is on, the gate opens straight away; if not, it appears when the customer clicks “Add to cart” or goes to checkout. The gate has three fields: day, month and year of birth. The cursor is already in the first field and moves on by itself once a number is entered. Instead of a date you can switch on one-click confirmation — a lighter variant that proves less.

An adult date closes the gate, the answer is remembered for the chosen period (30 days by default) and the product goes into the cart. A date that makes the customer younger than required is refused; after three such attempts (the number is configurable) the gate locks, and the customer can be sent to a page of yours, for example one explaining the age limits. Ordinary products without an age are bought as usual, with no questions.

Closing the gate and ordering around it does not work. On the block checkout, “Place order” without confirmation shows a banner with the product name and the required age, and no order is created. On the classic checkout WooCommerce shows its standard notice about a problem with items in the cart, and the cart itself shows which age the product requires; the checkout form does not appear until the customer answers. With JavaScript switched off, ordering is impossible too.

What the shop owner gets

The settings live under WooCommerce → Age verification in four tabs: “Log”, “Settings”, “Rules” and “Licence”. Above the tabs is a short status line: what exactly is protected, how many categories have a rule, how many attempts were blocked in the last 30 days, and whether it is the free or the Pro version. In German the admin is called “Altersverifikation”.

On the “Rules” tab every category can get a minimum age as a single number. Subcategories inherit it, and you can see that at once: next to “Whisky” it says “18+ (from Spirituosen)”, and the same appears in the “Age” column of the category and product lists. A single product or variation can be raised higher or exempted from the category rule by entering 0.

The “Settings” tab holds the gate switch (off after installation), what to protect (only products with an age, or the whole shop), the default age, the answer method, how long the answer is remembered, the number of attempts, the address for locked-out visitors, the question on adding to cart and on the product page, product badges, writing into the order, your own gate texts with the {age} placeholder, and the log: whether to keep it and how to store the IP.

Every order with an age-restricted product gets a note such as “Age verification: 18+ required, customer confirmed 36 (date of birth: 1990-03-15)”, and the order screen shows an “Age verification” panel: the age confirmed for, the declared age, the date of birth, the log reference and a plain reminder that this is the customer’s statement, not an identity check. The panel works with both HPOS and the legacy order screen.

The “Log” tab is the record of every check: “Confirmed”, “Too young”, “Blocked”, “Order placed”. Each row has the date, the required and declared age, the date of birth, the order, the country and a reference that ties the confirmation to the order. The log can be filtered by event, order and dates. Rows are only ever added, never edited.

Pro: age per delivery country, and the delivery itself

Age limits differ between countries, so Pro lets you set a minimum age per delivery country — for everything restricted or for a specific category. A country rule can only raise the age, never lower it. There are starting presets for Germany, Austria and Switzerland, and they are deliberately strict: 18+ on everything restricted that ships to the country. Where the law allows less (beer and wine from 16, for example), lower the category on purpose. In our test a 17-year-old customer confirmed for 16+ placed an order with a German address, while with a Swiss address the order was refused with the exact requirement. On the block checkout the country rule applies on “Place order”: switching the country does not show the banner immediately, but the order is refused.

The second part of Pro is the delivery. For orders with age-restricted goods you can leave only selected shipping methods — a carrier that checks the ID at hand-over, or pickup — and hide payment methods such as cash on delivery. An ordinary cart still sees every method. A note “hand over only against an ID showing an age of 18 or more” (the text can be changed) is added to the order and to the customer e-mail. Pro also brings CSV export of the log for a date range, automatic deletion of old rows, and your logo and colour in the gate.

Austria and tobacco. § 2a TNRSG prohibits mail-order sales of tobacco and related products in Austria altogether. No age check changes that, so for tobacco and vapes into Austria the plugin is not the answer — such goods are not shipped there at all.

How it works — step by step

  1. For every product in the cart the minimum age is resolved: the variation, then the product, then its categories including parent categories; in Pro also the delivery-country rule, which can only raise the age.
  2. If the cart holds a product with an age and there is no answer yet, the customer sees the gate — on the product page, on adding to cart or at checkout.
  3. The answer is checked on the server. An adult date is stored in the session for the chosen period and in the log as “Confirmed”; a date that is too young as “Too young”, with an attempt counter.
  4. Before the order is created the server checks the cart against the answer once more — separately for the classic checkout and for the block checkout through the Store API. No confirmation, no order.
  5. The new order gets the verification data, the order note, the panel on the order screen and an “Order placed” row in the log with the same reference.
  6. In Pro the shipping and payment restrictions and the hand-over note are applied to the age-restricted order.

How much it costs

Pro — 990 UAH, a one-year licence. A year of updates, technical support and all Pro features. You can take a longer term straight away — the longer, the cheaper per year:

  • 1 year — 990 UAH
  • 2 years — 1,880 UAH (−5%, 940 UAH a year)
  • 3 years — 2,610 UAH (−12%, 870 UAH a year)
  • 4 years — 3,250 UAH (−18%, 810 UAH a year)
  • 5 years — 3,710 UAH (−25%, 740 UAH a year)

No automatic charges: renewal is manual, and reminders come by e-mail. A purchased licence keeps the Pro features for good — when the term ends, the shop only stops receiving new versions and support. One key — one domain.

Trial first, payment later. The 7-day Pro trial starts only with the “Try Pro free for 7 days” button on the “Licence” tab; the key comes by e-mail, no card needed. When the trial ends only the Pro features switch off; the age check and the log keep working.

Under the hood

  • Server-side blocking. Classic checkout — woocommerce_add_to_cart_validation, woocommerce_check_cart_items, woocommerce_checkout_process; block checkout — Store API cart errors and a refusal while the order is being built. One decision in one place.
  • The gate is plain HTML in the footer, with no separate build for blocks, and appears the same way on both checkouts.
  • The log is its own table, rows are only added. The IP is hashed by default: repeated attempts from one device are visible, the identifier itself is not stored.
  • Session. For a guest who answered the gate a WooCommerce session is started (cookie wp_woocommerce_session_*) — without it the attempt limit would not work.
  • Developer hooks: ccav_product_required_age — the final word on a product’s age, ccav_order_verified — an order has just been marked as verified.
  • Deletion. The log stays by default: it is the evidence that the shop asked. To remove everything, add define( 'CCAV_DELETE_DATA', true ); to wp-config.php before deleting.

How to install

  1. Download the catcode-age-verification-for-woocommerce-1.0.1.zip archive with the button at the top of the page: Plugins → Add New → Upload Plugin → Install → Activate.
  2. WooCommerce → Age verification → “Rules”: give every category with regulated goods its minimum age. Single products can be changed on the product edit screen.
  3. “Settings”: choose what to protect (only products with an age, or the whole shop), how the customer answers and how long the answer is remembered.
  4. Switch on “Age gate” and place a test order with an age-restricted product — on the classic and the block checkout if your shop offers both.
  5. For Pro: paste the key from the e-mail after payment on the “Licence” tab, or click “Try Pro free for 7 days”.

Questions
about the module

Didn't find the answer? Message us on Telegram and we'll reply within a business day.

@catcode_support Setup, compatibility, activation
Does the plugin make my shop legally compliant?

No plugin can guarantee that, and we do not promise it. A date of birth typed into a browser is a statement by the customer, not an identity check. The plugin records that the shop asked, what was answered and when, and it stops an order that fails the rule. Whether that is enough for your goods is for your legal adviser to decide. Where real identification is required, it happens at hand-over — that is what the Pro shipping restrictions are for.

Which ages should I set?

That depends on the goods and the delivery country, and it stays the shop owner’s responsibility. For orientation, from the official texts (09/2026): in Germany beer, wine and sparkling wine from 16, other alcohol from 18 (§ 9 JuSchG), tobacco, nicotine products and e-cigarettes from 18, including mail order (§ 10 JuSchG). In Switzerland alcoholic drinks from 16, spirits from 18. The Pro presets are deliberately strict: 18+ on everything restricted, so beer and wine at 16+ have to be lowered on the category by hand.

Can I sell tobacco and vapes to Austria?

No, and the plugin does not change that: § 2a TNRSG prohibits mail-order sales of tobacco and related products in Austria altogether. An age check does not help here — such goods must simply not be shipped to Austria.

The customer closed the dialog. Can they still order?

No. The dialog is just the convenient way to answer. The check sits on the server: a closed dialog, a blocked script or a direct Store API request all end in the same refusal. We tested this on the classic checkout with JavaScript switched off and on the block checkout.

What if the customer clears their cookies?

Then the gate asks again and the failed-attempt limit starts from zero — that is how any browser-side check works. An order without confirmation still does not go through. That is exactly why Pro can limit delivery to carriers that check the ID for goods that need a real check.

Is the date of birth personal data?

Yes. It is stored in the order and in the log because that is the point of the record. The IP is hashed by default (or not stored at all), and Pro can delete old log rows automatically. For a guest who answered the gate, WooCommerce starts its session cookie — it is needed for the attempt limit; list it in your cookie policy as technically necessary.

Does it work with the block checkout?

Yes. The rule is enforced through the Store API as well: the cart and checkout blocks show the error and the order is refused before it is created. The dialog is plain HTML in the footer and appears the same way on both checkouts.

Which languages does the plugin have?

English and German. The plugin is made for the German, Austrian and Swiss market; the interface and the customer dialog follow the site language. There is no Ukrainian or Russian translation.

How much does it cost?

The base version is free. Pro is 990 UAH per year, and a longer term is cheaper: 2 years — 1,880 UAH, 5 years — 3,710 UAH. No automatic charges. A purchased licence keeps the Pro features for good; the term covers updates and support.

Not quite what you are looking for?

We build custom modules for WordPress, WooCommerce, OpenCart and Shopify. Tell us about the task and we'll prepare an estimate.

Order a custom module