EU Withdrawal Button & Widerruf Form for WooCommerce
From 19 June 2026, every EU store must let customers withdraw as easily as they bought. Most WooCommerce stores still cannot.
Developer reference: filters
The plugin exposes a small set of filters for developers who need to adjust behaviour. Add these to your theme’s functions.php or a small custom plugin.
Set the delivery date that starts the clock
The withdrawal deadline is calculated from when the customer received the goods. If your store records a real delivery or possession date (for example from a shipping integration), return it here as a GMT datetime string. Returning null keeps the built-in fallback.
add_filter(
'carticy_eu_withdrawal_delivery_date_gmt',
function ( $date_gmt, $order ) {
$delivered = $order->get_meta( '_my_delivered_date_gmt' );
return $delivered ? $delivered : $date_gmt; // 'Y-m-d H:i:s' in GMT
},
10,
2
);
Exclude an item from withdrawal
Return a non-empty reason string to mark a specific item as non-withdrawable; that reason is shown to the customer. Return an empty string to leave the item withdrawable. This runs in addition to the product, category, and type exclusions you configure in settings.
add_filter(
'carticy_eu_withdrawal_item_exclusion_reason',
function ( $reason, $item, $product ) {
if ( $product && $product->get_meta( '_made_to_order' ) === 'yes' ) {
return 'Made-to-order items cannot be withdrawn.';
}
return $reason;
},
10,
3
);
Force the frontend assets to load
For performance the form’s CSS and JavaScript load only where the form is detected. If you render the form in a location the auto-detection misses (a custom template or builder widget), return true to enqueue the assets there.
add_filter( 'carticy_eu_withdrawal_enqueue_frontend_assets', function ( $load ) {
if ( is_page( 'my-custom-withdrawal-page' ) ) {
return true;
}
return $load;
} );
Request data is stored in the plugin’s own tables and exposed through WordPress privacy export and erase, so you do not need custom code to handle personal-data requests.