# Expiry Reminders for Contracts, Licenses & Documents

> Track contracts, licences, certificates and insurance by expiry date, with automatic reminders, a colour-coded board and a renewals calendar.

- **What it is:** Track contracts, licences, certificates and insurance by expiry date, with automatic reminders, a colour-coded board and a renewals calendar.
- **For:** Extra Tools
- **Odoo versions:** 16.0, 17.0, 18.0, 19.0, 20.0 - Community and Enterprise
- **Runs on:** Odoo.sh or Odoo you host yourself - not Odoo Online, which accepts no third-party apps
- **Price:** 79 EUR, one-time, on the Odoo Apps Store
- **Technical name:** bambooforge_expiry_reminder
- **Not for:** Said before you buy, because it is the half that decides whether the app fits:; Show documents to a plain employee - they see none unless named on one.; Delete the paper trail: reminders sent stay on record.
- **Manual:** https://docs.bambooforge.dev/bambooforge_expiry_reminder/
- **Live demo:** https://demo20.bambooforge.dev/odoo/action-bambooforge_expiry_reminder.expiry_document_action
- **Store page:** https://apps.odoo.com/apps/modules/20.0/bambooforge_expiry_reminder
- **Manual last updated:** 2026-10-15

---
# Expiry Reminders for Contracts, Licenses & Documents

Never miss a renewal again. Register any document with an expiry date —
contracts, licenses, certificates, insurance, warranties — and the app reminds the
responsible person automatically before it lapses, with a colour-coded board, a
renewals calendar and one-click renewal.

This page is the complete manual. Follow it top to bottom and you can install,
register documents, read the board and fix the common issues **without contacting
support**.

## Overview

Compliance and renewals slip through the cracks because nobody is watching the
dates. This app watches them for you:

- **Register any expiring document** with a type, a related party, a responsible
  person, an expiry date and a lead time.
- **Automatic status** — Valid, Expiring Soon or Expired, computed from the expiry
  date and the lead time.
- **Reminders before expiry** — an activity for the responsible person and an
  email, fired automatically once the document enters its lead-time window.
- **A board and a calendar** — a kanban grouped by status and a month calendar of
  upcoming expiries.
- **One-click renewal** — roll a document forward a year, keeping the history.

## Requirements

- Odoo 20.0. The app only depends on **Discuss** (`mail`), which is part of
  every Odoo install.

No Enterprise modules and no external Python libraries are required.

## Installation

1. Copy `bambooforge_expiry_reminder` into your addons path.
2. Update the apps list (Apps > Update Apps List).
3. Search for **Expiry Reminders** and click *Install*.

A **Renewals** app appears with a starter set of document types (Contract,
License, Certificate, Insurance, Warranty, Other).

## Quick start

1. Open **Renewals > Documents** and click *New*.
2. Enter a name, choose a **Type**, set the **Expiry Date** and, if needed, adjust
   the **Lead Time (days)** (it defaults from the type).
3. Set the **Responsible** person and optionally a **Related Party**.
4. Save.

The document gets a status automatically and appears on the board and the
calendar. When it enters its lead-time window, the responsible person is reminded.

## The board and calendar

**Renewals > Documents** opens a kanban grouped by **Valid / Expiring Soon /
Expired**, each card showing the type, expiry date and days remaining. Switch to
the **list** for a sortable table (overdue rows in red, expiring in orange) or the
**calendar** to see expiries laid out by month.

**Renewals > Expiring & Expired** is a focused worklist of everything that needs
attention now.

## How reminders work

Each document has a **Lead Time** — the number of days before expiry to start
reminding. A daily scheduled action recomputes every document's status and, the
first time a document is **Expiring Soon** or **Expired**, it:

- schedules a *Renew* activity for the responsible person, dated to the expiry,
- sends them the reminder email,

and marks the reminder as sent so it does not repeat. Everything is logged on the
document's chatter.

The scheduled action **Expiry Reminders: Check & Notify** ships **disabled** —
enable it under *Settings > Technical > Scheduled Actions* to run it daily.

## Renewing a document

