Skip to Content

Extra Tools app for Odoo

Contract Management & Obligation Tracking

Turn contracts into tracked obligations: a termination notice deadline computed from the expiry date, renewal and review schedules, SLA, insurance and compliance duties with owners, and minimum purchase or sales commitments measured against real orders.

Extra ToolsOPL-1Odoo 19Odoo 18
Contract Management & Obligation Tracking for Odoo, contract workspace
Price$249
LicenseOPL-1
Odoov19 · v18
CategoryExtra Tools

Overview

Contract Management & Obligation Tracking.

Contract Management and Obligation Tracking for Odoo treats a contract as a set of promises with deadlines, not as a PDF with an expiry date. Most contract promises bite long before the contract ends, and the one that costs the most is the termination notice: a 90 day notice clause on a 31 December contract has to be acted on around the end of September. The module computes that notice deadline from the expiry date and the notice period, stores it, and warns against it rather than against the expiry. Every promise becomes a real Odoo record with an owner, a due date, a lead time and a recurrence. Payment terms, annual price escalation clauses, SLA commitments, penalties, warranties, insurance certificate validity, compliance duties and free-form duties are all first class obligations, scheduled as activities against the person responsible. Activating a contract materialises its key dates as obligations automatically, and completing a recurring one spawns its next occurrence. Commercial commitments are measured, not just recorded. A minimum purchase commitment is compared against confirmed purchase orders and a minimum customer sales commitment against confirmed sale orders, net of tax, converted into company currency and grouped by the order currency first so a mixed currency counterparty does not produce a confident wrong number. Progress is measured over the period the commitment actually covers: a quarterly target is judged against the quarter in progress, not against the whole term. Reminders are idempotent by construction. An alert ledger records that a given obligation was warned about for a given rule on a given date, under a database unique constraint, so a daily cron cannot pile up duplicate activities on the same deadline, and moving a due date supersedes the old warning and raises a fresh one. Multi-company isolation and confidentiality are enforced with global record rules rather than group rules, so another group membership cannot widen them. Works on Odoo 19 and 18, Community and Enterprise, with no external dependencies.

How it works

Built around what you actually do.

Every screen below is the module running in Odoo, not a mockup.

01

Termination notice deadline computed from the expiry date and the notice period, so you are warned while you can still act

  • Obligations are real records with an owner, due date, lead time and recurrence, not extracted text
  • Activating a contract materialises its key dates as obligations, and completing a recurring one spawns the next occurrence
  • Minimum purchase commitments measured against confirmed purchase orders, net of tax, in company currency
  • Minimum customer sales commitments measured against confirmed sale orders the same way
Contract Management & Obligation Tracking for Odoo, contract form
Contract form

02

Mixed currency orders are grouped by currency and converted, never summed across currencies

  • Periodic commitments are judged against the period in progress, so a quarterly target is not graded against the whole term
  • Alert ledger with a database unique constraint, so a daily cron cannot raise duplicate activities for the same deadline
  • Moving a due date supersedes the old warning and raises a fresh one, instead of leaving a stale reminder behind
  • Risk register per contract with likelihood, impact and a computed severity
Contract Management & Obligation Tracking for Odoo, obligations
Obligations

03

Confidential contracts restricted to the owner and named authorised users, enforced by global record rules

  • Multi-company isolation on every model, with crons that iterate companies explicitly rather than trusting the cron user's context
  • Four roles - User, Officer, Manager and Confidential - with Confidential deliberately not implied by Manager
  • Calendar, pivot and graph views for obligations, plus a stored per period snapshot of commitment performance
Contract Management & Obligation Tracking for Odoo, overdue
Overdue

Every screen

The whole module, screen by screen.

The captures the walkthrough above did not use, in the order you meet them in the product.

Contract Management & Obligation Tracking for Odoo, awaiting validation
Awaiting validation
Contract Management & Obligation Tracking for Odoo, commitments
Commitments
Contract Management & Obligation Tracking for Odoo, risk register
Risk register
Contract Management & Obligation Tracking for Odoo, obligation calendar
Obligation calendar

