Ångerrätt SE for WooCommerce

Beschreibung

Ångerrätt SE for WooCommerce gives Swedish WooCommerce stores a complete, self-service workflow for the statutory right of withdrawal under the Distance Contracts Act (distansavtalslagen) — built on your real order data, not a contact form that just emails the store.

A dedicated withdrawal page lets the customer:

  1. Enter their email address and receive a one-time verification code.
  2. Verify their identity by entering the code.
  3. Select an eligible order — the same time window as the actual withdrawal deadline, based on your delivery-time setting — and submit the withdrawal request.

When a request is submitted, the plugin records it, sets a dedicated order status, sends the customer a confirmation email and notifies the store. The confirmation email only confirms what was received — it makes no commitment about refund amount, shipping cost or timing until you’ve actually reviewed the request. All emails use the standard WooCommerce email template so they match the rest of your store’s messaging.

Key features

  • Quick setup, advanced options out of the way. The settings screen has two tabs: „Allmänt“ (General) for the handful of things every store needs, and „Avancerat“ (Advanced) for exclusions by category/product, partial returns, data retention and display customization.
  • Dedicated withdrawal page (/angra-kop/) created automatically on activation.
  • Customer verification via a one-time code sent to the order’s email address — no login required. Works for both registered users and guests.
  • Extensive exclusion options for custom-made products where the right of withdrawal does not apply. Exclusions can be set by tag, product category or individual products.
  • A confirmation email that only confirms. It lists the requested products as a reference copy of the order, but makes no promises about refund amount or timing — that follows separately once you’ve reviewed the request.
  • Admin notification on every withdrawal request, with a direct link to the order.
  • Automatic order status update in the WooCommerce order view.
  • Right-of-withdrawal information shown at checkout and on the order confirmation page — as a floating tab (default) or inline WooCommerce text, depending on your display setting. Never on the cart page; the law requires this information before the customer is bound by the contract, and checkout already satisfies that.
  • Configurable time limit, used consistently for both the withdrawal deadline and which orders the customer can select — never two different figures to keep in sync. Buffer days approximate the delivery time; the exact delivery date is checked manually with your carrier. Automatic delivery-date lookup via Sendify and Fraktjakt is planned for the premium version.
  • Contact details from the admin panel printed automatically on all pages in the withdrawal flow.
  • Two display modes — Floating tab (default, works regardless of theme and page builder, including Klarna Checkout) or Hook (inline WooCommerce styling, if your checkout already uses the standard layout).
  • GDPR-friendly — withdrawal data is deleted automatically after a configurable number of months (default 36), and the records are covered by WordPress’s own personal-data export and erase tools. You choose whether the data is removed when the plugin is uninstalled.

This plugin is built for the Swedish market and its interface texts are in Swedish.

Installation

  1. Upload the plugin files to the /wp-content/plugins/angerratt-se-for-woocommerce directory, or install the plugin through the WordPress Plugins screen directly.
  2. Activate the plugin through the Plugins screen in WordPress.
  3. A withdrawal page (/angra-kop/) containing the [ngersefo_angerratt] shortcode is created automatically on activation.
  4. Go to WooCommerce Ångerrätt to configure exclusions, the withdrawal window, contact details and display options.

WooCommerce 10.5.3 or later is required (this includes the security fix for CVE-2026-3589).

FAQ

Which page do customers use?

On activation the plugin creates a page at /angra-kop/ containing the [ngersefo_angerratt] shortcode. You can move the shortcode to any page you like.

Does it support guest orders?

Yes. Identity is verified with a one-time code sent to the order’s email address, so customers do not need an account.

Is partial return supported?

Yes. Partial returns are optional and disabled by default — the plugin then registers a full withdrawal of the selected order, exactly as before. When you enable partial returns under WooCommerce Ångerrätt, the customer gets a checkbox in front of each eligible product in the confirmation step and can withdraw only the items they choose. The order total is recalculated to reflect the selected products, and you can choose per store whether the shipping cost is refunded on a partial return.

Where is the data stored?

Withdrawal requests are stored in a dedicated table in your own WordPress database. Records are removed automatically after the retention period you set in the settings.

Does the confirmation email say whether the customer will get a refund?

No, and that’s deliberate. The confirmation email only confirms that the request was received and lists which products it covers — it never states a refund amount, shipping status or a processing timeline, since those depend on your review of the request. You decide the outcome and communicate it separately; the plugin doesn’t commit to anything on your behalf before that.

Why isn’t there a right-of-withdrawal notice on the cart page?

The Distance Contracts Act requires this information before the customer is bound by the contract, which happens at checkout — not when items are merely added to the cart. The plugin shows the notice at checkout and on the order confirmation page, which satisfies the requirement; the cart page was intentionally left out.