When a document is renewed, open it and click **Renew**. The app creates a new
document starting at the old expiry date and running one year (adjust as needed),
links the two together, and archives the old one — so your history stays intact
and the new period is tracked from day one.

## Document types

Under **Renewals > Configuration > Document Types** you can rename the types, set
each one's **Default Lead Time** and colour, or add your own (e.g. *Safety
Inspection*, *Domain Name*, *Visa*).

## Frequently asked questions

****Statuses look stale.****

Status is recomputed by the daily scheduled action and whenever a document is
edited. Enable **Expiry Reminders: Check & Notify** so it refreshes every day.

****The reminder went to the wrong person.****

Reminders go to the document's **Responsible** user. Set it on each document.

****I was reminded once but want another nudge.****

Reminders fire once per document to avoid noise. Re-trigger by clearing the
reminder (it resets automatically on renewal), or rely on the scheduled
*Renew* activity.

****Does it work with multiple companies?****

Yes. Documents are company-scoped via a record rule.

## How we make sure it works

Before every release, **25 automated checks** run against this app on Odoo 16, 17, 18, 19 and 20.
Among them:

- The user cannot delete the paper trail.
- The user reads types and touches nothing in them.
- A plain employee sees no documents at all.
- An empty contact falls back to odoo 20's company timezone.
- The email less user registers and renews a document.

The complete list is in the source you receive.

## Support

Questions or ideas: **support@bambooforge.dev**.

## Usage

Everything happens under the **Renewals** app, which appears in the main menu
after installation with a starter set of document types (Contract, License /
Permit, Certificate, Insurance, Warranty, Other).

### Register a document

1. Go to **Renewals > Documents** and click *New*.
2. Enter a **Name** and pick a **Type**. Choosing a type fills the **Lead Time
   (days)** from that type's *Default Lead Time* — for example *Contract* sets
   45 days and *Warranty* sets 15. Override it per document if needed.
3. Set the **Expiry Date** (required) and, optionally, a **Start Date**, a
   **Reference**, a **Related Party** and free-text **Notes**.
4. The **Responsible** defaults to you; change it to the person who should be
   reminded and who owns the renewal.
5. Save.

On save the status is computed automatically from the expiry date and lead time:
**Valid** while more than the lead time remains, **Expiring Soon** once inside
the lead-time window, and **Expired** once the date has passed. **Days to
Expiry** counts down and turns negative after expiry.

### Read the board and calendar

**Renewals > Documents** opens as a kanban grouped by status, colour-coded by
document type (see `screenshot_kanban.png`). Switch views from the top-right:
a **List** where expired rows show in red and expiring rows in orange
(`screenshot_list.png`), or a **Calendar** month view of expiry dates coloured
by type (`screenshot_calendar.png`). Use the search filters *Expiring Soon*,
*Expired*, *My Documents* and *Renewed (archived)*, or group by Status, Type or
Responsible. **Renewals > Expiring & Expired** is a pre-filtered worklist of
everything needing attention now.

### How the scheduled action reminds people

The cron **Expiry Reminders: Check & Notify** (*Settings > Technical >
Scheduled Actions*) runs the automatic notifications. It ships **inactive**, so
enable it once and set it to run daily (its default interval is every 1 day).

Each run recomputes every active document's status, then finds documents that
are **Expiring Soon** or **Expired** and not yet reminded (**Reminder Sent**
unchecked). For each, once only, it schedules a *Renew: <name>* to-do activity
for the **Responsible** user dated to the expiry date, sends that user the
*Document Expiry Reminder* email (if they have an email address), ticks
**Reminder Sent**, stamps **Last Reminder** and logs a chatter note.

Because the flag is set, a document is never reminded twice. To acknowledge a
due document manually and stop the cron from notifying about it, use the **Mark
Reminded** button on the form (shown while a document is not yet valid and not
yet reminded); it ticks **Reminder Sent** and stamps **Last Reminder**.

### Renew a document

When a document is up for renewal, open it and click **Renew** in the header.
The app creates a fresh document that starts on the old expiry date and runs one
year forward, links the pair (**Renewed From** / **Renewed To**), and archives
the original — its history and chatter stay intact, and the new period is
tracked with its reminder flag cleared from day one. The **Renew** button
disappears once a document has already been renewed.

