Magento Open Source 2.4.0 Release Notes

Magento Open Source 2.4.0 introduces support for PHP 7.4, Elasticsearch 7.6.x, and MySQL 8.0. Substantial security changes include the enablement of two-factor authentication in the Admin by default.

With this release, the Authorize.Net method integration has been removed from core code. Merchants should migrate to the official extension that is available on the Magento Marketplace.

Braintree payment integration: Prior to Magento 2.4.0, it was recommended that merchants install and configure the official Braintree payment integration extension from the Magento Marketplace to replace the core integration. With this release (Magento 2.4.0), the extension is now included in the Magento release. Merchants must follow additional steps to ensure that Braintree works properly in a Magento 2.4.0 deployment. See Braintree for more information on how to migrate to Magento 2.4.0.

This release includes all the improvements to core quality that were included in Magento 2.3.5-p1, over 100 new fixes to core code, and 30 security enhancements. It includes the resolution of 226 GitHub issues by our community members. These community contributions range from minor clean-up of core code to significant enhancements in Inventory Management and GraphQL.

Minor releases bring substantial code enhancements. Before upgrading to Magento 2.4.0, confirm that your environment meets the minimal technical stack requirements.

Quarterly releases may contain backward-incompatible changes (BIC). Magento 2.4.0 contains minor backward-incompatible changes. To review minor backward-incompatible changes, see BIC reference. (Major backward-incompatible issues are described in BIC highlights. Not all releases introduce major BICs.)

The package names of security-only releases are typically appended with -p1. However, we could not avoid deviating from these naming conventions with Magento 2.3.5, which in turn has had a temporary ripple effect on the subsequent security package names. Specifically, the full-feature Magento 2.3.5 release is Magento 2.3.5-p1. The security-only release that we will release when Magento 2.4.0 GAs will be Magento 2.3.5-p2. We hope to return to the usual naming conventions in future releases.

Security-only patch available

Merchants can now install time-sensitive security fixes without applying the hundreds of functional fixes and enhancements that a full quarterly release (for example, Magento 2.3.5-p2) provides. Patch 2.3.5.2 (Composer package 2.3.5-p2) is a security-only patch that provides fixes for vulnerabilities that have been identified in our previous quarterly release, Magento 2.3.5-p1. All hot fixes that were applied to the 2.3.5 release are included in this security-only patch. (A hot fix provides a fix to a released version of Magento that addresses a specific problem or bug.)

For general information about security-only patches, see the Magento DevBlog post Introducing the New Security-only Patch Release. For instructions on downloading and applying security-only patches (including patch 2.3.5-p2), see Install Magento using Composer. Security-only patches include security bug fixes only, not the additional security enhancements that are included in the full patch.

Other release information

Although code for these features is bundled with quarterly releases of the Magento core code, several of these projects (for example, Inventory Management and Progressive Web Applications (PWA) Studio) are also released independently. Bug fixes for these projects are documented in the separate, project-specific release information that is available in the documentation for each project.

Highlights

Look for the following highlights in this release:

Substantial security enhancements

This release includes over 30 security fixes and platform security improvements.

Over 30 security enhancements that help close remote code execution (RCE) and cross-site scripting (XSS) vulnerabilities

No confirmed attacks related to these issues have occurred to date. However, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. Most of these issues require that an attacker first obtains access to the Admin. As a result, we remind you to take all necessary steps to protect your Admin, including but not limited to these efforts: IP allowlisting, two-factor authentication, use of a VPN, the use of a unique location rather than /admin, and good password hygiene. See Security Updates Available for Magento for a discussion of these fixed issues. for a discussion of these fixed issues.

Additional security enhancements

  • Implementation of 2FA for Admin accounts, Magento.com user accounts, and Cloud SSH access

    • Securing your Magento Admin account. Two-factor authentication (2FA) is now required for the Magento Admin. Admin users must first configure their 2FA before logging into the Admin through either the UI or a web API. 2FA is enabled by default. We strongly recommend against disabling the 2FA module. This extra step of authentication makes it harder for malicious users to log in to the Admin without authorization. See Two-factor Authentication (2FA).

    • Securing your Magento account. Two-factor Authentication (2FA) provides an added, optional layer of security to better protect your Magento.com account from unauthorized users who might want to use your account in ways you do not want. See Securing Your Account.

  • Securing Cloud SSH access. Magento Commerce Cloud provides multi-factor authentication (MFA) enforcement to manage authentication requirements for SSH access to Cloud environments. Multi-factor authentication for 2FA is not enabled by default on a project. Magento highly recommends enabling this feature. Contact Support for assistance. See Enable multi-factor authentication for SSH access.

  • Template filter strict mode is now enabled by default. Magento components (including CMS pages and blocks) that use the template filter in legacy mode can be vulnerable to remote code execution (RCE). Enabling strict mode by default ensures that RCE attacks cannot be deliberately enabled. 

  • Data rendering for UI data providers is now disabled by default. This removes an opportunity for malicious users to execute arbitrary JavaScript.

  • New \Magento\Framework\Escaper class. This class is provided for .phtml templates and the PHP classes that are responsible for generating HTML. This class contains HTML sanitization methods relevant to multiple contexts. The $escaper local variable is available inside .phtml templates and should be used instead of the deprecated $block->escape{method}. Use $escaper rather than $block as the use of $block->escape{method} has been deprecated.

  • Support for new security.txt file. This file is an industry-standard file on the server that helps security researchers report potential security issues to site administrators.

Starting with the release of Magento Commerce 2.3.2, Magento will assign and publish indexed Common Vulnerabilities and Exposures (CVE) numbers with each security bug reported to us by external parties. This allows users of Magento Commerce to more easily identify unaddressed vulnerabilities in their deployment. You can learn more about CVE identifiers at CVE.

Platform upgrades

The following platform upgrades help enhance website security and performance. Supported versions of PHP and PHPUnit, Elasticsearch, MySQL, and other dependencies are listed in Magento 2.4 technology stack requirements.

  • PHP 7.4 support introduced and PHP 7.1 and 7.2 deprecated. Magento 2.4.0 introduces support for PHP 7.4.

  • Support for PHPUnit 9.x and deprecation of PHPUnit 6.5. PHP 7.4 requires the use of the latest PHPUnit testing framework, which is PHPUnit 9.x. Magento Marketplace extension vendors must confirm that all new extension versions are compatible with PHP 7.4 and that all unit and integration tests have been configured to be run with PHPUnit 9.

  • Elasticsearch 7.6.x support. Elasticsearch 7.6.x is now the default catalog search engine for Magento Commerce and Open Source. You cannot install or upgrade to Magento 2.4.0 without also installing Elasticsearch 7.6.x. Elasticsearch version 2.x code has been removed. Elasticsearch versions 5.x and 6.x have been deprecated and are no longer supported. See Elasticsearch.

  • MySQL 8.0 support. Magento 2.4.x supports MySQL 8.x. (Magento 2.4.0 was tested with MySQL 8.0.20.) Merchants are encouraged to migrate their deployments to MySQL 8.x to take advantage of its improved performance, security, and reliability. Although MySQL 5.7 is still supported for Magento 2.4.x, MySQL 5.6 is no longer supported. You cannot host Magento 2.4.x with a MySQL 5.6 database. See MySQL.

  • Removal of the MySQL catalog search engine. The MySQL search engine has been removed from Magento 2.4.0 and replaced as the default search engine with Elasticsearch. Elasticsearch provides superior search capabilities as well as catalog performance optimizations. All merchants must have Elasticsearch to install and deploy Magento 2.4.0. See Check the catalog search engine.

  • MariaDB 10.4 support. Support for MySQL 8.0 provides the opportunity for merchants to deploy MariaDB 10.4 with Magento. Although merchants can still use MariaDB 10.2 with Magento 2.4.0, we recommend upgrading to MariaDB 10.4 for improved performance and reliability. MariaDB 10.0 and 10.1 are no longer supported (as a result of removing support for MySQL 5.6 in this release).

  • Migration of dependencies on Zend Framework to the Laminas project to reflect the transitioning of Zend Framework to the Linux Foundation’s Laminas Project. Zend Framework has been deprecated. See the Migration of Zend Framework to the Laminas Project DevBlog post.

  • Decomposition of Magento Controllers allows extension developers to implement ActionInterface directly without “layer supertype” classes. See the Decomposition of Magento Controllers DevBlog post. Enhancement started by Vinai Kopp in pull request 16268 and finalized by Lukasz Bajsarowicz in pull request 26778. GitHub-9582

  • Removal of the core integration of the Signifyd fraud protection code. This core feature is no longer supported. Merchants should migrate to the Signifyd Fraud & Chargeback Protection extension that is available on the Magento Marketplace.

  • The core Braintree module has been removed from the code base. The Braintree Payments module now provides the same feature set. See Braintree Payments.

  • The Internet Explorer 11.x browser is no longer supported.

Infrastructure improvements

This release contains enhancements to core quality, which improve the quality of the Framework and these modules: Customer Account, Catalog, CMS, Import, Cart and Checkout, and B2B.

  • Removal of core integration of third-party payment methods. With this release, the Authorize.Net payment method integration has been removed from core code. Merchants should migrate to the official extension that is available on the Magento Marketplace. See the Deprecation of Magento core payment integrations devblog post.

  • Support for partial-word search for Elasticsearch (new default search engine). Elasticsearch now supports the use of partial words in search terms for product names and SKUs when using quick search. This capability was supported by the MySQL search engine, which has been deprecated and replaced by Elasticsearch in this release.

  • PayPal JavaScript SDK upgrade. We’ve migrated the PayPal Express Checkout integration to the latest PayPal JavaScript SDK, an SDK that automatically collects and passes needed risk parameters to PayPal. The behavior of the PayPal Express Checkout payment method remains unchanged. However, upgrading this SDK to the latest version let merchants access the latest features and security enhancements.

  • Deprecation and removal of the Web Set Up Wizard. You must use the command line to install or upgrade Magento 2.4.0. See Install Magento.

  • Composer update plugin. Composer plugin streamlines the upgrade process by resolving changes that must be made to the root project composer.json file before updating to a new Magento product requirement. This plug-in protects against overwriting customizations. See Upgrade using the Magento composer root plugin.

  • Seller-assisted shopping. This feature allows merchants to view the storefront on behalf of their customers. Customers opt to allow storefront access to their accounts. This community-developed feature includes an original extension developed by MAGEFAN. See Seller Assisted Shopping. Features include:

    • ACL to control which administrators can log in to customer accounts can be configured on a per-website basis
    • Compatibility with multiple websites and customer account scopes
    • Orders placed on behalf of customers are logged in the storefront and Admin
    • All sessions are destroyed following administrator logout, and administrators cannot access customer passwords.

Performance improvements

  • Improvements to customer data section invalidation logic. This release introduces a new way of invalidating all customer sections data that avoids a known issue with local storage when custom sections.xml invalidations are active. (Previously, private content (local storage) was not correctly populated when you had a custom etc/frontend/sections.xml with action invalidations.) See Private content.

  • Multiple optimizations to Redis performance. The enhancements minimize the number of queries to Redis that are performed on each Magento request. These optimizations include:

    • Decrease in the size of network data transfers between Redis and Magento

    • Reduction in Redis’ consumption of CPU cycles by improving the adapter’s ability to automatically determine what needs to be loaded

    • Reduction in race conditions on Redis write operations

    See Use Redis for the Magento page and default cache and Configure caching.

  • Improved caching of results of SQL queries to inventory tables. These enhancements include:

    • Caching of SQL queries to the inventory_stock_sales_channel table (1 query instead of 16)

    • Caching of result of queries to the inventory_stock table (1 query instead of 16)

  • Improvement of up to 25-30% to Quick Order add-to-cart performance.

  • Merchants can now use lazy loading to load images. See Configure theme properties.

Adobe Stock Integration v2.0

Ability to license stock image previews from the Media Gallery. Merchants can now find any Adobe Stock preview image in the Media Gallery, which reduces the number of steps required to license stock preview image.

This replacement for the former Media Gallery offers a new, searchable interface for Magento media assets. Administrators can now search, filter, and sort images up to 30x faster than they could in the earlier version of this feature. Merchants can use this tool to evaluate storefront image usage. Extension developers should be aware that extensions that were developed for the Media Gallery will not work as expected with the new Media Gallery.

Inventory Management

Inventory Management enhancements for this release include support for in-store pickup and bundle product support. See Inventory Management release notes for a more detailed discussion of recent Inventory Management bug fixes.

GraphQL

GraphQL enhancements include:

  • pickupLocations query supports the Inventory In-store pickup feature
  • categories query returns a list of categories that match a specified filter. This query differs from the categoryList query in that it supports pagination.
  • reorderItems mutation allows a logged-in user to add all the products from a previous order into their cart.

See the GraphQL Developer Guide for details on this and other enhancements. See Release notes for a detailed discussion of recent GraphQL bug fixes.

PWA Studio

See Magento compatibility for a list of PWA Studio versions and their compatible Magento core versions. For information about enhancements and bug fixes, see PWA Studio releases.

Magento Functional Testing Framework (MFTF)

MFTF v3.0.0 includes these new features and includes support for PHP 7.4 and PHPUnit 9:

  • MFTF helpers, which can create custom actions outside of the test framework
  • schema updates for test entities
  • sub-folders in test modules
  • nested assertion syntax
  • static check that checks and reports references to deprecated test entities

This release also removes deprecated actions and upgrades scripts that were added to upgrade tests to MFTF major version requirements.

Vendor-developed extension enhancements

This release of Magento includes extensions developed by third-party vendors. It introduces both quality and UX improvements to these extensions and an expansion of MFTF coverage.

Magento Marketplace extension vendors should confirm that their extensions are compatible with PHP 7.4 when publishing a new version of their extension for Magento 2.4.0.

Amazon Pay

This release includes:

  • Updates to CSP allowlists
  • Ability to do multiple authorizations for a multi-item order
  • Support for Japanese addresses

Braintree Payments

This extension replaces our core Braintree integration. It provides the same features as the Braintree core integration. See Braintree Payments.

Klarna

This release includes new on-site messaging options to help shoppers understand the available credit and financing options. It also includes improvements to:

  • refunds
  • API efficiency
  • cookies and unit tests
  • discounts
  • configuration settings now contain On-Site Messaging section for the control of the storefront display of Klarna promotional messaging. See Setting Up Klarna.

Vertex

This release of Vertex includes the following new feature and enhancements:

  • Improvements to the Admin configuration user experience
  • Replacement of installation and upgrade scripts with XML schema files and patches
  • Removal of deprecated code (ApiClient and ClientInterface)

Yotpo

Yotpo Ratings and Reviews are integrated with Page Builder.

Fixed issues

We have fixed hundreds of issues in the Magento 2.4.0 core code.

Installation, upgrade, deployment

  • You can now successfully remove a website along with the website’s scope-specific configuration settings in app/etc/config.php as expected. Previously, when you tried to remove the website, the operation failed, and Magento displayed this error: The website with code xxx that was requested wasn't found. Verify the website and try again. Additionally, Magento displayed this error on the storefront: Config files have changed. Run app:config:import or setup:upgrade command to synchronize configuration. GitHub-24061
  • Configuration settings that are disabled in index.php are no longer editable from the Admin.
  • Magento installation now completes successfully, and stores are created as expected, when store configuration is pre-defined in config.php.
  • \Magento\Store\App\Config\Source\RuntimeConfigSource::getEntities has been refactored to decrease the number of SHOW TABLE STATUS queries it makes. (This change reverts to the behavior this function displayed in Magento 2.3.3.)
  • Data scripts are no longer re-run whenever you attempt to upgrade the database by running bin/magento setup:upgrade. Previously, upgrade scripts were re-run unnecessarily, which affected performance. GitHub-19469
  • Magento now displays the following behaviors when your connection to Redis is interrupted. Previously, Magento did not reload the current page and displayed this error: An error has happened during application run. See exception log for details.

    • Admin and storefront sessions expire
    • Admin and storefront users must log in again
    • Session data is saved to var/session/
    • No error or exceptions are logged.
  • The bin/magento setup:di:compile command no longer fails with anonymous classes. Fix submitted by Yevhen Sentiabov in pull request 26533. GitHub-26532, GitHub-21555
  • Problems with LESS compilation in Magento’s Luma theme when using an alternative LESS compiler than the one that ships with Magento by default have been resolved. Fix submitted by Pieter Hoste in pull request 24003. GitHub-23619
  • You no longer need to have a writeable env.php file when switching to maintenance mode. Instead, Magento sets the no-cache headers for all frontend requests in maintenance mode (Cache-Control). Previously, you could not enable maintenance mode when env.php was read-only, and Magento tried to disable the FPC when switching into maintenance mode. Fix submitted by Marco K̦pcke in pull request 25790. GitHub-24229
  • db-ssl-verify no longer results in an undefined index error during a ddev setup. Fix submitted by Daniel Ruf in pull request 26763. GitHub-26762
  • Composer dependencies have been updated to implement Redis key expiry, which has improved Redis performance. Fix submitted by toxix in pull request 25488. GitHub-25487