A contract is a set of promises with deadlines, and most of them bite long before it expires.

What it does

Contract Management and Obligation Tracking turns each promise in a contract into an Odoo record that somebody owns and that something reminds them about. Effective, signed, expiry and review dates, renewal rules and auto-renewal periods all live on the contract. So does the one date most systems miss: the termination notice deadline, computed backwards from the expiry date and the notice period, so a 90 day notice clause on a 31 December contract warns you around the end of September rather than on the day it is already too late.

Activating a contract materialises its key dates as obligations automatically. Payment terms, price escalation clauses, SLA commitments, penalties, warranties, insurance certificate validity and compliance duties each become a record with a responsible user, a due date, a lead time and a recurrence. Completing a recurring obligation spawns the next occurrence. A per contract risk register records likelihood and impact and computes a score.

Why the reminders do not repeat themselves

This is the detail that decides whether a contract module is usable after the first month. Odoo archives a completed activity in version 19 and deletes it in version 18, so a scheduled job that decides what to warn about by searching for an existing activity will find nothing the moment a user deals with one, and will raise the same reminder again the next night. The user completes it again. It comes back again.

So the record of "we have already warned about this" is kept somewhere the user cannot touch by completing an activity: an alert ledger holding one row per obligation, rule and due date under a database unique constraint. The row is written first and the activity is scheduled only if the row was genuinely new. Moving a due date supersedes the old warning and raises a fresh one, which is the behaviour you want, and repeating the same deadline raises nothing, which is the behaviour you need.

Who it's for

Procurement, legal, finance and operations teams who hold supplier and customer agreements with real obligations in them, and who currently track renewal and notice dates in a spreadsheet next to Odoo. If you have ever auto-renewed a contract you meant to exit, missed a notice window, or reached year end without knowing whether a supplier hit the minimum you committed to, those are the three things this is built to stop.

Questions

About Contract Management & Obligation Tracking.

How is this different from a contract expiry reminder?

An expiry reminder tells you on the day the contract ends, which is usually too late to do anything about it. This module computes the termination notice deadline from the expiry date and the notice period, so a 90 day notice clause on a 31 December contract warns you around the end of September. It also tracks the obligations inside the contract, each with its own owner and deadline, rather than treating the contract as a single date.

Does it need Odoo Enterprise?

No. The module depends only on base, mail, sale and purchase, all of which ship with Community. It deliberately does not depend on Documents, Sign or Subscriptions, which are Enterprise only, so it installs and works identically on both editions.

How are minimum purchase and sales commitments calculated?

Confirmed orders in the commitment window are summed net of tax, grouped by the order currency and converted into company currency. Tax is excluded because a minimum commitment is a promise about net trade between the parties, not about the tax authority's share. You can restrict a commitment to specific products and include a counterparty's child companies.

Will the daily cron spam my users with duplicate reminders?

No. Every alert is recorded in a ledger keyed on the obligation, the rule and the due date, under a database unique constraint, so a second run on the same day writes nothing. Odoo 19 archives completed activities and Odoo 18 deletes them, which means searching the activity table cannot answer whether a warning was already sent. The ledger can.

Can a contract be hidden from most users?

Yes. A contract can be marked confidential, which restricts it to the responsible user and a named list of authorised users unless the reader holds the Confidential group. That group is deliberately not implied by the Manager group, so a Contract Manager does not automatically see every confidential contract. The restriction is a global record rule, so holding another group cannot widen it.

Can it read contracts from PDFs?

Yes, with the free AI Extraction Bridge add-on, which connects this module to CODEerts AI Document OCR. Extracted obligations arrive unvalidated, carrying the confidence of the reading and the passage they came from, and nothing binding is created without a human confirming it.

On the Odoo Store

Get Contract Management & Obligation Tracking on the Odoo Store.

Pick your Odoo version and install it in a click, with free updates and real support behind it.

Get it on the Odoo Store