The ultimate guide for a successful odoo-ERP-implementation   Free Download

Sales Master Agreements

Mapping of Call-off or Master Agreements in Odoo Standard under Sales


In this article, we want to show how to use master agreements in sales with onboard means, even though the function does not officially exist in Odoo Standard.

Proceeding from the creation of the contract to its final evaluation.
Step 1: Creating a quote
Step 2: Generating a price list as a representation of the master agreement
Step 3: Creating call-offs via duplication, Excel import, or quotation templates
Step 4: Target-Performance-Comparison and display of quantity already called off within the master agreement

We will see that the number of requirements and functions is not always represented 1:1 within a system. Sometimes, however, the knowledge of the system and a little ingenuity help to achieve the same goal.


At some point in almost every company focusing on B2B, there will be a requirement to map a client’s master agreements in the system. Usually, this involves the representation of the following four essential functions. 

1) Prices

Within the call-off agreement, deviating prices/discounts may have been agreed upon that need to be considered.

2) Quantities

The prices agreed on in (1) are tied to a time frame and a fixed purchase volume. Therefore, both have to be evaluated regularly to determine whether the agreement is being adhered to as planned or needs to be adjusted.

3) Quick Call-off

A quick call-off option should be part of the implementation to ensure an effective process if only to minimize potential errors as much as possible. Therefore, you should be able to call off the products included in the master agreement quickly. In addition, a delivery schedule may apply, including the respective quantities.

4) Reporting

Bear in mind, however, that we are not only dealing with how many master agreements exist and how they are structured but also with the target-performance comparison for the sales planning.

The “Purchase Agreements“ extension may be activated in the settings of the Purchase Module, as every experienced Odoo user knows.

Setting Purchase Agreements(Fig.1)

After activation, you may create and configure different types of purchase contracts, e.g., tenders or blanket orders. In addition, you can see and manage essential information on a single screen.

Blanket Orders(Fig.2)

The key points here are probably the assignment to a supplier (“Vendor“), the term of the agreement (“Agreement Deadline“), the comparison of the quantities agreed on in the contract (here shown as “Quantity“), and the amount already called off from the supplier (“Ordered Quantities“).

Of course, it is nice to also have Chatterbox and file storage, which may also be used for versioning and communication. In addition, all process-related files may be stored here to make them accessible.

However, there is no such thing as a separate reporting system; items 1-3 in our list are displayed only here. Item 3 is shown via the configuration of the contract types, and here, the creation of a new RfQ (Request for quotation) and its subsequent behavior may be defined and mapped (see the area on the right).

Agreement Type(Fig.3)

Background Information

There has never been a comparable function in the Sales module, and we can only speculate why it has not been introduced in this form.

The main task of purchasing is to negotiate the best possible price, usually achieved via an appropriate quantity. Therefore, defining a purchasing framework and implementing a related tender are standard processes that require mapping in an integrated system.

Moreover, the tasks of an ERP system include determining a quantity requirement from sales as well as the conversion and transfer to purchasing, taking into account the delivery times. Here, we need to distinguish several use cases:

  • Purchase articles or components with previously determined conditions
  • Products and quantities, where prices and conditions have yet to be determined (regardless of whether they originate in a project or are scheduled over a fixed period).

Consequently, there should be a possibility to control these two different processes.

In Odoo Sales, only the display of price lists is available to illustrate the general conditions. However, these may be used in many ways and are not only intended for controlling individual prices but can also be used in the context of campaigns to regulate the prices of different sales channels or to signal different types of contracts.

Why Odoo has not gone further here is anyone’s guess. However, conjecture does not change that no other specific functions exist.

Mapping in Sales

The legitimate question is, of course, what about the remaining items on our list? After all, a price is only one, albeit an essential, part of a sales agreement.


Let us compare the quantity agreed on in the master agreement and the amount already called off; in other words, let us move on to the comparison shown in Fig. 2. 

Step 1

The solution is relatively simple. First, let us look at what happens in real life:

We have received an inquiry that appears as a sales opportunity in CRM.

This leads us to a quotation mapping the calculation or master agreement. Here, we can use the full range of the Odoo quotation system, i.e., price calculation, communication, and complete versioning, all in one place.

If it becomes necessary to create different calculations, the quotations may be duplicated to create separate calculations. You can store imputed purchase prices here if you also open the “Cost“ field. This offers two advantages:

  1. We can see the planned margin for the total order (either as a percentage or monetary value).
  2. There is a comparison parameter to the later ACTUAL value or a starting value for purchasing.

At this point, it is essential NOT to confirm the offer once the contract is signed. Instead, it needs to remain in the status ”Offer” or “Offer sent”; otherwise, our calculation will appear in the sales statistics. In addition, this would trigger a delivery and probably even more processes (e.g., reordering levels, purchase requests, etc.).