Rezensionen

11. August 2026
Works nicely and fast support. When testing dont use orders older than 30 days, or past the 14+5 day return window. And useorder status Completed, Processing, or On hold
1 Rezension lesen

Mitwirkende und Entwickler

„Ångerrätt SE for WooCommerce“ ist Open-Source-Software. Folgende Menschen haben an diesem Plugin mitgewirkt:

Mitwirkende

„Ångerrätt SE for WooCommerce“ wurde in 1 Sprache übersetzt. Danke an die Übersetzer für ihre Mitwirkung.

Übersetze „Ångerrätt SE for WooCommerce“ in deine Sprache.

Interessiert an der Entwicklung?

Durchstöbere den Code, sieh dir das SVN-Repository an oder abonniere das Entwicklungsprotokoll per RSS.

Änderungsprotokoll

1.8.1

  • Tweak: Floating tab is now the default display method instead of Hook. It works regardless of theme or page builder, which reduces the risk of the withdrawal notice silently failing to appear on an incompatible checkout. New installs and any store that has never saved the settings screen will see this; stores that have already saved their settings keep whatever they had.
  • Tweak: expanded FAQ and feature description to cover the confirmation email’s no-promises design and why the withdrawal notice isn’t shown on the cart page.

1.8.0

  • New: the settings screen is now split into two tabs — „Allmänt“ (General) for the handful of things every store needs to set (excluded tags, the time limit, contact details, checkout text) and „Avancerat“ (Advanced) for everything else (excluded categories/products, partial returns, data retention, floating-tab display). New installs get a short, focused setup instead of one long page of 20+ fields; nothing was removed, just relocated.
  • Tweak: the customer’s confirmation email no longer states a refund amount, a shipping refund status, or a „within one business day“ timeline. It now only confirms what was received and which products were requested, with a note that a decision follows separately — your review determines the outcome, not the plugin, so the email no longer commits to anything before that review happens.
  • Tweak: customer-facing wording on the withdrawal page reworded for plain language and accuracy — e.g. the submit button now reads „Skicka ångerbegäran“ instead of the more legalistic „Frånträd avtalet“, and the order list no longer implies every listed order is definitely eligible.
  • Tweak: the verification-code field now accepts a pasted code — the digits are distributed across the six boxes automatically instead of only the first box being filled.
  • Tweak: in Floating-tab display mode, the right-of-withdrawal notice no longer appears on the cart page, only at checkout and on the order-confirmation page. The Distance Contracts Act requires the information before the customer is bound by the contract, which checkout already satisfies; the cart page is not a binding step.
  • Fix: the order-selection window and the actual withdrawal deadline are now always the same figure (14 days + your buffer-days setting), computed by one shared function used everywhere it matters. Previously the order list used a fixed 30-day window independent of the buffer-days setting, so a store with a buffer longer than 16 days could have eligible orders that never appeared in the list.
  • Hardening: submitting a withdrawal request now re-checks the deadline on the server, not only when the order list is built. Buffer days can now be set up to 99 (previously 30).

1.7.14

  • Tweak: „Undantagna produktkategorier“ (excluded product categories) is now a searchable dropdown, matching the existing tag and product selectors, instead of a checkbox grid. Stores with many categories no longer need to scroll a long list to find the ones they want to exclude.

1.7.13

  • New: the verification code, the customer receipt and the store notification are now proper WooCommerce email types. They appear under WooCommerce Settings Emails with their own subject, heading and format, can be previewed, and are rendered through WooCommerce’s own template and styles like every other store email. The store notification can be switched off; the two customer emails cannot, because a withdrawal cannot be completed without the code and the Distance Contracts Act requires an acknowledgement of receipt.
  • Fix: placeholders such as {site_title} were printed literally in the footer of the customer’s acknowledgement, and the emails were sent without WooCommerce’s inline styles. Both came from rendering WooCommerce’s templates outside its email system; the emails now go through it.
  • New: plain-text versions of all three emails, for recipients whose client requests them.

1.7.12

  • Fix: the plugin no longer forces its own „From“ header on outgoing email. It previously copied WooCommerce’s sender address into every message, which overrode the site’s own mail configuration: SMTP plugins and hosts that rewrite the sender to an address they are allowed to send for leave an explicitly set From alone. The result was that a store’s order emails were delivered while this plugin’s emails were sent unauthenticated and rejected by the recipient — silently, because WordPress reports such a send as successful. The plugin’s emails now inherit whatever sender the site already uses. If your order emails arrive, these do too.
  • New: ngersefo_email_headers filter for anyone who does want to set the sender in code.