Adobe Stock Integration

  • CSS styles have been added to the Adobe Stock image display to support highlighting the selected image. Fix submitted by Serhiy Zhovnir in pull request 25864. GitHub-761
  • Navigation through Adobe Stock preview images is no longer triggered by moving the input field cursor using arrow keys. Fix submitted by Adarsh Manickam in pull request 27138. GitHub-973
  • Magento now caches messages for errors that occur when a customer tries to apply a filter to Adobe Stock images. Fix submitted by Shankar Konar in pull request 26502. GitHub-863
  • Magento no longer saves a preview of an Adobe Stock image when you move the cursor to the window’s left vertical scroll bar after clicking Save Preview but not confirming the save operation. Fix submitted by Serhiy Zhovnir in pull request 27399. GitHub-1002

Backend

  • Email templates (Admin > Marketing > Communications > Email Templates) can now be previewed from the Admin when JavaScript minification is enabled. Previously, when you tried to preview an email template, the Email Preview popup window was empty. GitHub-25068
  • Administrators can now log into the Admin as expected after an administrator account with limited privileges has been created. Previously, the Admin was not accessible. Instead, users with these permissions were redirected to the storefront with a 404 error. Fix submitted by Eden Duong in pull request 25909. GitHub-25881
  • Magento no longer duplicates SEO data such as URL key, meta title, meta keywords, and meta description when you duplicate a product. Fix submitted by Dasharth patel in pull request 26659. GitHub-26054
  • Magento no longer throws an error when you delete an image from a page while creating it from Admin > Content > Pages >  Add New Page. Previously, Magento threw this error in the developer console: 500 (Internal Server Error). Fix submitted by Eden Duong in pull request 25924. GitHub-25893

Bundle products

  • The performance of the catalog_product_price re-index operation for bundle products has been improved.
  • Administrators can no longer manually enter a tax class in the Admin for a bundle product when the bundle product’s Tax Class and Dynamic Price settings are disabled for the default store view. Previously, when an administrator unchecked the Use Default Value option next to Tax Class, Magento enabled the option, permitting an administrator to enter another value and save the product.
  • Bundle product prices are now calculated correctly on product pages.
  • You can now add any number of bundle products to your shopping cart without error. Previously, when you added a bundle product to your cart, then navigated to the cart, Magento displayed this error: Please correct the quantity for some products.

Cache

  • The cache.xsd schema from Magento\Framework\Cache has been refactored so that a cache type without an instance attribute no longer cause exceptions when you disable a module through the Admin cache management. Previously, when you created a cache type using cache.xml without the instance argument, Magento threw an exception when you tried to disable it. Fix submitted by Andrii Beziazychnyi in pull request 27307. GitHub-26224
  • health_check.php no longer fails if a database cache engine is configured in your Magento deployment. Fix submitted by Andrii Beziazychnyi in pull request 25722. GitHub-25669

Cart and checkout

  • Magento no longer throws an error during checkout when the Synchronize with Backend configuration setting is enabled. GitHub-23833
  • Radio buttons for shipping methods are now enabled as expected in the checkout workflow.
  • The order review page in the checkout workflow now loads successfully for an order being shipped to multiple addresses when Terms and conditions with the Applied Manually setting is enabled. Previously, the Review page did not pass validation, and Magento displayed a 404 error.
  • Magento now displays the spinning icon while prices are updated on the cart.
  • Magento now displays an informative message when a product in the mini cart becomes out-of-stock before checkout. Once you’ve removed the out-of-stock item, Magento displays the Proceed to Checkout button. Previously, Magento did not display this button.
  • Magento now displays an informative error message when you try to add a product by clicking Order by SKU when the file for upload is corrupt. Previously, Magento displayed a blank page.
  • Magento now applies cart price rules to only the bundle product child products that match the rule criteria. Previously, Magento applied the cart price rule to all child products that belonged to the bundle product.
  • StorefrontMiniCartSection has been replaced byStorefrontMinicartSection in MFTF tests. Fix submitted by Andrii Kalinich in pull request 27955. GitHub-27897
  • Hardcoded references to the country selector component on the shipping address form have been removed. Fix submitted by Mateusz Krzeszowiak in pull request 25541. GitHub-22416
  • Magento no longer underlines the Delete icon in the shopping cart when the cursor hovers over the icon when viewing the storefront in Internet Explorer. Fix submitted by divyajyothi5321 in pull request 26173. GitHub-26164
  • Changing the billing street no longer changes a customer’s shipping address when a single address has been selected for both billing and shipping address. Fix submitted by Yurii Tvardyi in pull request 26279. GitHub-26276
  • The promotion region of the mini cart is now rendered as expected. Fix submitted by Matti Vapa in pull request 25375. GitHub-25373

Cart price rule

  • Cart price rules that are based on payment methods are now applied during the checkout workflow. GitHub-24206
  • Corrected the behavior of the Datepicker page element on Admin > Marketing > Promotions > Catalog Price Rule. Fix submitted by Hitesh in pull request 26290. GitHub-26289
  • StorefrontMiniCartSection has been replaced by StorefrontMinicartSection in MFTF tests. Fix submitted by Andrii Kalinich in pull request 27955. GitHub-27897
  • The unused coupon grid in the create new cart price rule workflow has been disabled. Fix submitted by Eden Duong in pull request 24471. GitHub-24468
  • Changing the billing street no longer changes a customer’s shipping address when a single address has been selected for both the billing and shipping addresses. Fix submitted by Yurii Tvardyi in pull request 26279. GitHub-26276

Catalog

  • Magento no longer throws an error when you change the name of a tiered product that is included in a scheduled update. Previously, when you tried to save the product with a new name, Magento displayed this error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3-0-0-2.0000-0' for key 'UNQ_EBC6A54F44DFA66FA9024CAD97FED6C7', query was: INSERT INTO catalog_product_entity_tier_price (all_groups, customer_group_id, qty, value, website_id, percentage_value, row_id) VALUES (?, ?, ?, ?, ?, ?, ?)
  • Custom attribute values can now be saved as expected from the Admin.
  • The Recently View Products feature now shows products that are associated only with the current store view in multi-store deployments when Stores > Configurations > Catalog > Recently Viewed/Compared Products > Show for Current is set to store view. Previously, Magento displayed recently viewed products from all websites, no matter which website the product was assigned to.
  • Magento now displays product images in the mini cart without distortion. Previously, Magento stretched the image in the mini cart to fill the entire width and height of the image container.
  • The getBasePrice function now returns a float value as expected rather than a string.
  • The product compare feature now works as expected. It now displays only products in the current user’s compare list.
  • You can now assign a default watermark to a theme. Previously, after assigning the watermark, Magento threw a fatal error.
  • You can now successfully edit a configurable product with many variants (approximately 5,000) from the Admin. Previously, when you tried to edit a configurable product with many subproducts, Magento displayed this error: Warning: DOMDocumentFragment::appendXML(): Entity: line 1: parser error : CData section too big found in /vendor/magento/framework/View/TemplateEngine/Xhtml/Template.php on line 60
  • Sorting on attribute sets on Admin > Catalog > Products is now based on alphabetical order as expected.
  • The Recently Viewed Products feature now works as expected in multi-store deployments.
  • The Product in Websites checkbox of the new product page is now enabled by default for restricted administrators in multi-site deployments. Previously, the checkbox for the non-default website was not preselected, and if the administrator left the checkbox unselected, Magento displayed an error message.
  • addToCart events are now tracked as expected in the data layer. Previously, after changing the configurable options for a product, then clicking Add to cart, the new addToCart event was not added to the data layer.
  • The mini cart and Admin shopping cart (Admin > Customers > Manage Shopping Cart) now display correct product prices when a Catalog Price Rule is applied. Previously, the storefront shopping cart displayed the correct product price, but the mini cart and Admin shopping cart displayed the original product price.
  • Filtering on the Admin product grid website column now works as expected. Previously, filter results did not display the correct number of products, but consistently displayed the total number of products as 1.
  • Price condition uses catalog_product_entity_decimal to filter by price. However, this table contains no records for configurable, bundle dynamic, and grouped products because these products have no fixed price. The correct table to use for filtering by price is catalog_product_index_price.
  • The Admin catalog and product lists now display currency symbols in the MSRP, Cost, and Special Price columns. Fix submitted by Sergiy Vasiutynskyi in pull request 27261. GitHub-21910, GitHub-20906, GitHub-20472
  • The Add for Customer Group Price pop-up window (Admin > Catalog > Products > New Product > Advanced pricing) now closes as expected when you click the close icon. Fix submitted by Ashna-Jahan in pull request 25759. GitHub-25433
  • The sample description that is provided for a newly product’s description and title no longer contains double quotation marks. Fix submitted by Nathan Morgan in pull request 25655. GitHub-25654
  • Magento no longer throws an error when you try to filter products on the Category page using an invalid price. Previously, Magento logged this error in the system log. Fix submitted by Ihor Sviziev in pull request 25912. GitHub-25911
  • You can now navigate through multi-page category search results. Previously, Magento created duplicate pages of search results when you tried to use the Back button to return to the first page of results. Fix submitted by Douglas Radburn in pull request 25337. GitHub-14971
  • Corrected the return type to string|null for the getSourceModel method in the Eav\Attribute.php class. Fix submitted by Mychailo in pull request 25333. GitHub-25278
  • Saving a new (duplicated) product no longer results in the duplication of the product’s images hundreds of times. Fix submitted by Jeroen in pull request 25875. GitHub-9466
  • Magento no longer throws a JavaScript error when you delete a product with a custom option of type file during creation of an order from the Admin. Fix submitted by adrian-martinez-interactiv4 in pull request 24843. GitHub-24842
  • Creating a product with no image by using product_page_image_large in your layout results in a placeholder image being displayed as expected. Previously, Magento threw this error: Fatal error: PHP Fatal error: Uncaught TypeError: Argument 1 passed to Magento\Catalog\Block\Product\ImageFactory::getRatio() must be of the type integer, null given. Fix submitted by Lukasz Bajsarowicz in pull request 26974. GitHub-26973
  • You can use the POST /V1/:sku/links endpoint to set product links with an empty array of products when the product has existing links. Previously, Magento threw an error. Fix submitted by Sathish Subramanian in pull request 26979. GitHub-26800
  • You can now use the Actions dropdown menu from the Products grid to specify whether a product has weight when you update multiple products’s attributes from the Admin. Fix submitted by Bartomiej Szubert in pull request 26075. GitHub-6310
  • Validation logic has been added to the Products per Page on Grid Allowed Values and Products per Page on Grid Default Value fields of the store configuration page. Previously, store administrators could enter unavailable values in these fields. Fix submitted by Lukasz Bajsarowicz in pull request 27093. GitHub-27089_

Catalog widget

  • The CatalogWidget products list now works as expected with anchor categories, and products from anchor categories are now matched and displayed. Previously, when you selected a parent category that was an anchor, but that did not contain assigned products, products were not visible in the widget.
  • Magento now displays all children of a selected parent category as expected. Previously, if you selected a parent category that was an anchor, but that did not contain assigned products, Magento did not display all nested products.
  • The Recently Viewed Products widget now works correctly when Stores > Configuration > Catalog > Catalog > Recently Viewed/Compared > Synchronize widget products with backend storage is set to Yes.

Cleanup

  • Removed an extra closing tag from module XML. Fix submitted by Tejash Kumbhare in pull request 26339. GitHub-26338
  • Corrected misalignment of the My billing and shipping address are the same checkbox on the Review and Payments page section of the checkout workflow. Fix submitted by divyajyothi5321 in pull request 26169. GitHub-26168
  • Removed unnecessary white space between the field labels and asterisks on the Shipping Address section of the checkout workflow. Fix submitted by Daniel Ruf in pull request 26285. GitHub-26275
  • Corrected misalignment of the radio buttons on the Shipping methods section of the checkout workflow. Fix submitted by Hitesh in pull request 25966. GitHub-25962
  • Corrected inconsistent menu spacing in mobile view. Fix submitted by Hitesh in pull request 26238. GitHub-26235
  • Corrected misalignment of the mini cart Edit and Remove icons in mobile view. Fix submitted by Vasilii Burlacu in pull request 27493. GitHub-26652
  • Corrected misalignment of the tax rate zip/post code range and checkbox on the Add New Tax Rate/Zip Code page (Admin > Store > Taxes > Tax Zones and Rates). Fix submitted by Sathish Subramanian in pull request 26932. GitHub-26917
  • The link from the Setup Wizard to the Admin now works as expected. Fix submitted by Oleh Usik in pull request 26100. GitHub-24990
  • Sorting has been disabled on the status column of the Cache Management grid in the Admin. Fix submitted by Sathish Subramanian in pull request 26215. GitHub-26208
  • Corrected misalignment of page elements on the Admin > Stores > Attributes > Ratings > Add new ratings dialog. Fix submitted by Sathish Subramanian in pull request 27014. GitHub-26992
  • Corrected misalignment of the calendar icon on the Add Design Change page. Fix submitted by Eduard Chitoraga in pull request 26063. GitHub-20379
  • Removed unnecessary space in submenu display on the home page hover menu. Fix submitted by Hitesh in pull request 25973. GitHub-25972
  • Corrected misalignment of the price labels on the storefront product details page. Fix submitted by divyajyothi5321 in pull request 26237. GitHub-25936
  • Corrected misalignment of the out-of-stock text in relation to the Add to cart button on the product list page in mobile view. Fix submitted by divyajyothi5321 in pull request 26183. GitHub-26181
  • The integration success message displayed on Admin > System > Extensions > Integrations is now displayed correctly. Fix submitted by divyajyothi5321 in pull request 26011. GitHub-25930

CMS content

  • You can now save and duplicate all CMS pages. Previously, Magento threw this exception when you tried to duplicate certain pages: Unique constraint violation found.
  • Magento now lets you create CMS blocks with identical names if the blocks are assigned to different store views.
  • Select from Gallery image thumbnails are now cached as expected. Previously, these images were resized on the fly.
  • Magento no longer throws an error when you save a CMS page that has been assigned to multiple stores. Previously, when you created or edited a CMS page, Magento saved the page but also threw this error: Item (Magento\VersionsCms\Model\Hierarchy\Node) with the same ID "PAGE_ID" already exists.
  • New CMS pages are now added as expected to a website’s store page hierarchy.
  • The CMS page custom layout update logic has been improved. Magento now applies specific layout changes from cms_page_view_selectable_home_somechanges.xml. Fix submitted by Sergiy Vasiutynskyi in pull request 27131. GitHub-26758

Configurable products

  • Child products of a configurable product can now be successfully disabled through the API.
  • Cart price rules with a condition set as Category (Parent only) now consistently work as expected.
  • You can now add a configurable product to the cart from the Cross-Sells tab. When you select a product and click Add to Cart from this tab, you are now taken to the product details page, where you can select specific product options. Previously, Magento redirected you to a 404 error page.
  • Magento no longer links a simple product to a configurable product when the API call to link these products fails.
  • Corrected the rendering of SKUs in the Current Variations list for a configurable product. Fix submitted by KaushikChavda in pull request 26007. GitHub-25591
  • You can now save system.xml configuration information by entering values in Admin > System > Configuration in fields that do not have associated labels. Fix submitted by Andrii Chorniy in pull request 25985. GitHub-23899
  • The performance of \Magento\ConfigurableProduct\Model\Product\Type\Configurable::isSalable has been optimized. Fix submitted by Stanislav Ilnytskyi in pull request 26071. GitHub-26065
  • The logic that is responsible for updating configurable product product images has been improved. Previously, simple products associated with a configurable product displayed only the default image associated with the configurable product, and Magento sometimes displayed the wrong main image for the product. Fix submitted by Sergiy Vasiutynskyi in pull request 26560. GitHub-26473, GitHub-26856, GitHub-26858
  • Magento now displays a product’s special price as expected when you select a discounted option of a configurable product. Previously, class="normal-price" was not changed to class="special-price" when a discounted option was selected. Fix submitted by Ravi Chandra in pull request 26170. GitHub-24972

Cookies

  • The setRedirectCookie and clearRedirectCookie functions now work as expected. Previously, these functions sent cookies to the browser, but all cookie parameters were missing. GitHub-24547
  • Metadata has been added to the setRedirectCookie and clearRedirectCookie functions. Fix submitted by Alexander Lukyanov in pull request 24612. GitHub-24547

Custom customer attributes

  • Magento no longer throws an error when you include an empty customer attribute field in the Forms to Use In field while creating a Company account on the storefront. Previously, Magento threw this error: PHP Fatal error: Uncaught TypeError: Argument 2 passed to Magento\Eav\Model\Attribute\Data\Text::validateLength() must be of the type string, null given.

