This is a beta release of documentation for Magento 2.4, published for previewing soon-to-be-released functionality. Content in this version is subject to change. Links to the v2.4 code base may not properly resolve until the code is officially released.

Magento Open Source 2.4.0 Release Notes

Magento Commerce 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, Braintree, eWay, CyberSource, and Worldpay payment method integrations have been removed from core code. Merchants should migrate to the official extensions that are available on the Magento Marketplace.

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.

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.4-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.4-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.

Additional security enhancements include:

This release includes over 30 security fixes and platform security improvements. Additional security enhancements include:

  • Two-factor authentication (2FA) is now enabled by default 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 and cannot be disabled. This extra step of authentication makes it harder for malicious users to log in to the Admin without authorization. Additional implementations of 2FA are scheduled for release with Magento 2.4.0 General Availability, which is scheduled for late July. See Two-factor Authentication (2FA).

  • 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.

  • Content Security Policy (CSP) improvementsSecureHtmlRenderer has been added to the Magento Framework and is available in .phtml templates to support the allowlisting of inline style and script tags. Inline scripts and styles are not typically permitted with the default CSP configuration. Although most core template files have been updated, some pages may display CSP violations. See Content Security Policies.

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.

  • 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.

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, Braintree, eWay, CyberSource, and Worldpay payment method integrations have been removed from core code. Merchants should migrate to the official extensions that are 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.

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.

dotdigital

This release includes these enhancements:

  • Customer attribute values that are captured by any input type (for example, dropdown, multi-select) are now correctly synced as data fields.
  • Cart insight data is now sent for all active quotes, even if they contain no items. This allows merchants to exit contacts from a program if they empty their cart.
  • Merchants can now sync website name, store name, and store view name by individual data fields.
  • Wishlist, Review, and Order syncs now look up the transactional data sync limit once only.
  • Logging output from the Client class has been improved and is now consistent across all methods in the API wrapper.
  • Configurable products now have a stock figure that is the sum of their child products.
  • A new plugin detects stock updates that are performed by third-party code (outside the Magento Admin).

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

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.
  • 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

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 admin account with limited privileges has been created. Previously, the Admin was not accessible. Instead, users were redirected to the storefront with a 404 error. Fix submitted by Eden Duong in pull request 25909. GitHub-25881

  • 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.
  • 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.

Cache

  • 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 waiting/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.
  • 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

Catalog

  • Magento now disables the ability of a restricted administrator to change a product’s quantity attribute and disables advanced inventory as expected. Previously, only the visual display of the quantity attribute was affected, and Magento changed the quantity value in the database after the product was saved.
  • 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 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 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.
  • Administrators with restricted permissions to Catalog can now create a downloadable product. Previously, administrators could not create a downloadable product, and Magento threw an error.
  • 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.
  • 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.
  • 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.
  • 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 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
  • 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
  • Magento now provides This item has weight and This item has no weight options in the Actions drop-down menu that is accessible when you update a product’s attributes. Fix submitted by Bartomiej Szubert in pull request 26075. GitHub-6310

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 is an anchor, but which did not have assigned products by itself, Magento did not display all nested products.
  • 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

Cleanup

  • Removed an extra closing tag from module XML. Fix submitted by Tejash Kumbhare in pull request 26339. GitHub-26338
  • Corrected misalignment of the calendar icon on the Add Design Change page. Fix submitted by Eduard Chitoraga in pull request 26063. GitHub-20379
  • 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
  • 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
  • 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

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 were not being added to a website’s store page hierarchy.

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
  • Google Tag Manager tags are no longer triggered when a customer navigates to a new store without accepting the Google Tag Manager cookie.

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 work as expected consistently.
  • 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’s 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

Custom customer attributes

  • Magento now displays custom customer address attribute values as expected in the address section of the checkout workflow. Previously, Magento displayed the custom customer address attribute code instead of the value, and a JavaScript error was triggered.
  • 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.
  • Magento now saves custom customer address attributes and implements them in registration forms as expected. Previously, when you created a new custom customer address attribute while creating an account from the cart, Magento did not save the attribute information.

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 the 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

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.

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 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 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.
  • 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.
  • 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 are no longer added to default layout handles. 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.

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.
  • 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.
  • 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

Gift cards

  • The GET V1/orders/:orderId call returns gift card codes as expected.

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

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 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

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 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 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.
  • 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).

Infrastructure

  • The validation logic associated with the Date of Birth field of the Customer Registration form no longer triggers a JavaScript error.
  • 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

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.
  • 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

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.

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 create an order from the Admin using Authorize.net as the payment method. Previously, Magento did not create the order, and displayed this error: Transaction has been declined. Please try again later. GitHub-23934
  • 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.
  • The OK button is now clickable when you try to correct Braintree payment details for an order.
  • 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.
  • 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.
  • The Place order button on the checkout workflow is now disabled as expected until the customer updates the billing address when paying with Braintree. Previously, when secure 3D was enabled and the customer was paying with Braintree, Magento did not correctly validate the shipping address and displayed this JavaScript error: TypeError: Cannot read property 'firstname' of null.
  • 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.
  • 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

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.

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

Product alert

  • 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

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.

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.
  • Adminstrators 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
  • 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

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.
  • 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.

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.

Sitemap

  • Magento now uses the project base URL as expected when you generate a sitemap.

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.

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.
  • 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.
  • Magento no longer throws an error when you edit and save the NOT LOGGED IN customer group when B2B is installed.

Test

  • Added an integration test to cover $storeId for the Category Repository get() method. Fix submitted by Lukasz Bajsarowicz in pull request 27048. GitHub-27044

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.

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.
  • The es_US Spanish (United States) locale is now supported. Fix submitted by Vinh Le in pull request 26857. GitHub-26843

UI

  • You can now use Page Builder to add a product as a button link (Edit Content > Button Link). Previously, Magento threw this error when you tried to select the product: Product with ID: XXXX doesn't exist.
  • The link from the Setup Wizard to the Admin now works as expected. Fix submitted by Oleh Usik in pull request 26100. GitHub-24990
  • 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
  • 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 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 scroll through gallery thumbnail images on the product page in mobile view as expected. Fix submitted by iGerchak in pull request 25839. GitHub-21014
  • Scrolling of product pages now works as expected in mobile view. Fix submitted by Mateusz Krzeszowiak in pull request 25385. GitHub-10518, GitHub-21717
  • The Compare Products section of the Catalog page is now displayed as expected in mobile view on displays with less than 767px. Fix submitted by Hitesh in pull request 26418. GitHub-26416

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.
  • We’ve added a check to prevent URL redirects if the request path is the same as the target path. Fix submitted by Bartłomiej Szubert in pull request 26902. GitHub-20309

VAT

Vault

  • The Place Order button on the shipping workflow is now enabled as expected when you select Braintree as the payment method and the My billing and shipping address are the same setting is disabled.

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

!— ENGCOM-6920–>

  • 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

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.

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

Known issues

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.

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.