### Worked example

A workshop registers its liability insurance: Type *Insurance*, Expiry Date
*31/12/2026*, Lead Time *30* days, Responsible *the office manager*. It stays
**Valid** until 1 December 2026, when it becomes **Expiring Soon**. On the next
cron run the office manager gets a *Renew: Liability Insurance* activity dated
31 December plus the reminder email, and the chatter records "Expiry reminder
sent". After the new policy is agreed, clicking **Renew** produces the 2027
document (valid to 31/12/2027) and archives the 2026 one.

### Configure document types

Managers can maintain the catalogue under **Renewals > Configuration > Document
Types** (see `screenshot_types.png`): rename types, set each one's **Default
Lead Time** and colour, add your own (e.g. *Safety Inspection*, *Visa*, *Domain
Name*), or open a type to view its documents via the *document count*.

## Upgrading & version compatibility

This build targets **Odoo 20.0**. Each Odoo major series (16.0, 17.0, 18.0, 19.0, 20.0) has its
own dedicated build of this module — always install the build that matches your Odoo
version. Mixing a build with a different Odoo series is not supported.

### Patch upgrades (same series, e.g. 20.0.1.0.0 → later)

1. **Back up** your database and filestore first.
2. Replace the module folder with the newer build.
3. Restart Odoo with the module updated:
   
   ```
   ./odoo-bin -c your.conf -u bambooforge_expiry_reminder -d your_db
   ```
4. Odoo applies any schema/data changes automatically. Your existing records and
   configuration are preserved.

### Cross-version migration (moving to a newer Odoo)

Upgrading Odoo itself is a database migration handled by Odoo's standard upgrade
tooling. When you migrate the database to the next Odoo series, install the matching
build of this module for that series. Data created by this module carries over with
the database migration.

After any upgrade the module's scheduled actions resume on their normal cadence —
no manual re-activation is required.

## Uninstallation

You can remove this module at any time from **Apps → (this module) → Uninstall**,
or from the command line. Uninstalling is clean and reversible by reinstalling —
but note what is and is not deleted.

### What is removed

- The module's own tables and every record in them (2 models, prefixed `expiry.*`) — this is the data this module created.
- The menus, actions, views and reports this module installed.
- Its scheduled actions (cron jobs) — they stop immediately on uninstall.
- The security groups this module defined (user assignments to them are dropped).

### What is preserved

- Your standard Odoo data (partners, products, sales, invoices, inventory moves) is
  **not** deleted — this module only reads and annotates it; the underlying records stay.
- Attachments and chatter messages on standard records are kept.

As always, take a database backup before uninstalling in production.

## What it does not do

Said before you buy, because it is the half that decides whether the app fits:

- Show documents to a plain employee - they see none unless named on one.
- Delete the paper trail: reminders sent stay on record.

## Questions people ask

****Which Odoo versions does it run on?****

Odoo 16.0, 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing.

****Community or Enterprise?****

Both. It needs no Enterprise app.

****What does it need?****

The standard Discuss app. No extra Python package.

****Where does it show up?****

Under the **Renewals** menu (Documents, Expiring & Expired, Configuration).

****Does anything leave my server?****

No. It makes no call outside your Odoo server: no telemetry, no licence check, no third-party service.

****What happens if I uninstall it?****

Odoo drops the app's own tables and fields; the standard records it worked on (contacts, orders, products) stay as they are.

## Changelog

### 20.0.1.2.2

- Built for Odoo 20: record rules and access rights rewritten onto Odoo 20's single ir.access model, the screens rebuilt on Owl 3, and every icon moved to the icon set Odoo 20 ships.

### 20.0.1.0.0

Current release for Odoo 20.0. This build includes:

- Track contracts, licenses, certificates, insurance and any document with an expiry date. Get reminded before they lapse with automatic activities and emails, a colour-coded board and a renewals calendar.

Feature additions and fixes ship as new builds on the Odoo Apps store; this page and
the module's `version` reflect the current published release. Always keep the build
matched to your Odoo series (see *Upgrading & version compatibility*).