Customer

  • Customers who are subscribed to newsletters as a guest are no longer unsubscribed after registering for a new account.
  • Magento now uses a new PHPSession for each change of password.
  • You can now successfully create a customer and associate it with a particular website using the Associate to Website dropdown menu on Customers > All Customers > Add new Customer. Previously, when you tried to associate a new customer with the non-default website in a multi-site deployment, Magento displayed this error: The store view is not in the associated website.
  • Magento now saves the information a customer enters in the default billing and shipping fields during checkout when the transaction is initially declined due to an invalid credit card but later completed successfully. Previously, although Magento created the order when the customer entered valid payment information, it did not update the default billing or shipping addresses in the My Account section of the checkout workflow.
  • Magento now honors customer group settings when you create a new customer from the Admin in a multi-site deployment.
  • Magento now successfully imports customer data using the Customer and Addresses (single file) option when cron is enabled and the Customer Grid indexer is set to Update By Schedule. After cron executes, the imported customer information is available in the Admin as expected. Previously, Magento imported the customer data, but did not update the customer grid with the newly imported customer records.
  • You can now create a new customer from the storefront when the date of birth is required. Previously, you could not create a new customer when this field was required, even when you entered valid DOB values. GitHub-26700
  • Customer creation from the Admin now honors the default customer group setting as expected.
  • The PHPSessionId is now changed as expected after a customer logs out and then logs back in.
  • The Admin view of a customer cart now displays all the products that were added to the cart from multiple websites in a multi-website deployment. Previously, when a customer added a product to their cart from a non-default website, the product was not displayed in the Admin even when Share customer account is set to Global.
  • Magento now displays only the products that the customer has placed in their cart when the cart is viewed from the Admin. Previously, a customer’s shopping cart displayed all the products in the catalog when viewed from the Admin. Fix submitted by Ravinder in pull request 26489. GitHub-26437
  • Validation now works as expected for the Date of birth field when editing a customer from the Admin. Previously, Magento did not factor in the user locale, and for some birthdates displayed this error: The Date of Birth should not be greater than today. Fix submitted by Sergiy Vasiutynskyi in pull request 27149. GitHub-27027
  • The email field is no longer required when placing an order from the Admin. Fix submitted by solwininfotech in pull request 24479. GitHub-22251
  • The My Account dashboard now displays email address values correctly in mobile view. Fix submitted by Eden Duong in pull request 25942. GitHub-25935
  • Clicking the Create an Account button on the customer registration form multiple times no longer submits the registration request more than once. Fix submitted by princeCB in pull request 26642. GitHub-26590
  • Customers who are subscribed to newsletters as a guest are no longer unsubscribed after registering for a new account.
  • Magento now uses a new PHPSession for each change of password.
  • You can now successfully create a customer and associate it with a particular website using the Associate to Website dropdown menu on Customers > All Customers > Add new Customer. Previously, when you tried to associate a new customer with the non-default website in a multi-site deployment, Magento displayed this error: The store view is not in the associated website.
  • Magento now saves the information a customer enters in the default billing and shipping fields during checkout when the transaction is initially declined due to an invalid credit card but later completed successfully. Previously, although Magento created the order when the customer entered valid payment information, it did not update the default billing or shipping addresses in the My Account section of the checkout workflow.
  • Magento now honors customer group settings when you create a new customer from the Admin in a multi-site deployment.
  • Magento now successfully imports customer data using the Customer and Addresses (single file) option when cron is enabled and the Customer Grid indexer is set to Update By Schedule. After cron executes, the imported customer information is available in the Admin as expected. Previously, Magento imported the customer data, but did not update the customer grid with the newly imported customer records.
  • You can now create a new customer from the storefront when the date of birth is required. Previously, you could not create a new customer when this field was required, even when you entered valid DOB values. GitHub-26700
  • Customer creation from the Admin now honors the default customer group setting as expected.
  • The PHPSessionId is now changed as expected after a customer logs out and then logs back in.
  • The Admin view of a customer cart now displays all the products that were added to the cart from multiple websites in a multi-website deployment. Previously, when a customer added a product to their cart from a non-default website, the product was not displayed in the Admin even when Share customer account is set to Global.
  • Validation now works as expected for the Date of birth field when editing a customer from the Admin. Previously, Magento did not factor in the user locale, and for some birthdates displayed this error: The Date of Birth should not be greater than today. Fix submitted by Sergiy Vasiutynskyi in pull request 27149. GitHub-27027
  • The email field is no longer required when placing an order from the Admin. Fix submitted by solwininfotech in pull request 24479. GitHub-22251
  • Magento now displays only the products that the customer has placed in their cart when the cart is viewed from the Admin. Previously, a customer’s shopping cart displayed all the products in the catalog when viewed from the Admin. Fix submitted by Ravinder in pull request 26489. GitHub-26437
  • The My Account dashboard now displays the displays email address values correctly in mobile view. Fix submitted by Eden Duong in pull request 25942. GitHub-25935
  • Clicking the Create an Account button on the customer registration form multiple times no longer submits the registration request more than once. Fix submitted by princeCB in pull request 26642. GitHub-26590

Directory

  • The Default State dropdown menu is now populated by data that is based on the allowed countries that have been assigned to the selected website when you configure a value for the Default Tax Destination Calculation field. Previously, this dropdown listed the countries that were assigned to the default website.

Downloadable

  • You can now use an import file to update downloadable products in bulk by SKU and description. Previously, validation errors occurred, and import failed.

EAV

  • Magento now respects store-specific settings that determine whether the telephone number field of the checkout workflow is required in a multi-site deployment. Previously, in deployments where one store required this field in the checkout workflow and another store did not, customers who did not complete this field while checking out on the store that did not require it encountered this error: Please check the shipping address information. "telephone" is required. Enter and try again.
  • EAV sort order by attribute option_id now works as expected. Fix submitted by Tan Sezer in pull request 24360. GitHub-24357
  • You can now create a new product after adding a new attribute via REST and assigning it to an attribute set from the Admin. Previously, Magento threw a 500 error. Fix submitted by Sergiy Vasiutynskyi in pull request 27191. GitHub-26827

Email

  • The authorization emails that are sent to a customer when they request a return now contain the RMA status as expected. Previously, this email displayed an empty string instead of the expected return status.
  • Customers are no longer redirected away from the current website when they report a forgotten password in multi-site deployments where customer accounts are shared globally. Previously, customers were redirected to the website on which the account was created.
  • Order confirmation emails that are sent to customers now include the list of ordered items as expected. Previously, when you created an email template in the Admin by loading and saving the default template, emails generated from this template did not include the list of ordered items. GitHub-26882

Frameworks

  • Dependencies on Zend Framework have been migrated to the Laminas project to reflect the transitioning of Zend Framework to the Linux Foundation’s Laminas Project. Zend Framework has been deprecated. Fix submitted by Ihor Sviziev in pull request 26436. GitHub-26335
  • Special price range settings (from/to dates) now work correctly for administrator accounts using a Dutch locale.
  • php bin/magento cron:run no longer processes items from the change log table multiple times. Previously, when you had more than 100000 new versions in the change log table, actions could be called several times for the same entity id.

  • php bin/magento setup:cron:run command has now been removed. References to this in crontabs should be removed when upgrading.

  • The update/cron.php file has been removed in Magento 2.4.0, if this file exists on your installation, it can be safely removed. Also, remove references to this file in crontabs when upgrading.

  • The Update Attribute action now correctly updates the timestamp of a product’s updated_at column from catalog_product_entity when you update the product from the Admin edit product page.
  • Setting 'persistent' => '1' in env.php no longer throws an error when you run setup:upgrade.
  • The Invalid Form Key. Please refresh the page text string on the login page is now translated as expected.
  • We’ve improved the performance of the Magento\Framework\App\DeploymentConfig\Reader::load function. Previously, when a request was made to Magento, this function was called repetitively, which resulted in config.php and env.php config files being loaded each time the method was called.
  • Magento no longer downloads a blank.html page when an administrator clicks on a product while creating an order from the Admin.
  • Non-cacheable blocks added to the default layout in reference instructions for non-existent (undeclared) components on the page no longer affect page caching. Adding non-cacheable blocks to default layout handlers renders all Magento pages non-cacheable. This results from the layout generation process: During layout generation, Magento collects all available layout handles for a particular page and merges instructions from them into the page’s final layout structure. The default layout handle is used as a basic handle for every page. As a result, layout updates that are declared for the default handler appear on every Magento page. GitHub-9041
  • The MySQL lock manager is now the primary lock manager. As a result, the minimal required version of MySQL is 5.7.9.
  • queue_consumer.xml now allows numbers in the handler class. Previously, when a handler contained a number in its path, XSD validation failed. Fix submitted by Eden Duong in pull request 25952. GitHub-25731
  • An incorrect @var reference in the doc block of the class member variable $queueIterator in class \Magento\Framework\MessageQueue\Topology\Config has been corrected. Fix submitted by Artem Voloznov in pull request 24976. GitHub-24971
  • JavaScript page load listeners are now triggered to fire when a document is no longer loading rather than waiting until it is marked as complete as waiting until the document is marked as complete can lead to severe delays in rendering JavaScript content. Fix submitted by John Hughes in pull request 23313 and pull request 50. GitHub-22909
  • Magento now displays the following informative message when you try to add a product to your wishlist with a quantity of 0 or negative number: Please enter a valid number in this field. Previously, Magento displayed this error: We can't update your Wish List right now. Fix submitted by Pawe Tylek in pull request 25641. GitHub-25032
  • Magento no longer supports inheritance of DTO classes from the Magento\Framework\Api\AbstractExtensibleObject class. Missing PHP annotation @api  has been added to AbstractExtensibleModel, and the missing @deprecated  annotation has been added to AbstractExtensibleObject. Fix submitted by Alexander Taranovsky in pull request 22011. GitHub-22010
  • You can now save products as expected after changing a product-related date (for example, news_from_date, news_to_date, special_price_from_date, special_price_to_date) in stores implementing non-English locales. Previously, Magento threw an error similar to this: Invalid input datetime format of value '22/5/2019.

General fixes

  • The Customer module no longer has a dependency on the Review module. Previously, you could not disable the Review module due to this dependency.
  • The product edit page now loads successfully when the default attribute set for the page contains a dropdown attribute with the select label.
  • The graphical orders chart accessible from the Orders tab on the Admin now accurately reflects order quantity.
  • A store’s Admin URL no longer redirects to the storefront URL when these two URLs differ.
  • URL rewrite generation for subcategories now works correctly when using the performance toolkit profile with more than one website.
  • You can now delete an empty user model without deleting the Administrators role to which it is assigned.
  • The TinyMCE4 editor now supports all HTML tags.
  • Clicking the Refund Offline button in the create a credit memo workflow now generates a credit memo as expected. Previously, a JavaScript error disabled this button, and Magento did not create a credit memo.
  • Merchants can now create a product attribute of type Decimal. Previously, due an earlier bug fix, Magento did not display the product attribute type Price. GitHub-26949
  • Magento no longer returns a 500 error when you try to open a Category page on the storefront when Layout = Product – Full Width has been set from the Design tab of the Category page.
  • Corrected a bug in AbstractSimpleObjectBuilder.php.
  • MAP (minimum advertised price) now works as expected for group products.
  • Magento now redirects you to the home page of the appropriate store view when you change language on CMS pages in a multi-store deployment. Previously, Magento displayed a 404 page when you changed language on certain CMS pages.
  • Order queries (SalesOrderIndexGridAsyncInsertCron) have been refactored to reduce the size of the data set returned and the frequency of the queries.
  • You can now successfully create a CMS page and assign it to the website root category in the CMS hierarchy.
  • Guests can now display a product price or add a product to the cart when category permissions are enabled (for example, when the Not logged in customer group has been granted these privileges).
  • Product rules now apply to out-of-stock products as expected. Previously, Magento did not display out-of-stock products in the related products list even when the rule was configured to display out-of-stock products.
  • Clicking the Track shipping button for an order from the Admin now results in tracking information being displayed in a pop-up window as expected. Previously, this link took the administrator to the Log in page.
  • Magento now displays an informative error message and continues to display the registration form as expected if an error occurs when a customer tries to complete a registration form that contains a multi-select customer attribute. Previously, Magento displayed a 500 error.
  • Magento now displays the Credit memo button after the partial refund of an order. Previously, Magento did not display this button after you created a partial refund, and you could not create a credit memo for the rest of the order.
  • Bulk order updates through REST now modify the order status as expected. Previously, Magento threw this error: report.ERROR: Property "AdditionalInformation" does not have accessor method "setAdditionalInformation" in class "Magento\Sales\Api\Data\OrderPaymentInterface".
  • Attribute filters are now displayed as expected in the Shopping Options block of the Category page.
  • Customer billing and shipping addresses are now displayed as expected under the Addresses tab on the Admin Customer Edit page when displayed in Internet Explorer. Fix submitted by Vasilii Burlacu in pull request 27383. GitHub-27370
  • All bookmark views now remain editable when you delete one. Previously, all bookmark views became uneditable after you deleted the first view for accounts with multiple bookmark views. Fix submitted by Bartomiej Szubert in pull request 26263. GitHub-14913
  • Layered navigation no longer breaks HTML5 validation of the swatch module. Previously, HTML validation errors occurred for attributes that were not defined in the W3C markup validation service, but those attributes have been changed to data attributes. Fix submitted by Nirav Patel in pull request 26055. GitHub-22363
  • An unused require.JS alias (critical-css-loader) has been removed from app/code/Magento/Theme/view/frontend/requirejs-config.js. Fix submitted by Tu Nguyen in pull request 26987. GitHub-26963
  • Magento now implements PHP7.x’s throwable interface to enable the catching of all errors that might potentially expose sensitive information such as passwords. Fix submitted by miszyman in pull request 25250. GitHub-23350
  • Pressing the ESC key when entering the name of a new folder on the create a new folder popup window now closes the popup as expected without creating the folder. Fix submitted by Shankar Konar in pull request 25349. GitHub-572
  • An incorrectly nested HTML structure has been corrected. Previously, this structure resulted in a broken layout for the list of related, up-sell, or cross-sell products. Fix submitted by Pieter Hoste in pull request 27926. GitHub-27920
  • Removed duplicated call to addToolbarBlock, which had resulted in two similar conditions in ORDER BY. Fix submitted by Vasilii Burlacu in pull request 27263. GitHub-26708
  • Merchants can now set an expiration date on Admin user accounts. Fix submitted by Laura Folco in pull request 22837. GitHub-22833
  • We’ve added the @api PHP annotation to AbstractExtensibleModel, the @deprecated PHP annotation to AbstractExtensibleObject, and @see to AbstractExtensibleModel. Fix submitted by Alexander Taranovsky in pull request 22011. GitHub-22010

GraphQL

  • Magento now returns the GraphQL message The cart isn't active instead of Current user does not have an active cart under certain circumstances when a cart becomes inactive and a new cart ID is created. Fix submitted by Vadim Malesh in pull request 27187. GitHub-26117
  • Removed code that caused an error when using GraphQL to add products to a cart when a previously added product became out-of-stock. Fix submitted by AleksLi in pull request 27015. GitHub-26683
  • Corrected a problem in GraphQL in which Magento did not return all the required information while using fragments on products query. Fix submitted by Riccardo Tempesta in pull request 26218. GitHub-26217

  • The GraphQL mutation setShippingMethodsOnCart no longer retrieves the wrong data in the available_shipping_methods attribute. Fix submitted by Vadim Malesh in pull request 27004. GitHub-26742

Grouped products

  • You can now add a simple product that belongs to a group product to the shopping cart when another simple product that belongs to that same group is out-of-stock. Fix submitted by Gihovani Filipp Pereira Dem̩trio in pull request 24955. GitHub-22304
  • Magento now sends email to customers about refunded group products as expected. Fix submitted by Alexander Taranovsky in pull request 26246. GitHub-26245
  • You can now add a child product of a grouped product to your cart when one of the grouped product’s other child products is out-of-stock. Previously, when one child product was out-of-stock, you could not add any other child products to the cart.

Images

  • Images are now saved in pub/media/catalog/category as expected when you save category images. Previously, Magento saved these images in pub/media/catalog/tmp/category.
  • Watermark images no longer obscure the product image that they overlay. Previously, when the watermark image was larger than the product image it was applied to, the product image was not visible.
  • You can now successfully save an image to a category from the Admin. Previously, after you saved the image, part of the URL was missing, and you couldn’t re-open the image.
  • Magento now displays .png images as expected after upload.
  • Using REST to add or update an image now creates an image thumbnail as expected. Fix submitted by Sergiy Vasiutynskyi in pull request 27170. GitHub-26825
  • Custom attributes of images generated by Block\Product\ImageFactory now render correctly. Previously, you could not add your own custom attributes to the attribute markup due to incorrect escaping of the HTML output. Fix submitted by alexander-aleman in pull request 26959. GitHub-25219
  • Images are no longer blurred when a storefront is viewed from an iPhone. Fix submitted by Dmitriy in pull request 24743. GitHub-24735
  • Images on the storefront are now responsive. Previously, image height was distorted. Fix submitted by Sean van Zuidam in pull request 27041. GitHub-27040
  • The default store logo is now visible on the storefront when the Magento_blank theme is used. Fix submitted by Vasilii Burlacu in pull request 27497. GitHub-27496