This raises the fundamental question of how a commercial commission is recorded. Since we cannot trigger a technical commission, we are left with a purely communicative solution: a manual confirmation by e-mail and a corresponding internal note in Chatterbox.

If there are several versions of the master agreement (i.e., separate offers), all processes that have not been signed need to be canceled; otherwise, the picture in the report would be significantly distorted. 

Step 2

The next step is to transfer the price conditions into a price list since all call-offs should contain the corresponding conditions.

Then, to avoid time-consuming manual creation, you may export the offer, convert it into the import format of a price list, and re-import that list.

The format may be obtained quite easily by exporting an existing price list. This could then look like this:

Export Price Conditions(Fig.4)

However, a manual transfer might be faster if there are only a few positions. This also applies if you are still getting familiar with the Odoo export and import functions.

Two points are important here:
  1. The price list must contain the contract number as well as a descriptive name.
  2. The price list must now be assigned to the quotation that symbolizes the master agreement. A recalculation of the prices should NOT be performed.

Quick Call-off

Depending on the most efficient and effective solution for the individual situation, some may use this optional step with its various possibilities. This provides another fine example that there is no one true way.

The issue is to record and schedule the call-offs from the master agreement quickly and as accurately as possible.

Various solutions are possible, including duplicating the quotation, Excel import, and quotation templates.


The easiest way, of course, is to call up the quotation representing the master agreement and duplicate it. The quantities, positions, and delivery dates will be adjusted accordingly.

The call-offs may also be uploaded via an Excel spreadsheet, which is particularly helpful for these two applications:

  • Case 1) The delivery dates and call-off quantities are part of the master agreement. In this case, creating them in Excel and importing them into the system would make sense. They would be easily visible, and the quantities would be easy to schedule. In addition, if you add an activity, the dates will become available to the sales department for follow-up; they could be confirmed again in time and would thus be sent on for requirements planning in a controlled manner.
  • Case 2) The Excel file is available to the customer, who uses it to send the required quantities for the respective products. It may now be easily loaded into Odoo. Another advantage of this approach is that the customer may view the call-offs in advance via his portal access and communicate about them.
Quotation Templates

The final alternative is somewhat similar to the duplication approach. With this solution, you may create a quotation template under the same name as the master agreement.

Then, using an import function (structured not unlike the price list), products may be loaded into the template, offering additional interesting configuration details.

As shown on the screen in Fig.5, a different quotation validity, confirmation via the portal, or differently worded order confirmation e-mails are possible.

Quotation Template(Fig.5)

However, you will find the most critical point in the last tab, which may be combined with the Excel import.

This version is quite convenient in terms of usability, providing the sales department with information on which products are part of the master agreement and which are not.

In addition, removing items is generally much quicker and easier than adding them, at least from the point of view of user guidance.

General remarks

In any case, we recommend using the master agreement number and/or cost center of the contract when naming the price list or quotation template file.

This will make it easier to find all objects under both names/numbers. In addition, if the customer does not generate a different transaction number for each call-off, the sales department can easily see the external contract number and copy & paste it into the customer reference field. This would also simplify invoice allocation in the customer’s accounting.


Now we come to the final item, comparing planned and already called-off quantities within the agreement.

To do this, you need to go to the Sales Analysis tab (to be found under the menu item “Reporting“). In my example, I switched to the pivot view and set up the X-axis according to “Order Date.“ Next, you will find the customer, the price list, and the products on the Y-axis.

To show the current status, we should set a filter on the orders and sent quotations.

This would then look as follows:

Sales Analysis(Fig.6)

The screenshot shows that the sales of customer „Azure Interior“ have been broken down into sales without the master agreement (“Public Price List“) and those within the master agreement, giving “BC-Custom1-1234“ as an example.

The quantities in the status “Quotation Sent“ are those of the master agreement, and the quantities under “Sales Order“ are the called-off amounts.

Of course, all this is very simplified to better illustrate the issues. In the real world, this would be just the database; in the next step, you would transfer everything into a spreadsheet. As of Odoo 15, this is relatively easy to do (see tab “INSERT IN SPREADSHEET“) and offers various possibilities for further data analysis, e.g., an evaluation of the expected remaining order volume of the contract, maybe a comparison between the binding deadline and called-off amounts in percentages, etc.


As shown above, the known functions and requirements for mapping a master agreement are covered in Odoo Standard from the sales department’s point of view. Since the contracts in purchasing do not offer a reporting view or further options for analysis, it is perhaps safe to say that the mapping in sales even provides more opportunities for evaluation than an adapted counterpart.

If you have further questions regarding the functions shown here, we are happy to help with your research.

Was this article helpfull information to you? 
Would you mind to leave us a review of your experiences with openfellas?

​​​​​review openfellas

Talk to our experts.

We will find the solution best suited to you and your products!


The openfellas approach to implementation