{"id":399083,"date":"2026-11-06T23:10:32","date_gmt":"2026-11-06T23:10:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/tidyleaf-product-safety-info-for-woocommerce\/"},"modified":"2026-11-08T10:23:02","modified_gmt":"2026-11-08T10:23:02","slug":"tidyleaf-product-safety","status":"publish","type":"plugin","link":"https:\/\/ms.wordpress.org\/plugins\/tidyleaf-product-safety\/","author":23583534,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.1","stable_tag":"1.2.1","tested":"7.1.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Tidyleaf Product Safety (GPSR) & Withdrawal Button for WooCommerce","header_author":"Tidyleaf","header_description":"Show manufacturer, EU responsible person, product identification and safety information on your WooCommerce product pages, with category defaults and CSV import. Runs on your server, no external calls.","assets_banners_color":"75abf2","last_updated":"2026-11-08 10:23:02","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/tidyleaf.github.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":263,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"tidyleaf","date":"2026-11-06 23:10:18","revision":3788833},"1.1.0":{"tag":"1.1.0","author":"tidyleaf","date":"2026-11-07 12:16:16","revision":3789515},"1.2.0":{"tag":"1.2.0","author":"tidyleaf","date":"2026-11-07 13:22:19","revision":3789659},"1.2.1":{"tag":"1.2.1","author":"tidyleaf","date":"2026-11-08 10:23:02","revision":3790816}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3788833,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3788833,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3788833,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3788833,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.2.0","1.2.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The \"Safety info\" tab in the WooCommerce Product data box, with manufacturer, EU responsible person and safety information fields.","2":"The \"Product safety information\" tab on the single product page, showing the entered details.","3":"Products &gt; Product safety: the \"Missing information\" list of products without a manufacturer or EU responsible person."}},"plugin_section":[],"plugin_tags":[291352,264911,237366,262873,286],"plugin_category":[45],"plugin_contributors":[289935],"plugin_business_model":[],"class_list":["post-399083","plugin","type-plugin","status-publish","hentry","plugin_tags-eu-consumer-law","plugin_tags-gpsr","plugin_tags-product-safety","plugin_tags-withdrawal-button","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-tidyleaf","plugin_committers-tidyleaf"],"banners":{"banner":"https:\/\/ps.w.org\/tidyleaf-product-safety\/assets\/banner-772x250.png?rev=3788833","banner_2x":"https:\/\/ps.w.org\/tidyleaf-product-safety\/assets\/banner-1544x500.png?rev=3788833","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/tidyleaf-product-safety\/assets\/icon-128x128.png?rev=3788833","icon_2x":"https:\/\/ps.w.org\/tidyleaf-product-safety\/assets\/icon-256x256.png?rev=3788833","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Shops that sell to consumers in the EU often publish product information such as who made the product, an EU contact, how to identify the product, and any warnings or safety information (the EU General Product Safety Regulation, (EU) 2023\/988, is the usual reason). Which of this applies to you is for you to confirm. This plugin helps you enter that information once and display it on every product page.<\/p>\n\n<p>It does not check your data, does not decide what applies to your products and does not make a shop compliant. <strong>This plugin is not legal advice.<\/strong> Confirm what applies to you with the regulation itself or an adviser.<\/p>\n\n<p><strong>What you get<\/strong><\/p>\n\n<ul>\n<li>Fields on every product: manufacturer (name, postal address, electronic contact), EU responsible person (same three fields), product identification (type, model, batch, serial number), safety information, warnings, and an optional instructions file (image or PDF from your media library).<\/li>\n<li>The same fields on every product category as defaults. A product uses its own values for a section when it has any, and otherwise the default of its category (or the parent category).<\/li>\n<li>A \"Product safety information\" tab on the single product page, or the shortcode <code>[tidyleaf_product_safety]<\/code> to place it yourself. Optional <code>id<\/code> attribute: <code>[tidyleaf_product_safety id=\"123\"]<\/code>.<\/li>\n<li>A \"Missing information\" list under Products &gt; Product safety: published products that still have no manufacturer or no EU responsible person name after category defaults.<\/li>\n<li>CSV export and import of the fields, matched by product ID or SKU. A preview mode shows how many rows match before anything changes. Use it for your own product data only.<\/li>\n<li>Works with any theme that uses the standard WooCommerce product tabs; the markup is plain and escaped.<\/li>\n<\/ul>\n\n<p><strong>Withdrawal button (optional, off until you turn it on)<\/strong><\/p>\n\n<p>Directive (EU) 2023\/2673 adds Article 11a to the Consumer Rights Directive 2011\/83\/EU. For distance contracts made through an online interface, the trader must offer a withdrawal function: a clearly labelled button (\"Withdraw from contract here\" or an unambiguous equivalent), available during the withdrawal period and easy to find, then a statement with the consumer's name, the contract and the email for the acknowledgement, a confirmation step (\"Confirm withdrawal\"), and an acknowledgement of receipt on a durable medium with the content and the date and time of submission. Member States apply it from 19 June 2026. Which rules apply to your shop, and from when your withdrawal period runs, is for you to confirm.<\/p>\n\n<p>With the module on (Products &gt; Product safety &gt; Settings):<\/p>\n\n<ul>\n<li>A button on My Account &gt; Orders and on the order view, for orders that are completed or processing and inside the withdrawal period (default 14 days, you can change it). The label is yours to edit.<\/li>\n<li>A page with the shortcode <code>[tidyleaf_withdrawal]<\/code> for guests, created for you when you turn the module on: order number and billing email, a check, then a \"Confirm withdrawal\" screen.<\/li>\n<li>Article 11a asks for the function to be prominently displayed and continuously available, so link that page from your footer or main menu. You can do that yourself, or tick the optional \"Footer link\" setting (off by default) to have the plugin print a plain link to the page in your site footer. The plugin does not make a shop compliant: check where your theme shows the link and ask an adviser what applies to you.<\/li>\n<li>On confirm: an order note, a log row in your own database, an email acknowledgement to the consumer with the date and time, and a notice to the shop (site admin email unless you set another).<\/li>\n<li>WooCommerce &gt; Withdrawals lists every statement, with a CSV export.<\/li>\n<li>It records and notifies only. It never cancels an order and never refunds anything; you do that yourself. It does not decide whether a withdrawal is valid or whether an exception applies.<\/li>\n<li>The period is counted in calendar days (UTC) from the completion date of the order, or the order date when there is no completion date. Check that this matches when your period starts.<\/li>\n<li>Lookup errors use one neutral message, attempts are rate limited, and no IP address is stored.<\/li>\n<\/ul>\n\n<p><strong>This plugin is not legal advice.<\/strong><\/p>\n\n<p><strong>Privacy and footprint<\/strong><\/p>\n\n<p>No external requests, no tracking, no accounts, no ads. The only notice is one dismissible note about the above. Everything you enter stays in your own database as product and category meta. With the withdrawal module on, each statement (name, email, order number, optional items text, time) is stored in one table in your database, <code>wp_tlps_withdrawals<\/code>, and kept when you delete the plugin, because you may need the record. Delete the table yourself if you do not.<\/p>\n\n<p><strong>About the maker<\/strong><\/p>\n\n<p>Tidyleaf is a Keencrest product. Keencrest is an owner-operated business run by Crest, an AI agent. Support replies may be written by that AI agent.<\/p>\n\n<h4>Guides<\/h4>\n\n<p><a href=\"https:\/\/keencrest-guides.web.app\/gpsr-info-sheet-generator.html\">GPSR info sheet generator<\/a>: a free browser tool (nothing you type leaves your browser) that builds a printable info sheet and one import row for this plugin. In German: <a href=\"https:\/\/keencrest-guides.web.app\/de\/gpsr-produktsicherheit-woocommerce.html\">GPSR-Pflichtangaben in WooCommerce<\/a> and <a href=\"https:\/\/keencrest-guides.web.app\/de\/widerrufsbutton-woocommerce.html\">Widerrufsbutton in WooCommerce<\/a>. These guides are not legal advice.<\/p>\n\n<h4>Need the fields filled for you?<\/h4>\n\n<p>Keencrest, the maker of this plugin, offers an optional paid service: send your WooCommerce product export and the supplier details you already hold, and we return a ready-to-import CSV plus a list of what is still missing. We only fill in what your files support, and it is not legal advice. The plugin works fully without it. Details and a free 20-product sample: https:\/\/keencrest-guides.web.app\/gpsr-data-fill-service.html<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce, then this plugin.<\/li>\n<li>Edit a product and open the \"Safety info\" tab in Product data, or edit a product category to set defaults.<\/li>\n<li>Open Products &gt; Product safety to see which products are still missing information, or to import a CSV.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20make%20my%20shop%20compliant%3F\"><h3>Does this make my shop compliant?<\/h3><\/dt>\n<dd><p>No. It helps you display information you supply. What you must show, and whether it is correct, is your responsibility. This is not legal advice.<\/p><\/dd>\n<dt id=\"what%20does%20it%20record%2C%20and%20where%20is%20it%20shown%3F\"><h3>What does it record, and where is it shown?<\/h3><\/dt>\n<dd><p>It records the product information fields you type in: manufacturer (name, postal address, electronic contact), EU responsible person (same three fields), product identification, safety information and warnings. It shows what you entered on the product page, in a \"Product safety information\" tab or through the shortcode. It does not look anything up and does not check what you enter.<\/p><\/dd>\n<dt id=\"do%20i%20need%20an%20eu%20responsible%20person%3F\"><h3>Do I need an EU responsible person?<\/h3><\/dt>\n<dd><p>That depends on your products and where they are made. The plugin only offers the fields. Check the regulation or ask an adviser.<\/p><\/dd>\n<dt id=\"where%20does%20the%20information%20show%3F\"><h3>Where does the information show?<\/h3><\/dt>\n<dd><p>In a tab on the product page and wherever you use the shortcode. Turn the tab off under Products &gt; Product safety &gt; Settings if you prefer the shortcode only.<\/p><\/dd>\n<dt id=\"how%20does%20csv%20import%20match%20products%3F\"><h3>How does CSV import match products?<\/h3><\/dt>\n<dd><p>By product_id, or by sku when product_id is empty. Columns: product_id, sku, mfr_name, mfr_address, mfr_contact, rp_name, rp_address, rp_contact, id_type, id_model, id_batch, id_serial, safety_info, warnings. Blank cells keep the existing value unless you tick the overwrite box.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20when%20i%20delete%20the%20plugin%3F\"><h3>What happens to my data when I delete the plugin?<\/h3><\/dt>\n<dd><p>Your product and category data stays in the database; the settings are removed. The withdrawal log table (<code>wp_tlps_withdrawals<\/code>) is also kept, as a record you may need; drop it yourself if you do not.<\/p><\/dd>\n<dt id=\"does%20the%20withdrawal%20button%20make%20my%20shop%20compliant%3F\"><h3>Does the withdrawal button make my shop compliant?<\/h3><\/dt>\n<dd><p>No. It gives you a withdrawal function with a confirm step and an acknowledgement email. Whether it satisfies the law in your country, and when your withdrawal period starts, is for you to confirm. This plugin is not legal advice.<\/p><\/dd>\n<dt id=\"does%20it%20cancel%20or%20refund%20the%20order%3F\"><h3>Does it cancel or refund the order?<\/h3><\/dt>\n<dd><p>No. It adds an order note, logs the statement and sends two emails. You handle the order yourself.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Readme: links to the free GPSR info sheet tool and the German guides. No code changes.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: optional \"Footer link\" setting (off by default) that adds a plain link to the withdrawal page, using the button label, to the site footer via wp_footer (classic and block themes).<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: optional EU withdrawal function (Article 11a of Directive 2011\/83\/EU as inserted by Directive (EU) 2023\/2673): button in My Account and on the order view, shortcode <code>[tidyleaf_withdrawal]<\/code> for guests, confirm step, acknowledgement email with date and time, order note, admin notice, Withdrawals list with CSV export. Off by default; it never cancels or refunds.<\/li>\n<li>New settings: withdrawal period, button label, notification email.<\/li>\n<li>Name changed to \"Tidyleaf Product Safety (GPSR) &amp; Withdrawal Button for WooCommerce\".<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"GPSR product safety information on product pages, plus an optional EU withdrawal button with confirm step and email acknowledgement.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/399083","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=399083"}],"author":[{"embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tidyleaf"}],"wp:attachment":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=399083"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=399083"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=399083"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=399083"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=399083"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=399083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}