Import/export

  • Magento no longer throws an error during import when imported data includes a swatch_image store-view key has a value of no_selection. Previously, Magento threw this error: Imported resource (image) could not be downloaded from external resource due to timeout or access permissions in row(s): 1. GitHub-25026
  • Magento now updates images as expected when you use the hide_from_product_page setting when importing products in deployments with multiple store views.
  • Customizable options are now imported as expected when row_id is not equal to a product’s entity_id. Previously, Magento did not import customizable options when row_id was not equal to a product’s entity_id, which resulted in certain products not being imported.
  • Images associated with configurable products are now properly uploaded during import and available for viewing as expected from the product edit page.
  • Exported .csv files now reflect filter settings for including in-stock or out-of-stock products. Previously, Magento exported all products, no matter which stock setting you selected.
  • You can now successfully import or update customers using the Customer and addresses single file option of the import workflow. Previously, when you selected this option, Magento did not import the customer data and displayed this error: Invalid data for insert.
  • The Stock Indexer is now triggered as expected after import and updates product status. Previously, the Stock Indexer did not index the changed product inventory data.
  • Magento now successfully imports all custom options for a configurable product’s child products when store_view_code is specified. This works whether you choose to import configurable products individually or collectively. Previously, Magento did not successfully import all custom options when the import file contained more than one item and store_view_code was specified.
  • Magento now provides a message during product import that identifies which products in the imported .csv file have duplicated keys. Merchants can use this information to resolve conflicts. Previously, Magento displayed this error: Notice: Undefined index: name in /var/www/html/ee233dev/app/code/Magento/CatalogImportExport/Model/Import/Product.php on line 2524
  • Magento now displays a more informative error message, and does not display a download link, when you try to delete a directory from the System > Export list. Previously, when you tried to delete a directory from this list, Magento continued to display a download link for files that could not be downloaded, and displayed an uninformative error message.
  • The .csv file that is used during import now contains the correct links for downloadable products and is now correctly formatted to support importing and updating downloadable products.
  • Magento now successfully exports a .csv file when you set import behavior for Replace, select a previously exported .csv file, and click Check data. Previously, Magento displayed this error: Data validation failed. Please fix the following errors and upload the file again and Following Error(s) has been occurred during importing process.
  • The Stock Indexer is now triggered as expected after import and updates product status. Previously, the Stock Indexer did not index the changed product inventory data.
  • .csv files that are generated during product import now contain group titles for downloadable products as expected. Previously, unnecessary validation of group_title during import prevented the display of group titles for downloadable products.
  • When cron is enabled and you perform a customer import using the (Customer and Addresses (single file)) option, Magento populates data to the Admin customer grid as expected. The customer grid displays the customers once manual re-indexing completes for customer_grid indexer. Previously, Magento did not update the customer grid with newly imported customer addresses.
  • Magento now displays the customer list as expected after automatic re-indexing. Previously, although manually running bin/magento index:reindex worked, the customer grid did not display customer information after automatic re-indexing.
  • Magento now deletes temporary files from <Magento_home>/var as expected after product import has completed.
  • Magento no longer creates duplicate SKUs in the Admin when products are imported by .csv file.
  • Import no longer fails when the imported configurable attribute includes an equal sign (=) in its value. Fix submitted by dhoang89 in pull request 25194. GitHub-25188
  • All exported grid data (both Magento and custom data) now have option labels instead of option values for all the columns with type Select or Multiselect. Previously, when you exported this data, the exported spreadsheet contained Columns with ID rather than the values that were displayed in the grid. Fix submitted by Maksym Novik in pull request 26523. GitHub-25963
  • Magento now displays bundle products on the storefront as expected after you update a product by importing a .csv file. Fix submitted by Pavel Bystritsky in pull request 25664. GitHub-25540

Index

  • We have improved the performance of indexer_update_all_views. Indexing is now faster, inactive rules are no longer processed, and caches are cleared of entries for only changed products.
  • Product prices on the storefront now accurately reflect the application of a scheduled Catalog Price Rule update. Previously, prices did not reflect the scheduled cart price rule until you manually re-indexed (php bin/magento indexer:reindex catalogrule_rule).
  • You can now successfully re-index the product database after adding an attribute that is unsearchable (that is, the is_searchableis_filterableis_visible_in_advanced_search attributes are disabled).
  • Magento now displays a message that identifies the indexer and the time the indexing operation took when a re-indexing operation fails. Fix submitted by Lukasz Bajsarowicz in pull request 26207. GitHub-26206
  • Products that are saved in stores where the onthefly indexer and flat tables are enabled now respect website assignments. Previously, if you removed all website assignments from a product and then saved it, all flat tables included the product, despite the specified website assignments. Fix submitted by Abel Truong in pull request 27365. GitHub-16315

Infrastructure

  • The Internet Explorer 11.x browser is no longer supported.
  • The validation logic that is associated with the Date of Birth field of the Customer Registration form no longer triggers a JavaScript error.
  • Added an integration test to cover $storeId for the Category Repository get() method. Fix submitted by Lukasz Bajsarowicz in pull request 27048. GitHub-27044
  • Enabling the Block all cookies setting in Safari no longer results in JavaScript errors, and Magento displays the cookies disabled message as expected. Previously, Magento displayed multiple SecurityError (DOM Exception 18): The operation is insecure errors in the console. Fix submitted by Ra̼l Verdugo Lorenzo in pull request 25324. GitHub-13865
  • Magento no longer throws this error when running integration tests: Error: Call to a member function findFile() on array (/var/www/html/lib/internal/Magento/Framework/Code/Generator/DefinedClasses.php:59). Previously, an issue with AutoloaderRegistry::getAutoloader caused integration tests to fail randomly. Fix submitted by Lukasz Bajsarowicz in pull request 26480. GitHub-26479
  • The date tag in /module-sales/view/frontend/templates/order/order_date.phtml has been corrected to span. Previously, Magento logged an error in the exception.log file when you clicked View Order on the storefront My Account > My Orders page. Fix submitted by Andrii Chorniy in pull request 25895. GitHub-13269, GitHub-25738
  • The JavaScript mixin module has been refactored to improve the loading and application of mixins for advanced bundled modules. Previously, Magento did not load or apply mixins for advanced bundled modules. Fix submitted by Mateusz Krzeszowiak in pull request 25587. GitHub-25586
  • The grunt clean command now cleans generated code and metadata folders as expected. Fix submitted by Andrii Beziazychnyi in pull request 25765. GitHub-25739
  • getVersion result (ProductMetadata::getVersion) is now cached, which improves performance of the ProductMetadata::getVersion method. Fix submitted by Lukasz Lewandowski in pull request 26001. GitHub-24025
  • A missing setter for additional_information has been added to OrderPaymentInterface, which resolves an inconsistency between its schema declaration and accepted properties. Fix submitted by Antonino Bonumore in pull request 26748. GitHub-26745, GitHub-13222

Layered navigation

  • Magento now renders the Yes/No attribute on the Category page when Use in Layered Navigation: Filterable (with results) for storefront properties is enabled.
  • Redundant \Magento\Sales\Model\Order\Email\Sender\ShipmentSender has been deprecated in favor of \Magento\Sales\Model\Order\Shipment\Sender\EmailSender. Fix submitted by Adarsh Manickam in pull request 26714. GitHub-14885
  • Clicking Enter after naming a new folder in the Media Gallery now saves all changes you’ve made. Previously, clicking Enter instead of using the mouse to select OK resulted in all changes being lost. Fix submitted by Sergiy Vasiutynskyi in pull request 27029. GitHub-26847
  • You can now create a subfolder under the Media Gallery that has the same name as the primary folder. Previously, you could not save the subfolder with the same name. Fix submitted by Vadim Malesh in pull request 27976. GitHub-1270

Media Storage

  • var/resource_config.json is no longer regenerated whenever an image is requested by get.php. Previously, this file was rewritten on each call to get.php.

Newsletter

  • Customers can now subscribe as expected to newsletters. Previously, when a customer tried to confirm their subscription, Magento displayed this error: This is an invalid subscription confirmation code.
  • The newsletter input field of the storefront footer is now rendered identically by any supported browser. Fix submitted by divyajyothi5321 in pull request 26182. GitHub-26176
  • Storefront messages about newsletter subscriptions are now rendered as expected in HTML. Fix submitted by Oleh Usik in pull request 26455. GitHub-25162

Orders

  • Order summary subtotals no longer display excluded taxes when the website display settings specify that taxes should be excluded. Previously, when multiple websites were configured with different display settings, the setting defined in the server variable was used for the store despite the store-level configurations.

Payment methods

  • The integration of third-party payment methods Authorize.Net, eWay, CyberSource, Braintree, and Worldpay into the core Magento code have been removed. Merchants should migrate to the official extensions that are available on the Magento Marketplace.
  • You can now successfully complete an order and return to the merchant’s home page when Website Payments Pro Hosted Solution is configured. Previously, when you clicked Return to merchant, Magento threw this error: Invalid Form Key. Please refresh the page.
  • Switching billing address no longer causes JavaScript function text to render in the payment section of the storefront checkout workflow. Fix submitted by Chris Pook in pull request 26378. GitHub-26375
  • Credit memos now display the correct amount in the Adjustment Refund field of the Credit Memo overview. Fix submitted by Sergiy Vasiutynskyi in pull request 27343. GitHub-13851
  • You can now remove additional information from the quote_payment column additional_information table after you’ve saved a quote. Previously, you could not remove this information after saving the quote because the unsAdditionalInformation method in \Magento\Payment\Model\Info did not initialize data properly. Fix submitted by Marco Oliveira in pull request 26084. GitHub-26083
  • Payment instructions are now derived from the store view from which an order was made. Previously, payment instructions were used from the default store view because the BeforeOrderPaymentSaveObserver method fetched payment instructions from the default store view. Fix submitted by Karyna Tsymbal in pull request 26399. GitHub-26332
  • Magento now collects the payment information that is displayed on both the Admin and in invoice and shipment invoices from the store in which the order was made in deployments with multiple stores. Previously, Magento derived payment information from the default store. Fix submitted by Bartomiej Szubert in pull request 26765. GitHub-17933

PayPal

  • Magento now displays an informative error message each time a customer clicks Pay with PayPal after entering an invalid shipping address in the checkout workflow. Previously, Magento displayed an error message only when the customer first clicked the button, not for subsequent clicks.
  • Magento no longer changes an order’s status to Processing in the Payment Review section of the checkout workflow when a payment with PayPal fails.
  • You can now successfully complete an order using the Payflow Link payment method. Previously, the Payflow Link payment method always rejected payment because the order status remained in the Pending payment state, even though the order status in the payment method logs was Approved.
  • Orders that are placed using PayPal Payflow Pro are now set to Suspected Fraud status when fraud filters are triggered.
  • You can now use PayPal Express Checkout with any supported credit card. Previously, when you clicked on a credit card button while using PayPal Express Checkout to complete an order, Magento hung, and you could not enter any credit card information.
  • Orders placed within PayPal Payflow Pro are now set to Suspected Fraud status when fraud filters are triggered. Previously, payment transaction status on PayPal was not validated before payment approval occurred on the Magento side.
  • Payflow Pro now works as expected when Website Restrictions are enabled.
  • Magento now successfully processes orders placed with PayPal Express Checkout where the order’s shipping address specifies a country region that the customer has manually entered into the text field rather than selected from the drop-down menu on the Shipping page. Previously, Magento displayed this error on the order review page: Error 500: NOTICE: PHP message: PHP Fatal error: Uncaught Error: Call to a member function getId() on null in httpdocs/vendor/magento/module-paypal/Model/Api/Nvp.php:1527. GitHub-26698
  • The PayPal Pro payment method now works as expected in the Chrome 80 browser. This payment method previously invoked a Magento callback endpoint that needed access to the customer’s session — access that the new default Chrome SameSite cookie functionality does not permit. GitHub-26840
  • You can now successfully use PayPal Express to pay for an order when persistent checkout cart has been enabled and the Clear Persistence on Sign Out setting is set to no. Previously, Magento redirected you to the Login page.
  • Payments from Paypal Express and Web Payments Pro now move to the Processing state as expected once processing has begun. Previously, Paypal Web Payments Pro payments remained in the Pending payment state even when payment information was in the Processing state. Fix submitted by azambon in pull request 25876. GitHub-25659

Performance

  • Customer data section invalidation logic has been improved. This release introduces a new way of invalidating all customer sections data that avoids a known issue with local storage when custom sections.xml invalidations are active. (Previously, private content (local storage) was not correctly populated when you had a custom etc/frontend/sections.xml with action invalidations.) See Private content.
  • The import of customer accounts has been refactored to improve import speed.
  • Dashboard charts have been migrated to the chart.js library. Fix submitted by Bartomiej Szubert in pull request 26923. GitHub-186
  • The performance of operations that are run on large catalogs that contain many product attributes (on the scale of 3,000 - 23000 options) has been improved by the refactoring of the how attribute option arrays are built. Fix submitted by Behnam Shayani in pull request 25452. GitHub-20966

Pricing

  • Magento now saves and displays the correct price for tiered products even after you’ve edited products multiple times. Previously, Magento did not save the last edits made to product price. Fix submitted by Ravi Chandra in pull request 26162. GitHub-25195
  • Both fixed and discount save percentage are now correctly applied on an order’s final price. Previously, Magento displayed an incorrect tier price (both fixed & discount) save percentage on the product detail page. Fix submitted by Sathish Subramanian in pull request 26584. GitHub-26583
  • The stock alert email sent to customers about the re-stocking of a configurable product now contains the correct product price. Previously, this email contained a product price of 0.
  • Product stock alert unsubscribe now works when a user’s session has expired. Previously, when you clicked on the Click here to stop alerts for this product link, Magento displayed a 404 error.
  • Unsubscribe actions for product alerts now work as expected. Previously, when a customer clicked on the Click here to stop alerts for this product link, Magento displayed a 404 error.

Product video

  • You can now use REST to update YouTube videos (PUT rest/V1/products/{SKU}). Previously, Magento displayed a thumbnail for the video, but the video player did not load when you clicked the Play button. GitHub-23194

Reports

  • Product lists now order configurable products by SKU, which groups configurable products by variations. Previously, the report grouped products by product_id. Fix submitted by Lukasz Bajsarowicz in pull request 25858. GitHub-25856
  • The Admin > Reports > Refresh Statistics table now displays Updated At = Null status as Never in the Updated column instead of undefined. Fix submitted by Eden Duong in pull request 25932. GitHub-25931
  • The Low Stock report no longer includes disabled products. Fix submitted by Mohamed-Asar in pull request 26862. GitHub-26838
  • Magento now displays an accurate value for the Year-To-Date Starts field in Admin > Stores > Configuration > General > Reports. Fix submitted by Priya-V-Panchal in pull request 27088. GitHub-27086

Reviews

  • Magento now disables the Submit Review button after the user clicks the button once. Previously, Magento did not disable this button after the first click and created multiple reviews when the user clicked the Submit Review button multiple times.
  • The Admin > Reports > Reviews > By Products filter list now displays results as expected. Previously, when you tried to filter this list, Magento did not display any results.
  • The Pending Reviews menu item is now activated as expected on Admin > Marketing > User Content > Pending Reviews. Fix submitted by Ravinder in pull request 26230. GitHub-26229

