What we talk about when we talk about KITS in Dynamics AX

We often encounter the requirement for handling kits or product combinations, sets, bundles or packs in the sales module in Dynamics AX. They all have in common a fixed (or partially variable) set of components (‘A’, ‘B’, ‘C’…) offered to the client as a single package ‘K’.

Here the common part ends. The users may follow very different kit handling processes:

  • The kits may be pre-assembled and assume some work at the picking workplace
  • Or the kit just requires a joint shipment
  • On the invoice the kit may be represented by a single line or it may expose its components
  • The sales price for the kit may be less than the sum of the component’s prices, or it may be the same

For example, an epoxy resin may be sold in a combination with a hardener; the ratio between the resin and hardener is pre-defined. This assumes a Bill of Materials for the Epoxy kit:

Product ID



Unit of measure

Regular sales price per unit


Epoxy SET Bisphenol A





Epoxy Resin base Bisphenol A





Epoxy Hardener Phenalkamine




In this example, the “Epoxy set” costs less than the total sales price of the components (150) it entails.

A related problem may arise in the high-tech industry when selling software-hardware bundles. Shown to the customer as one line on the sales confirmation and the invoice, the revenue from this bundle broken down by the revenue stream:

Product ID



Unit of measure



HP Server + 1 y guarantee





HP Proliant Server





1 year guarantee




The guarantee may be managed as a non-stockable item or even as a stockable one, should it be provided by a 3rd party.


Depending on the requirements above the preferrable solution in Dynamics AX 2012 R3 may differ:


Price(K) = Price A + Price B + …

Price(K) < Price A + Price B + …

The lines A, B, C, … are printed

(1) Sales BOM explosion

(2) Supplementary items

(4) Retail mix-and-match discount


Only the kit line K is printed

(3) Sales BOM explosion (customized)

(5) Retail product kits

(3) Sales BOM explosion (customized)

(5) Retail product kits

Let us explore the options in more detail, with its benefits and shortcomings.

(1) Sales BOM explosion

Imagine one “Epoxy SET Bisphenol A” would cost exactly €150 and will be shown to the customer as 2 separate lines. We just know that the epoxy resin is useless without the hardener and we are happy to offer the hardener as an option. Create a simple bill of materials of 2 lines for the set EXY-6001, approve and activate it:

In this example, one set requires 500 ml of the resin and 500 ml of the hardener.

Now create a sales order, enter a new line with the set and apply the Sales order line / Explode BOM lines function:

Choose Select all, OK. The sales order quantity for the original goes to zero, the line is effectively replaced by its 2 components, each with an individual price set in the released product master:

Note the need for the user to press the button. What if the operator does not know there is a BOM behind the set? Use distinctive product names or implement a customization to apply the BOM explosion automatically.

Make sure there is enough stock for EXY-7001 and EXY-7002, produce a delivery note and an invoice for the order. As expected, the invoice shows 2 lines with a total amount of €150. There is no reference to the original set.

(2) Supplementary items

Imagine the buyer of an EXY-7002 “Epoxy hardener” lot is offered a promotional “Mixing bowl”, 1 piece at a discounted price.

Navigate to the EXY-7002 released product record records, use Sell / Supplementary sales items on the ribbon to enter the information as shown below:

Note the sales price for the EXY-7010 “Mixing bowl” is again taken from its own product settings, unless the option Free of charge is chosen. I.e. the level of control of the sales price is very low.

Return to your sales orders, create a new one 50 liters of the hardener EXY-7002. Note that nothing happens when you save the sales line for the main product. Again, the operator MUST know there is a potential supplementary item and press the Sales order line / Supplementary items button:

The Once only option chosen above allows for just one supplementary item line instead of 50 (per liter).

Note: similarly to the BOM explosion and standard multi-line discounts, the supplementary item calculation requires an thoughtful action (clicking the button, approving with OK) from the user. You may think of programming an automatic notification of a supplementary item applicable.

The resulting invoice printout is from the functional perspective equivalent to the previous solution (1) with 2 lines and individual prices:

(3) Sales BOM explosion (customized)

Having the limitations of the solution (1) and (2) in mind, I may recommend developing a customized BOM explosion routine which replaces the components’ sales prices with the (lesser) set sales price. The calculated sales prices follow the ratio of components’ sales amounts. The invoice printout is customized to replace the 2 set component lines with the kit sales line.