1.7.11

  • New: explanatory text under the Exclusions, Time limit and Return options headings in the settings screen.
  • New: setting under Dataskydd for whether the plugin’s table and options are removed when the plugin is uninstalled. Default is off — data is kept, exactly as before. Deactivating the plugin never removes anything.
  • New: withdrawal records are now covered by WordPress’s personal data export and erase tools, and the plugin contributes suggested text to the site’s privacy policy.
  • Fix: the floating tab is 50% larger in all three sizes. The previous sizes were too small to read comfortably.
  • Fix: the internal version constant was still 1.7.9 in the 1.7.10 release. It controls the cache-busting version on the plugin’s CSS and JavaScript, so style changes did not reach returning visitors, and it gated the automatic database upgrade. Now follows the plugin version.
  • Fix: the withdrawal page is no longer deleted on activation. Since 1.7.3 every activation permanently deleted any existing withdrawal page — past the trash — and created a fresh, empty one, which discarded any changes the store had made to it. An existing page is now reused, and the shortcode is appended only if it is missing.
  • Fix: choosing the custom colour for the floating tab without touching the colour picker saved no colour at all.
  • Fix: the display method, tab positions and tab size are now validated against their allowed values on save.
  • Fix: step one of the withdrawal flow returned a session token only when the email address had an eligible order, which made it possible to tell registered addresses apart despite the deliberately neutral message. All responses are now identical.
  • Tweak: the plugin now calls itself „Ångerrätt SE for WooCommerce“ everywhere. The admin heading and the activation errors said „Woo Ångerrätt“.

1.7.10

  • Hardening: sanitize the selected-items input on submission, use a $wpdb->prepare() placeholder for the internal table name, and remove a redundant suppress_filters flag. No functional changes.

1.7.9

  • Tweak: the two withdrawal tabs in the order list are now told apart — WooCommerce’s built-in status filter is labelled „Ångerbegäran Nya“ (orders still awaiting handling) and the new full view is „Ångerbegäran Alla“. Only the tab labels change; the order status itself is unchanged.

1.7.8

  • New: a „Ångerbegäran“ tab with a counter above the WooCommerce order list shows every order that has ever had a withdrawal request, regardless of its current status (they no longer disappear from view when the status changes). Works with both HPOS and classic order storage.

1.7.7

  • Fix: reverted the settings field widths to the simple inline approach that worked in 1.7.3 (25% width) with an added minimum width so they no longer compress on mobile, and a cap so they never overflow the screen. All fields share the same width again.

1.7.6

  • Fix: the settings field width rules are now enforced so they reliably win over the active WooCommerce/theme admin styles. In some setups the previous rules were overridden, leaving the fields full width; they now consistently share one capped, responsive width.

1.7.5

  • Fix: all settings fields now share one consistent width. Text inputs, textareas and the product/tag selectors are capped at the same maximum (the reference field width) so none is wider than the others, have a minimum width so they stay usable, and never extend past the screen edge on phones. The product category grid also collapses to a single column on small screens.

1.7.4

  • Fix: settings fields no longer use a fixed 25% width that collapsed on phones and narrow browser windows. Text inputs and textareas now use the responsive WordPress core classes (regular-text/large-text) and the product/tag selectors fill the available column up to a sensible maximum, so the settings screen is usable on mobile.

1.7.3

  • On activation the withdrawal page is always (re)created cleanly: any earlier withdrawal pages (slugs angra-kop, angra-kop-N and woo_angerratt) are permanently deleted first, then a fresh „Ångra ett köp“ page with the [ngersefo_angerratt] shortcode is created.
  • New: optional partial returns. Enable it under WooCommerce Ångerrätt to let customers select individual products to withdraw via checkboxes in the confirmation step, with the order total recalculated for the selected items.
  • New: per-store setting for whether the shipping cost is refunded on a partial return (full returns always refund shipping).
  • New: the article number (product SKU, or the WooCommerce product ID as a fallback) is shown under each product name on the withdrawal page and in both the customer and admin emails.
  • New: the shipping method name is printed under the shipping line on the withdrawal page and in both emails.
  • The withdrawal request now records the return type and shipping handling for traceability.

1.7.2

  • OTP verification no longer relies on PHP sessions; it now uses a transient keyed by a one-time token, which is more reliable across caching and hosting setups.
  • Output escaping, input unslashing/sanitization and wp_parse_url() usage brought fully in line with the WordPress coding standards.

1.7.1

  • Public release prepared for the WordPress.org directory.
  • Removed the external license check and the bundled update mechanism (updates are handled by WordPress.org).
  • Internationalization, database and nonce handling reviewed against the WordPress coding standards.