Sales

  • Completed orders now appear in both the payment system and Magento. Previously, orders appeared in the payment system but not in Magento. GitHub-25862
  • Magento now honors a customer’s default shipping address. Previously, Magento did not honor the default billing and default shipping addresses according to the settings, and the Same As Billing Address setting was not enabled automatically.
  • Magento now correctly calculates refunds for orders that include discounts. Previously, Magento incorrectly calculated the shipping tax and shipping discount, and the refunded total did not match the total paid.
  • Magento now assigns the correct Group ID when a new customer creates an order in multi-site deployments. Previously, Magento applied the settings from the default customer group.
  • Administrators with restricted permissions that include view permission for credit memos, invoices, and shipments can now view invoices and shipments from the Orders page as expected. Previously, when a restricted administrator tried to view an order, Magento displayed this error: Something went wrong with processing the default view and we have restored the filter to its original state.
  • Magento no longer displays an error when a customer adds a quantity of a product to their cart that exceeds half of the existing product stock but does not exceed the total stock. Previously, under these circumstances, Magento displayed this error: The requested qty is not available. Github-24365
  • You can now successfully add a product to the cart from the Admin when the stock quantity is 1. Previously, Magento didn’t add the product to the cart and displayed this message: The requested qty is not available. Fix submitted by Serhii Petrychenko in pull request 26650. GitHub-25675
  • Magento now displays an informative error message when a store administrator tries to re-order a product whose custom option has a name that exceeds the maximum number of characters. Previously, under these conditions, Magento displayed the Report page, not a message. Fix submitted by Mudit Shukla in pull request 26348. GitHub-26345
  • The layout of the Sales order address information edit form has been refactored to match Admin form library conventions. Fix submitted by Alexey Rakitin in pull request 25699. GitHub-19805
  • The checkboxes on the Products section of the Catalog > Categories page now work as expected. Fix submitted by Denis Kopylov in pull request 22990. GitHub-22988
  • The getCustomer method now returns the customer object as defined in phpdoc block. Previously, this method returned NULL, and phpdoc block did not highlight that this method could return NULL. Fix submitted by Fanis Strezos in pull request 26423. GitHub-25268
  • Re-orders are now disabled as expected when a merchant disables the Admin > Store > Configuration > Sales > Reorder > Allow Order. Fix submitted by Eden Duong in pull request 26051. GitHub-25130
  • getPrice() method now returns a float or null instead of a string when setting a custom price for an order in the Admin. Fix submitted by Andrii Chorniy in pull request 26313. GitHub-25968
  • The State Code and Title column of Admin > Stores > Settings > Order Status now displays state instead of status as expected. Fix submitted by Oleh Usik in pull request 26569. GitHub-17847
  • PDF invoices now capture the correct purchase date when created in a GB locale. Fix submitted by Eden Duong in pull request 26701. GitHub-26675

Sales Rule

  • quote_item.applied_rule_ids is now updated as expected after a cart price rule is disabled. GitHub-24526
  • Magento now displays category trees as expected when you try to create or edit a cart price rule. Previously, selecting a category in the Condition section while creating or editing a rule resulted in JavaScript errors.
  • Magento now correctly calculates cart-level fixed discounts using cart price rules when a configurable product is first added to the cart. Fix submitted by Lachlan Turner in pull request 26623. GitHub-26622
  • Elasticsearch 7.6.x is now the default catalog search engine for Magento Commerce and Open Source. You cannot install or upgrade to Magento 2.4.0 without also installing Elasticsearch 7.6.x. Elasticsearch version 2.x code has been removed. Elasticsearch versions 5.x and 6.x have been deprecated and are no longer supported. See Elasticsearch.
  • Magento now renders the < and > symbols correctly in storefront catalog search strings.
  • Products now show as expected in categories after running cron:run in deployments implementing Elasticsearch.
  • Magento no longer requires a full search re-index in order for a new product attribute to be searchable on the storefront.
  • Elasticsearch now works as expected when you sort a product list that contains bundle products by alphabetized product names.
  • Filtering results no longer include out-of-stock options when you filter configurable products in a category.
  • Selecting all products from the products list page using Elasticsearch now displays all products in the search results as expected. Previously, Magento displayed no search results.
  • Elasticsearch now correctly displays results from category pages when you change the number of search results viewed per page. Previously, when you changed how many search results should be displayed on the search results page, Magento displayed a blank page and this error: "0":"SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near'
  • Price sorting now works correctly for out-of-stock configurable products.
  • Magento no longer throws an exception when a customer uses the storefront quick search in multi-website deployments.
  • Magento no longer displays a warning when a merchant opens the search term page by clicking on the Search terms option on the footer of Marketing > SEO & Search > Search Terms. Fix submitted by vishal-webkul in pull request 25246. GitHub-25245
  • Magento no longer resizes the viewport when you click on the search input box when running Safari in mobile view. Fix submitted by Pawe Tylek in pull request 27603. GitHub-27506
  • The Elasticsearch versions are now identified by X.x notation instead of X.0+ notation in the Admin (Stores > Settings > Configuration > Catalog > Catalog > Catalog Search). Fix submitted by Andreas Mautz in pull request 25838. GitHub-25674

Shipping

  • Magento now applies fixed-amount, whole-cart discounts correctly for orders being shipped to multiple addresses. Previously, this type of discount was applied multiple times when a customer checked out an order using Check Out with Multiple Addresses. GitHub-25834
  • The drop-down list that is available for selecting shipping methods during the process of creating a cart price rule now contains only valid values. Previously, this dropdown list contained empty or extra values.
  • Magento now prints shipping labels as a .pdf file as expected when you select Print Shipping Label from the Action drop-down list from an order in the order archive list. Previously, Magento displayed a 404 error.
  • Free Shipping Price rules now affect only the relevant products when a shopping cart contains products from categories that are included by the Free Shipping Price rule as well as products from categories not included in the rule. Previously, when a shopping cart included products from both the free shipping categories as well as other categories not included in the price rule, then free shipping was not applied to any products.
  • Magento no longer displays a blank page instead of displaying all the shipping carriers in the dropdown/multi-select box. Previously, an error in the toOptionArray function in vendor/magento/module-shipping/Model/Config/Source/Allmethods.php occurred. Fix submitted by Marc Rodriguez in pull request 25315. GitHub-13136

  • Magento no longer applies a fixed amount discount multiple times when a customer creates an order that will be shipped to multiple addresses. Fix submitted by Mahesh Singh in pull request 26419. GitHub-25834

  • Plugins for Magento\Ups\Model\Carrier that implement custom di.xml now work properly in developer mode. Previously, Magento threw this error: 1 exception(s): Exception #0 (BadMethodCallException): Missing required argument $data of Magento\Ups\Model\Carrier. Fix submitted by Bartomiej Szubert in pull request 26130. GitHub-25390

Sitemap

  • Magento now uses the project base URL as expected when you generate a sitemap.
  • Generated site maps now include the URL of the home page. Fix submitted by deepaksnair in pull request 26445. GitHub-25761

Store

  • Customer sessions now persist as expected when a customer logs in to one store, adds products to the shopping cart, and then switches to a new store in a multi-store deployment. Previously, when the customer navigated to the second store, Magento logged out the customer and emptied the shopping cart.
  • Magento now deletes records that are related to a deleted store view from the sale_sequence_meta and sales_sequence_profile tables as expected. Fix submitted by Bartomiej Szubert in pull request 22296. GitHub-14958
  • Store switcher now works as expected when switching between stores that have different base URLs. Previously, when a customer used the store switcher to switch between stores, the request failed if the target store had a different base URL than the current store. Fix submitted by Tobias Nilsson in pull request 26548. GitHub-23755, GitHub-26384

Swatches

  • Merchants can now successfully add color swatch attributes to products using the Visual Swatch option on Stores > Attributes > Product > New Attribute. Previously, a JavaScript error was triggered when you tried to open the newly created swatch attribute.
  • The Minimum Advertised Price now changes as expected when a customer selects a new swatch option for a configurable product. Fix submitted by Sergiy Vasiutynskyi in pull request 26241. GitHub-26240
  • Magento no longer duplicates the Minimum Advertised Price for a configurable product when you select a new swatch option. Fix submitted by Sergiy Vasiutynskyi in pull request 26317. GitHub-26314
  • Corrected issues with the behavior of the drop-down menu in the Manage Swatch (Values of Your Attribute) area of the New Product Attribute page. Fix submitted by Oleh Usik in pull request 26090. GitHub-25910

TargetRule

  • The related product block that is displayed for a product on the storefront now displays the products that have met the criteria defined in the Related Product Rule. Previously, Magento did not display any related products.

Tax

  • Magento now updates shipping rates and prices as expected when a customer changes the destination country for an order during checkout.
  • Free shipping is now applied as expected based on the applicable cart price rule. Previously, cart price rules did not take into account taxes when calculating whether an order meets criteria for free shipping.

Test

MFTF now uses Google Authenticator to execute tests with 2FA enabled. MFTF will not work with Magento 2.4.0 without additional configuration steps to enable Google Authenticator. See Configuring MFTF for Two-Factor Authentication (2FA).

  • Hardcoded URLs in tests and Action roups have been replaced with page references. Fix submitted by Lukasz Bajsarowicz in pull request 117 in private repository partners-magento2ee. GitHub-26331
  • Tests now cover the task of logging Admin Actions related to CMS pages. Fix submitted by Lukasz Bajsarowicz in pull request 172 in private repository partners-magento2ee. GitHub-171
  • Invalid functional test names have been revised to follow best practices. Fix submitted by Lukasz Bajsarowicz in pull request 27118 and pull request 151 in private repository partners-magento2ee. GitHub-27117
  • Magento cron is now used for re-indexing after creating test data, and where applicable, cache:flush config replaces cache:flush. Fix submitted by Lukasz Bajsarowicz in pull request 26990. GitHub-26989
  • Acceptance tests now follow naming conventions for Magento/Indexer and Magento/Backup modules. Fix submitted by Shankar Konar in pull request 27515. GitHub-27503
  • The AdminReorderWithCatalogPrice test has been refactored and no longer fails during the CI validation process. Fix submitted by Lukasz Bajsarowicz in pull request 135 in private repository partners-magento2ee. GitHub-26607
  • The AdminAddingNewOptionsWithImagesAndPricesToConfigurableProduct and StorefrontApplyPromoCodeDuringCheckout tests have been refactored and no longer fail during CI validation process. Fix submitted by Lukasz Bajsarowicz in pull request 26611 and pull request 26614. GitHub-26612, GitHub-26610
  • The DeleteProduct and DeleteCustomer Action Groups tests have been refactored and no longer fail during the CI validation process. Fix submitted by Lukasz Bajsarowicz in pull request 26407. GitHub-26396
  • The AdminMoveAnchoredCategoryTest.xml tests have been refactored and no longer fail during the CI validation process. Fix submitted by Lukasz Bajsarowicz in pull request 26395. GitHub-26396

Integration tests

  • Consecutive requests in integration tests no longer fail. Previously, tests failed because request objects were shared between dispatches. The resetRequest method now empties the state of request. Fix submitted by Lukasz Bajsarowicz in pull request 27300. GitHub-27299
  • Additional integration tests added to cover for Magento_Customer email features. Fix submitted by Lukasz Bajsarowicz in pull request 27606. GitHub-27607

PHP unit tests

  • PHP unit tests no longer throw this fatal error: Fatal error: Class Mock_CartExtensionInterface_0ba80a0b contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (Magento\Quote\Api\Data\CartExtensionInterface::getAmazonOrderReferenceId, Magento\Quote\Api\Data\CartExtensionInterface::setAmazonOrderReferenceId) in /var/www/html/vendor/phpunit/phpunit-mock-objects/src/Generator.php(264) : eval()'d code on line 1. Fix submitted by Lukasz Bajsarowicz in pull requests 178 in private repository partners-magento2ee and 27701. GitHub-27638
  • Tests for Offline_Payments are now compatible with PHPUnit 8. Fix submitted by Cristiano Pacheco in pull request 27627. GitHub-27500
  • Unit tests for Framework, AdminAnalytics, AdminNotification, and AMPQ have been updated for PHPUnit 8. Fix submitted by Ihor Sviziev in pull requests 27522, 27521, 27519, 27522. GitHub-27500
  • You can now run the \Magento\Downloadable\Test\Unit\Helper\DownloadTest unit test without being connected to the internet. Fix submitted by aleromano89 in pull request 26264. GitHub-23521
  • Added unit test for app/code/Magento/Fedex/Model/Source/Generic.php. Fix submitted by Sathish Subramanian in pull request 26549.
  • <magentoCron> has been added to multiple tests, which triggers partial reindexing. This changes addresses issues that created false negatives in functional tests that covered Magento_Bundle, CatalogImportExport, CatalogInventory, CatalogRule, Backend, Braintree, and Captcha. Fix submitted by Lukasz Bajsarowicz in pull requests 27322, 27323, 27321. GitHub-27320
  • All incorrect uses of <amOnPage> have been replaced with an appropriate <actionGroup> for Admin log out where applicable in tests. Fix submitted by Lukasz Bajsarowicz in pull request 116 in private repository partners-magento2ee. GitHub-26331
  • Each Action group in a test has been moved to a separate file to follow MFTF best practices, and inconsistent file names have been revised. Tests for the following modules have been affected:

    • module-catalog-permissions
    • module-shared-catalog
    • module-catalog-event
    • module-banner
    • module-admin-gws
    • module-advanced-checkout
    • module-shipping
    • module-ui
    • module-shipping
    • module-checkout-address-search
    • module-sales
    • module-catalog
    • module-catalog-rule-staging
    • module-visual-merchandiser
    • module-customer

    Fix submitted by Lukasz Bajsarowicz in pull requests 25800, 26323, 26321, 26320, 26319, 26322, 25828, 26329 (and pull requests 104, 105, 106, 107, 108, 109, 111, 119, 120, 121 in private repository partners-magento2ee). GitHub-22853

Theme

  • We’ve resolved a bug in JsFooterPlugin.php that affected the display of dynamic blocks. Previously, Magento displayed this error when you directly accessed /banner/ajax/load/url: Uncaught TypeError: strpos() expects parameter 1 to be string, null given in.
  • The i18n method provides the ability to add a string to underscore templates. Fix submitted by Sergiy Vasiutynskyi in pull request 26435. GitHub-18012
  • The section-config module has been refactored. This refactoring has reduced errors that were caused by third-party modules making POST requests or requesting customer data directly before the module was initialized by data-mage-init. Fix submitted by Mateusz Krzeszowiak in pull request 25764. GitHub-17125
  • LoadCssAsync HTML format errors have been fixed. Fix submitted by Sathish Subramanian in pull request 26764. GitHub-26760
  • When you create default.xml and catalog_product_view.xml files as part of creating a new theme, Magento either creates these pages or logs errors in the log files as expected. Previously, Magento logged errors in vendor/magento/framework/View/Page/Config/Renderer.php file. Fix submitted by Vinh Le in pull request 27026. GitHub-27009

Translation and locales

  • Inline translation now works as expected on the storefront when Admin > Stores > Configuration > Advanced > Developer > Translate Inline > Enabled for Storefront is set.
  • Inline translation now works as expected when enabled for a storefront.
  • Product URL keys are now transliterated as expected. Fix submitted by DanieliMi in pull request 26506. GitHub-26499
  • The es_US Spanish (United States) locale is now supported. Fix submitted by Vinh Le in pull request 26857. GitHub-26843
  • Numerical placeholder count and JavaScript code placeholder count are now the same. Previously, the JavaScript code assumed 0% while the numerical placeholder count started with %1. Fix submitted by korostii in pull request 25359. GitHub-25243
  • You can now disable the translation of the page title of the Product details page (page.main.title), which is enabled by default. Fix submitted by Bartomiej Szubert in pull request 26269. GitHub-7065
  • Issues with the rendering of Arabic and Hebrew in invoice PDFs have been resolved. Fix submitted by Ihor Sviziev in pull request 27887. GitHub-25769
  • Language pack inheritance order is now applied in a first-listed, first-used basis as expected and as described in the Magento documentation. Fix submitted by Sergiy Vasiutynskyi in pull request 26420. GitHub-8691
  • Magento now displays this error message when you enter a non-Latin character for a folder name in locales where only Latin letters are supported: Please rename the folder using only Latin letters, numbers, underscores and dashes. Fix submitted by Eden Duong in pull request 25904. GitHub-25896
  • The length of the locale column for directory_country_region_name has been increased from 8 to 16 to support locales such as zh_Hans_CN. Fix submitted by Bartomiej Szubert in pull request 26268. GitHub-14001

