<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: KodeXpo</title>
    <description>The latest articles on DEV Community by KodeXpo (@kodexpo).</description>
    <link>https://dev.to/kodexpo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3880583%2F219791e1-a4b3-443f-84e1-0c3b85f729c5.png</url>
      <title>DEV Community: KodeXpo</title>
      <link>https://dev.to/kodexpo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kodexpo"/>
    <language>en</language>
    <item>
      <title>EU Withdrawal Requests: A Magento 2 Module for Secure Compliance Flows</title>
      <dc:creator>KodeXpo</dc:creator>
      <pubDate>Tue, 14 Jul 2026 20:01:01 +0000</pubDate>
      <link>https://dev.to/kodexpo/eu-withdrawal-requests-a-magento-2-module-for-secure-compliance-flows-487j</link>
      <guid>https://dev.to/kodexpo/eu-withdrawal-requests-a-magento-2-module-for-secure-compliance-flows-487j</guid>
      <description>&lt;p&gt;Magento stores that sell to EU customers need a withdrawal flow that is secure, auditable, and clear for both customers and support teams.&lt;/p&gt;

&lt;p&gt;The module is built to support merchants implementing the consumer right of withdrawal under Directive 2011/83/EU (CELEX 32011L0083). The directive establishes the 14-day withdrawal period and allows withdrawal by an unequivocal statement, which is what this module operationalizes in Magento Open Source.&lt;/p&gt;

&lt;p&gt;The problem is that many stores handle this with a contact form, a loose email thread, or a custom one-off workflow that exposes order data and creates confusion later. That is not enough when you need ownership verification, request tracking, manual review, and store-specific timing rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Module Exists&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;EU withdrawal requests are easy to get wrong.&lt;/p&gt;

&lt;p&gt;A good implementation needs to balance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;customer experience&lt;/li&gt;
&lt;li&gt;guest verification&lt;/li&gt;
&lt;li&gt;request integrity&lt;/li&gt;
&lt;li&gt;admin review&lt;/li&gt;
&lt;li&gt;configurable compliance timing&lt;/li&gt;
&lt;li&gt;safe email handling&lt;/li&gt;
&lt;li&gt;abuse resistance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This module is designed to cover all of that without exposing order data publicly or relying on brittle manual steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What It Does&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;KodeXpo_ReturnCompliance&lt;/code&gt; adds a secure withdrawal flow for Magento 2 stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;customer account withdrawal requests&lt;/li&gt;
&lt;li&gt;guest withdrawal requests with secure verification links&lt;/li&gt;
&lt;li&gt;manual admin review with approve / reject handling&lt;/li&gt;
&lt;li&gt;configurable withdrawal window logic&lt;/li&gt;
&lt;li&gt;configurable anchor offsets for delivery timing&lt;/li&gt;
&lt;li&gt;resend throttling and confirmation attempt limits&lt;/li&gt;
&lt;li&gt;configurable email templates and sender identity&lt;/li&gt;
&lt;li&gt;optional guest reCAPTCHA support&lt;/li&gt;
&lt;li&gt;translated storefront and admin copy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How the Flow Works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Customer Flow&lt;/p&gt;

&lt;p&gt;A logged-in customer can open an order in My Account and submit a withdrawal request directly from the order view page.&lt;/p&gt;

&lt;p&gt;The module then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;checks whether the order is still eligible&lt;/li&gt;
&lt;li&gt;stores the request&lt;/li&gt;
&lt;li&gt;shows a confirmation screen&lt;/li&gt;
&lt;li&gt;sends the request into the admin review queue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Guest Flow&lt;/p&gt;

&lt;p&gt;Guest users must verify ownership before the request can proceed.&lt;/p&gt;

&lt;p&gt;The guest flow uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;order number&lt;/li&gt;
&lt;li&gt;email address on the order&lt;/li&gt;
&lt;li&gt;secure tokenized confirmation link&lt;/li&gt;
&lt;li&gt;throttled resend behavior&lt;/li&gt;
&lt;li&gt;max attempt protection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps the flow usable without exposing the order or verification details in the URL.&lt;/p&gt;

&lt;p&gt;Admin Flow&lt;/p&gt;

&lt;p&gt;The admin side gives support teams a clear request view:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request status&lt;/li&gt;
&lt;li&gt;order reference&lt;/li&gt;
&lt;li&gt;customer email&lt;/li&gt;
&lt;li&gt;review note&lt;/li&gt;
&lt;li&gt;reviewed by&lt;/li&gt;
&lt;li&gt;reviewed at&lt;/li&gt;
&lt;li&gt;approval / rejection decision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a request is reviewed, the module also appends an order comment so the decision is visible in the order history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Is Better Than a Simple Form&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A simple form is not enough for a real withdrawal workflow.&lt;/p&gt;