You may find the source code of the customization attached to this blog entry. It is kept very minimalistic and non-intrusive, more like a proof of concept. The core of the customization is a change in SalesLine.expandBOM method as well as a hook in the  SalesInvoiceDP.insertIntoSalesInvoiceTmp invoice printout data provider:

Here is what happens when you apply the modified BOM explosion routine to your sales order line:

The sales prices of the components now accommodate the set sales price.

The invoice printout obscures the components as if it was just the set alone, while the kit components are still picked, shipped and posted to the General Ledger at the back office:

(4) Retail mix-and-match discount

Note the difference in the sales price allocation between the solutions (1-2) and (3): the presence of the second line (hardener) have an influence on the first sales line (resin). A similar effect may be achieved with the retail mix-and-match discounts: “take a pillow to your blanket and have a 10% discount on both”.

This may also be applicable to wholesale or manufacturing: we anticipate the demand for the hardener to correlate with the resin and procure / produce both in a constant ratio. The customer is motivated to buy both products together. Should he only buy the resin, the hardener accumulates in our stock and we suffer.

In the previous versions of AX the retail pricing engine was only used on hardware points of sales (POS) and not in the rich client sales order. In AX 2012, the both worlds are united in the Call center extension to the sales orders. The configuration is not quite easy, though. First of all, we need a new “Call center” retail channel to be established in Retail/Common/Retail channels/Call centers:

The Channel user must be associated with the new call center to take advantage of the retail sales orders. In fact, this user – the call center operator -  is given a very limited, workflow-driven access to the sales order form.

Additionally, a Price group of the retail type must assigned to the call center. You may also find it useful to associate your products with a retail category in the retail hierarchy, and the call center should normally be grounded in your Retail assortment hierarchy:

Our mix-and-match agreement must be activated if the 2 products – 50 liters of resin and the 50 liters of hardener – meet each other in the same sales order. This requires a Mix and match group setup of 2 lines there the Number of products needed = 50+50 = 100. Yes, this calculation is kind of weird. My understanding is that in the retail business the stuff is normally sold in small numbers (1+1=2).

In the Retail/Common/Pricing and discount/Mix and match discounts form you must be able to configure the following:

Here the two components together are granted a discount of 10% for both. The link to the call center is established though the Price group (see the button above). Set the status of the discount to Enabled. The discount becomes effective immediately.

Having all the necessary setup in place, proceed to the sales order and enter a new one. With the right AX user every new sales order is associated with the call center and marked as a Retail sale in the order Header view. This activates the retail price and discount engine in the lines.

Enter the first sales line for the 50 liters of EXY-7001. Nothing happens at first, but when you are about to leave the second one (50 l of EXY-7002) a notification appears:

The result is as follows: the 10% discount is applied to the both the resin and the hardener:

Beware: this interactive discount calculation runs amok when you enter a sales quantity more than the Number of products needed = 100.

Moreover, this discount agreement is applied to ANY customer: the call center and retail modules are made to implement a uniform sales process to a large group of mass customers.

As a call center operator, you must Complete the order, providing payment info before shipping and billing. The invoice printout is as follows, individual lines with combination prices; a percentage discount is always converted into an amount by the retail price engine:

(5) Retail product kits

A solution alternative to the BOM explosion is offered by the new retail kit functionality in AX2012 R3. Retail kits are better understood as tangible ones, put into one box: “Canon EOS 100 + 40mm lens kit, boxed”. The retail kits are therefore stored at the warehouse and assembled explicitly. The assembling procedure is managed with a kit assembly order. It silently posts a BOM inventory journal, an approach well known to an experienced Dynamics AX consultant.

The kit requires a configurable product master to be set up (Retail/Common/Kits/Product kits). By clicking Configure you are able to enter the components. Every set of components results in a new Configuration of the kit product:

A retail-enabled “call center sales order" checks for kits on-hand and may raise a kit assembly order automatically when you “Complete” the sales order. Posting the assembly order consumes the components and increases the stock of the kit item. This kit may now be shipped and billed with a trivial invoice layout:

Note: the retail product kit functionality does not use BOMs. The retail ‘flavor’ enforces strict rules for the sales order entry, its modification and fulfillment. The retail kit is normally a stockable one, its shipping requires an explicit confirmation of the assembly order by the warehouse operator.