Frequently Asked Questions
General
Section titled “General”What does this module solve?
It implements the mandatory “Withdraw from contract” button required by EU Directive 2023/2673 (effective from 19 June 2026) for all online shops doing business with EU consumers.
The module provides:
- A compliant button + dual-step form
- A confirmation email on a durable medium (per directive)
- Integration into My Account, transactional emails, and admin
- Optional warranty claim form (reklamace) sharing the same UI
Do I need both halves (withdrawal + claim)?
No. Each half is independent — assign a page to enable it, leave empty to disable it.
If you only need the withdrawal button (the legal minimum), assign only the Withdrawal page.
Is this enough to be EU 2023/2673 compliant?
The plugin covers the technical side (button, form, dual step, durable-medium email, period tracking).
You still need to take care of:
- Terms & Conditions mentioning the button location and how to use it
- Information obligation about the right to withdraw (per § 1820 OZ in CZ)
- Refund processing — actually returning money to the customer once you receive a request
- Reklamace processing — handling warranty claims within 30 days
What about WooCommerce Subscriptions?
Subscriptions create regular WC orders, so the module works for them by default. However, “withdrawal from a subscription” has a different legal meaning than from a regular order — talk to your legal advisor before relying on the standard withdrawal flow for subscriptions.
How do I create a Returns page?
- WordPress → Pages → Add New
- Title: “Returns” (or whatever you prefer)
- Add the shortcode
[wpify_woo_withdrawal_form]to the content (or insert the Withdrawal form Gutenberg block) - Publish
- Go to WPify → WPify Woo → Withdrawal & Claim
- Select your new page in Withdrawal page
- Save
For the claim form, repeat with [wpify_woo_claim_form] and assign it to Claim page.
Can I use a single page for both forms?
Yes. Place both shortcodes (or both blocks) on the same page and assign that page to both Withdrawal page and Claim page in settings.
The plugin uses the URL parameter ?form=withdrawal or ?form=claim to know which form to pre-fill on a shared page.
How do I exclude products from withdrawal?
For products that customers cannot withdraw from (custom-made, hygiene reasons, perishables…):
- Go to the product editor
- Open the Withdrawal & Claim tab
- Tick Excluded from withdrawal
- Save
Same approach for warranty exclusion via Excluded from warranty/claim.
How do I set a longer warranty for specific products?
In the product editor, Withdrawal & Claim tab, set Warranty months override to e.g. 36 for a 3-year warranty. Leave empty for the global value.
Customer Flow
Section titled “Customer Flow”What does the customer see if they're logged in?
In My Account → Order detail, they see:
- A Withdraw from contract button (if eligible)
- A File a claim button (if claim is enabled and eligible)
- A Submitted requests section listing previous requests (always shown, even after the order is refunded)
What about guest customers?
Two paths:
-
Direct link from email — plugin-generated emails include a link with
?order_key=. The customer clicks, the form opens with all data pre-filled. They just confirm. -
Direct page visit (footer link, T&C…) — the form starts empty. The customer fills in their order number + billing email + name. After clicking submit, the server validates the email match and reveals the items list inline (no page reload). The customer picks items and confirms.
What if the customer types the order number wrong?
They get an inline error message (“Order not found” or “The email does not match the order”), the form stays put with their values intact, and they can correct and resubmit.
Does the customer need to be logged in?
No. Guest checkouts work fully — order_key in transactional emails (trusted token) or order number + email match (manual entry).
Can a customer attach photos for a claim?
Not in the form (Phase 1). The default email template instructs the customer to reply to the email with attachments — that goes directly to the admin notification recipient.
You can customize this instruction in WooCommerce → Settings → Emails → Claim — admin notification → Additional content.
Periods & Eligibility
Section titled “Periods & Eligibility”When does the 14-day withdrawal period start?
It starts when the order first transitions into one of the statuses configured in Order statuses that start the period (default: Completed).
If you have a custom “Delivered” status, configure that to start the countdown from actual delivery.
What about orders that existed before I activated the module?
For legacy orders, the plugin falls back (in order):
date_completeddate_paiddate_created
The configured period-start statuses are only fully enforced for orders the module observes since activation. Legacy orders use a reasonable approximation based on WooCommerce’s native timestamps.
Mixed eligibility — some items expired, others not?
The form shows the full items list with disabled rows (with a reason tag like “Period expired”) for ineligible items. The customer can submit only for eligible items.
If the customer chooses Whole order scope, the server processes only the eligible items (with a warning that some items won’t be included).
What about partial returns of multi-quantity line items?
For items ordered with quantity > 1, the form shows a number input (0 to ordered quantity), so the customer can return e.g. 1 of 3 ordered. For items with quantity = 1, a checkbox is used.
Why are buttons hidden on refunded/cancelled orders?
Orders in refunded, cancelled, failed, or draft statuses are dead contracts — there’s nothing to withdraw or claim. The buttons are hidden and form submissions are rejected.
The previously-submitted requests history remains visible in My Account, so the customer sees “I requested withdrawal on date X — the order is now refunded, request resolved.”
Emails
Section titled “Emails”How many emails does the plugin send per submission?
Up to 2 emails per submission:
- Customer notification (always to billing email) — confirms receipt, includes the request details and exact submission timestamp (required by directive)
- Admin notification — sends to the configured admin recipient with a link to the request detail in the admin overview
Where do I customize email content?
WooCommerce → Settings → Emails lists 4 emails:
- Withdrawal — confirmation to customer
- Withdrawal — admin notification
- Claim — confirmation to customer
- Claim — admin notification
For each, you can edit Subject, Heading, and Additional content (extra text shown above the request details).
Can I include the withdrawal link in my regular order confirmation email?
Yes. In the module settings (Withdrawal tab), tick the WooCommerce emails into which the withdrawal link should be injected — e.g., “Completed order”.
The link is rendered only if the period is still running and the order is in an eligible status.
Does the customer need to use the same email as on the order?
Yes — the email entered in the form must match the billing_email of the order. This is the second factor of the guest authentication.
For users opening the form via ?order_key= in a transactional email, the order_key alone is sufficient (the customer already received it in their inbox).
Where do I see all submitted requests?
WooCommerce → Withdrawals & Claims — list table with filters by type and period status (in / expired at submission).
Can I see requests directly from the order detail?
Yes. The order edit page has a Withdrawal & Claim Requests sidebar metabox listing all requests for that order (date, type, items count, link to detail).
The orders list table also has a Withdrawals & Claims column showing requests inline (#42 Withdrawal · 27.4.2026).
Can I delete a request?
Not via UI by default — requests are audit records. If you need to delete (e.g., GDPR right to erasure), do it via WP-CLI or a custom DB query against the wpify_woo_requests table.
What about the request status field?
The DB has a status column (default submitted), but the plugin never changes it. It’s an extension point — install or write a workflow extension that hooks into wpify_woo_withdrawal_claims_status_changed to manage states like processing, approved, refunded, etc.
Security
Section titled “Security”How is bot protection handled?
Two layers:
- Honeypot field (named
wpify_woo_url, hidden via CSS,aria-hidden) — bots fill it, humans don’t - Time-trap — server-rendered HMAC-signed timestamp; submissions under 1 second after page load are rejected
Plus per-IP rate limiting (Layer B in settings).
What if my CDN strips the IP?
The plugin uses REMOTE_ADDR. If you’re behind a proxy/CDN that masks IPs, configure your hosting to set REMOTE_ADDR from the trusted forwarded header. This is a hosting-level fix, not plugin.
How is GDPR handled?
The DB stores customer_ip, customer_user_agent, customer_email, customer_name, and the items submitted. Default retention guideline: 4 years (statute of limitations + buffer). Manual cleanup is the merchant’s responsibility — no automatic deletion.
Localization
Section titled “Localization”What languages does the module support?
Source strings are in English. Translations bundled / available on translate.wordpress.org for Czech (cs_CZ) and Slovak (sk_SK). Other languages can be contributed there too.
For local string overrides, edit wpify-woo.po in wp-content/languages/plugins/.
How do I customize button texts?
In settings:
- Withdrawal → Button text / Confirm button text
- Claim → Button text / Confirm button text
These fields override the default texts.