UI

  • The Back button now works as expected from Admin > Stores > Order Status > Edit Order Status. Fix submitted by Vadim Malesh in pull request 27976. GitHub-1270
  • Preview images no longer change unexpectedly when you use the arrow keys to move the cursor in the File Name field in the Adobe Stock list. Fix submitted by Adarsh Manickam in pull request 25991. GitHub-847
  • The Your Password field on the Current User Identity Verification section of the Admin > System > Integrations page now inherits styles as expected. Fix submitted by Eduard Chitoraga in pull request 25918. GitHub-25917
  • Input that is validated by the JavaScript validator on the storefront will also pass validation on the Admin. Previously, the JavScript validator counted newlines as a single character on the storefront, but on the server side, \Magento\Catalog\Model\Product\Option\Type\maxCharacters counted newlines as two characters. Fix submitted by Grzegorz Bogusz in pull request 26033. GitHub-25974
  • The subTitle tag is no longer erased when you change a modal title using the setTitle() call. Previously, when you tried to create a popup or custom modal with a title and subtitle, then changed title with the setTitle() method, the subTitle was erased. Fix submitted by Andrea Parmeggiani in pull request 26142. GitHub-26141
  • The submenu in the Admin Marketing tab now automatically adjusts to the length of menu items as expected. You can also now scroll horizontally. Fix submitted by Paweł Tylek in pull request 26034. GitHub-18687
  • The table quote column customer_note now uses type text as expected. Previously, it used type varchar(255). Fix submitted by Ravi Chandra in pull request 26160. GitHub-26155
  • Corrected display issues with the table header on the My Account > Address Book Address Entries table. Fix submitted by Abrar Pathan in pull request 27336. GitHub-27335
  • The currency symbol used in Layered Navigation Price Step is now based on default settings as expected. Fix submitted by Bartomiej Szubert in pull request 24815. GitHub-21684
  • The symbol for the Belarusian currency (BYR) has been updated to BYN. Fix submitted by Bartomiej Szubert in pull request 25723. GitHub-24713
  • The Compare Products section of the Catalog page is now displayed as expected in mobile view on displays with resolutions of less than 767px. Fix submitted by Hitesh in pull request 26418. GitHub-26416
  • Scrolling of product pages now works as expected in mobile view. Fix submitted by Mateusz Krzeszowiak in pull request 25385. GitHub-10518, GitHub-21717
  • You can now scroll through gallery thumbnail images on the product page in mobile view as expected. Fix submitted by iGerchak in pull request 25839. GitHub-21014
  • Clicking on Theme Title on Admin > Content > Themes no longer results in duplicate records. Fix submitted by Eden Duong in pull request 25926. GitHub-25925
  • The layout of the Admin Billing Address/Shipping Address page has been refactored to meet Magento Admin form display conventions. Fix submitted by Alexey Rakitin in pull request 25699. GitHub-23481, GitHub-19805
  • The Add to Compare link on the product detail page now renders correctly in mobile view on displays with less than 640px resolution. Fix submitted by Pawe Tylek in pull request 26424 and Tejash Kumbhare in pull request 26365. GitHub-26364
  • The Sort By label no longer overlaps with the Shop By button on the category page in mobile view. Fix submitted by Andrii Kartavtsev in pull request 26381. GitHub-25300
  • You can now update the value of a downloadable product’s sample and link title by enabling the Use default checkbox. Fix submitted by Abel Truong in pull request 27295. GitHub-27169
  • Corrected spacing between the Update button and Qty field on the mini cart. Fix submitted by Hitesh in pull request 26234. GitHub-26227
  • The bottom border color of the Additional Address Entries table on the Address Book page now matches thead and tbody border color. Fix submitted by Tejash Kumbhare in pull request 26649. GitHub-26648
  • Prompt modals no longer carry out a confirm action when a user clicks on the modal overlay. Fix submitted by Serhiy Zhovnir in pull request 27399.

URL

  • The category repository (save method) has been refactored, which had previously prevented you from creating unique paths when changing a category URL key. Fix submitted by Sergiy Vasiutynskyi in pull request 27304. GitHub-14080
  • Validation for the category URL key logic has been improved. Fix submitted by Sergiy Vasiutynskyi in pull request 27412. GitHub-13689

URL rewrites

  • Customers who change language on a CMS page can now successfully navigate to the store view they’ve selected. Previously, Magento displayed a 404 error.
  • URL rewrite generation for product URLs for which you’ve enabled category path inclusion now works as expected. Previously, in deployments with multiple store views, Magento sometimes generated incorrect URL rewrites by using the default value of the category url path instead of the storeview-specific URL path. Fix submitted by Pieter Hoste in pull request 26784. GitHub-25124, GitHub-11616
  • We’ve added a check to prevent URL redirects if the request path is the same as the target path. Fix submitted by Bartomiej Szubert in pull request 26902. GitHub-20309
  • URL rewrite operations no longer removes a query string from a URL when the URL has a trailing slash. Fix submitted by Alexey Arendarenko in pull request 25603. GitHub-18717

VAT

Web API framework

  • Corrected issues with the POST /rest/default/async/bulk/V1/orders calls.
  • Corrected issues with the POST /rest/default/async/bulk/V1/products calls.
  • The getList method has been refactored to retrieve the is_subscribed extension attribute. Previously, you could not retrieve this attribute when fetching a customer entity through the API. Fix submitted by enriquei4 in pull request 25311. GitHub-13252
  • Updating customer information through /V1/customers/:id no longer resets the group_id unnecessarily. Previously, when you updated a customer through REST, the customer group was changed to 1 if the body did not contain a customer group. Fix submitted by MaxRomanov4669 in pull request 25958. GitHub-14663
  • Nullable getters in service contracts no longer throw reflection errors when used in the web API. Methods that can return null and a valid type now working correctly regardless of order, too. Fix submitted by Marco K̦pcke in pull request 25806. GitHub-25656
  • You can now use POST /V1/guest-carts/:cartId/items to add products to a specific cart. Previously, when you used this call, Magento ignored the value of cartId. Fix submitted by Vadim Malesh in pull request 27172. GitHub-14086
  • You can now use the PUT /V1/cmsPage/:id endpoint to save a CMS page title without changing the values of other fields. Fix submitted by Vadim Malesh in pull request 27237. GitHub-24704
  • The pagination of results from REST requests is now accurate. Previously, when you requested results from a specific page (for example, page_size = 1 and a current_page value that was out of scope), the call returned repeated the last page of results rather than an informative message . Fix submitted by Lukasz Bajsarowicz in pull request 26988. GitHub-26986, GitHub-8099
  • The result of GET /V1/orders/items/{id} now includes an extension attribute element that includes gift message data. Fix submitted by Laura Folco in pull request 25946. GitHub-19093

Wishlist

  • A wishlist now works as expected when it is enabled at the store-view level and disabled at the global level. Previously, when these settings were in place, adding a product to a wishlist resulted in a 404 error.
  • We’ve improved the error message that is displayed when a customer tries to share their wishlist with more email addresses than is permitted. Fix submitted by divyajyothi5321 in pull request 26066. GitHub-26064
  • Magento now displays the My Wishlist page as expected in displays with resolution greater than 768px and less than 1023px. Fix submitted by Hitesh in pull request 26546. GitHub-26543
  • The email generated when you click Share Wishlist now displays the same product images as the Wishlist page. Fix submitted by Michael Bottens in pull request 27125. GitHub-27124
  • Customers can now add to a wishlist both a simple product that is part of grouped product and the same simple product with a different quantity. Fix submitted by MaxRomanov4669 in pull request 26258. GitHub-11209

WYSIWYG

  • The WYSIWYG image uploader now uses pub/media/wysiwyg as the storage root. Previously, the uploaded used pub/media as its storage root, which made those uploaded images inaccessible after recent changes to image uploader code. Fix submitted by Pieter Hoste in pull request 24878. GitHub-22609
  • TinyMCE4 on the Chrome browser now handles double-byte characters as expected. Previously, TinyMCE4 could not properly handle double-byte characters (such as used in Chinese) on Chrome. Fix submitted by Hirokazu Nishi in pull request 25454. GitHub-24637

Known issues – General

Issue: Anomalies in storefront error messages occur in deployments where PHP 7.4.2 is installed. When Magento 2.4.0 is deployed with PHP 7.4.2, the space symbols in storefront error messages are replaced with plus (+) characters. This bug is native to PHP 7.4.2 and cannot be corrected by Magento. Workaround: Magento recommends using other versions of PHP 7.4.x. See Raw message data display on storefront Knowledge Base article.

Issue: Merchants cannot add ordered products to a package from the Admin Create Package page and save the package. See Shipping labels creation Knowledge Base article. The MC-35514-2.4.0-CE-composer.patch hotfix for this issue is now available from Releases.

Issue: Magento displays this error message during installation of Magento with third-party extensions that have dependencies on APIs for the Store module in CLI commands: The default website isn't defined. Set the website and try again. Workaround: Remove dependencies on third-party extensions from Composer, install Magento, and then install third-party extensions.

Issue: The Add selections to my cart button on the bottom of the shopping cart does not work. Workaround: Use the Add selections to my cart button on the top of the page. See Add selections to my cart button does not work Knowledge Base article.

Issue: Merchants can’t create a new order from the Admin because the Add Products By SKU and Add Products  buttons are missing from the order creation page when JavaScript bundling is enabled. Workaround: Disable the JavaScript bundling for your Magento deployment.

Issue: Magento throws a 404 not found error when a customer tries to remove reward points when checking out an order being shipped to multiple addresses.

Issue: Editing a configurable product from a customer’s wishlist results in the following unexpected behavior: An unexpected field appears on the Configure Product page, and the Configure Product page does not disappear after you click OK. Magento also displays this message: Please load Wish List item. Workaround: Reload the Configure Product page.

Issue: Customers cannot change the number of orders displayed per page when the Orders list spans multiple pages. Currently, Magento displays this message when you navigate to the last page of orders and try to change the number of orders displayed per page: You have placed no orders. See Orders display error Knowledge Base article. Workaround: Re-opening the My Orders page will result in the display of the Orders list.

Issue: Directly clicking on the Export Tax Rates button of the Add New Tax Rule page (Stores > Tax Rules) does not download the tax_rates.csv file as expected. Workaround: Click the edge of the Export Tax Rates button. See Export Tax Rates does not work Knowledge Base article.

Issue: The Refresh buttons on the Last Ordered Items, Products in Comparison List, and Recently Compared Products sections of the Admin Customer Activities page do not work as expected. Currently, Magento scrolls the page every time the Refresh button is clicked and does not display the product name. See Refresh on Customer’s Activities does not work Knowledge Base article.

Known issues – VBE

Amazon Pay

  • Issue: Payment methods are missing from the checkout workflow when a customer clicks Return to standard checkout during checkout with Amazon Pay. Workaround: Refresh the checkout page to display the missing methods.

  • Issue: Magento displays two identical Amazon Pay methods in the Payment Method drop-down list that is available when creating a new cart price rule.

Braintree

  • Issue: Magento displays an error when an administrator tries to access the Braintree Settlement Report page (Admin > Reports ). Currently, Magento displays this message: An error has happened during application run. See exception log for details. See Braintree Settlement Report fails to load Knowledge Base article. The BUNDLE-2683_SettlementReport.patch hotfix for this issue is now available from Releases.

  • Issue: Merchants can’t create partial invoices for orders in deployments where Venmo is enabled and the Enable Vault for Card Payments setting is disabled. Currently, Magento displays this error: The "vault_capture" command doesn't exist. Verify the command and try again.

  • Issue: Magento displays two identical PayPal methods in the Payment Method drop-down list that is available when creating a new cart price rule.

  • Issue: Magento throws an error when opening Sales > Braintree Virtual Terminal. Although the form contains corrupted UI elements, it still accepts payments. Workaround: Save the correct Braintree credentials, which will fix the collapsed input fields. See Braintree Virtual Terminal page is corrupted Knowledge Base article. The BUNDLE-2670_VirtualTerminal.patch hotfix for this issue is now available from Releases.

  • Issue: Magento displays an error message in the following countries when a customer selects a local payment method during checkout: Belgium, Netherlands, Italy, Spain, and Poland. Workaround: Ignore the error message and continue with payment.

Klarna

  • Issue: Leaving the Design Theme field blank in Klarna On-Site Messaging (Admin > Stores > Configuration > Klarna settings) results in a blank page. Workaround: Select a design theme and save.

Vertex

  • Issue: Magento displays an Address verification button on the shipping section of the checkout workflow even when address validation is disabled. The address validator doesn’t re-check the updated address and continues to display a message that indicates that the address is invalid when a customer enters a correct address after first entering an incorrect address even when address validation is enabled. Workaround: Disable Vertex address validation.

Community contributions

We are grateful to the wider Magento community and would like to acknowledge their contributions to this release. Check out the following ways you can learn about the community contributions to our current releases:

  • If a community member has provided a fix for this release, we identify the fix in the Fixed Issue section of these notes with the phrase, “Fix provided by community member @member_name”.

  • The Magento Community Engineering team Magento Contributors maintains a list of top contributing individuals and partners by month, quarter, and year. From that Contributors page, you can follow links to their merged PRs on GitHub.

Partner contributions

The following table highlights contributions made by Partners. This table lists the Partner who contributed the pull request, the external pull request, and the GitHub issue number associated with it (if available).

