Skip to content

Product Charges & Fees#


Description#

Available in version 10.11.00, the Product Charges and Fees module allows you to configure additional charges or fees that automatically add to a customer’s basket when they select specific products. These charges or fees are represented as separate products and will display in the basket as “child” items linked to the main product, ensuring clarity for the customer.

Because these items are treated as standard products, they follow the same rules for tax code assignment and returns, ensuring that taxes and refunds are handled accurately without requiring manual adjustments.

Note

Product Charges & Fees will work with the wish list and manage quotes items

Common Use Cases#

This feature is particularly useful in scenarios like:

  • Core Charges for Automotive Products: For example, purchasing an automotive battery may include a refundable core charge.
  • Environmental Fees: A non-refundable recycling fee may also apply when buying certain products, such as car batteries.

Installation#

To begin using this feature, install the module by navigating to Settings > Modules and searching for Product Charges and Fees. Once installed, a productcharges item and two fragments, product_display_productcharges and group_productcharges, will be created along with several new sections within the admin interface.

productcharges Item#

The productcharges item, when initialized, will load all charges linked to the current product residing in l.all_settings:product and make tokens available for the charge and the linked product. The basic fields of the charge name, description, and price will be available.

product_display_productcharges fragment#

This fragment has template code that will output productcharges:chargetypes array items. Specifically the name and amount of each Product Charge/Fee that is assigned to the item. (The description will also be available within a tooltip.) This item needs the productcharges assigned for it to include the productcharges:chargetypes array. This fragment has been added to the Page: Product Display prod-product_display template.

group_productcharges fragment#

This fragment has template code that will output group:children array items. Specifically the name and amount of each Product Charge/Fee that is assigned to the item. (The description will also be available within a tooltip.) This fragment has been added to the following templates within the Shadows framework:

  • Page: Basket Contents bask-basket
  • Page: Invoice invc-order_contents
  • Page: Invoice invc-printer_friendly_content
  • Page: Order Status ords-printer_friendly_content
  • Page: Order Status ords-view_order
  • Template: global-minibasket
  • ReadyTheme Content Section: Checkout Basket Summary

Updated Admin Settings#

Catalog > Charges & Fees#

The Charges & Fees section is a batch list that displays all charges or fees set up within the system. Key fields here include Code, Name, Price, and Type.

Charges & Fees Batchlist

From this screen, you can create new charges by selecting Add Charge Type.

Each charge has an Edit Charge screen that allows for configuration of pricing, taxability, description, and rules for payment and shipping, along with any tax module-specific rules if applicable. There are three available types including Core, Fee, or Other, these types are primarily for categorization. Additionally, this screen contains Products and Collections tabs for assigning products to the charge.

Charges & Fees Edit Screen

When assigning products to a charge, you have the option to override the charge price, making the assignment process a two-stage operation rather than a single toggle. Importantly, when a core charge price is overridden for a collection, only products not already assigned to the charge will have the price overwritten. If a product has been assigned to the charge through another collection or a manual assignment, it will be skipped during processing, avoiding duplicate charges. For server efficiency, only one collection can be assigned at a time due to the processing load with large collections. In the batch list, a new column called Overridden Charge Price will display for clarity, alongside the standard product fields.

Product Assignment

Catalog > Edit Product#

In the Edit Product section, a new Charges & Fees tab appears for each product, listing all charges assigned to that product. Like in the main Charges & Fees section, assigning charges here is a two-step process, allowing you to override the price of each charge as needed.

Shadows Updates#

Basket Page#

  • bask-basket.mvt (Coming Soon)

Product Page#

  • prod-product_display.mvt (Coming Soon)
  • prod-attributemachine.mvt (Coming Soon)

Invoice Page#

  • invc-order_contents.mvt (Coming Soon)
  • invc-printer_friendly_content.mvt (Coming Soon)

Order Stats Page#

  • ords-view_order.mvt (Coming Soon)
  • ords-printer_friendly_content.mvt (Coming Soon)

Global#

  • global-header.mvt (Coming Soon)
  • global_minibasket.mvt (Coming Soon)

Provisioning#

Provisioning available to add, update, delete, assign, and unassign (also from collections):

<ProductChargeType_Add>
    <Type>core,fee,other</Type>
    <Code>code</Code>
    <Name>name</Name>
    <Price>1.11</Price>
    <Cost>2.22</Cost>
    <Weight>3.33</Weight>
    <Description>description</Description>
    <Taxable>true|false</Taxable>
</ProductChargeType_Add>

<ProductChargeType_Update charge_code="existing">
    <Type>core,fee,other</Type>
    <Code>code</Code>
    <Name>name</Name>
    <Price>1.11</Price>
    <Cost>2.22</Cost>
    <Weight>3.33</Weight>
    <Description>description</Description>
    <Taxable>true|false</Taxable>
</ProductChargeType_Update>

<ProductChargeType_Delete charge_code="existing" />

<ProductChargeTypeProduct_Assign charge_code="charge" product_code="existing">
    <!-- Optional -->
    <OverridePrice>true|false</OverridePrice>
    <Price>9.95</Price>
</ProductChargeTypeProduct_Assign>

<ProductChargeTypeProduct_Update charge_code="charge" product_code="existing">
    <OverridePrice>false</OverridePrice>
    <Price>0.00</Price>
</ProductChargeTypeProduct_Update>

<ProductChargeTypeProduct_Unassign charge_code="charge" product_code="existing" />

<ProductChargeTypeCollection_Assign charge_code="test" collection_code="collection">                
    <!-- Optional -->
    <OverridePrice>true|false</OverridePrice>
    <Price>9.95</Price>
</ProductChargeTypeCollection_Assign>

<ProductChargeTypeCollection_Update charge_code="test" collection_code="collection">
    <OverridePrice>false</OverridePrice>
    <Price>0.00</Price>
</ProductChargeTypeCollection_Update>

<ProductChargeTypeCollection_Unassign charge_code="test" collection_code="collection" />

Additional Notes#

Database Update#

This feature includes a database update which introduces a type field to enhance product identification and item management. When type is not specified or left blank, and a matching product exists (i.e., orderitem:product_id is non-zero), the system will automatically assign a type of product. This ensures consistent handling of items linked to product codes.

The following functions now support an optional type parameter:

  • BasketItem_Read
  • OrderItem_Read
  • QuoteItem_Read

Updated Item Structure#

The item structure has been revised to include additional fields. A new variable, parent_xxx_count, now tracks the count of parent products, while each item record will include a :parent_id field to identify parent-child relationships.

The following functions have been updated to incorporate parent_id:

  • QuoteItem_Insert
  • OrderItem_Insert_LowLevel
  • WishListItem_Insert
  • BasketItem_Insert_LowLevel