olegkoval / magento2-regenerate-url-rewrites
Add into Magento 2 a CLI feature which allow to regenerate a Url Rewrites of products and categories
"Regenerate Url Rewrites" extension
A Magento 2 CLI extension that regenerates URL Rewrites for products and categories — across all
stores, a single store view, or a specific ID/range — with options to preserve old URLs, delete
orphaned rewrites, change the URL suffix, and more.
Extension homepage: https://github.com/olegkoval/magento2-regenerate_url_rewrites
Changelog: CHANGELOG.md
Table of Contents
- Requirements
- Installation
- Quick Start
- CLI Options Reference
- Notes & Caveats
- Combining Options
- Deprecated Options
- More Examples
- Support Me
- Contacts
- License
REQUIREMENTS
| Magento Open Source (CE) | PHP |
|---|---|
| 2.4.7 | 8.2, 8.3 |
| 2.4.8 | 8.3, 8.4 |
| 2.4.9 (latest) | 8.4, 8.5 |
composer.json declares "php": ">=8.2". PHP compatibility otherwise follows whatever your
Magento version itself requires — the extension doesn't impose a narrower floor than Magento does.
2.4.6 and older are treated as legacy/best-effort only (no longer patched upstream by Adobe).
INSTALLATION
COMPOSER INSTALLATION
- run composer command:
$> composer require olegkoval/magento2-regenerate-url-rewrites
MANUAL INSTALLATION
-
extract files from an archive
-
deploy files into Magento2 folder
app/code/OlegKoval/RegenerateUrlRewrites
ENABLE EXTENSION
- enable extension (use Magento 2 command line interface):
$> php bin/magento module:enable OlegKoval_RegenerateUrlRewrites
- to make sure that the enabled module is properly registered, run 'setup:upgrade':
$> php bin/magento setup:upgrade
- [if needed] re-compile code and re-deploy static view files:
$> php bin/magento setup:di:compile
$> php bin/magento setup:static-content:deploy
QUICK START
- regenerate Url Rewrites for all products, in all stores (
productis the default entity type, so it can be omitted):
$> php bin/magento ok:urlrewrites:regenerate
- regenerate Url Rewrites for all categories, in all stores:
$> php bin/magento ok:urlrewrites:regenerate --entity-type=category
- regenerate Url Rewrites for one product (ID
122), in one store (ID2):
$> php bin/magento ok:urlrewrites:regenerate --product-id=122 --store-id=2
Keep reading for the full options reference, or jump to More Examples.
CLI OPTIONS REFERENCE
General
| Option | Description |
|---|---|
--entity-type=<product|category> |
Entity type to regenerate. Default: product. Can be omitted when --category-id/--categories-range is given — the extension infers category automatically. |
--store-id=<id> |
Regenerate only for the given store view. Omit to run for all stores. |
--save-old-urls |
Keep old URLs working: when a product/category URL changes, its old URL becomes a 301 redirect to the new one instead of being discarded. |
--regen-url-key |
Also regenerate url_key values. By default url_key is left untouched and only url_path/URL Rewrites are regenerated. |
--no-reindex |
Skip the full reindex that normally runs at the end. |
--no-cache-clean |
Skip cache:clean at the end. |
--no-cache-flush |
Skip cache:flush at the end. |
--no-progress |
Hide the console progress bar. |
--delete-orphaned-rewrites |
Delete url_rewrite rows (for the given --entity-type) whose product/category no longer exists. |
--skip-existing |
Skip an entity entirely if it already has any URL Rewrite for the current store, instead of always deleting + regenerating. |
Product targeting & options
| Option | Description |
|---|---|
--product-id=<id> |
Regenerate for one specific product. |
--products-range=<from>-<to> |
Regenerate for a range of product IDs (gaps in the range are handled automatically). |
--include-not-visible |
Also regenerate URLs for products with visibility "Not Visible Individually" (e.g. configurable child products) — excluded by default. |
--add-sku-to-url |
Append the product's SKU as a URL segment, e.g. screws.html → screws-2244000004.html. Custom (admin-created) rewrites and kept old-URL redirects are left unchanged. |
--set-product-suffix=<suffix> |
Set the product URL suffix (e.g. .html) before regenerating. See Notes & Caveats. |
Category targeting & options
| Option | Description |
|---|---|
--category-id=<id> |
Regenerate for one specific category. |
--categories-range=<from>-<to> |
Regenerate for a range of category IDs (gaps in the range are handled automatically). |
--skip-products |
Skip regenerating associated product URLs when regenerating categories. See Notes & Caveats. |
--set-category-suffix=<suffix> |
Set the category URL suffix (e.g. .html) before regenerating. See Notes & Caveats. |
NOTES & CAVEATS
-
--skip-productsonly has an effect when the "Use Category Path for Product URLs" setting
(Stores > Configuration > Catalog > Catalog > Search Engine Optimization, config path
catalog/seo/product_use_categories) is enabled — that setting is what makes category
regeneration cascade into product URLs in the first place. If it's disabled, category
regeneration never touches product URLs, with or without--skip-products. -
--set-product-suffix/--set-category-suffixare applied to Default Config and every
store view, or only to the store given via--store-id, using the same write path Magento's own
config:setCLI command uses — so validation (e.g. rejecting#or//) and Magento's own
automatic suffix swap on existing URL Rewrites both run. If either suffix value fails validation,
the whole command aborts before any regeneration runs. Since the config is written before
regeneration, in the same command, you get a clean
/categorya/oldname.html -> /categorya/newname.htmlredirect instead of a two-step chain. -
Failures and exit code: if any product/category (or a cleanup step) fails, the run continues with
the rest, then prints a[FAILURES]summary (counts per entity type plus up to 20 of the failures) and
exits with code1— after reindex and cache refresh have still run. Earlier versions always exited
0, so cron jobs or scripts that check the exit code may start reporting failures that used to be
hidden. -
--regen-url-keyinverted its default behavior in 1.8.0:url_keyis no longer regenerated
automatically. Pass--regen-url-keyexplicitly whenever you want it regenerated too — see
Deprecated Options if you're upgrading from an older version.
COMBINING OPTIONS
Most options combine freely, e.g.:
$> php bin/magento ok:urlrewrites:regenerate --store-id=2 --save-old-urls --regen-url-key --no-reindex
These combinations are not allowed:
--entity-type=producttogether with--category-id/--categories-range--entity-type=categorytogether with--product-id/--products-range--category-idand/or--categories-rangetogether with--product-idand/or--products-range
DEPRECATED OPTIONS
--check-use-category-in-product-url— obsolete. The extension now uses Magento's built-in URL
Rewrite generator, which already checks the "Use Category Path for Product URLs" config on its
own, so this manual flag is no longer needed.--no-regen-url-key— removed in 1.8.0 (not just deprecated — passing it now causes an
"unrecognized option" error).url_keyregeneration behavior was inverted: it is now skipped by
default and only runs when you explicitly pass--regen-url-key. If you relied on the old
default (url_keyregenerated automatically), add--regen-url-keyto your existing
commands/scripts/cron jobs after upgrading to 1.8.0.
MORE EXAMPLES
- Regenerate Url Rewrites for product with ID
38in store with ID3:
$> php bin/magento ok:urlrewrites:regenerate --entity-type=product --store-id=3 --product-id=38
or
$> php bin/magento ok:urlrewrites:regenerate --store-id=3 --product-id=38
- Regenerate Url Rewrites for products with IDs 5,6,7,8,9,10,11,12 in store with ID
2and skip the full reindex:
$> php bin/magento ok:urlrewrites:regenerate --entity-type=product --store-id=2 --products-range=5-12 --no-reindex
- Regenerate Url Rewrites for category with ID
22in all stores and save current Url Rewrites:
$> php bin/magento ok:urlrewrites:regenerate --entity-type=category --category-id=22 --save-old-urls
- Regenerate Url Rewrites for categories with IDs 21,22,23,24,25 in store with ID
2:
$> php bin/magento ok:urlrewrites:regenerate --entity-type=category --categories-range=21-25 --store-id=2
- Set the category URL suffix to
.htmland regenerate all category URLs in one step:
$> php bin/magento ok:urlrewrites:regenerate --entity-type=category --set-category-suffix=.html
SUPPORT ME
CONTACTS
- Email: [email protected]
- LinkedIn: https://www.linkedin.com/in/oleg-koval-85bb2314/
- Issues & feature requests: GitHub Issues
LICENSE
Dual-licensed, same as Magento itself:
Enjoy!
Best regards,
Oleg Koval
"Regenerate Url Rewrites" Change Log
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
[1.10.0] - 2026-09-26
Changed
- the command now reports failures instead of silently skipping them: products/categories whose URL
rewrites couldn't be generated or saved (and failed cleanup steps) are listed in an end-of-run summary —
counts per entity type plus up to 20 of the failures — and the command exits with code 1. Reindex and
cache refresh still run first. Previously it always exited 0, so cron jobs/scripts that check the exit
code may now start alerting on failures that used to be hidden. - all-stores runs no longer regenerate every store view twice: the store 0 (default scope) pass now only
updates default-scopeurl_key/url_path, and each store view is generated once — with identical
results; on a two-store-view sample catalog full runs were ~15–30% faster, and the saving grows with the
number of store views - category runs with "Use Categories Path for Product URLs" enabled regenerate each affected product once,
after all categories are done, instead of once per ancestor category (plus a full scan of the
product/category rewrite table after every category) — identical results; on the sample catalog a full
category run went from ~22s to ~5s
Fixed
--store-id=0(global scope) runs dropped the product rewrites of every store view after the first
(identical paths in different store views were treated as duplicates) and didn't replace the store views'
current rewrites, so old URLs kept serving pages and--save-old-urlsredirects were lost--save-old-urlsnow actually creates 301 redirects: when a URL changes, the old URL redirects to the
new one. Before, the old URL kept serving the page as an ordinary rewrite (duplicate content) and the
redirect Magento generated was silently dropped when saving (#174, #142). This includes switching to
--add-sku-to-urlwith--save-old-urls: the old unsuffixed URL now redirects to the SKU URL--add-sku-to-url(and path clean-up/de-duplication in general) no longer alters custom URL
rewrites: admin-created rewrites, and old-URL redirects kept by--save-old-urls, keep their exact
request path. Before,--add-sku-to-urlappended the SKU to them too, so a custom URL like
promo/salebecamepromo/sale-<sku>and the original URL stopped working.- with
--add-sku-to-url, custom redirects (and--save-old-urlsredirects) pointing at a product's URL
now follow it to the SKU-suffixed URL; before, they kept pointing at the old unsuffixed URL, which no
longer existed (redirect to a 404) - a product/category whose generated URL paths were all empty no longer has its existing rewrites
touched (nothing to write, so the current rewrites are kept)
[1.9.1] - 2026-08-26
Added
- new options
--set-product-suffix/--set-category-suffix— set the product/category URL suffix
(e.g..html) before regenerating, via the same write path Magento's ownconfig:setCLI command
uses, so validation and the automatic suffix swap on existing url_rewrite rows both run. Applied to
Default Config and every store view, or only the store given via--store-id. If either suffix value
fails Magento's validation, the whole command aborts before any regeneration runs.
Fixed
- category
url_pathwas not recalculated per store view: when a category'surl_pathhad only ever
been saved at the default (store 0) scope, Magento'sCategoryUrlPathGeneratorshort-circuited and
handed back that inherited value instead of building a new one from the store-scopedurl_key,
because the category object's still-populatedurl_pathmade itsdataHasChangedFor()checks look
unchanged. Nowurl_pathis cleared on the category object before generation, matching the pattern
already used on the product side. (#184)
[1.9.0] - 2026-08-11
Added
- new option
--skip-products— skip regenerating associated product URLs when regenerating categories (useful on large catalogs when "Use Category Path for Product URLs" is enabled) - new option
--skip-existing— skip an entity entirely if it already has any url_rewrite for the current store, instead of always deleting + regenerating - new option
--include-not-visible— also regenerate URLs for products with visibility "Not Visible Individually" (e.g. configurable child products), excluded by default since 1.6.2 - new option
--add-sku-to-url— append the product's SKU as a URL segment in generated product Url Rewrites, e.g.screws.html->screws-2244000004.html
Fixed
- guard against writing a blank url_key when Magento's own transliteration can't handle the product/category title (e.g. Arabic/other non-Latin scripts)
[1.8.0] - 2026-08-10
Changed
- BREAKING: inverted url_key regeneration default — url_key is no longer regenerated automatically; use the new
--regen-url-keyoption to opt in. The old--no-regen-url-keyoption is removed entirely (not deprecated) — update any existing scripts/cron jobs that relied on the previous default. - fixed data loss risk in
saveUrlRewrites(): deleting existing rewrites and inserting new ones now happen in a single transaction, so a failed insert can no longer leave an entity with its rewrites deleted and nothing to replace them - fixed category URL rewrite regeneration to process every category (top level down to the deepest child) instead of only top-level categories, so child categories' own url_key/url_path are regenerated too
- skip writing a redundant per-store url_key override when the regenerated value is identical to the default-scope value
Added
- new option
--delete-orphaned-rewrites— deletes url_rewrite rows (for the given--entity-type) whose product/category no longer exists
[1.7.3] - 2026-08-09
Changed
- fixed deprecated non-canonical (double) type cast for PHP 8.5 compatibility
- use the current PHP executable (PHP_BINARY) instead of a hardcoded "php" command for reindex/cache calls
- fixed category URL rewrite regeneration stopping entirely when a single broken/orphaned category is encountered
- added missing type hint and defensive casting in a couple of helper methods
- declared minimum supported PHP version (>=8.2) in composer.json
[1.7.2] - 2026-03-31
Changed
- fixed deprecated functionality: ctype_digit()
- improved SQL safety in URL rewrite regeneration queries
- fixed SQL escaping in URL rewrite cleanup logic
- fixed _clearRequestPath() to correctly handle multiple consecutive slashes
- removed dead code from category URL rewrite model
- display validation errors before command failure
- display a completed progress bar for empty product/category collections
- normalized line endings to LF
[1.7.1] - 2025-05-30
Changed
- adapted for compatibility with PHP 8.4 (deprecated implicitly nullable types)
[1.7.0] - 2025-04-15
Changed
- adapted for compatibility with Magento 2.4.7-p4
- adapted the composer.json file to be compatible with Composer 2
[1.6.2] - 2023-10-10
Changed
- fixed Symfony Command constant issue
- exclude non visible products from url regeneration
[1.6.1] - 2023-08-24
Changed
- fixed compatibility with Symfony Console 5 and Magento 2.4.6
- updated contact email to Gmail email (my own domain olegkoval.com was stolen)
[1.6.0] - 2021-01-27
Changed
- adapted to Magento 2.3.5
- fixed incorrect generation when URL suffix is slash
[1.5.6] - 2020-04-13
Changed
- updated logic of "cleaning" of Url Rewrites and duplications check
[1.5.5] - 2020-04-02
Changed
- updated logic of Url Rewrite regeneration via category entity
- fixed compilation issue in helper
[1.5.4] - 2020-03-21
Changed
- fixed issue of non-empty/non-false "request_path" of product entity.
- modified logic of Url Rewrite db table updates
[1.5.3] - 2020-03-20
Changed
- updated Url Rewrite preparing function
- updated logic of Url Rewrite regeneration via category entity
- updated save logic
[1.5.2] - 2020-03-18
Changed
- updated logic of Url Rewrite regeneration via category entity
- CLI options logic optimized (for category entity)
[1.5.1] - 2020-03-08
Changed
- fixed issue of url_key and url rewrites regeneration based on product name value
[1.5.0] - 2020-02-26
Changed
- revised and restructured code
- modified functional logic of extension
- removed option "--check-use-category-in-product-url"
[1.4.3] - 2019-05-12
Added
- new option "no-regen-url-key"
Changed
- fixed a "typo" issue
[1.4.2] - 2019-04-04
Added
- new option "--check-use-category-in-product-url"
- info into log about conflicted URL Rewrites
Changed
- fixed logical issues in url_key regeneration
- a fix for category/products rewrites for multistore
- fixed issue of division by zero in progress bar
- update the url_key regeneration behavior to use UrlPathGenerators
- modified logic of displaying console messages (notifications, errors, exceptions...)
[1.4.1] - 2019-02-20
Changed
- fixed the issue of removing previously added URL rewrites of product when the same URL key exists;
- modified progress bar
[1.4.0] - 2019-02-11
Added
- new option "--entity-type"
- new option "--products-range"
- new option "--product-id"
- new option "--category-range"
- new option "--category-id"
Changed
- revised and restructured code
- modified logic of url rewrites regeneration
- removed "--clean-url-key"
[1.3.1] - 2018-11-14
Changed
- fixed issue of empty product URL keys
- fixed double slashes issue
- update category attributes via resource saveAttribute()
- use proxy for CategoryUrlPathGenerator
[1.3.0] - 2018-10-29
Added
- new option "--no-cache-clean"
- new option "--no-cache-flush"
- new option "--no-progress"
- new option "--no-clean-url-key"
Changed
- optimized code
- modified logic of url rewrites regeneration
- fixed issue of store filter in a category collection
[1.2.3] - 2018-10-03
Added
- display additional debug information for "URL key for specified store already exists" error
Changed
- modified logic of url rewrites regeneration
[1.2.2] - 2018-10-02
Changed
- fixed setStoreId() on null error
[1.2.1] - 2018-09-25
Changed
- fixed compilation issues
[1.2.0] - 2018-09-25
Changed
- added proxies to CLI commands
- modified logic of url rewrites regeneration
- updated a composer file
- fixed issue of a compatibility with new Magento Commerce versions
[1.1.1] - 2018-09-10
Changed
- fix composer file format issue
[1.1.0] - 2018-09-09
Added
- added feature to add a Pro features through a "Layer" class
Changed
- fix issue when optional arguments require value
- updated a code structure
[1.0.6] - 2018-07-26
Added
- new option to run URL rewrite generation without running full reindex
Changed
- update help notice to show INPUT_KEY_SAVE_REWRITES_HISTORY and INPUT_KEY_NO_REINDEX
[1.0.5] - 2018-05-13
Added
- new option to save current URL rewrites
Changed
- improve the store ID arguments workflow
[1.0.4] - 2017-11-13
Added
- additional checks of storeId argument
[1.0.3] - 2017-10-25
Added
- check if area code is set
[1.0.2] - 2017-10-20
Fixed
- fix "Area code not set" issue
[1.0.1] - 2017-10-10
Fixed
- fix store id issue in collection filter
[1.0.0] - 2017-09-29
Release of Magento 2 "Regenerate Url Rewrites" extension
| Version | Stability | QA Status | Compatibility | Released |
|---|---|---|---|---|
| 1.12.0 | stable | Fail | Magento 2.4.7-2.4.9 Details | 2026-10-07 10:01:17 |
| 1.11.1 | stable | Fail | Magento 2.4.7-2.4.9 Details | 2026-10-05 15:58:48 |
| 1.11.0 | stable | Fail | Magento 2.4.7-2.4.9 Details | 2026-09-30 07:47:49 |
| 1.10.0 | stable | Fail | Magento 2.4.7-2.4.9 Details | 2026-09-26 14:37:52 |
| 1.9.1 | stable | Fail | Magento 2.4.7-2.4.9 Details | 2026-08-26 16:26:43 |
| 1.9.0 | stable | Fail | Magento 2.4.7-2.4.9 Details | 2026-08-18 18:39:18 |
| 1.8.0 | stable | Fail | Magento 2.4.7-2.4.9 Details | 2026-08-09 22:44:50 |
| 1.7.3 | stable | Not tested | Not yet tested Details | 2026-08-09 19:50:58 |
| 1.7.2 | stable | Fail | Not yet tested Details | 2026-04-07 11:58:33 |
| 1.7.1 | stable | Not tested | Not yet tested Details | 2025-05-30 08:50:45 |
| 1.7.0 | stable | Not tested | Not yet tested Details | 2025-04-17 08:57:27 |
| 1.6.2 | stable | Not tested | Not yet tested Details | 2023-10-10 16:03:11 |
| 1.6.1 | stable | Not tested | Not yet tested Details | 2023-08-24 08:11:18 |
| 1.6.0 | stable | Not tested | Not yet tested Details | 2021-01-27 19:08:16 |
| 1.5.6 | stable | Not tested | Not yet tested Details | 2020-04-14 12:37:22 |
| 1.5.5 | stable | Not tested | Not yet tested Details | 2020-04-02 09:38:49 |
| 1.5.4 | stable | Not tested | Not yet tested Details | 2020-03-21 13:20:23 |
| 1.5.3 | stable | Not tested | Not yet tested Details | 2020-03-21 00:52:01 |
| 1.5.2 | stable | Not tested | Not yet tested Details | 2020-03-18 13:09:43 |
| 1.5.1 | stable | Not tested | Not yet tested Details | 2020-03-08 13:19:47 |
| 1.5.0 | stable | Not tested | Not yet tested Details | 2020-02-26 00:39:38 |
| 1.4.3 | stable | Not tested | Not yet tested Details | 2019-05-12 16:26:18 |
| 1.4.2 | stable | Not tested | Not yet tested Details | 2019-04-04 19:25:24 |
| 1.4.1 | stable | Not tested | Not yet tested Details | 2019-02-22 18:50:45 |
| 1.4.0 | stable | Not tested | Not yet tested Details | 2019-02-10 23:31:00 |
| 1.3.1 | stable | Not tested | Not yet tested Details | 2018-11-14 01:09:36 |
| 1.3.0 | stable | Not tested | Not yet tested Details | 2018-10-29 21:35:32 |
| 1.2.3 | stable | Not tested | Not yet tested Details | 2018-10-03 17:50:49 |
| 1.2.2 | stable | Not tested | Not yet tested Details | 2018-10-02 10:16:34 |
| 1.2.1 | stable | Not tested | Not yet tested Details | 2018-09-25 08:06:32 |
| 1.2.0 | stable | Not tested | Not yet tested Details | 2018-09-24 23:20:50 |
| 1.1.1 | stable | Not tested | Not yet tested Details | 2018-09-10 05:45:05 |
| 1.0.6 | stable | Not tested | Not yet tested Details | 2018-07-26 20:52:28 |
| 1.0.5 | stable | Not tested | Not yet tested Details | 2018-05-12 23:15:48 |
| 1.0.4 | stable | Not tested | Not yet tested Details | 2017-11-13 13:46:25 |
| 1.0.3 | stable | Not tested | Not yet tested Details | 2017-10-25 11:32:32 |
| 1.0.2 | stable | Not tested | Not yet tested Details | 2017-10-20 00:25:54 |
| 1.0.1 | stable | Not tested | Not yet tested Details | 2017-10-10 08:12:20 |
| 1.0.0 | stable | Not tested | Not yet tested Details | 2017-09-29 10:23:11 |
Requires 1
| Package | Constraint |
|---|---|
| php | >=8.2 |
Compatibility
Each Magento release line is installed on its supported PHP versions, then the module is built (DI compilation + static-content deploy) and its unit and integration suites are run. The matrix shows the lines and PHP versions the module is confirmed to install and run on. Code-quality results further down (phpstan, phpcs, …) are reported separately and never affect compatibility.
Code Quality
Advisory checks against the module's source. Static analysis runs once across the whole module; PHPStan re-runs per Magento + PHP version because resolvable symbols differ between releases. These NEVER affect the Compatibility badge. A phpcs finding can't make a module incompatible.
Static analysis
Coding standards (phpcs), mess detection (phpmd), copy-pasted code (cpd), PHP cross-version compatibility, composer.json validity. Each runs once for the whole module.
| Tool | Status | Findings | Summary |
|---|---|---|---|
| PHPCS | Fail | 92 | 12 errors, 80 warnings (ruleset: Magento2), 20 auto-fixable with phpcbf |
| PHPMD | Warning | 21 | 21 rule violations (CyclomaticComplexity:5, NPathComplexity:5, ExcessiveClassComplexity:3, ExcessiveMethodLength:2, UnusedLocalVariable:2) |
| Cpd | Pass | 0 | |
| Composer validate | Pass | 0 |
Tests
Unit and integration suites, run for each applicable Magento and PHP version. A test failure speaks to the module's behaviour, not its compatibility with a Magento line, so it is reported here separately and never reddens the compatibility matrix.
Unit tests
| Magento | PHP 8.2 | PHP 8.3 | PHP 8.4 | PHP 8.5 |
|---|---|---|---|---|
| 2.4.7 | N/A | N/A | ||
| 2.4.8 | N/A | N/A | ||
| 2.4.9 | N/A | N/A |
Integration tests
| Magento | PHP 8.2 | PHP 8.3 | PHP 8.4 | PHP 8.5 |
|---|---|---|---|---|
| 2.4.7 | N/A | N/A | ||
| 2.4.8 | N/A | N/A | ||
| 2.4.9 | N/A | N/A |
Security
Security checks run directly against the module: an audit of its declared dependencies for known vulnerabilities (composer audit) and a scan of its source for malware and web-shell signatures. Each runs once. A malware detection fails the version outright.
Turn an existing module into recurring revenue.
If you already maintain a Magento 2 module on GitHub or GitLab, listing it on Packagento takes about five minutes. We mirror your tags, handle distribution signing, and route paid licenses through Stripe Connect, so you can keep shipping the way you already do.