Partner Pull Requests Related GitHub Issues
Atwix magento/magento2#25774, magento/magento2#25913, magento/magento2#25765, magento/magento2#25918, magento/magento-functional-tests-migration#744, magento/magento-functional-tests-migration#746, magento/magento-functional-tests-migration#711, magento/magento2#26069, magento/magento2#26063, magento/magento2#25697, magento/magento2#26154, magento/magento2#26150, magento/magento2#26148, magento/magento2#26096, magento/magento2#26028, magento/magento2#25864, magento/magento2#26029, magento/magento2#26251, magento/magento2#25985, magento/magento-functional-tests-migration#760, magento/magento-functional-tests-migration#757, magento/magento-functional-tests-migration#701, magento/magento2#26312, magento/magento2#26311, magento/magento2#26305, magento/magento2#26402, magento/magento2#26313, magento/magento2#26464, magento/magento2#26452, magento/partners-magento2ee#129, magento/partners-magento2ee#128, magento/magento2#26558, magento/magento2#26490, magento/magento2#26478, magento/magento2#26455, magento/magento2#26435, magento/magento2#26000, magento/magento2#26525, magento/magento2#26487, magento/magento2#26439, magento/magento2#26429, magento/magento2#26241, magento/magento2#26579, magento/magento2#26574, magento/magento2#26569, magento/magento2#26496, magento/magento2#26476, magento/magento2#26430, magento/magento2#26399, magento/magento2#26420, magento/magento2#26770, magento/magento2#26715, magento/magento2#26246, magento/magento2#26816, magento/magento2#26846, magento/magento2#26844, magento/magento2#26839, magento/magento2#26835, magento/magento2#26769, magento/magento2#26712, magento/magento2#26317, magento/magento2#26904, magento/magento2#26899, magento/magento2#26894, magento/magento2#26878, magento/magento2#26710, magento/magento2#26617, magento/partners-magento2ee#134, magento/magento2#26833, magento/magento2#26755, magento/magento2#26090, magento/magento2#25895, magento/magento2#27021, magento/magento2#26947, magento/magento2#26944, magento/magento2#26912, magento/magento2#26842, magento/magento2#27010, magento/magento2#27114, magento/magento2#27057, magento/magento2#27149, magento/magento2#27131, magento/magento2#27029, magento/partners-magento2ee#141, magento/partners-magento2ee#140, magento/partners-magento2ee#139, magento/magento2#26563, magento/partners-magento2ee#154, magento/magento2#25722, magento/magento2#27261, magento/magento2#27170, magento/magento2#27266, magento/magento2#27165, magento/magento2#26560, magento/magento2#27191, magento/magento2#26015, magento/magento2#27304, magento/magento2#27263, magento/magento2#27390, magento/magento2#27353, magento/magento2#27334, magento/magento2#27307, magento/magento2#22011, magento/magento2#27412, magento/magento2#27383, magento/magento2#27371, magento/magento2#27493, magento/magento2#27492, magento/magento2#26100, magento/magento2#27399, magento/partners-magento2ee#162, magento/magento-functional-tests-migration#724, magento/magento-functional-tests-migration#723, magento/magento-functional-tests-migration#710, magento/magento-functional-tests-migration#707, magento/magento-functional-tests-migration#706, magento/magento2#27526, magento/magento2#27497, magento/magento2#27495, magento/magento2#27563, magento/magento2#27343, magento/magento2#27671, magento/magento-functional-tests-migration#765, magento/magento-functional-tests-migration#764, magento/magento-functional-tests-migration#762, magento/magento-functional-tests-migration#761, magento/magento-functional-tests-migration#759, magento/magento-functional-tests-migration#751, magento/magento2#27676, magento/magento2#27689, magento/magento2#27677, magento/magento2#27843, magento/magento2#27841, magento/magento2#27692, magento/magento2#27846 magento/magento2#25739, magento/magento2#25917, magento/magento2#20379, magento/magento2#761, magento/magento2#23899, magento/magento2#25968, magento/magento2#25162, magento/magento2#18012, magento/magento2#26240, magento/magento2#17847, magento/magento2#26332, magento/magento2#8691, magento/magento2#26245, magento/magento2#26314, magento/partners-magento2ee#100, magento/magento2#25910, magento/magento2#13269, magento/magento2#25738, magento/magento2#27027, magento/magento2#26758, magento/magento2#26847, magento/magento2#25669, magento/magento2#20472, magento/magento2#20906, magento/magento2#21910, magento/magento2#26825, magento/magento2#26473, magento/magento2#26856, magento/magento2#26858, magento/magento2#26827, magento/magento2#14080, magento/magento2#26708, magento/magento2#26224, magento/magento2#22010, magento/magento2#13689, magento/magento2#27370, magento/magento2#26652, magento/magento2#24990, magento/magento2#1002, magento/magento2#27496, magento/magento2#13851
Mediotype magento/magento2#26225, magento/magento2#26274, magento/magento2#26273, magento/magento2#26259, magento/magento2#26207, magento/partners-magento2ee#120, magento/partners-magento2ee#108, magento/partners-magento2ee#107, magento/partners-magento2ee#106, magento/partners-magento2ee#105, magento/partners-magento2ee#104, magento/magento2#26407, magento/magento2#26395, magento/magento2#26323, magento/magento2#26321, magento/magento2#26320, magento/magento2#26319, magento/partners-magento2ee#109, magento/partners-magento2ee#119, magento/partners-magento2ee#111, magento/magento2#26322, magento/partners-magento2ee#121, magento/partners-magento2ee#117, magento/magento2#26391, magento/partners-magento2ee#124, magento/partners-magento2ee#102, magento/magento2#26614, magento/magento2#26480, magento/magento2#26355, magento/magento2#26611, magento/magento2#26621, magento/partners-magento2ee#116, magento/partners-magento2ee#115, magento/magento2#26608, magento/partners-magento2ee#135, magento/magento2#25858, magento/magento2#26974, magento/magento2#25828, magento/magento2#27048, magento/magento2#26779, magento/magento2#26329, magento/magento2#26778, magento/partners-magento2ee#132, magento/magento2#26990, magento/magento2#27281, magento/magento2#27277, magento/magento2#27274, magento/magento2#27249, magento/magento2#27118, magento/partners-magento2ee#151, magento/magento2#27255, magento/magento2#27273, magento/magento2#27298, magento/magento2#27292, magento/magento2#27214, magento/partners-magento2ee#158, magento/magento2#27276, magento/magento2#27000, magento/magento2#27378, magento/magento2#27381, magento/magento2#27427, magento/magento2#27425, magento/magento2#27322, magento/magento2#27321, magento/magento2#27597, magento/partners-magento2ee#172, magento/magento2#26988, magento/magento2#27552, magento/magento2#27701, magento/partners-magento2ee#178, magento/magento2#27325, magento/magento2#27606, magento/magento2#27300, magento/magento2#27323, magento/magento2#27093, magento/magento2#27964 magento/magento2#26206, magento/magento2#26331, magento/magento2#26396, magento/magento2#26612, magento/magento2#26479, magento/magento2#26610, magento/partners-magento2ee#26607, magento/magento2#25856, magento/magento2#26973, magento/magento2#27044, magento/magento2#26989, magento/partners-magento2ee#27117, magento/magento2#27320, magento/partners-magento2ee#171, magento/magento2#26986, magento/partners-magento2ee#27638, magento/magento2#27607, magento/magento2#27299, magento/magento2#27089
Strix magento/magento2#25822, magento/magento2#25812, magento/magento2#25803, magento/magento2#25792, magento/magento2#25791, magento/magento2#25954, magento/magento2#26009, magento/magento2#25854, magento/magento2#25846, magento/magento2#25845, magento/magento2#25844, magento/magento2#25842, magento/magento2#25841, magento/magento2#25836, magento/magento2#25831, magento/magento2#25830, magento/magento2#25829, magento/magento2#25825, magento/magento2#25823, magento/magento2#25821, magento/magento2#25820, magento/magento2#25819, magento/magento2#25818, magento/magento2#25817, magento/magento2#25816, magento/magento2#25815, magento/magento2#25813, magento/magento2#25811, magento/magento2#25807, magento/magento2#25804, magento/magento2#25802, magento/magento2#25800, magento/magento2#25799, magento/magento2#25797, magento/magento2#25794, magento/magento2#25793, magento/magento2#25788, magento/magento2#25787, magento/magento2#25784, magento/magento2#25783, magento/magento2#26128, magento/magento2#26131, magento/magento2#26129, magento/magento2#26126, magento/magento2#26125, magento/magento2#25957 magento/magento2#22047
Ziffity magento/magento2#25808, magento/magento2#26057, magento/magento2#26050, magento/magento2#25920, magento/magento2#26068, magento/magento2#26136, magento/magento2#26215, magento/magento2#26540, magento/magento2#26537, magento/magento2#26549, magento/magento2#26568, magento/magento2#26782, magento/magento2#26764, magento/magento2#26820, magento/magento2#26771, magento/magento2#26768, magento/magento2#26761, magento/magento2#26584, magento/magento2#26932, magento/magento2#26862, magento/magento2#26979, magento/magento2#26928, magento/magento2#27014, magento/magento2#27740, magento/magento2#26886 magento/magento2#26208, magento/magento2#26760, magento/magento2#26583, magento/magento2#26917, magento/magento2#26838, magento/magento2#26800, magento/magento2#26992
Fast White Cat magento/magento2#25723, magento/magento2#26130, magento/magento2#24815, magento/magento2#26268, magento/magento2#26263, magento/magento2#26354, magento/magento2#26269, magento/magento2#26360, magento/magento2#26684, magento/magento2#26398, magento/magento2#22296, magento/magento2#26982, magento/magento2#27054, magento/magento2#26765, magento/magento2#27084, magento/magento2#27083, magento/magento2#27082, magento/magento2#27080, magento/magento2#26964, magento/magento2#26902, magento/magento2#27145, magento/magento2#27215, magento/magento2#26923, magento/magento2#27319, magento/magento2#27393, magento/magento2#27385, magento/magento2#27384, magento/partners-magento2ee#150, magento/magento2#26075, magento/magento2#27462, magento/magento2#26397, magento/magento2#27463, magento/magento2#27491 magento/magento2#24713, magento/magento2#25390, magento/magento2#21684, magento/magento2#14001, magento/magento2#14913, magento/magento2#7065, magento/magento2#14958, magento/magento2#17933, magento/magento2#20309, magento/magento2#186, magento/magento2#6310
creativestyle magento/magento2#25541, magento/magento2#25587, magento/magento2#26037, magento/magento2#26034, magento/magento2#26033, magento/magento2#26424, magento/magento2#25385, magento/magento2#25764, magento/magento2#25641, magento/magento2#27360, magento/magento2#26036, magento/magento2#27603, magento/magento2#27589 magento/magento2#22416, magento/magento2#25586, magento/magento2#18687, magento/magento2#25974, magento/magento2#26364, magento/magento2#10518, magento/magento2#21717, magento/magento2#17125, magento/magento2#25032, magento/magento2#27506
Fisheye magento/magento2#25655, magento/magento2#25624, magento/magento2#23313, magento/partners-magento2ee#50, magento/magento2#25860, magento/magento2#25297 magento/magento2#25654, magento/partners-magento2ee#22909
Vaimo magento/magento2#25452, magento/magento2#26213, magento/magento2#27015, magento/magento2#27448, magento/magento2#27578 magento/magento2#20966, magento/magento2#26683
Wagento magento/magento2#25973, magento/magento2#26234, magento/magento2#26290, magento/magento2#26238, magento/magento2#26365, magento/magento2#25966, magento/magento2#26546, magento/magento2#26339, magento/magento2#26342, magento/magento2#26659, magento/magento2#26418, magento/magento2#26649 magento/magento2#25972, magento/magento2#26227, magento/magento2#26289, magento/magento2#26235, magento/magento2#26364, magento/magento2#25962, magento/magento2#26543, magento/magento2#26338, magento/magento2#26054, magento/magento2#26416, magento/magento2#26648
Krish TechnoLabs magento/magento2#26160, magento/magento2#26170, magento/partners-magento2ee#118, magento/magento2#26162, magento/partners-magento2ee#143, magento/magento2#27336 magento/magento2#26155, magento/magento2#24972, magento/magento2#25195, magento/magento2#27335
i95Dev magento/magento2#26011, magento/magento2#25759, magento/magento2#26173, magento/magento2#26182, magento/magento2#26066, magento/magento2#26237, magento/magento2#26183, magento/magento2#26169 magento/magento2#25930, magento/magento2#25433, magento/magento2#26164, magento/magento2#26176, magento/magento2#26064, magento/magento2#25936, magento/magento2#26181, magento/magento2#26168
Something Digital magento/magento2#26359, magento/magento2#26185, magento/partners-magento2ee#60  
Comwrap magento/partners-magento2ee#68, magento/magento2#27257  
Zilker Technology magento/magento2#25428, magento/magento2#26714, magento/magento2#25991, magento/magento2#27138 magento/magento2#14885, magento/magento2#847, magento/magento2#973
Youwe magento/magento2#24360, magento/magento2#25194, magento/magento2#26748 magento/magento2#24357, magento/magento2#25188, magento/magento2#26745
Reach Digital magento/magento2#25875 magento/magento2#9466
Cedcommerce magento/magento2#26628, magento/magento2#26348, magento/magento2#27886 magento/magento2#26345, magento/magento2#27874
Divante magento/magento-functional-tests-migration#718, magento/magento-functional-tests-migration#720, magento/magento-functional-tests-migration#719, magento/magento-functional-tests-migration#717  
Interactiv4 magento/magento2#24843, magento/magento2#25311 magento/magento2#24842, magento/magento2#13252
Monsoon magento/magento2#26044, magento/partners-magento2ee#136, magento/magento2#26869, magento/magento2#26868, magento/magento2#26821, magento/magento2#26697  
MediaCT magento/partners-magento2ee#145  
Aligent Consulting magento/magento2#26623, magento/magento2#26781 magento/magento2#26622
Maginus magento/magento2#26413, magento/magento2#27196  
integer_net GmbH magento/magento2#25851, magento/magento2#24485  
Veriteworks magento/magento2#25454 magento/magento2#24637

Individual contributor contributions

The following table identifies contributions from our community members. This table lists the external pull requests, the GitHub issue number associated with it (if available), and the community member who contributed the pull request.

