Sales in a competitive market is the driving force of a company. One of the critical factors influencing sales volume is sales price. Dynamics 365 for Finance and Operation (D365FO) has a very strong functionality to manage sales pricing in a very flexible way. In this blog post, I cover a lot of available options in D365FO related to sales prices.
This post is also applicable for Dynamics AX 2012 (AX2012).
- Sales price in product details
- Sales price in trade agreements
- How to determine where the price was taken from
- Sales agreements
- Attribute-based sales pricing
This post doesn’t cover sales pricing related to retail.
Sales price in product details
The most simple setting for a sales price is to put it on the product. To make things work, just set the base sales price and sales order unit there. The price is transferred from the product to the sales order. The price is recalculated if the sales unit in the product details is different from the unit in the sales order. For example, a sales price is set as $0.5 for 1 unit and 1 pallet includes 500 units. Then one pallet is specified in the sales order, so the price per pallet in the sales order will be $250 ($0.5 * 500 units per pallet).
It is also important to mention here that the price is set in the national currency that is specified in the ledger module. The system recalculates the price if the currency in the sales order is different from the national currency.
Another important parameter that can be set in the product details is the “Price quantity,” meaning that the price is set per quantity of units. For example, the price can be set as $3,000 per 10 units, so the price per 1 unit is $300 ($3,000/10).
D365FO offers functionality to set a sales price based on the purchase price. As one of the options, you can set sales price based on the purchase price by specifying the charges percentage. In this case, the sales price is calculated and specified automatically: purchase price * (charges percentage / 100 + 1).
Instead of charges percentage, it’s also possible to use the contribution ratio model, which can be specified in the “Sales price model” field. In this case, the calculation of the sales price is: (purchase price * 100) / (100 – contribution ratio).
The sales price can also be calculated based on the cost of production. The option can be specified in the “Base price” field, and the cost is specified in the “Manage costs” tab.
The system allows automatically updating the purchase price and cost. This option advances sales price management. It means that if the sales price is set based on the purchase price or the cost, the sales price can be updated automatically because of automatic updating of the purchase price or cost. The image below shows an example where I linked sales price to purchase price and specified that purchased price must be updated automatically.
In accordance with the setting above, the system updates the purchase price when the purchase invoice is posted, and then updates the sales price in accordance with the purchase price. It’s also true when a sales price is linked to the cost.
In this chapter I covered the most basic functionality regarding sales prices. In the chapters below, I describe more advanced options.
Sales price in trade agreements
A more sophisticated option to set up prices is to use trade agreements. Trade agreements give a lot of flexibility. You can still set the base price in the product details, but you can also specify a price in the trade agreement. A price in the trade agreement has priority over a base price in the product details. It means if the system finds an appropriate price in trade agreements, and at the same time the price is available in the product details, the system will use the price from the trade agreement.
In order to use trade agreements, it is required to create at least a trade agreements journal name.
To create a trade agreement journal name for sales prices, use the “Price (sales)” value in the “Relation” field.
Price for period
Let’s say you’re required to set a specific price from the exact date. A trade agreement helps to accomplish the requirement.
The system gives you options for how to define the date that must be used to determine the price. Make sure that the “Date type” parameter in the account receivable module has an appropriate value. In my example, I set the “Today” value meaning that is used the system date to determine the price.
To set a price that is active from the particular date, create a new journal and go to its lines. Then select the “Table” value in the “Production code type” field and specify the item code in the “Item relation” field. Also specify unit, currency, and price unit (the same as price quantity in the product details). Finally, you need to input the “From date” value.
After that you need to post the trade agreement journal to make the price active in the system. When you add a new product to the sales order, the system searches for a price in trade agreements first. If the appropriate price in not found in trade agreements, then the system looks for the price in the product details.
Price for inventory dimensions
The system gives an option to set prices in connection with inventory dimensions such as product, storage, and tracking. For activating this functionality, the necessary settings must be done in the dimension groups that are linked to the product. To activate the dimension for price, the “For sales prices” field must be marked.
For example, let’s set the price for a specific color. If the color is not available in the lines of the trade agreement, then turn it on by clicking the “Inventory / Display dimensions” button. Please note that the system shows active dimensions for the selected item code that is specified in the “Item relation” field.
Don’t forget to post the journal.
Price for customer group or exact customer
To retain or attract high valued customers, a company can offer special prices for them. It’s possible to set these in D365FO by using trade agreements. To enable this option, the “Activate price/discount” parameters must be set up.
Next, it’s necessary to create groups of customers.
Then you need to link the customer to the group.
After that, you can set the price for the customer group in the trade agreement journal.
If a company has a very special customer, it is also possible to set the price for that exact customer. In this case, just choose the “Table” value in the “Party code type” field and set the customer code in the “Account selection” field.
To activate the price, the journal must be posted.
Price for quantity
D365FO allows setting prices depending on the quantity that the customer is going to buy. In the example below, I set the price for an exact customer and minimum quantity for the specified price. So the price will be used if the customer buys 10 or more units.
The system gives an option to round the prices in the trade agreement journal. To use this option, the smart roundings must be set up.
You can find a guide for smart rounding in the “Trade agreements” document, the chapter is “Smart rounding”.
Smart roundings can be applied in the journal by the “Adjustment / Apply smart rounding” button.
After the “Apply smart rounding” function was run, the prices in the journal were adjusted in accordance with the smart rounding settings.
How the search price engine works
The key rule of the search price engine is that it searches from the particular to the general. This means, for example, that the system searches the price for the exact customer first. If the price for the customer is not found, then the system looks further for the customer group, and so on.
The important thing is that trade agreements allow setting more than one price that can be applicable for exact conditions. For example, it’s possible to set more than one price for the particular product, or particular customer. In this case the system uses the LOWEST price.
Some details about the logic of searching can also be found in the “Trade agreements” document – chapter “Priority for searching through dimensions.”
How to manage trade agreements
There are many options available for managing trade agreements. First, let’s talk about initial data entry. The most straightforward way is to manually enter trade agreements in the journal, entering line by line by using the “Copy line” button. This option is suitable if it’s not necessary to input many records.
However, if it’s required to enter hundreds or thousands of records then this approach is not suitable. For bulk uploading, it’s possible to use the “Open sales price journal lines” data entity in the data management module. This option allows uploading records from a file.
It’s also possible to input a trade agreement journal line by selecting already available trade agreements in the system. You can use the “Select” button in the “Overview” tab of the trade agreement lines to resolve this task. When you click the button, the system requests criteria to filter the necessary trade agreements. The example in the image below shows how to select all prices available in the system.
When the lines are available in the journal, it’s possible to use Excel to manage them. Click the “Open sales price journal lines” menu to download an Excel file that is connected to D365FO. You can find more information about opening in Excel in this link.
Another option for creating a trade agreement journal is to open the “Price (sales)” page from the “Released products” page, then select the prices that are necessary to change, and click the “Edit selected lines” button. The system offers creating a trade agreement journal where you’ll be able to change or delete prices.
To delete prices, click the “Select all agreements to be deleted” button and post the journal.
Trade agreements is a very strong functionality. This option complements the basic pricing functionality and gives a lot of flexibility for specifying prices. However, I don’t recommend making your pricing very tricky, because it can be time consuming to support it.
How to determine where the price was taken from
Now let’s have a look at the available options for tracking the settings that were used to determine the price in the sales order. You can use the “Find price” page where “Price and discounts from agreements” and “Product price” are shown. The “Price and discounts from agreements” group contains information from trade agreements and the “Product price” group has information from the product details.
Another option for tracking the price determination is to use the “Price details” functionality. Please note that this function must be turned on first.
The price details page shows the price from the exact trade agreement, and also contains information about potential agreements.
D365FO offers functionality to manage sales agreements (don’t confuse it with trade agreements as it’s a very different functionality). A sales agreement is a contract according to which a customer must buy products in a specific quantity or amount over an agreed period of time. In its turn, the company offers a special price for the customer.
One of the most important parameter of a sales agreement is the commitment that the company and the customer agreed on. Different commitment types are available in D365FO. You can find more information about sales agreement commitments in this link.
Before you can use sales agreements, at least one sales agreement classification record must be set up.
There is an example of a sales agreement below, where the price for the exact product is specified.
The system offers a few options to link a sales order to the sales agreement. The first option is to create a new sales order from the sales agreement. To do so, click on the “Release order” button and the system shows the form where it is necessary to provide details about a new sales order. In case of product quantity commitment, the system requests sales quantity for each line of the sales agreement.
When the the sale order was created, the linked sales agreement can be found by clicking the “Attached sales agreements” button.
The lines of the sales order and sales agreement are linked. The prices are transferred to sales orders as well. You have options to discover linked lines, unlink lines, and create a new link.
Another option to link a sales order to the sales agreement is to choose sales agreement when creating a sales order.
In this case, when the added product in the sales order matches the product in the agreement, the system links the sales order and sales agreement lines together.
The system allows tracking the fulfillment of sales agreements. Information about fulfillment can be found on the sales agreement page.
The system also has a report which aids tracking the fulfillment of sales agreements.
More details about sales agreements can be found in this documentation. A video is also available here. It focuses on Dynamics AX 2012 but it is pretty similar to D365FO and gives a good idea of how it works.
Attribute-based sales pricing
D365FO allows setting sales prices based on the properties of the product’s batch. The idea is that the company has a base price for the product and then adjust it depending on the properties of the batch. The batch’s properties are listed as batch attributes in the system. The price can be calculated based on the values of theses attributes. This method is known as attribute-based pricing.
To understanding this functionality, you need to be familiar with the following D365FO concepts:
- Batch management and logistics – batches in D365 are used to track products. You also need to know how to register the received quantity in the system.
- Batch attributes – D365FO allows the tracking property values in a batch, meaning that it is possible to define and track the attributes and values of each batch.
- Potency and potency management – the term “potency” is used mostly in the pharmaceutical industry and refers to the concentration of active ingredient in the product. Attribute-based sales pricing only works in D365FO if the product is defined in the system as a potency item.
I’ll guide you through the most straightforward way of setting attribute-based sales pricing in D365FO. To make it easier to follow, I’m going to use the example.
Product: M1101 Foam reacting agent
Potency base attribute: Concentration Percentage
Target value of potency: 25%
Actual value of potency: 30%
Base sales price: $60 per bag
Potency adjusted price = $60 * 30/25 = $72
Sale quantity: 5 bags
Net amount = 5 bags * $72 = $360
The steps to follow:
1. Let’s start from batch attributes. At least one batch attribute must be available in the system. If there isn’t, then create one.
2. Now you need to make sure that the product is linked to the tracking dimension group where the batch is active.
3. Now let’s link the batch attribute to the item. For this example, I set a “Product specific” batch attribute.
4. Next, it’s necessary to set a base attribute, which is then used to track the potency of the product. Please note that I also set the “Batch number group” to retrieve the batch number automatically.
5. It’s time to set up attribute-based pricing details. I did it in accordance with the example we’re following.
6. Now everything is ready to set a price and link attribute-based pricing to it. The price must be set in a trade agreement which is described earlier on in this post. Here is how I set it.
Don’t forget to post the trade agreement journal.
7.This is all you need to set up attribute-based pricing. Let’s add inventory to stock; I used movement journal. When registering inventory, it’s also possible to set a value for the potency attribute.
Don’t forget to confirm registration.
8. Now we can sell the product. I created a sales order, added the M1101 item, specified quantity, and set all other required parameters. Please note that the base price from the trade agreement is used at this step, and the attribute-based pricing is linked to the line of the sale order.
9. What is needed now is to pick and pack the batch we registered above. After that, the invoice can be issued. At this point, the system calculates the invoice’s adjusted net amount.
While I was testing this option I noticed that the system always rounded the net amount to an integer. I checked the code and, if I’m not wrong, it’s programmed that way. I can see it in the “averageAdjustedUnitPriceOnServer” method of the “PdsPriceEstablisher” class, the “calculator.averageAdjustedUnitPrice(0, inventTrans.Qty);” line.
That is all I have regarding sales prices in D365FO. I hope this post was helpful for you. Please don’t hesitate to share your thoughts about this topic in the comments.
Thanks for reading!