WordPress plugin intelligence profile

ErreD EU Order Withdrawal for WooCommerce

Digital withdrawal function for WooCommerce — the EU "easy withdrawal" duty (Directive 2023/2673), in force from 19 June 2026.

WP PlugIndex snapshot

Current directory snapshot

Tested up to WordPress 7.1
Current version0.9.0
WordPress coverageTested up to WordPress 7.1
Minimum stackWP 6.9 · PHP 8.2
Directory statusactive
Last directory update16 Oct 202617d ago
Active installationsNewAdoption metric — not a quality score
WordPress.org ratingNo WordPress.org ratings yet
Official packageDirect from WordPress.org

Repository metrics are context, not quality scores. Active installations measure adoption and can strongly reflect a plugin’s age and historical popularity. Ratings, recent updates and “Tested up to” metadata also do not guarantee modern code, error-free operation, security, feature completeness or suitability for a particular site. Why active installs don’t tell the whole story →

WP PlugIndex currently records ErreD EU Order Withdrawal for WooCommerce version 0.9.0 as active, updated 17d ago and tested up to WordPress 7.1.

Overview

About this plugin

From 19 June 2026, EU Directive 2023/2673 requires online stores across the European Union to

provide a digital withdrawal function: a way to cancel a distance contract online that is at

least as easy to use as the purchase flow itself. A single “cancel” button is not enough. The law

requires a clearly labelled, continuously available function, a two-step confirmation, and an

acknowledgement on a durable medium whose timestamp fixes the legal moment of communication.

ErreD EU Order Withdrawal for WooCommerce implements that function end to end — not just the

button, but the declaration flow, the two-step confirmation, the durable-medium receipt, the

eligibility rules and the merchant review tools needed to actually comply.

It ships the Italian transposition out of the box (art. 54-bis of the Codice del Consumo,

Lgs. 209/2025) with the legally-fixed label «recedere dal contratto qui», and it

is fully translatable for other EU markets.

The plugin does not create a right of withdrawal: it provides the online channel to exercise an

g. art. 59 in Italy).

It is built security-first,

is WooCommerce High-Performance Order Storage (HPOS) native, and works fully offline (no external

service calls).

For consumers

  • A clearly labelled, continuously available withdrawal function on the My Account orders screen and

in a dedicated “Right of withdrawal” tab listing every order still eligible.

  • A two-step declaration and confirmation flow (“conferma recesso”), server-rendered so it works

even with JavaScript disabled.

  • An acknowledgement on a durable medium (email plus a stored PDF receipt) whose timestamp fixes

the moment of communication — the legal start date (dies a quo) for refund deadlines.

  • Reachable by guest-checkout customers through a per-order signed link in their order emails and on

the order-received page, with no order enumeration.

For merchants

  • A React admin screen to review requests, filter by status, search by order, name or email, view

the audit timeline, view/regenerate the durable receipt and mark requests refunded or rejected.

  • A menu badge counting the requests awaiting action.
  • A conservative, configurable eligibility engine (withdrawal window, eligible order statuses, per-product and per-category exclusions) that fails closed when configuration is missing.
  • Withdrawal periods counted per item: goods from delivery, services and digital content from the purchase, set store-wide and overridable on any product or category. An order mixing the two gives each item its own deadline.
  • Article 16 checkout consents — digital content (art. 16(m)) and early-started services

(art. 14(4)(a)) — in both the classic checkout and the WooCommerce Checkout block, shown either on

every checkout or only for the carts that actually call for them.

  • Role-based access to the requests screen, so the personal data each request holds is visible to

the people you choose rather than to everyone who can edit the shop.

  • Optional WooCommerce Subscriptions support: a confirmed withdrawal cancels the subscription

(status transition only — subscription data is never deleted).

  • An append-only audit trail and tamper-evident receipts (SHA-256 of the receipt payload).

Built to standard

  • Security-first: capability + nonce/REST permission checks and input sanitisation / output

escaping on every privileged path; signed, rate-limited guest access.

  • Accessibility: WCAG 2.2 AA, verified with automated axe checks.
  • Fully translatable; ships a complete Italian (it_IT) translation.

