Outlet Module for Magento 2 - Sale Automation
Magento Modules: Clear Guidelines
You purchase the module once, with no domain restrictions
Free installation and updates via Composer
Affiliate Program
Technical support for Magento
Clear guidelines for licensing Magento modules
Magento Module Code Security
Kowal Outlet Products is a module for Magento 2 that automates the handling of outlet products, sale items, and end-of-line inventory. The solution helps keep the catalog organized, assign products to the OUTLET category, mark them with a dedicated attribute, and remove them from the outlet when they should no longer be visible as a sale offer.
The module was designed for stores where outlet products change dynamically: some are individual simple products, some are variants of configurable products, and some require support for multiple stores, multiple websites, and different pricing configurations.
Key business value
In standard Magento, managing an outlet section often requires manually monitoring several elements at once: categories, product status, special price, inventory levels, configurable variants, and cache. With a larger catalog, it is easy to end up in a situation where a product still appears in OUTLET despite being sold out, the parent of a configurable product remains in the category without active variants, or the special price is restored in a way that does not match the store configuration.
Kowal Outlet Products streamlines this process. The administrator can add a list of SKUs to the outlet, and the module takes care of assigning them to the correct categories, setting the OUTLET attribute, handling configurable parent products, and later automatically detaching products after the sale ends.
Key features
- bulk import of products to OUTLET by SKU list,
- assignment of products to one or more outlet categories,
- support for simple products and configurable product variants,
- automatic product marking with the
saleattribute, - assignment of configurable parent products to OUTLET when their variants are outlet products,
- automatic detachment of products from the OUTLET category after they are sold out or when the outlet status is disabled,
- detachment of the configurable parent when none of its variants is an OUTLET product anymore,
- cyclic product checks via cron,
- manual recalculation from the Magento console,
- refreshing indexes and cache for products and categories,
- support for stock and backorders after the sale ends,
- backup and restoration of special prices,
- support for multistore configuration and website scope for prices,
- OUTLET labels next to variant swatches on the product page.
How the OUTLET process works
The administrator selects outlet categories in the module configuration. Then, from the admin panel, they can paste a list of SKUs and add products to the sale. The module assigns products to the OUTLET category and sets the sale attribute.
For configurable products, the module works on two levels. If a variant is an outlet product, the configurable parent can also be added to the OUTLET category so the customer can see the product in the listing. When the variant is sold out or no longer has OUTLET status, the module verifies whether the parent still has any active outlet variants. If not, the parent is detached from OUTLET.
The module cron regularly checks product status. When a product can no longer be sold, the module removes it from outlet categories, changes its outlet status, and refreshes data in indexes and cache. As a result, the OUTLET category listing stays up to date without manual work from the administrator.
Special price handling
The module can protect special prices from being lost during the OUTLET cycle. When a product is added to the outlet, the current special price is copied to technical attributes. After the outlet ends, the price can be restored or cleared, depending on the configuration.
The backup includes:
special_price,special_from_date,special_to_date.
The module respects Magento price scope. If prices are global, it operates at the global level. If prices are set per website, the module saves and restores values according to the default store views of the websites. It does not perform currency conversions because Magento stores prices as base values for a given scope, while store currencies are converted by Magento mechanisms.
Multistore and multi-currency support
Kowal Outlet Products can work in Magento installations with multiple store views and websites. During import, the administrator can specify the websites to which the product should be assigned. The module configuration is available at the default, website, and store levels, making it possible to adapt its behavior to the store structure.
For special prices, the module does not multiply or convert values between currencies. It preserves the amounts saved in Magento for the appropriate price scope. This helps avoid errors caused by manual exchange-rate calculations and leaves currency presentation to standard Magento mechanisms.
Use case example
A store sells clothing and has an OUTLET category where it displays the last units of products from previous collections. The administrator receives a list of variant SKUs that should be added to the sale, for example:
TSHIRT-BLACK-MTSHIRT-BLACK-LJACKET-NAVY-XLSHOES-WHITE-42After pasting the list into the import panel, the module:
- sets the products as OUTLET,
- assigns them to the
OUTLETcategory, - assigns configurable parent products if their variants are outlet products,
- saves a copy of the current special prices,
- optionally updates stock settings,
- refreshes indexes and cache.
The customer sees the products in the OUTLET category and labels next to variants. When the last unit of a variant is sold, the module cron detects that the product is no longer salable, removes it from OUTLET, and refreshes the listing. If it was the last outlet variant of the given configurable product, the parent is also removed from the OUTLET category.
Who this module is for
The module is designed for Magento 2 stores that:
- run a permanent OUTLET or SALE section,
- often work with end-of-line inventory,
- have configurable products with variants that have different sale statuses,
- want to reduce manual work when updating categories,
- need control over special prices in a multistore environment,
- want to avoid outdated products in category listings.
Technical elements
- Composer package name:
kowal/module-outletproducts - Magento module name:
Kowal_OutletProducts - CLI command:
bin/magento kowal_outletproducts:generate - Configuration panel:
Stores > Configuration > kowal > OUTLET Products - Import panel:
kowal > Upload Outlet Products - Main product attributes:
sale,special_price_copy,special_from_date_copy,special_to_date_copy,special_price_copy_active
Implementation result
After the module is implemented, the store gains a consistent outlet management process: products are assigned to the correct categories, variants and parent products are maintained logically, special prices are protected, and catalog data is refreshed after changes. This allows administrators to focus on selecting products for the sale instead of manually cleaning up categories and cache.
Installation and configuration of the Kowal Outlet Products module
Basic information
- Composer package:
kowal/module-outletproducts - Magento module:
Kowal_OutletProducts - Required application type: Magento 2
- Package dependency:
kowal/base - Module CLI command:
bin/magento kowal_outletproducts:generate
Installation via Composer
Add the module repository:
composer config repositories.module.outlet.products vcs https://github.com/kowalco/magento-2-outlet-productsIf the repository is private, configure an access token:
composer config --auth github-oauth.github.com Install the module:
composer require kowal/module-outletproductsEnable the module:
php bin/magento module:enable Kowal_OutletProductsRun the database update:
php bin/magento setup:upgradeIn a production environment, run DI compilation and static content deployment according to the store deployment process:
php bin/magento setup:di:compilephp bin/magento setup:static-content:deployClear the cache:
php bin/magento cache:flushUpdating an existing installation
After updating the module, run:
composer update kowal/module-outletproductsphp bin/magento setup:upgradephp bin/magento cache:flushIf the store runs in production mode, also perform the standard deployment steps:
php bin/magento setup:di:compilephp bin/magento setup:static-content:deploysetup:upgrade is required because the module adds and updates product attributes used to handle OUTLET and special price copies.
Product attributes
The module adds or uses the following attributes:
| Attribute | Meaning |
|---|---|
sale | Marks the product as OUTLET. |
special_price_copy | A copy of the special_price value from before the product entered OUTLET. |
special_from_date_copy | A copy of the special_from_date date. |
special_to_date_copy | A copy of the special_to_date date. |
special_price_copy_active | A marker indicating that the special price copy has been created. |
Configuration in the admin panel
Go to:
Stores > Configuration > kowal > OUTLET ProductsAvailable options:
| Option | Description |
|---|---|
Włącz moduł Outlet | Enables or disables the module. |
Usuń ceny specjalne dla produktów po wyprzedaży | Defines whether the special price should be cleared after OUTLET ends. If the option is disabled, the module will restore the price from the copy. |
Kategorie outletowe | A list of categories to which OUTLET products are assigned and from which they are later automatically removed. |
Wyłącz zarządzanie stanem magazynowym po wyprzedaży | Allows manage_stock to be disabled after the sale ends. |
Włącz backorder po zakończeniu wyprzedaży outletowej | Allows backorder to be enabled and the product to be marked as available after the outlet sale ends. |
Configuration is available at the default, website, and store levels. OUTLET categories used by cron are taken from the default configuration.
OUTLET category configuration
- Create a category or categories in Magento intended for the outlet.
- Make sure the categories are active and visible in the menu or listing if they should be available to customers.
- In the module configuration, select all outlet categories in the
Kategorie outletowefield. - Save the configuration.
- Clear the Magento cache.
php bin/magento cache:flushImporting products to OUTLET
Go to the panel:
kowal > Upload Outlet ProductsIn the form:
- Paste the SKU list, one SKU per line.
- Select the OUTLET categories.
- Optionally select the websites to which the product should be assigned.
- Choose whether the module should enable inventory management for the imported products.
- Click
Importuj.
Example SKU list:
TSHIRT-BLACK-MTSHIRT-BLACK-LJACKET-NAVY-XLSHOES-WHITE-42During import, the module:
- assigns products to the OUTLET category,
- sets the
saleattribute, - updates configurable parent products,
- creates a copy of the special price and promotion dates,
- updates stock according to the selected option,
- refreshes indexes and cache for products and categories.
Configurable product support
If the imported product is a variant of a configurable product, the module finds the parent and assigns it to the OUTLET category. As a result, the configurable product appears in the category listing, and the customer can select the outlet variant.
During cyclic recalculation, the module checks whether the parent still has active OUTLET variants. If not, the parent is detached from the OUTLET category.
Special price handling
When importing to OUTLET, the module saves a copy of:
special_price,special_from_date,special_to_date.
The copy is saved according to the scope of the special price attribute in Magento:
- for global prices: at the global level,
- for prices per website: at the level of the default store view of each website,
- for prices per store: at the store view level.
The module does not convert currencies. Magento stores prices as base values for the appropriate scope, while currency presentation on the frontend remains handled by standard Magento mechanisms.
Behavior after OUTLET ends depends on the Usuń ceny specjalne dla produktów po wyprzedaży option:
Tak: the module clears the special price and removes the technical copy,Nie: the module restores the special price and dates from the copy, then removes the technical copy.
Cron
The module includes a cron job:
kowal_outletproducts_outletThe task runs the OUTLET helper and cyclically checks outlet products. Cron removes products from the OUTLET category when they should no longer be visible there and refreshes indexes and cache.
After installation, make sure Magento cron works correctly:
php bin/magento cron:runIn a production environment, cron should be run from the system crontab of the Magento application user.
Manual recalculation launch
Recalculation can be launched manually from CLI:
php bin/magento kowal_outletproducts:generateThe command performs the same process that is run by cron.
Indexes and cache
After changes, the module refreshes the most important product and catalog indexes:
catalog_product_price,catalog_product_category,catalogsearch_fulltext,inventory,cataloginventory_stock.
The module also clears cache tags for OUTLET products and categories, so the category listing should update after a status change or product detachment.
If needed, you can force a full reindex:
php bin/magento indexer:reindexphp bin/magento cache:flushPost-implementation test
Recommended functional test:
- Select a simple product with stock.
- Set a special price and promotion dates for it.
- Add the product to OUTLET through the import panel.
- Check whether the product appeared in the OUTLET category.
- Check whether the
saleattribute has the valueTak. - For a configurable product, check whether the parent appeared in OUTLET.
- Change the product status so it is no longer salable.
- Run cron or the CLI command.
- Check whether the product was removed from the OUTLET category.
- Check whether the special price was restored or removed according to the configuration.
Common issues
The product is still visible in OUTLET
Check:
- whether Magento cron is running,
- whether the product still has
sale = 1, - whether the product is assigned to one of the categories configured as OUTLET,
- whether indexes and cache have been refreshed.
Helpful commands:
php bin/magento cron:runphp bin/magento indexer:reindexphp bin/magento cache:flushThe configurable parent is still in OUTLET
Check whether any product variant still has sale = 1. The parent is kept in OUTLET as long as it has an active outlet variant.
The special price was not restored
Check:
- whether the product was previously added to OUTLET after the copy attributes were installed,
- whether the
special_price_copy_activeattribute was set, - whether the
Usuń ceny specjalne dla produktów po wyprzedażyconfiguration is set toNie, - which price scope is set in Magento.
Prices differ between store views
Check the price scope configuration in Magento. The module does not convert currencies and does not synchronize prices between store views. It restores values saved for the appropriate price scope.
Uninstallation
If the module is to be disabled:
php bin/magento module:disable Kowal_OutletProductsphp bin/magento setup:upgradephp bin/magento cache:flushRemoving the Composer package:
composer remove kowal/module-outletproductsphp bin/magento setup:upgradephp bin/magento cache:flushBefore removing the module, it is recommended to check whether products require manual clearing of the sale attribute or detachment from the OUTLET category.