&lt;p&gt;This module gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request tracking instead of a one-off submission&lt;/li&gt;
&lt;li&gt;secure guest ownership verification&lt;/li&gt;
&lt;li&gt;timing rules you can tune per store&lt;/li&gt;
&lt;li&gt;manual review before a decision is finalized&lt;/li&gt;
&lt;li&gt;email templates that can be localized and branded&lt;/li&gt;
&lt;li&gt;throttling that reduces abuse&lt;/li&gt;
&lt;li&gt;admin visibility that does not depend on tribal knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: it makes the process explicit instead of silent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security and Abuse Protection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Security was a core requirement.&lt;/p&gt;

&lt;p&gt;The module avoids the common mistakes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no raw customer email or verification code exposed in the guest URL&lt;/li&gt;
&lt;li&gt;opaque verification tokens instead of predictable identifiers&lt;/li&gt;
&lt;li&gt;resend throttling&lt;/li&gt;
&lt;li&gt;limited confirmation attempts&lt;/li&gt;
&lt;li&gt;configurable guest verification retention&lt;/li&gt;
&lt;li&gt;form key protection where applicable&lt;/li&gt;
&lt;li&gt;optional reCAPTCHA for guest entry points&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not only to make the flow work, but to make it hard to abuse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The module is configurable from:&lt;/p&gt;

&lt;p&gt;Stores &amp;gt; Configuration &amp;gt; KodeXpo &amp;gt; EU Return Compliance&lt;/p&gt;

&lt;p&gt;Typical settings include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enable / disable module&lt;/li&gt;
&lt;li&gt;withdrawal window&lt;/li&gt;
&lt;li&gt;anchor order priority&lt;/li&gt;
&lt;li&gt;AWB, shipment, invoice, and order offsets&lt;/li&gt;
&lt;li&gt;guest verification TTL&lt;/li&gt;
&lt;li&gt;resend delay&lt;/li&gt;
&lt;li&gt;max attempts&lt;/li&gt;
&lt;li&gt;email template selection&lt;/li&gt;
&lt;li&gt;from identity&lt;/li&gt;
&lt;li&gt;reCAPTCHA support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The module also uses Magento’s own email and configuration conventions, so it fits into a normal store setup instead of introducing a parallel system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compatibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The module is designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Magento Open Source 2.4.6 through 2.4.9&lt;/li&gt;
&lt;li&gt;Adobe Commerce 2.4.6 through 2.4.9&lt;/li&gt;
&lt;li&gt;PHP 8.1 through 8.5&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Localization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The module includes translations for a wide set of locales, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;en_US&lt;/li&gt;
&lt;li&gt;ro_RO&lt;/li&gt;
&lt;li&gt;de_DE&lt;/li&gt;
&lt;li&gt;fr_FR&lt;/li&gt;
&lt;li&gt;es_ES&lt;/li&gt;
&lt;li&gt;it_IT&lt;/li&gt;
&lt;li&gt;pt_PT&lt;/li&gt;
&lt;li&gt;nl_NL&lt;/li&gt;
&lt;li&gt;pl_PL&lt;/li&gt;
&lt;li&gt;cs_CZ&lt;/li&gt;
&lt;li&gt;da_DK&lt;/li&gt;
&lt;li&gt;sv_SE&lt;/li&gt;
&lt;li&gt;fi_FI&lt;/li&gt;
&lt;li&gt;nb_NO&lt;/li&gt;
&lt;li&gt;el_GR&lt;/li&gt;
&lt;li&gt;hu_HU&lt;/li&gt;
&lt;li&gt;sk_SK&lt;/li&gt;
&lt;li&gt;sl_SI&lt;/li&gt;
&lt;li&gt;hr_HR&lt;/li&gt;
&lt;li&gt;bg_BG&lt;/li&gt;
&lt;li&gt;lt_LT&lt;/li&gt;
&lt;li&gt;lv_LV&lt;/li&gt;
&lt;li&gt;et_EE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Composer&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;composer require kodexpo/module-return-compliance&lt;br&gt;
  bin/magento module:enable KodeXpo_ReturnCompliance&lt;br&gt;
  bin/magento setup:upgrade&lt;br&gt;
  bin/magento cache:clean&lt;/p&gt;

&lt;p&gt;If needed:&lt;/p&gt;

&lt;p&gt;bin/magento setup:di:compile&lt;br&gt;
  bin/magento setup:static-content:deploy en_US -f&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Manual&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Copy the module to:&lt;/p&gt;

&lt;p&gt;app/code/KodeXpo/ReturnCompliance&lt;/p&gt;

