PHPackages                             orangecat/module-returns - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. orangecat/module-returns

ActiveMagento2-module[Utility &amp; Helpers](/categories/utility)

orangecat/module-returns
========================

Customer-facing RMA and return request management for Magento 2 B2B stores

0.0.2(2d ago)02↑2900%OSL-3.0PHPPHP &gt;=8.1

Since Jun 5Pushed 2d agoCompare

[ Source](https://github.com/olivertar/m2_returns)[ Packagist](https://packagist.org/packages/orangecat/module-returns)[ RSS](/packages/orangecat-module-returns/feed)WikiDiscussions main Synced 2d ago

READMEChangelog (2)Dependencies (2)Versions (3)Used By (0)

Orangecat\_Returns
==================

[](#orangecat_returns)

Customer-facing RMA and return request management for Magento 2 B2B stores.

**Module:** `Orangecat_Returns`**Version:** 1.0.0 **License:** OSL-3.0 **Author:** Oliverio Gombert

---

Table of Contents
-----------------

[](#table-of-contents)

1. [Overview](#overview)
2. [Theme Compatibility](#theme-compatibility)
3. [Requirements](#requirements)
4. [Installation](#installation)
5. [What Gets Installed](#what-gets-installed)
6. [Return Eligibility Rules](#return-eligibility-rules)
7. [Configuration](#configuration)
8. [Store Admin Guide](#store-admin-guide)
9. [Buyer Guide (Frontend)](#buyer-guide-frontend)
10. [Developer Guide](#developer-guide)
11. [REST API](#rest-api)
12. [Frontend Routes Reference](#frontend-routes-reference)
13. [DevOps &amp; Integrator Notes](#devops--integrator-notes)

---

Overview
--------

[](#overview)

`Orangecat_Returns` adds a full return-request (RMA) workflow to Magento 2. Customers submit return requests from their account area; admins review, update status, assign a resolution, and add internal notes. Every status change triggers an automatic email to the customer.

The module handles:

- Per-product returnability toggle via the `is_returnable` product attribute
- Configurable return window (days) measured from order creation or latest shipment date
- Optional partial returns — customers can select individual items and quantities
- Four configurable lookup catalogs: Statuses, Reasons, Conditions, Resolutions — all with per-store label translations
- Increment ID generation in `RMA000000001` format
- Automated email notifications to admins on new requests and to customers on status changes
- Full Hyvä and Luma theme support; Breeze Evolution CSS included

### Position in the Orangecat B2B Dependency Chain

[](#position-in-the-orangecat-b2b-dependency-chain)

`Orangecat_Returns` has no dependency on other Orangecat modules. It stands alone and can be deployed alongside any combination of the Orangecat B2B suite.

```
Orangecat_Core (via composer: orangecat/core)

Orangecat_Returns     ← this module (independent)

```

### Return Eligibility Rules

[](#return-eligibility-rules)

A return request can only be created when all of the following are true:

1. The module is enabled in configuration.
2. The order is in `complete` or `closed` state.
3. The return window has not expired (configurable; `0` = no limit).
4. At least one item in the order has `is_returnable = Yes` on its product.
5. Available quantity for each selected item is greater than zero (all previous requests count, even rejected ones).

---

Theme Compatibility
-------------------

[](#theme-compatibility)

ThemeStatusNotes**Luma**SupportedStandard `.phtml` templates. Less styles via `view/frontend/web/css/source/_module.less`.**Hyvä**SupportedDedicated `*_hyva.phtml` templates with Tailwind CSS. Loaded via `hyva_*` layout handles. Module CSS injected via `hyva_default.xml`.**Breeze Evolution**PartialNo dedicated Breeze templates; falls back to Luma `.phtml`. Breeze-compatible Less styles provided in `view/frontend/web/css/breeze/_default.less`.To add proper Breeze template support: create `view/frontend/templates/account/returns_list_breeze.phtml`, `return_view_breeze.phtml`, and the equivalent create templates, then wire them in `breeze_returns_*` layout handles.

---

Requirements
------------

[](#requirements)

DependencyVersion / NotesPHP8.1+Magento2.4.x`Orangecat_Core`composer: `orangecat/core``Magento_Catalog`core`Magento_Sales`core`Magento_Customer`core`Magento_Eav`core — used by `AddIsReturnableAttribute` data patch`Magento_Email`core`Magento_Ui`core`Magento_Backend`core---

Installation
------------

[](#installation)

This module is a git submodule of the B2B SDK. To add it:

```
git submodule add git@github.com:olivertar/m2_returns.git app/code/Orangecat/Returns
git submodule update --init app/code/Orangecat/Returns
```

Then, inside the PHP container (`reward shell`):

```
bin/magento module:enable Orangecat_Returns
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento setup:static-content:deploy -f
bin/magento cache:flush
```

---

What Gets Installed
-------------------

[](#what-gets-installed)

### Database Tables

[](#database-tables)

#### `return_status`

[](#return_status)

The configurable status catalog.

ColumnTypeNotes`status_id`int unsigned, PK, auto-increment`code`varchar(50), NOT NULLUnique machine code (e.g. `pending`).`label`varchar(255), NOT NULLDefault display label.`sort_order`intDisplay order in dropdowns.`is_active`smallint`1` = active, `0` = hidden.#### `return_status_store`

[](#return_status_store)

Per-store label translations for statuses.

ColumnTypeNotes`status_id`int unsigned, PK+FKCascades on delete.`store_id`smallint unsigned, PK+FKCascades on delete.`label`varchar(255), NOT NULLTranslated label for this store.#### `return_reason`

[](#return_reason)

The configurable reason catalog.

ColumnTypeNotes`reason_id`int unsigned, PK, auto-increment`label`varchar(255), NOT NULL`is_other`smallint`1` = renders a free-text textarea on the form.`sort_order`int`is_active`smallint#### `return_reason_store`

[](#return_reason_store)

Per-store label translations for reasons. Same structure as `return_status_store`.

#### `return_condition`

[](#return_condition)

The configurable item-condition catalog.

ColumnTypeNotes`condition_id`int unsigned, PK, auto-increment`label`varchar(255), NOT NULL`sort_order`int`is_active`smallint#### `return_condition_store`

[](#return_condition_store)

Per-store label translations for conditions. Same structure as `return_status_store`.

#### `return_resolution`

[](#return_resolution)

The configurable resolution catalog — the outcome assigned by admin when processing a request (e.g. Refund, Exchange).

ColumnTypeNotes`resolution_id`int unsigned, PK, auto-increment`label`varchar(255), NOT NULL`sort_order`int`is_active`smallint#### `return_resolution_store`

[](#return_resolution_store)

Per-store label translations for resolutions. Same structure as `return_status_store`.

#### `return_request`

[](#return_request)

The return request header — one record per submitted RMA.

ColumnTypeNotes`request_id`int unsigned, PK, auto-increment`increment_id`varchar(50), NOT NULLHuman-readable ID, e.g. `RMA000000001`.`order_id`int unsigned, NOT NULL, FKReferences `sales_order.entity_id`. Cascades on delete.`order_increment_id`varchar(50), NOT NULLSnapshot of the order increment ID.`customer_id`int unsigned, nullableFK to customer. Nullable for future guest support.`customer_email`varchar(255), NOT NULLSnapshot of the customer email at submission time.`store_id`smallint unsigned, NOT NULLStore the order was placed on.`status`varchar(50), NOT NULL, default `pending`Current status code.`resolution`varchar(255), nullableResolution label assigned by admin.`admin_notes`text, nullableInternal notes — not visible to the customer.`customer_comments`text, nullableCustomer's freeform comment submitted with the request.`created_at`timestampSet on INSERT.`updated_at`timestampUpdated on every save.Indexes: `customer_id`, `order_id`, `status`.

#### `return_request_item`

[](#return_request_item)

One record per line item in a return request.

ColumnTypeNotes`item_id`int unsigned, PK, auto-increment`request_id`int unsigned, NOT NULL, FKReferences `return_request.request_id`. Cascades on delete.`order_item_id`int unsigned, NOT NULLReferences the original `sales_order_item`.`product_id`int unsigned, NOT NULLProduct ID at submission time.`product_name`varchar(255), NOT NULLSnapshot of the product name.`product_sku`varchar(255), NOT NULLSnapshot of the product SKU.`qty_requested`decimal(12,4), NOT NULLQuantity the customer wants to return.`reason`varchar(255), NOT NULLReason label stored as text (snapshot).`reason_other`text, nullableFree-text filled when reason `is_other = 1`.`condition_label`varchar(255), nullableItem condition label stored as text (snapshot).Index: `request_id`.

### EAV Attributes

[](#eav-attributes)

Attribute CodeEntityTypeInputScopeDefaultNotes`is_returnable``catalog_product`intbooleanGlobal`0` (No)Appears in product edit under the **Returns** attribute group. Applies to simple, configurable, virtual, bundle, grouped products.> **Important:** Products with `is_returnable = No` (the default) are silently excluded from all return forms. You must explicitly set `is_returnable = Yes` on each product you want to allow returns for. For configurable products, the attribute is checked on the **child simple product** selected in the order.

### Data Patches

[](#data-patches)

ClassWhat It Installs`InstallDefaultStatuses`10 statuses: Pending, Authorized, Partially Authorized, Denied, Return Received, Return Partially Received, Approved, Rejected, Processed and Closed, Closed.`InstallDefaultReasons`6 reasons: Wrong Item, Defective Product, Not As Described, Changed My Mind, Arrived Too Late, Other (`is_other=1`).`InstallDefaultConditions`3 conditions: Unopened, Opened, Damaged.`InstallDefaultResolutions`3 resolutions: Exchange, Refund, Store Credit.`AddIsReturnableAttribute`Adds the `is_returnable` boolean attribute to `catalog_product`.---

Configuration
-------------

[](#configuration)

Navigate to **Stores &gt; Configuration &gt; Orangecat &gt; Returns**.

### General Configuration

[](#general-configuration)

LabelConfig pathDefaultDescriptionEnable Returns Module`returns/general/enabled`YesMaster toggle. Disables all frontend routes and hides the "My Returns" account link when off.Allow Partial Returns`returns/general/allow_partial`YesWhen disabled, the customer must return the full order; item selection checkboxes are hidden.Return Window (days)`returns/general/return_days_limit`30Number of days after the reference date during which a return may be submitted. Set to `0` for no limit.Calculate Return Period From`returns/general/return_period_start`Order Creation Date`order` = order `created_at`; `shipment` = latest shipment `created_at`. When set to `shipment`, orders with no shipments cannot be returned.Return Address`returns/general/return_address`—Shown to customers on the return form and confirmation pages. Store-level scope.Return Instructions`returns/general/return_instructions`—Shown to customers alongside the return address. Store-level scope.Admin Notification Emails`returns/general/notification_emails`—Comma-separated list of email addresses notified when a new return request is submitted.```
returns/general/enabled
returns/general/allow_partial
returns/general/return_days_limit
returns/general/return_period_start
returns/general/return_address
returns/general/return_instructions
returns/general/notification_emails

```

---

Store Admin Guide
-----------------

[](#store-admin-guide)

### Navigating to Returns

[](#navigating-to-returns)

All returns management is under **Orangecat B2B &gt; Returns** in the admin menu.

### Manage Return Requests

[](#manage-return-requests)

**Path:** Orangecat B2B &gt; Returns &gt; Manage Returns

The grid displays all submitted return requests with columns for Increment ID, Order, Customer Email, Status, Store, and Created date. Use the column filters and search to locate specific requests.

**Viewing a request:**

1. Click a row or use **Edit** in the Actions column.
2. The detail page shows the request header (status, resolution, admin notes) and the **Items** tab listing every line item with its reason, condition, and requested quantity.

**Processing a request:**

1. Open the return request edit page.
2. Change **Status** to reflect the current stage (e.g. `Authorized`, `Denied`).
3. Optionally set a **Resolution** (e.g. `Refund`).
4. Add **Admin Notes** for internal tracking — these are not emailed to the customer.
5. Click **Save**. If the status changed, the customer receives an automatic status-update email.

> Admins can only update `status`, `resolution`, and `admin_notes`. Item details are immutable after submission.

### Managing Statuses

[](#managing-statuses)

**Path:** Orangecat B2B &gt; Returns &gt; Statuses

Create, edit, or deactivate return statuses. Each status has a machine `code` (must be unique), a display `label`, a `sort_order`, and an `is_active` flag. Per-store label translations are managed on the status edit form.

### Managing Reasons

[](#managing-reasons)

**Path:** Orangecat B2B &gt; Returns &gt; Reasons

Each reason can optionally have `Is Other = Yes`, which causes a free-text textarea to appear on the frontend return form when that reason is selected.

### Managing Conditions

[](#managing-conditions)

**Path:** Orangecat B2B &gt; Returns &gt; Conditions

Item conditions reported by the customer (e.g. Unopened, Damaged). Supports per-store label translations.

### Managing Resolutions

[](#managing-resolutions)

**Path:** Orangecat B2B &gt; Returns &gt; Resolutions

The set of outcomes admin can assign when processing a request (e.g. Exchange, Refund, Store Credit).

### Enabling Returns on Products

[](#enabling-returns-on-products)

**Path:** Catalog &gt; Products &gt; \[Edit product\] &gt; Returns tab

Set **Is Returnable** to **Yes** on each product that should be eligible for returns. The attribute defaults to **No** — products not explicitly enabled are silently excluded from return forms.

### Configuration

[](#configuration-1)

**Path:** Orangecat B2B &gt; Returns &gt; Settings (or Stores &gt; Configuration &gt; Orangecat &gt; Returns)

See the [Configuration](#configuration) section for a full field reference.

---

Buyer Guide (Frontend)
----------------------

[](#buyer-guide-frontend)

### My Returns (Account Area)

[](#my-returns-account-area)

Logged-in customers see a **My Returns** link in their account navigation (after Orders). The page lists all their submitted return requests with Increment ID, linked Order, Status, and submission date.

**URL:** `/returns/account/index`

### Submitting a New Return

[](#submitting-a-new-return)

1. Navigate to **My Returns** and click **Create New Return**, or go directly to `/returns/create/search`.
2. Enter your Order ID or Order Increment ID to locate the order.
3. If the order is eligible, you are taken to the return form at `/returns/create/form?order_id=`.
4. For each returnable item in the order:
    - Check the item (when partial returns are enabled).
    - Enter the quantity to return (must not exceed the available balance).
    - Select a **Reason** from the dropdown; if "Other" is chosen, fill in the free-text field.
    - Select the **Condition** of the item.
5. Optionally add a **Comment** (general notes for the admin).
6. Submit the form. On success, you are redirected to the request detail page showing the new `RMAxxxxxxxxx` increment ID.

Orders that are not in `complete` or `closed` state, or that are outside the return window, are rejected with an explanatory error message.

### Viewing a Return Request

[](#viewing-a-return-request)

**URL:** `/returns/account/view?id=`

Shows the request header (status, resolution if assigned, submission date, customer comments) and a table of requested items with their reasons, conditions, and quantities.

---

Developer Guide
---------------

[](#developer-guide)

### Module Structure

[](#module-structure)

```
Orangecat/Returns/
├── Api/                          # Service contracts
│   ├── Data/                     # Data interfaces (ReturnRequest, Item, Status, Reason, Condition, Resolution)
│   └── *RepositoryInterface.php  # One repository interface per entity
├── Block/
│   ├── Account/                  # ReturnsList, ReturnView, Link (customer account)
│   ├── Adminhtml/Returns/        # Admin edit/tabs/form blocks
│   └── Create/                   # Form, Search blocks (frontend create flow)
├── Controller/
│   ├── Account/                  # Index (list), View (detail)
│   ├── Adminhtml/                # CRUD controllers for Returns, Status, Reason, Condition, Resolution
│   └── Create/                   # Search, Form, Post (submit)
├── Helper/
│   └── Data.php                  # canReturn(), isProductReturnable(), getRequestedQty()
├── Model/
│   ├── Config.php                # Typed config accessors
│   ├── Email/Sender.php          # Email dispatch for both templates
│   ├── Config/Source/            # Dropdown sources for system.xml and forms
│   ├── ResourceModel/            # One resource model + collection per entity
│   └── ReturnRequest.php         # Main model; also Status, Reason, Condition, Resolution, Item
├── Observer/
│   ├── SendNewRequestNotification.php
│   └── SendStatusUpdateEmail.php
├── Setup/Patch/Data/             # 5 data patches (statuses, reasons, conditions, resolutions, EAV attribute)
├── Ui/Component/Listing/Column/  # Actions columns for all five admin grids
├── view/
│   ├── adminhtml/                # UI component XML, layout XML, templates
│   └── frontend/
│       ├── email/                # Two email templates
│       ├── layout/               # Luma + hyva_ layout handles
│       ├── templates/            # account/* and create/* — both Luma and Hyvä variants
│       └── web/css/              # source/_module.less (Luma), hyva/module.css, breeze/_default.less
└── etc/
    ├── db_schema.xml
    ├── di.xml / adminhtml/di.xml
    ├── events.xml
    ├── email_templates.xml
    ├── acl.xml
    ├── adminhtml/{menu,routes,system}.xml
    └── frontend/routes.xml

```

### Key Classes

[](#key-classes)

#### Service Contracts

[](#service-contracts)

InterfaceImplementationDescription`ReturnRequestRepositoryInterface``ReturnRequestRepository``save()`, `getById()`, `getList()`, `delete()`, `deleteById()`, `getItemsByRequestId()`. Dispatches `return_request_created` and `return_request_status_changed` events automatically on save.`StatusRepositoryInterface``StatusRepository`CRUD for return statuses.`ReasonRepositoryInterface``ReasonRepository`CRUD for return reasons.`ConditionRepositoryInterface``ConditionRepository`CRUD for item conditions.`ResolutionRepositoryInterface``ResolutionRepository`CRUD for resolutions.#### Notable Models

[](#notable-models)

ClassPurpose`Model\Config`Typed accessors for all `returns/general/*` config values. Inject instead of calling `ScopeConfigInterface` directly.`Helper\Data``canReturn(OrderInterface)` — full eligibility check. `isProductReturnable(OrderItemInterface)` — resolves to the child simple for configurables. `getRequestedQty(OrderItemInterface)` — sums all past requests (all statuses).`Model\Email\Sender`Wraps `TransportBuilder` for both notification templates.#### Increment ID Format

[](#increment-id-format)

`ReturnRequestRepository::save()` sets the increment ID after the first INSERT using `sprintf('RMA%09d', $requestId)`, producing values like `RMA000000001`.

### Observers

[](#observers)

ClassEventAction`Observer\SendNewRequestNotification``return_request_created`Sends `returns_new_request_admin` email to all configured admin notification addresses.`Observer\SendStatusUpdateEmail``return_request_status_changed`Sends `returns_status_update_customer` email to the customer when status changes.Both observers swallow exceptions silently to prevent email failures from breaking the save flow.

### Plugins

[](#plugins)

This module registers no plugins.

### Email Templates

[](#email-templates)

Template IDFileTrigger`returns_new_request_admin``view/frontend/email/returns_new_request_admin.html`New return request submitted (`return_request_created` event). Sent to admin notification addresses.`returns_status_update_customer``view/frontend/email/returns_status_update_customer.html`Return request status updated (`return_request_status_changed` event). Sent to the customer.### ACL Resources

[](#acl-resources)

Resource IDTitleLocation`Orangecat_Returns::returns`ReturnsUnder `Magento_Backend::admin``Orangecat_Returns::returns_manage`Manage Return RequestsUnder `returns``Orangecat_Returns::status`Manage StatusesUnder `returns``Orangecat_Returns::reason`Manage ReasonsUnder `returns``Orangecat_Returns::condition`Manage ConditionsUnder `returns``Orangecat_Returns::resolution`Manage ResolutionsUnder `returns``Orangecat_Returns::config`Returns ConfigurationUnder `Magento_Config::config`### Adding Custom Logic

[](#adding-custom-logic)

- **Override eligibility:** Add a plugin on `Helper\Data::canReturn()` or extend `Model\Config` to inject additional rules (e.g., block returns for specific customer groups or SKUs).
- **React to state changes:** Observe `return_request_created` or `return_request_status_changed` events — both pass the `ReturnRequestInterface` instance in event data.
- **Custom lookup values:** Add records directly to `return_status`, `return_reason`, `return_condition`, or `return_resolution` via a data patch that depends on the corresponding `InstallDefault*` patch.

---

REST API
--------

[](#rest-api)

This module does not expose any REST API endpoints. No `webapi.xml` is defined.

---

Frontend Routes Reference
-------------------------

[](#frontend-routes-reference)

Frontend front name: `returns`.

RouteControllerAccess`GET /returns/account/index``Controller\Account\Index`Logged-in customers`GET /returns/account/view``Controller\Account\View`Logged-in customers (`?id=`)`GET /returns/create/search``Controller\Create\Search`Logged-in customers`GET /returns/create/form``Controller\Create\Form`Logged-in customers (`?order_id=`)`POST /returns/create/post``Controller\Create\Post`Logged-in customersAll customer-facing controllers extend `Magento\Customer\Controller\AbstractAccount` and redirect unauthenticated visitors to the login page. All controllers redirect to `/customer/account` when the module is disabled.

---

DevOps &amp; Integrator Notes
-----------------------------

[](#devops--integrator-notes)

### Deployment Checklist

[](#deployment-checklist)

```
# Run inside reward shell
bin/magento module:enable Orangecat_Returns
bin/magento setup:upgrade          # runs DB schema + data patches
bin/magento setup:di:compile
bin/magento setup:static-content:deploy -f
bin/magento cache:flush
```

### Minimum ACL for Integration Token

[](#minimum-acl-for-integration-token)

An integration used to manage returns programmatically needs:

- `Orangecat_Returns::returns_manage` — read/update return requests
- `Orangecat_Returns::status` — read/manage statuses
- `Orangecat_Returns::reason` — read/manage reasons
- `Orangecat_Returns::condition` — read/manage conditions
- `Orangecat_Returns::resolution` — read/manage resolutions

### Disabling Without Uninstalling

[](#disabling-without-uninstalling)

```
bin/magento module:disable Orangecat_Returns
bin/magento setup:upgrade
bin/magento cache:flush
```

When disabled: all frontend routes return a redirect to `/customer/account`; the admin menu disappears; existing data in all `return_*` tables is preserved.

### Data Integrity Notes

[](#data-integrity-notes)

- Deleting a `sales_order` record cascades to `return_request` and then to `return_request_item` (FK with `ON DELETE CASCADE`).
- Deleting a status, reason, condition, or resolution from the catalog tables **does not** cascade to existing request records. Item reasons and conditions are stored as text snapshots at submission time; status codes are stored as raw strings. Removing a catalog entry will not break existing requests but will remove it from dropdowns for new ones.
- `return_status.code` has a unique constraint. Duplicate codes from custom patches will throw a DB-level exception during `setup:upgrade`.
- The `is_returnable` product attribute defaults to `0` (No). Products without an explicit `Yes` value are excluded from all return forms — verify this is set before go-live.

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance99

Actively maintained with recent releases

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity33

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

2

Last Release

2d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/959440?v=4)[Oliverio Gombert](/maintainers/olivertar)[@olivertar](https://github.com/olivertar)

---

Top Contributors

[![olivertar](https://avatars.githubusercontent.com/u/959440?v=4)](https://github.com/olivertar "olivertar (14 commits)")

---

Tags

b2bmagento2rmareturnsorangecat

### Embed Badge

![Health badge](/badges/orangecat-module-returns/health.svg)

```
[![Health](https://phpackages.com/badges/orangecat-module-returns/health.svg)](https://phpackages.com/packages/orangecat-module-returns)
```

###  Alternatives

[magepal/magento2-googletagmanager

Google Tag Manager (GTM) for Magento 2 with Advance Data Layer

2671.6M5](/packages/magepal-magento2-googletagmanager)[run-as-root/magento2-prometheus-exporter

Magento2 Prometheus Exporter

68353.9k](/packages/run-as-root-magento2-prometheus-exporter)[magepal/magento2-reindex

Reindex your Magento2 store quickly and easily from backend/admin, instead of command line.

112688.4k1](/packages/magepal-magento2-reindex)[myparcelnl/magento

A Magento 2 module that creates MyParcel labels

1859.0k](/packages/myparcelnl-magento)[smile/module-gift-sales-rule

Extension of Magento2 Sales Rule to provide gifted (free) products.

35122.3k2](/packages/smile-module-gift-sales-rule)[smile/module-retailer

Smile Retailer Suite - Retailer Module

15536.9k7](/packages/smile-module-retailer)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
