Charge rule-driven extra fees as individual line items in Magento 2 cart and checkout
Some products cost more to sell than their price tag shows: hazmat handling, oversized delivery, cold-chain packaging, regulatory surcharges. OCMLabs Extra Fees lets you define those charges as named rules in the Magento admin and applies each one as its own labeled line item in cart and checkout totals whenever its conditions match. Multiple fees stack, each on its own line, so the shopper sees exactly what they are paying and why.

Target fees precisely, not with blanket surcharges
Every fee carries a condition set built from two kinds of rules. Product conditions match against any product attribute with a select or multiselect input, plus SKU with autocomplete search, using six operators (Is, Is Not, and four numeric comparisons). Cart conditions match against the cart itself: subtotal, item quantity, shipping country, region, and postcode, customer group, shipping method, and payment method. Mix both kinds on one fee and combine them with AND or OR.
Conditions store attribute option IDs, not label text, so renaming an attribute option in the catalog never breaks a fee. Configurable products are checked on both the parent and the selected child, so variant-level attributes like size or material work as conditions. A fee with no conditions applies to every cart.
Fixed or percentage, with caps
A fixed fee adds a flat base-currency amount. A percentage fee is computed from the pre-discount, tax-exclusive row totals of the matching items only, not the whole cart, and can be clamped with optional Min and Max amounts so a percentage never drops below or climbs above a sensible figure.
Fees the shopper chooses
Mark a fee “Is Optional” and it stops being automatic: it appears as an unchecked checkbox in the checkout order summary, and the total updates the moment the shopper opts in. The same selection surface is exposed over REST and GraphQL for headless storefronts.
Scoped, scheduled, taxed, and multi-currency
Each fee can be limited to specific store views with per-store label overrides for localization, and can carry an Active From / Active To window evaluated in the store’s own timezone. Taxable fees run through Magento’s tax engine using a per-fee tax class or a global default, with an optional store-wide tax-inclusive entry mode. Fixed amounts convert from base to display currency at the current rate; percentage fees compute in each currency from its own item prices.
Carried correctly through the whole order
Fees persist on the order and appear everywhere totals render: cart and checkout, order, invoice, and credit memo emails, customer account and guest order views and their print pages, PDF invoices and credit memos, and every admin view including order creation. The full fee is captured on the first invoice and refunded on the first credit memo after it, and the module never refunds more than was invoiced.
Built for teams that manage pricing
The admin grid supports filtering, inline edits, mass enable/disable/delete, CSV export, and a Duplicate action that always creates the copy disabled. A Fee Revenue report shows fee, tax, invoiced, and refunded amounts per order, and a Change Log records who changed which fee, when, and what changed. A dedicated view-only ACL role gives finance staff read access without edit rights.

At a glance
- MODULE
- OCMLabs_ExtraFees (Composer: ocmlabs/module-extra-fees)
- MAGENTO
- 2.4.7 - 2.4.8, Open Source and Adobe Commerce
- LICENSE
- $250 Magento Open Source, $500 Adobe Commerce (ocmlabs/module-extra-fees-commerce)
- PHP
- 8.3 or higher
- FEE TYPES
- Fixed or percentage, with optional min/max caps on percentage fees
- CONDITIONS
- Product attributes and SKU with six operators, plus eight cart-level conditions, combined with AND/OR
- TAX
- Per-fee tax class with global default, optional tax-inclusive entry, tax rolled into the Tax total
- APIS
- Admin REST CRUD, customer/guest selection REST endpoints, GraphQL queries and mutation
- ADMIN
- ACL-controlled with a separate view-only role (OCMLabs_ExtraFees::view)