&lt;p&gt;Then run:&lt;/p&gt;

&lt;p&gt;bin/magento module:enable KodeXpo_ReturnCompliance&lt;br&gt;
  bin/magento setup:upgrade&lt;br&gt;
  bin/magento cache:clean&lt;/p&gt;

&lt;p&gt;Limitations&lt;/p&gt;

&lt;p&gt;This module is intentionally focused on the withdrawal workflow.&lt;/p&gt;

&lt;p&gt;It does not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;auto-approve requests&lt;/li&gt;
&lt;li&gt;automatically correct order state&lt;/li&gt;
&lt;li&gt;replace legal review&lt;/li&gt;
&lt;li&gt;bypass store-specific eligibility rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is meant to make the compliance flow secure and operational, not to remove the need for review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Closing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your store needs a withdrawal flow that is secure, configurable, and visible to admins, this module gives you a practical base to build on.&lt;/p&gt;

&lt;p&gt;The important part is not just supporting EU withdrawal requests. It is doing it in a way that is safe, auditable, and maintainable inside Magento.&lt;/p&gt;

</description>
      <category>magento</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>php</category>
    </item>
    <item>
      <title>Magento 2 Scope Overrides Are Silent: A Module to Surface Them in Admin</title>
      <dc:creator>KodeXpo</dc:creator>
      <pubDate>Wed, 15 Apr 2026 16:56:04 +0000</pubDate>
      <link>https://dev.to/kodexpo/magento-2-scope-overrides-are-silent-a-module-to-surface-them-in-admin-4bkn</link>
      <guid>https://dev.to/kodexpo/magento-2-scope-overrides-are-silent-a-module-to-surface-them-in-admin-4bkn</guid>
      <description>&lt;p&gt;Magento / Adobe Commerce scope inheritance is powerful, but in day-to-day admin workflows, lower-scope overrides are easy to miss.&lt;/p&gt;

&lt;p&gt;Teams often save values on All Store Views (catalog) or Default Config (system configuration), while effective behavior still comes from website/store-view scope. The result is unnecessary debugging and inconsistent admin outcomes.&lt;/p&gt;

&lt;p&gt;To solve this, we built KodeXpo_ScopeOverrideInspector.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the module does
&lt;/h2&gt;

&lt;p&gt;The module adds override visibility directly in admin on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product edit pages&lt;/li&gt;
&lt;li&gt;Category edit pages&lt;/li&gt;
&lt;li&gt;Stores &amp;gt; Configuration section pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;where lower-scope overrides exist&lt;/li&gt;
&lt;li&gt;which values differ from parent scope&lt;/li&gt;
&lt;li&gt;which lower scope currently takes priority&lt;/li&gt;
&lt;li&gt;direct links to open the overriding scope&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For product/category store-view pages, it also adds helper actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check All “Use Default Value”&lt;/li&gt;
&lt;li&gt;Check All “Use Default Value” And Save&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;In multi-store implementations, scope behavior is one of the most common sources of admin confusion.&lt;/p&gt;

&lt;p&gt;This is especially visible in projects with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple websites/stores/store views&lt;/li&gt;
&lt;li&gt;localized catalogs&lt;/li&gt;
&lt;li&gt;parallel merchandising + configuration changes by different roles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to replace Magento’s scope model.&lt;br&gt;
The goal is to make scope precedence explicit at the point of editing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key capabilities
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Product and category store-view override notices&lt;/li&gt;
&lt;li&gt;Configuration override notices for default/website/store scopes&lt;/li&gt;
&lt;li&gt;Masking of sensitive config values in comparisons ([HIDDEN])&lt;/li&gt;
&lt;li&gt;Human-readable field labels (where available)&lt;/li&gt;
&lt;li&gt;Configurable notice layout: Sidebar (default) or Inline&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;composer require kodexpo/module-scope-override-inspector&lt;br&gt;
  bin/magento module:enable KodeXpo_ScopeOverrideInspector&lt;br&gt;
  bin/magento setup:upgrade&lt;br&gt;
  bin/magento cache:clean&lt;/p&gt;

&lt;h2&gt;
  
  
  Repository
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/kodexpo/scope-override-inspector" rel="noopener noreferrer"&gt;https://github.com/kodexpo/scope-override-inspector&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, issue reports, and implementation edge cases are welcome.&lt;/p&gt;

&lt;p&gt;———&lt;/p&gt;

&lt;p&gt;KodeXpo builds Magento / Adobe Commerce modules and backend tooling focused on operational clarity and admin productivity.&lt;br&gt;
Contact: &lt;a href="mailto:dev@kodexpo.com"&gt;dev@kodexpo.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>adobe</category>
      <category>commerce</category>
      <category>module</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