Contributing community member Pull Requests Related GitHub Issues  
Eden Duong #25905 N/A  
Ajith #25808 N/A  
Marco Köpcke #25790 24229  
Eduard Chitoraga #25774 N/A  
Edward Simpson #25604 N/A  
Mateusz Krzeszowiak #25541 22416  
Eden Duong #25939 N/A  
Eden Duong #25928 N/A  
Eduard Chitoraga #25913 N/A  
Lukasz Bajsarowicz #25822 N/A  
Lukasz Bajsarowicz #25812 N/A  
Lukasz Bajsarowicz #25803 N/A  
Lukasz Bajsarowicz #25791 N/A  
Lukasz Bajsarowicz #25792 N/A  
Andrii Beziazychnyi #25765 25739  
Nathan Morgan #25655 25654  
Eden Duong #25952 25731  
Eden Duong #25942 25935  
Eden Duong #25932 25931  
Eden Duong #25926 25925  
Eduard Chitoraga #25918 25917  
Ihor Sviziev #25912 25911  
Adam Mellen #25995 N/A  
Eden Duong #25984 N/A  
Eden Duong #25982 N/A  
Lukasz Bajsarowicz #25954 N/A  
Eden Duong #25924 25893  
Eden Duong #25904 25896  
Bartłomiej Szubert #25723 24713  
Alexey Rakitin #25699 19805, 23481  
Phil #25262 N/A  
Eden Duong #26016 N/A  
Eden Duong #25997 N/A  
Eden Duong #25993 N/A  
Nazar Klovanych #25992 N/A  
Hitesh #25973 25972  
maslii #25975 N/A  
Dan Wallis #25624 N/A  
Namrata #25114 N/A  
Mateusz Krzeszowiak #25587 25586  
Eduard Chitoraga #26069 N/A  
Eden Duong #26067 N/A  
Eduard Chitoraga #26063 20379  
Sathish Subramanian #26057 N/A  
Sathish Subramanian #26050 N/A  
Giancarlo Peris #26044 N/A  
Eden Duong #26045 N/A  
Eden Duong #26042 N/A  
Eden Duong #26043 N/A  
Krzysztof Daniel #26037 N/A  
Paweł Tylek #26034 18687  
Eden Duong #26003 N/A  
Łukasz Lewandowski #26001 24025  
Sergey Dovbenko #25940 100  
Eduard Chitoraga #25697 N/A  
Rafael Corrêa Gomes #25523 N/A  
Tan Sezer #24360 24357  
Eden Duong #26060 N/A  
Eden Duong #26059 N/A  
Matheus Gontijo #26058 N/A  
divyajyothi5321 #26011 25930  
Eden Duong #26004 N/A  
Sathish Subramanian #25920 N/A  
Eden Duong #26082 N/A  
Eden Duong #26076 N/A  
Sathish Subramanian #26068 N/A  
Lukasz Bajsarowicz #26009 N/A  
Ashna-Jahan #25759 25433  
Lukasz Bajsarowicz #25854 N/A  
Lukasz Bajsarowicz #25846 N/A  
Lukasz Bajsarowicz #25845 N/A  
Lukasz Bajsarowicz #25844 N/A  
Lukasz Bajsarowicz #25842 N/A  
Lukasz Bajsarowicz #25841 N/A  
Lukasz Bajsarowicz #25831 N/A  
Lukasz Bajsarowicz #25836 N/A  
Lukasz Bajsarowicz #25830 N/A  
Lukasz Bajsarowicz #25829 N/A  
Lukasz Bajsarowicz #25825 N/A  
Lukasz Bajsarowicz #25823 N/A  
Lukasz Bajsarowicz #25821 N/A  
Lukasz Bajsarowicz #25819 N/A  
Lukasz Bajsarowicz #25820 N/A  
Lukasz Bajsarowicz #25818 N/A  
Lukasz Bajsarowicz #25817 N/A  
Lukasz Bajsarowicz #25816 N/A  
Lukasz Bajsarowicz #25815 N/A  
Lukasz Bajsarowicz #25813 N/A  
Lukasz Bajsarowicz #25811 N/A  
Lukasz Bajsarowicz #25807 N/A  
Lukasz Bajsarowicz #25804 N/A  
Lukasz Bajsarowicz #25802 N/A  
Lukasz Bajsarowicz #25800 N/A  
Lukasz Bajsarowicz #25799 N/A  
Lukasz Bajsarowicz #25797 N/A  
Lukasz Bajsarowicz #25794 N/A  
Lukasz Bajsarowicz #25793 N/A  
Lukasz Bajsarowicz #25788 N/A  
Lukasz Bajsarowicz #25787 N/A  
Lukasz Bajsarowicz #25784 N/A  
Lukasz Bajsarowicz #25783 N/A  
Gihovani Filipp Pereira Demétrio #26157 N/A  
Ravi Chandra #26160 26155  
Eduard Chitoraga #26154 N/A  
Eduard Chitoraga #26150 #26148  
Eden Duong #26140 N/A  
Sathish Subramanian #26136 N/A  
Lukasz Bajsarowicz #26128 N/A  
Eden Duong #26127 N/A  
Eduard Chitoraga #26096 N/A  
Andrii Beziazychnyi #26028 N/A  
Serhiy Zhovnir #25864 761  
Daniel Ruf #24849 N/A  
Lukasz Bajsarowicz #26131 N/A  
Lukasz Bajsarowicz #26129 N/A  
Lukasz Bajsarowicz #26125 N/A  
Grzegorz Bogusz #26033 25974  
Pavel Bystritsky #25915 N/A  
Andreas Mautz #25838 25674  
Marc Rodriguez #25315 13136  
Lukasz Bajsarowicz #25957 22047  
David Lambauer #24103 N/A  
divyajyothi5321 #26173 26164  
Ravi Chandra #26170 24972  
azambon #25876 25659  
Adarsh Manickam #25428 N/A  
Andrey Legayev #25125 N/A  
Lukasz Bajsarowicz #26225 N/A  
Alexey Arendarenko #25603 18717  
divyajyothi5321 #26182 26176  
Bartłomiej Szubert #26130 25390  
Marco Oliveira #26084 26083  
divyajyothi5321 #26066 26064  
MaxRomanov4669 #25958 14663  
Anton Kaplya #25479 N/A  
Torben Höhn #25640 N/A  
Edward Simpson #25478 N/A  
Behnam Shayani #25452 20966  
Bartłomiej Szubert #24815 21684  
Eden Duong #24471 24468  
Pavel Bystritsky #22917 22856  
Lukasz Bajsarowicz #26274 N/A  
Lukasz Bajsarowicz #26273 N/A  
Bartłomiej Szubert #26268 14001  
aleromano89 #26264 23521  
Lukasz Bajsarowicz #26259 N/A  
divyajyothi5321 #26237 25936  
Hitesh #26234 26227  
Sathish Subramanian #26215 26208  
Lukasz Bajsarowicz #26207 26206  
divyajyothi5321 #26183 26181  
divyajyothi5321 #26169 26168  
Yaroslav Rogoza #26029 N/A  
Laura Folco #25946 19093  
miszyman #25250 23350  
Hitesh #26290 26289  
Marco Oliveira #26270 22964  
Bartłomiej Szubert #26263 14913  
Eduard Chitoraga #26251 N/A  
Riccardo Tempesta #26218 26217  
Pawan Kumar Parmar #26048 N/A  
Andrii Chorniy #25985 23899  
Douglas Radburn #25337 14971  
Denis Kopylov #22990 22988  
Bartłomiej Szubert #26360 N/A  
Patrick McLain #26359 N/A  
Bartłomiej Szubert #26354 N/A  
Alexander Taranovsky #26312 N/A  
Eduard Chitoraga #26311 N/A  
Eduard Chitoraga) #26305 N/A  
Bartłomiej Szubert #26269 7065  
MaxRomanov4669 #26258 11209  
Hitesh #26238 26235  
Patrick McLain #26185 N/A  
Eden Duong #26051 25130  
Eden Duong #25909 25881  
Benjamin Rosenberger #25718 N/A  
Benjamin Rosenberger #25716 N/A  
Matti Vapa #25375 25373  
Mychailo #25333 25278  
dhoang89 #25194 25188  
Thomas Klein #25083 N/A  
Gihovani Filipp Pereira Demétrio #24955 22304  
John Hughes #23313 22909  
Lukasz Bajsarowicz #26407 26396  
Lukasz Bajsarowicz #26395 26396  
Lukasz Bajsarowicz #26323 26331  
Lukasz Bajsarowicz #26321 26331  
Lukasz Bajsarowicz #26320 26331  
Lukasz Bajsarowicz #26319 26331  
Paweł Tylek #26424 26364  
Alexander Taranovsky #26402 N/A  
Tejash Kumbhare #26365 26364  
Andrii Chorniy #26313 25968  
Timon de Groot #26495 N/A  
Alexander Taranovsky #26464 N/A  
Alexander Taranovsky #26452 N/A  
Lukasz Bajsarowicz #26322 26331  
Lukasz Bajsarowicz #26391 N/A  
Vikalp Saxena #26628 N/A  
Lukasz Bajsarowicz #26614 26612  
Eduard Chitoraga #26558 N/A  
Ajith #26540 N/A  
Ajith #26537 N/A  
Fred Orosko Dias #26512 N/A  
Fred Orosko Dias #26511 N/A  
Fred Orosko Dias #26509 N/A  
Andrii Chorniy #26490 N/A  
Ravinder #26489 26437  
Lukasz Bajsarowicz #26480 26479  
Karyna Tsymbal #26478 N/A  
Oleh Usik #26455 25162  
deepaksnair #26445 25761  
Sergiy Vasiutynskyi #26435 18012  
Tjitse #26434 N/A  
Andrii Kartavtsev #26381 25300  
iGerchak #26327 N/A  
Daniel Ruf #26285 26275  
Stanislav Ilnytskyi #26071 26065  
Fred Orosko Dias #25994 N/A  
iGerchak #25839 21014  
Mateusz Krzeszowiak #25385 10518, 21717  
Lukasz Bajsarowicz #26355 N/A  
Manuel Eduardo Cánepa Cihuelo #26296 N/A  
Alexander Taranovsky #26000 N/A  
Hitesh #25966 25962  
Jeroen #25875 9466  
Mateusz Krzeszowiak #25764 17125  
Vinai Kopp #24460 N/A  
Namrata #26634 N/A  
Lukasz Bajsarowicz #26611 26610  
Sathish Subramanian #26549 N/A  
Karyna Tsymbal #26525 N/A  
Karyna Tsymbal #26487 N/A  
Alexander Taranovsky #26439 N/A  
Alexander Taranovsky #26429 N/A  
Sergiy Vasiutynskyi #26241 26240  
Risha Tiwari #26641 N/A  
Karyna Tsymbal #26579 N/A  
Dmitry Tsymbal #26574 N/A  
Oleh Usik #26569 17847  
Ajith #26568 N/A  
Mayank Zalavadia #26542 N/A  
Yevhen Sentiabov #26533 21555, 26532  
Eduard Chitoraga #26496 N/A  
Alexander Taranovsky #26476 N/A  
Erfan Shamabadi #26462 N/A  
Michele Fantetti #26451 N/A  
Karyna Tsymbal #26430 N/A  
Karyna Tsymbal #26399 26332  
Paavo Pokkinen #26213 N/A  
KaushikChavda #26007 25591  
Dan Wallis #25860 N/A  
Willem Wigman #25851 N/A  
jimuld #25742 N/A  
Raúl Verdugo Lorenzo #25324 13865  
George Babarus #24648 N/A  
Andreas von Studnitz #24485 N/A  
Chris Pook #26378 26375  
Paweł Tylek #25641 25032  
Andrey Nikolaev #25285 N/A  
Sergiy Vasiutynskyi #26420 8691  
Raul E Watson #26413 N/A  
Ravi Chandra #26162 25195  
Lachlan Turner #26623 26622  
Lukasz Bajsarowicz #26621 N/A  
Hitesh #26546 26543  
Fanis Strezos #26423 25268  
Tejash Kumbhare #26339 26338  
Jens Scherbl #24691 N/A  
Ajith #26782 N/A  
Matthew O’Loughlin #26781 N/A  
Karyna Tsymbal #26770 N/A  
Sathish Subramanian #26764 26760  
Adarsh Manickam #26714 14885  
Karyna Tsymbal #26715 N/A  
Shankar Konar #26502 863  
Yurii Tvardyi #26279 26276  
Alexander Taranovsky #26246 26245  
Andrea Parmeggiani #26142 26141  
toxix #25488 25487  
Nikita Sarychev #25249 N/A  
vishal-webkul #25246 25245  
adrian-martinez-interactiv4 #24843 24842  
Sathish Subramanian #26820 N/A  
Karyna Tsymbal #26816 N/A  
Ajith #26771 N/A  
Bartłomiej Szubert #26684 N/A  
Pratik Mehta #26674 N/A  
Tejash Kumbhare #26342 N/A  
Adarsh Manickam #25991 847  
Vinh Le #26857 26843  
Alexander Taranovsky #26846 N/A  
Karyna Tsymbal #26844 N/A  
Karyna Tsymbal #26835 N/A  
Karyna Tsymbal #26839 N/A  
Karyna Tsymbal #26769 N/A  
Ajith #26768 N/A  
Karyna Tsymbal #26712 N/A  
Vova Yatsyuk #26688 N/A  
Dasharth Patel #26659 26054  
Bartłomiej Szubert #26398 N/A  
Sergiy Vasiutynskyi #26317 26240, 26314  
Alexander Lukyanov #24612 24547  
Eduard Chitoraga #26904 N/A  
Karyna Tsymbal #26899 N/A  
Stanislav Ilnytskyi #26897 N/A  
Karyna Tsymbal #26894 N/A  
Eduard Chitoraga #26878 N/A  
Vladimir Fishchenko #26869 N/A  
Vladimir Fishchenko #26868 N/A  
Milan Osztromok #26863 N/A  
Stanislav Ilnytskyi #26790 N/A  
Sathish Subramanian #26761 N/A  
Eduard Chitoraga #26710 N/A  
Eden Duong #26701 26675  
Serhii Petrychenko #26650 25675  
Karyna Tsymbal #26617 N/A  
Sathish Subramanian #26584 26583  
Maksym Novik #26523 25963  
Hitesh #26418 26416  
Marco Köpcke #25806 25656  
Benjamin Rosenberger #25626 N/A  
Brice #25426 N/A  
Rafael Corrêa Gomes #25417 N/A  
Rafael Corrêa Gomes #25321 N/A  
Artem Voloznov #24976 24971  
Bartłomiej Szubert #22296 14958  
Alexander Taranovsky #26833 N/A  
Lukasz Bajsarowicz #26608 26607  
Grayson #26772 N/A  
Lukasz Bajsarowicz #25858 25856  
Denis Kopylov #23570 N/A  
Petar Borisovski #26995 N/A  
Bartłomiej Szubert #26982 N/A  
Lukasz Bajsarowicz #26974 26973  
Max Mezhensky #26947 N/A  
Max Mezhensky #26944 N/A  
Sathish Subramanian #26932 26917  
Nandhini Nagaraj #26928 N/A  
Andrii Kasian #26916 N/A  
Max Mezhensky #26912 N/A  
Mohamed-Asar #26862 26838  
Vladimir Fishchenko #26821 N/A  
Oleh Usik #26755 N/A  
Vladimir Fishchenko #26697 N/A  
Fred Orosko Dias #26586 N/A  
Ravinder #26230 26229  
Oleh Usik #26090 25910  
Andrii Chorniy #25895 13269, 25738  
Shankar Konar #25349 572  
Chris Frewin #25161 N/A  
Sathish Subramanian #26979 26800  
Max Mezhensky #26842 N/A  
Alastair Mucklow #26615 N/A  
Lukasz Bajsarowicz #25828 26331  
enriquei4 #25311 13252  
Bartłomiej Szubert #27054 N/A  
Lukasz Bajsarowicz #27048 27044  
Sean van Zuidam #27041 27040  
Karyna Tsymbal #27021 N/A  
Max Mezhensky #27010 N/A  
Lukasz Bajsarowicz #26779 N/A  
Bartłomiej Szubert #26765 17933  
Tobias Nilsson #26548 23755, 26384  
Lukasz Bajsarowicz #26329 26331  
korostii #25359 25243  
Pieter Hoste #24003 23619  
Alexander Taranovsky #27114 N/A  
Oleh Usik #27057 N/A  
Timon de Groot #27033 27032  
Dominic Fernando #26907 N/A  
Tu Nguyen #26619 N/A  
Lukasz Bajsarowicz #26778 N/A  
Lukasz Bajsarowicz #26990 26989  
Raul E Watson #27196 N/A  
Sergiy Vasiutynskyi #27149 27027  
Adarsh Manickam #27138 973  
Sergiy Vasiutynskyi #27131 26758  
Bartłomiej Szubert #27084 N/A  
Bartłomiej Szubert #27083 N/A  
Bartłomiej Szubert #27082 N/A  
Bartłomiej Szubert #27080 N/A  
Sergiy Vasiutynskyi #27029 26847  
Vinh Le #27026 27009  
Sathish Subramanian #27014 26992  
Bartłomiej Szubert #26964 N/A  
Ihor Sviziev #26939 N/A  
Bartłomiej Szubert #26902 20309  
Tejash Kumbhare #26649 26648  
princeCB #26642 26590  
Alexander Taranovsky #26563 N/A  
Hirokazu Nishi #25454 24637  
Pieter Hoste #24878 22609  
Dmitriy #24743 24735  
Francis #23742 N/A  
wardcapp #22442 N/A  
Vadim Malesh #27172 14086  
Franciszek Wawrzak #27179 N/A  
Bartłomiej Szubert #27145 N/A  
alexander-aleman #26959 25219  
DanieliMi #26506 26499  
Andrii Beziazychnyi #25722 25669  
Ihor Sviziev #27284 N/A  
Lukasz Bajsarowicz #27281 N/A  
Lukasz Bajsarowicz #27277 N/A  
Lukasz Bajsarowicz #27274 N/A  
Sergiy Vasiutynskyi #27261 20472, 20906, 21910  
Navarr Barnier #27249 N/A  
Pieter Hoste #26784 4112, 11615, 11616, 25124, 26393  
Piotr Markiewicz #26746 N/A  
Mudit Shukla #26348 26345  
Vadim Malesh #27187 26117  
Sergiy Vasiutynskyi #27170 26825  
Eden Duong #25733 N/A  
Lukasz Bajsarowicz #27118 27117  
Dmitry Tsymbal #27266 N/A  
Lukasz Bajsarowicz #27255 N/A  
Vasilii Burlacu #27165 N/A  
AleksLi #27015 26683  
Tu Nguyen #26987 26963  
Sergiy Vasiutynskyi #26560 26473, 26856, 26858  
Dan Wallis #25297 N/A  
solwininfotech #24479 22251  
Lukasz Bajsarowicz #27273 N/A  
Vadim Malesh #27237 24704  
Bartłomiej Szubert #27215 N/A  
Sergiy Vasiutynskyi #27191 26827  
Michael Bottens #27125 27124  
Yaroslav Rogoza #26015 N/A  
Mr. Lewis #25734 N/A  
Alexander Menk #23191 N/A  
Abrar Pathan #27336 27335  
Sergiy Vasiutynskyi #27304 14080  
Lukasz Bajsarowicz #27298 N/A  
Lukasz Bajsarowicz #27292 N/A  
Vasilii Burlacu #27263 26708  
Lukasz Bajsarowicz #27214 N/A  
Michele Fantetti #27116 N/A  
Antonino Bonumore #26748 26745  
Bartłomiej Szubert #26923 186  
Andrii Beziazychnyi #27390 N/A  
Fil Maj #27375 N/A  
Oleh Usik #27353 N/A  
Dmitry Tsymbal #27334 N/A  
Bartłomiej Szubert #27319 N/A  
Andrii Beziazychnyi #27307 26224  
Lukasz Bajsarowicz #27276 N/A  
Lukasz Bajsarowicz #27000 N/A  
Tjitse #26538 N/A  
Pavel Bystritsky #25664 25540  
Alexander Taranovsky #22011 22010  
Lukasz Bajsarowicz #27378 N/A  
Nirav Patel #26055 22363  
Sergiy Vasiutynskyi #27412 13689  
Bartłomiej Szubert #27393 N/A  
Bartłomiej Szubert #27385 N/A  
Bartłomiej Szubert #27384 N/A  
Vasilii Burlacu #27383 27370  
Lukasz Bajsarowicz #27381 N/A  
Mateusz Krzeszowiak #27360 N/A  
Priya-V-Panchal #27088 27086  
Laura Folco #22837 22833  
Bartłomiej Szubert #26075 6310  
Shankar Konar) #27388 N/A  
Graham Wharton #26999 N/A  
Vasilii Burlacu #27371 N/A  
Vadim Malesh #27509 N/A  
Bartłomiej Szubert #27462 N/A  
Lukasz Bajsarowicz #27427 N/A  
Lukasz Bajsarowicz #27425 N/A  
Nazar Klovanych #27413 N/A  
Abel Truong #27365 16315  
Lyzun Oleksandr #27257 N/A  
Daniel Ruf #26763 26762  
Shankar Konar #26736 N/A  
Tu Nguyen #26618 N/A  
Stanislav Ilnytskyi #26417 N/A  
Vasilii Burlacu #27493 26652  
Andrii Beziazychnyi #27492 N/A  
Serhiy Zhovnir #27399 1002  
Bartłomiej Szubert #26397 N/A  
Oleh Usik #26100 24990  
Simon Sprankel #27545 N/A  
Tu Nguyen #27544 N/A  
Oleh Usik #27526 N/A  
Ihor Sviziev #27521 27500  
Vasilii Burlacu #27497 27496  
Vasilii Burlacu #27495 N/A  
Bartłomiej Szubert #27463 N/A  
Abel Truong #27295 27169  
Mark Shust #26900 N/A  
Pieter Hoste #26801 N/A  
Ihor Sviziev #27519 27500  
Lukasz Bajsarowicz #27322 27320  
Lukasz Bajsarowicz #27321 27320  
Nazar Klovanych #27652 N/A  
Cristiano Pacheco #27627 27500  
Lukasz Bajsarowicz #27597 171  
Oleh Usik #27563 N/A  
Bartłomiej Szubert #27491 N/A  
Sergiy Vasiutynskyi #27343 13851  
Lukasz Bajsarowicz #26988 26986  
Tu Nguyen #26926 N/A  
Krzysztof Daniel #26036 N/A  
Oleh Usik #27671 N/A  
Lukasz Bajsarowicz #27552 N/A  
Marcus Pettersen Irgens #27547 N/A  
Oleh Usik #27676 N/A  
Ihor Sviziev #27522 27500  
Eino Keskitalo #27448 N/A  
Lukasz Bajsarowicz #27701 27638  
Oleh Usik #27689 N/A  
Bartosz Górski #27685 N/A  
Oleh Usik #27677 N/A  
Paweł Tylek #27603 27506  
Lukasz Bajsarowicz #27325 N/A  
Oleh Usik #27843 N/A  
Oleh Usik #27841 N/A  
Oleh Usik #27692 N/A  
Lukasz Bajsarowicz #27606 27607  
Matheus Gontijo #26293 N/A  
Oleh Usik #27846 N/A  
Lukasz Bajsarowicz #27300 27299  
Sergii Ivashchenko #27499 N/A  
Sergii Ivashchenko #27536 N/A  
Nazar Klovanych #27566 N/A  
Nazar Klovanych #27966 N/A  
Pieter Hoste #27926 27920  
Pieter Hoste #27892 N/A  
Ihor Sviziev #27887 25769  
Shikha Mishra #27886 27874  
Ajith #27740 N/A  
Oleksandr Kravchuk #27578 N/A  
Lukasz Bajsarowicz #27323 27320  
Lukasz Bajsarowicz #27093 27089  
Alexander Shkurko #27994 N/A  
Vadim Malesh #27976 1270  
Lukasz Bajsarowicz #27964 N/A  
Andrii Kalinich #27955 27897  
Shankar Konar #27515 27503  
Ajith #26886 N/A  
Nazar Klovanych #28048 N/A  
Volodymyr Zaets #27948 N/A  
Volodymyr Zaets #27662 N/A  
Ajith #26704 N/A  
Tu Nguyen #27572 27058  
Dzung Nguyen #27455 23440  
Rohan Hapani #27359 27358  

System requirements

Our technology stack is built on PHP and MySQL. For more information, see System Requirements.

Installation and upgrade instructions

You can install Magento Open Source 2.4.0 using Composer.

Migration toolkits

The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. Consider exploring or contributing to the Magento Data Migration repository.

The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts.