Beschrijving
BuddyPilot Withdrawal for WooCommerce implementeert de verplichte herroepingsfunctie vereist door artikel 11a van EU-richtlijn 2023/2673 voor online ondernemers die aan EU-consumenten verkopen.
Vanaf 19 juni 2026 moet elke WooCommerce winkel met EU-klanten een duidelijk zichtbare en gemakkelijk toegankelijke herroepingsfunctie (knop “Contract hier herroepen”) bieden, naast de bestaande informatievereisten inzake het herroepingsrecht.
Wat de plugin doet
Voor de klant
- Knop “Contract hier herroepen” conform artikel 11a op de bestellingsdetailpagina in Mijn account
- Tweestaps herroepingsformulier: artikelselectie, verklaringsvoorbeeld, bevestigen met een klik
- Ondersteuning voor variabele producten: elke variant (maat, kleur, enz.) verschijnt met volledige attribuutlabels als afzonderlijke regel in het herroepingsformulier
- Ondersteuning voor afrekenen als gast via directe verificatiestroom (e-mail en bestelnummer, inloggen niet vereist)
- Herroepingsgeschiedenis in Mijn account: lijst en detailpagina van de verklaring
- Vastleggen van toestemming conform artikel 16(m) bij het afrekenen voor digitale en virtuele goederen (instelbaar: verplicht, optioneel of verborgen)
- E-mail met verklaring voor de klant als bevestiging op een duurzame drager vereist door artikel 11a lid 3
- Withdrawal resolved email sent to the customer after the operator closes the declaration; includes the EU ODR platform link (ec.europa.eu/consumers/odr) when any item is rejected
- Per-item resolution status visible in the withdrawal form after a declaration is closed: each item shows an “accepted” or “rejected” badge with the rejection reason and ODR link, so the customer understands the outcome without contacting support
Voor de ondernemer
- Metabox voor bestellingbewerking voor het registreren van verklaringen ontvangen via telefoon, post of persoonlijk
- Zelfstandige pagina “Nieuwe verklaring toevoegen” voor ondernemers met grote hoeveelheden verklaringen, zonder de verklaringenlijst te verlaten
- Verklaringenlijst met zoeken, filteren en sorteren in het WooCommerce beheer
- Declaration detail page with full audit trail and resolution workflow: accept all, reject all, or partial resolution with per-item decisions and individual rejection reasons
- E-mail beheerdermelding onmiddellijk verzonden wanneer een klant een herroeping indient
Juridisch en naleving
- Custom order status
wc-withdrawal(optional, plugin-registered) with a full change history logged as WooCommerce order notes - Pagina met herroepingsinformatie van Bijlage I(A) beschikbaar om met een klik te genereren vanuit instellingen
- Annex I(B) model withdrawal form page available to generate with one click from Settings, published as a WordPress page and auto-linked from order emails and My Account
- Configurable refund period (default 14 days, matches your contract terms)
- Instelbare “geleverd” statussen die de herroepingstermijn starten
- Toewijzing van retourkosten (consument betaalt of ondernemer betaalt, conform vereisten van Bijlage I(A))
- AVG export en anonimisering van persoonsgegevens, compatibel met WordPress privacytools
- HPOS compatibility (High-Performance Order Storage) and legacy post-meta mode
- Naleving van WCAG 2.2 AA-toegankelijkheid op alle formulieren voor klanten
- Poolse en Engelse vertalingen inbegrepen
Pro add-on
Uitgebreide functionaliteit is beschikbaar via de BuddyPilot Withdrawal Pro add-on:
- Door de ondernemer goedgekeurde automatische terugbetaling op basis van gedeclareerde artikelen (een klik vanuit het verklaringsscherm)
- Verificatie van het downloadaantal: herstelt het herroepingsrecht wanneer een digitaal product nooit daadwerkelijk is gedownload, waarmee ongerechtvaardigde weigering van terugbetalingen wordt verminderd
- Ondersteuning voor WooCommerce Subscriptions: annuleert toekomstige verlengingen, berekent de huidige factureringsperiode naar rato conform artikel 9 lid 2 sub b punt iii
- Ondersteuning voor WooCommerce Product Bundles: automatische verwerking op bundeltype; voor per-artikel-bundels met een geconfigureerde korting: kies of gedeeltelijke retouren het betaalde bedrag behouden of de gehele bundelkorting vervalt
- PDF export van de juridische herroepingsverklaring
- Landspecifieke generatie van formulier Bijlage I(B)
Installatie
- Upload de pluginmap naar
/wp-content/plugins/of installeer via Plugins > Nieuw toevoegen. - Activeer de plugin via het menu Plugins in WordPress.
- Ga naar WooCommerce > Instellingen > Herroeping en configureer:
- Algemeen: herroepingstermijn, respijtperiode, statussen “geleverd”
- Gegevens ondernemer: naam, adres, retouradres, verantwoordelijkheid voor retourkosten
- Klantervaring: toestemmingsmodus voor digitale goederen, pagina met herroepingsinformatie
- In the Customer experience section click “Create withdrawal information page” to publish an EU-compliant Annex I(A) notice and Annex I(B) model form. The page URL is auto-linked from order emails and the My Account view-order screen.
- Customers eligible to withdraw will see a “Withdraw from contract here” call-to-action on their order page. The form works without JavaScript.
FAQ
-
Werkt de plugin bij afrekenen als gast?
-
Yes. Create a dedicated withdrawal form page from WooCommerce > Settings > Withdrawal > Customer (one click). Place the
[buddypilot_withdrawal_guest_form]shortcode on that page. Guest customers enter their order number and billing email; a secure magic-link is sent to the billing address. Clicking the link opens the full interactive withdrawal form without requiring an account. -
Verwerkt de plugin terugbetalingen automatisch?
-
The free version records the withdrawal declaration and changes the order status to
wc-withdrawal. The operator processes the refund using native WooCommerce tools. One-click automatic refund built from declared items is available in the Pro addon. -
Wat doet de plugin NIET?
-
De plugin registreert herroepingsverklaringen als juridische documenten en stelt zowel de klant als de ondernemer op de hoogte. De plugin verwerkt geen automatische terugbetalingen, verifieert geen retourzendingen, handhaaft geen terugbetalingstermijnen en verwerkt geen boekhouding en btw. De shopbeheerder is verantwoordelijk voor het verwerken van de terugbetaling binnen de wettelijk vereiste termijn (standaard 14 dagen, instelbaar onder WooCommerce > Instellingen > Herroeping > Algemeen).
-
Ondersteunt de plugin variabele producten?
-
Ja, zonder extra configuratie. Variabele producten (verschillende maten, kleuren, enz.) worden volledig ondersteund in de gratis versie. Elke variant verschijnt in het herroepingsformulier als een afzonderlijke regel met volledige attribuutlabels (bijv. T-shirt, Maat: L, Kleur: Zwart), zodat de klant precies aangeeft wat hij retourneert en de ondernemer dezelfde details ziet op de verklaringenlijst en de detailpagina van de verklaring.
-
Werkt de plugin met WooCommerce Subscriptions of Product Bundles?
-
Subscription, bundle and composite product handling (cancel renewals, proration, bundle refund modes) is part of the Pro addon. The free version treats them as standard products.
-
Dekt de plugin de toestemming van artikel 16(m) voor digitale goederen?
-
Yes. The plugin adds an explicit consent checkbox at checkout when the cart contains downloadable or virtual products. The operator can choose between “required before purchase”, “optional” or “hidden” (trader waives the exclusion). Consent is recorded on the order and displayed in the withdrawal form.
-
Wanneer begint de herroepingstermijn?
-
The clock starts from the exact moment the order status changes to one of the “delivered” statuses configured under WooCommerce > Settings > Withdrawal > General. The plugin records the precise timestamp of that status change. As long as the deadline has not passed, the customer sees how many days remain in the withdrawal form; once the deadline passes, the withdrawal button is no longer shown. Any built-in or custom WooCommerce order status can be mapped as a “delivered” trigger (e.g. “Completed”, a custom “Shipped” status, etc.). Leaving the list empty means the clock never starts, which is useful during testing or when you want withdrawal to be available indefinitely.
-
Is de plugin HPOS compatibel?
-
Yes. The plugin is fully compatible with WooCommerce High-Performance Order Storage (HPOS) and falls back to legacy post-meta mode automatically.
Beoordelingen
Bijdragers & ontwikkelaars
“BuddyPilot Withdrawal (Easy Returns)” is open source software. De volgende personen hebben bijgedragen aan deze plugin.
Bijdragers“BuddyPilot Withdrawal (Easy Returns)” is vertaald in 4 talen. Dank voor de vertalers voor hun bijdragen.
Vertaal “BuddyPilot Withdrawal (Easy Returns)” naar jouw taal.
Interesse in de ontwikkeling?
Bekijk de code, haal de SVN repository op, of abonneer je op het ontwikkellog via RSS.
Changelog
1.0.13
- Feature: Operators can now close a declaration as “Reject all items” or “Partial resolution” directly from the declaration detail page. Previously only full acceptance was available from that screen.
- Feature: Partial resolution mode allows a per-item accept/reject decision with a mandatory rejection reason for each rejected item, so the customer receives an itemised outcome rather than a single blanket decision.
- Feature: Rejection and partial resolution emails now include the EU ODR (Online Dispute Resolution) platform link (ec.europa.eu/consumers/odr) as required for cross-border dispute notifications under Article 11a.
- Feature: The customer-facing withdrawal form now shows per-item resolution badges for fully-resolved declarations: accepted items display a confirmation badge, rejected items display the rejection reason and an ODR platform link. Previously the form showed a generic “order not eligible” message.
- Improved: Reopening a declaration now resets the resolution type and operator note to null, so the operator starts with a clean slate when correcting an erroneous decision.
- Security: Financial snapshot fields in the declaration record (item total, subtotal, tax) are immutable; they cannot be overwritten by POST manipulation during the resolution step.
- Security: Resolution type is validated against a strict server-side whitelist (accepted / rejected / partial); arbitrary values are rejected before reaching the database.
- Security: Already-closed declarations reject stale resolution attempts with an explicit error, preventing accidental overwrites in concurrent operator sessions.
1.0.12
- Fixed: Article 16(m) consent checkbox was not displayed at checkout on stores using WooCommerce 8.6 or later with a classic shortcode-based checkout (e.g. Blocksy theme). The plugin now correctly detects whether the block checkout is in use before routing consent collection through the Additional Checkout Fields API.
- Improved: Guest withdrawal session is now time-limited to 15 minutes after clicking the magic link, reducing the window in which a shared or inactive browser session could be misused.
- Improved: Magic link redemption endpoint now applies rate limiting per order per IP, consistent with the email verification endpoint.
- Improved: Declaration detail and status toggle in the admin panel now verify that the current user has access to the linked order, providing correct access control on multi-vendor setups.
- Improved: Operator-customised consent label text is sanitised when saved, so stored option value is always clean HTML.
- Improved: Plugin no longer collects or stores the browser user-agent string with withdrawal declarations. The field served no active purpose and its removal reduces the personal data footprint. Existing installations will have the column dropped automatically on first load after updating (no data loss; the legal declaration record is preserved in full).
1.0.11
- Reparatie: Pluginemailklassregistratie is nu geïsoleerd per klasse. Een constructorfout in één klasse verspreidt zich niet meer in de e-mailverzending van WooCommerce en blokkeert niet langer alle transactionele e-mails van WooCommerce (nieuwe bestelling, klantverwerking, enz.).
1.0.10
- Fixed: Attempting to bulk-change orders in withdrawal status to Completed or Processing now triggers an admin notice informing the operator how many orders were skipped because the status change is not permitted for them, and that those orders must be handled individually.
1.0.9
- Feature: Guest verification form now accepts custom order numbers from third-party renumbering plugins (e.g. WebToffee Advanced Order Numbers, Custom Order Numbers for WooCommerce by Tyche Softwares). Guests can enter the formatted number shown in their confirmation email instead of the internal numeric order ID.
- Feature: Order number input on the guest verification form no longer forces a numeric-only keyboard on mobile devices, allowing guests to type prefixed order numbers such as ORD-2024-1042.
- Security: Input length on the guest verification form is now capped before order resolution, preventing crafted requests from triggering full-table database scans on stores with custom order number plugins installed.
1.0.8
- Feature: Withdrawal information page is now created as native WordPress blocks, allowing the operator to freely edit the legal wording directly in the block editor.
- Feature: New [buddypilot_withdrawal_info_block] shortcode renders the dynamic sections (trader contact details, return address, CTA button) independently so they always reflect current settings, even after manual edits to the surrounding text.
- Feature: New “Overwrite information page content” button in WooCommerce > Settings > Withdrawal > Customer refreshes the page with the latest model notice wording at any time.
- Fixed: Orders imported via the WooCommerce REST API (e.g. BaseLinker) were being re-imported in a loop because the plugin was writing unnecessary consent meta to every new order. The plugin no longer writes any meta to API-created orders that contain no digital items.
1.0.7
- Improved: Delivery tracking now uses a dedicated database table instead of order meta, preventing third-party order-sync integrations (e.g. BaseLinker) from re-importing orders on every delivery status update.
- Improved: Confirmation screen now reads the configured withdrawal period dynamically instead of using a hardcoded value.
- Improved: Rate limiting is now handled with a single atomic database operation.
- Improved: Reduced database queries on the withdrawals list page.
- Fixed: Several coding standards issues and minor security hardening.
1.0.6
- Feature: guest (non-logged-in) customers can now submit a withdrawal declaration directly from a dedicated form page. After entering their order number and billing email, a secure one-time magic-link is sent to the billing address; clicking it opens the full interactive withdrawal form with no account required.
- Functie: nieuwe shortcode
[buddypilot_withdrawal_guest_form]voor de gastherroepingsformulierpagina. De pagina en shortcode kunnen met een enkele klik worden gemaakt vanuit WooCommerce > Instellingen > Herroeping > Klant. - Feature:
[buddypilot_withdrawal_information]shortcode now shows an optional “Submit withdrawal form online” call-to-action button linking to the guest form page when the form page is configured. Existing information pages are not modified. - Feature: new “Withdrawal form access link (guest)” transactional email containing the magic-link; configurable under WooCommerce > Settings > Emails.
1.0.5
- Plugin renamed to BuddyPilot Withdrawal (Easy Returns) for better discoverability.
- Volledige vertalingen toegevoegd voor alle 24 officiële EU-talen: bg, cs, da, de (de_DE, de_AT, de_CH), el, es, et, fi, fr (fr_FR, fr_BE, fr_CH), ga, hr, hu, it, lt, lv, mt, nl (nl_NL, nl_BE), pl, pt, ro, sk, sl, sv.
- Vertaalkwaliteit: alle 24 EU-taalbestanden gecontroleerd over drie ronden; juridische terminologie geverifieerd aan officiële nationale gazetten (EU-richtlijn 2011/83/EU Bijlage I), diakritische markeringen hersteld, formeel register overal afgedwongen, meervoudige vormen gecorrigeerd en interne consistentie verbeterd.
1.0.4
- Functie: gebroken producthoeveelheden worden nu gedetecteerd en gemeld in de herroepingsverklaring. Volledige verwerking van gebroken hoeveelheden (correcte naar-rato-berekening, berekening van terugbetaling) is beschikbaar in BuddyPilot Herroeping Pro.
- Feature: added “Upgrade to Pro” action link in the Plugins list, shown only when the Pro version is not active.
1.0.3
- Getest en compatibiliteit met WordPress 7.0 bevestigd.
- Beveiliging: nonce wordt nu geverifieerd voor het innemen van een rate-limit slot, zodat CSRF sondes het uurbudget van een gebruiker niet kunnen uitputten.
- Beveiliging: anonieme (gast) rate-limit buckets zijn nu per gehashed IP-adres gescheiden in plaats van een gedeelde
user_id=0bucket. - Beveiliging:
sealed_mapen GET voorverzegelde ID’s worden gevalideerd tegen de bestelling voor gebruik, zodat geconstrueerde verzoeken geen verzegelde bevestigingen kunnen koppelen aan gewone artikelen. - Beveiliging: de uitvoer van
apply_filters('buddypilot_withdrawal_declaration_items_payload')wordt opnieuw gevalideerd: vermeldingen metitem_id=0, negatieve hoeveelheden of niet-array-waarden worden verwijderd. - Beveiliging:
PermissionCheckerblokkeert nu explicietuser_id=0ongeacht decustomer_idvan de bestelling. - Beveiliging:
OperatorRegistrationcontroleertEXCLUDED_STATUSESbij het betreden van de handler en wist de rechtencode na het opslaan van de bestelling. - Security:
DeclarationRepositoryvalidatesfiling_dateformat and rejects zero-date strings. - Beveiliging:
RateLimit::tally()geeftPHP_INT_MAXterug wanneer de rate-limittabel ontbreekt, zodat de begrenzer niet stilzwijgend inactief wordt. - Correctie:
round(qty, 10)inget_declared_quantities()voorkomt IEEE-754-epsilonaccumulatie bij gebroken producthoeveelheden. - Fix: removed spurious
user_registerhook from Privacy Manager; onlywoocommerce_created_customeris used.
1.0.2
- Code: renamed all short
bpw_/bpw-identifiers to the fullbuddypilot_withdrawal_/buddypilot-withdrawal-prefix throughout (affects AJAX/admin-post action names, script handles, localized JS object, metabox ID, WooCommerce field type, nonce field names, lock keys and GET parameters). Resolves WordPress.org unique-prefix review requirement.
1.0.1
- Beveiliging: alle handlers voor beheerder en AJAX verzoeken verifiëren nu eerst gebruikersrechten voor nonce verificatie, conform de beveiligingsrichtlijnen van WordPress.
- Beveiliging: het AJAX pad in de registratiehandler van de ondernemer gebruikt nu
check_ajax_referer()in plaats vancheck_admin_referer(), wat een correcte AJAX foutreactie geeft bij een nonce-fout. - Beveiliging: toegevoegd
current_user_can()poort naar de beheerdernoticehandler voor status van het maken van infopagina’s. - Beveiliging: valutasymbool en scheidingsteken waarden uit gelokaliseerde prijsformaatgegevens worden nu aan de JavaScript-kant ge-escaped voor invoeging in de DOM.
- Code: verplaatste inline JavaScript van de handelsregistratiesjabloon naar een geplaatst bestand (
assets/js/admin/operator-registration.js); strings doorgegeven viawp_localize_script(). - Code: aanroep van
load_plugin_textdomain()verwijderd; WordPress 4.6 en hoger laadt vertalingen automatisch voor plugins op WordPress.org.
1.0.0
- Eerste stabiele release. Volledige implementatie van de herroepingsfunctie van artikel 11a: tweestapsformulier, gastverificatie, handmatige registratie door de ondernemer, beheerderslijst met verklaringen, instelbare termijn en statussen “geleverd”, vastleggen van toestemming conform artikel 16(m), paginagenerator voor Bijlage I(A)/(B), e-mails voor klant en beheerder, herroepingsgeschiedenis in Mijn account, HPOS-ondersteuning, AVG-hooks, naleving van WCAG 2.2 AA, Poolse en Engelse vertalingen.