This plugin encodes legal and security intent; it is not legal advice. The mapping of the art. 59

exceptions to your catalogue and the durable-medium content must be validated by a qualified legal

professional before relying on them.

Source code and build process

This plugin ships its complete, human-readable source. The compiled assets in build/ are

generated from the React/JS/CSS source in assets/ with @wordpress/scripts.

  • JS/CSS source: assets/admin/ and assets/frontend/
  • Generated bundles: build/admin/ and build/frontend/
  • Rebuild the bundles: composer install && npm ci && npm run build
  • Runtime PHP dependencies (Dompdf) are managed with Composer.

com/erred74/ErreD-EU-Order-Withdrawal-for-WooCommerce

Hooks for developers

All hooks are prefixed recesso_dig_. Names and signatures are stable within a major version.

Filters:

  • recesso_dig_is_eligible — ( EligibilityResult $result, WC_Order $order ). The last word on

whether an order can be withdrawn from. Use it to refine the decision for your catalogue.

  • recesso_dig_withdrawable_statuses — ( string[] $statuses ). Which order statuses a withdrawal

may be started from, after the setting has been applied.

  • recesso_dig_entry_token_ttl — ( int $seconds ). Lifetime of the signed link emailed to

guest-checkout customers. Default 60 days, floor of one day.

  • recesso_dig_consent_applies — ( bool $applies, string $consent ) where $consent is digital

or service. Decides per cart whether a consent is asked for. Both checkouts read this same

decision, so the classic checkout and the Checkout block cannot disagree.

  • recesso_dig_consent_required — ( bool $required, string $consent ). Makes a consent blocking or

optional. Must not depend on the cart: the Checkout block registers its fields once per request,

before any cart is known.

  • recesso_dig_consent_render_hook — ( string $hook ). Moves the consent checkboxes to another

checkout hook; return an empty string to suppress the render and place them yourself. Classic

checkout only — in the Checkout block, WooCommerce decides placement.

  • recesso_dig_consent_render_priority — ( int $priority, string $hook ). Classic checkout only.
  • recesso_dig_original_product_id — ( int $original, int $product_id ). The original of a translated product, whose withdrawal settings a translation without its own inherits. WPML and Polylang are handled already; use this for another multilingual plugin. Return $product_id when the product is not a translation.
  • recesso_dig_original_category_id — ( int $original, int $term_id ). The same for product categories.

Actions:

  • recesso_dig_request_created — ( WithdrawalRequest $request ). After step one is stored, before

the consumer has confirmed. Not yet a legal record.

  • recesso_dig_request_confirmed — ( WithdrawalRequest $request ). After step two. This is the

moment of communication; confirmed_at_gmt is set and never changes.

  • recesso_dig_request_processed — ( int $request_id, string $action ). After a merchant decision.
  • recesso_dig_after_declaration_form — fires inside the flow container, below the declaration form.
WordPress.org metadata

Plugin tags

Topics listed for this plugin in the WordPress.org directory.

  • cancellation
  • consumer
  • recesso
  • withdrawal
  • woocommerce
Compatibility & maintenance

Compatibility & maintenance

Tested with WP 7.1

Marked as tested with the current WordPress 7.1 release.

Current WordPress releaseWordPress 7.1
WordPress.org Tested up to7.1
Minimum requirementsWordPress 6.9 · PHP 8.2
Update activity16 Oct 202617d ago

“Tested up to” is directory metadata supplied by the plugin author. WP PlugIndex does not turn an older declaration into a claim that the plugin is incompatible.

Changes recorded by WP PlugIndex

Recent tracked changes

Version0.8.00.9.0
WordPress compatibility7.17.1.3
Tracking & source

WP PlugIndex tracks public WordPress.org directory metadata and records selected version, compatibility and availability changes as they are detected.

Plugin watchlist

Watch this plugin

Sign in to your WP PlugIndex account or create a free account. Free accounts can watch up to 5 plugins and see what changed.

Watch limit

Watchlist limit reached

You have reached your current active watch limit.