| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Sales (sale_management)
• Discuss (mail) • Invoicing (account) |
| Lines of code | 590 |
| Technical Name |
sale_quotation_followup |
| License | OPL-1 |
| Website | https://www.oddons.com |
| Versions | 17.0 18.0 19.0 |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Sales (sale_management)
• Discuss (mail) • Invoicing (account) |
| Lines of code | 590 |
| Technical Name |
sale_quotation_followup |
| License | OPL-1 |
| Website | https://www.oddons.com |
| Versions | 17.0 18.0 19.0 |
Sale Quotation Follow-up
Automatically remind your customers about pending quotations — at the right time, every time — and convert more deals.
The problem
Quotations sent — then forgotten
In a standard Odoo setup, once you send a quotation to a customer, there is no built-in mechanism to automatically remind them if they haven't responded. Your salespeople must manually track each open quotation and decide when and how to follow up — a time-consuming, error-prone process that leads to missed opportunities.
Odoo already provides a powerful invoice follow-up system for payment reminders. Sale Quotation Follow-up brings the exact same logic to your sales quotations, based on the date the quotation was sent.
Features
Everything you need to follow up on quotations
Configurable Follow-up Levels
Define as many follow-up levels as you need. Each level specifies a delay (in days) after the quotation was sent, the action to trigger (email, activity, or both), and whether it runs automatically or manually.
Automatic Email Sending
Emails are sent directly via the quotation's chatter, exactly like a standard Odoo message. The customer receives a professional follow-up and the salesperson has full traceability.
Daily Cron Job
A scheduled job runs once a day and processes all quotations that are due for a follow-up. The execution frequency and time can be adjusted in the scheduled actions settings. Fully automatic — no manual action required for levels configured in "Automatic" mode.
Manual Execution Button
Salespeople can trigger a follow-up at any time via the "Execute Follow-up Now" button on the quotation form. Useful for manual follow-up levels or urgent situations.
Visual Status Pipeline
A statusbar widget on the quotation form shows the progression through all configured follow-up levels, with the last executed level highlighted.
Activity Scheduling
Each follow-up level can create an Odoo activity (To-Do, Phone Call, etc.) assigned to the salesperson or the sales team leader — whether the level runs automatically or manually. The salesperson is always kept in the loop.
Next Follow-up Date Control
The Next Follow-up Date field gives full control over scheduling. Clear it to stop all reminders on a quotation. Set a future date to postpone. Set today or a past date to trigger on the next cron run.
Bilingual Emails (EN / FR)
The default email template is fully translated. Emails are sent in the customer's language — French if the partner's language is set to French, English otherwise — regardless of the user's UI language.
Full Audit Trail
All follow-up actions are logged in the quotation's chatter. Changes to key fields (Next Follow-up Date, Reminder mode) are tracked automatically via Odoo's native field tracking.
Multi-Company Ready
Follow-up levels are scoped per company. Each company can define its own follow-up strategy independently. Fully compatible with Odoo's multi-company setup.
Access Rights
Sales Managers can create and configure follow-up levels. Salespeople have read-only access to the levels, while still being able to execute follow-ups manually on their quotations.
Dedicated "To Follow Up" View
A dedicated menu entry under Sales > Orders lists all quotations currently requiring a follow-up action, with a pre-applied filter. Perfect for the salesperson's daily review.
How it works
The follow-up lifecycle
Quotation sent to customer
When a salesperson clicks Send by Email on a quotation, Odoo records
the Sent Quotation Date (date_sent) automatically.
This date is the reference point for all follow-up delay calculations.
The system also pre-fills the Next Follow-up Date based on the first
configured follow-up level.
Follow-up level becomes due
Each day, the scheduled job checks all sent quotations. A follow-up level is considered due when:
- The number of days elapsed since
date_sent≥ the level's delay, AND - The level has not been executed yet (based on Last Follow-up Level), AND
- The Next Follow-up Date is set and is today or in the past.
When all three conditions are met, the quotation's status becomes "In need of action".
Follow-up is executed
Depending on the level's configuration, Odoo will:
- Send the follow-up email to the customer (via the chatter, with full traceability)
- Create an internal activity assigned to the salesperson or team leader
- Log the action in the chatter
- Update the Last Follow-up Level field
- Set the Next Follow-up Date for the next level (or clear it if no further levels exist)
Cycle continues until resolved
The process repeats for each configured level. Follow-ups stop automatically when:
- The quotation is confirmed (state = Sale Order) or cancelled
- The Next Follow-up Date is cleared manually by the salesperson
- The Next Reminder Mode is switched to Manual and no activity is configured on the next level
- All configured levels have been executed
Execution modes
Automatic vs Manual — how they work together
The module uses two settings that work together: the level's Automatic checkbox and the quotation's Next Reminder Mode field. The latter is updated automatically after each execution to reflect what the next level will do.
🤖 Automatic mode
- The daily cron sends the email without any human action
- Only applies when the level's Automatic checkbox is ticked
- Activity creation is also available — the salesperson receives an activity automatically alongside the email
- Best for standardised, high-volume follow-up pipelines
✋ Manual mode
- The cron never sends an email for this quotation
- If the next level has Schedule Activity enabled, the cron still creates the activity automatically
- The salesperson clicks "Execute Follow-up Now" to send the email when ready
- Best for high-value deals requiring a personal touch
Configuration
Setting up follow-up levels
Go to Sales > Configuration > Quotation Follow-up Levels (visible to Sales Managers only).
Fields reference — Follow-up Level
| Field | Description | Notes |
|---|---|---|
| Description | Internal name of the level (e.g. "First Reminder", "Final Notice") | Must be unique per company |
| Delay | Number of days after the quotation was sent to trigger this level | Must be unique per company. Levels are ordered by delay ascending. |
| Send Email | If enabled, an email is sent to the customer using the selected template | Requires an Email Template to be selected |
| Email Template | The mail template used for this reminder (filtered to Sale Order model) | A bilingual EN/FR template is installed by default |
| Schedule Activity | Creates an Odoo activity assigned to the responsible person | Works for both automatic and manual levels |
| Activity Type | Type of activity to create (To-Do, Phone Call, Email, etc.) | Required if Schedule Activity is enabled |
| Summary | Short title displayed on the activity card | Required if Schedule Activity is enabled |
| Note | Additional instructions shown in the activity body | Optional |
| Responsible | Who receives the activity: Salesperson or Sales Team Leader | Falls back to current user if neither is set |
| Automatic | If checked, the cron sends the email without human action. If unchecked, the cron will never send the email but can still create an activity automatically if Schedule Activity is enabled. | Compatible with activity scheduling |
Example configuration
| Level | Delay | Activity | Automatic | Notes | |
|---|---|---|---|---|---|
| First Reminder | 4 days | ✔ | ✘ | ✔ | Sent automatically |
| Second Reminder | 10 days | ✔ | ✘ | ✔ | Sent automatically |
| Personal Follow-up | 18 days | ✘ | ✔ (Phone Call) | ✘ | Manual — no email sent. The activity is still created automatically by the cron so the salesperson knows to call the customer. |
| Final Notice | 30 days | ✔ | ✔ (Call) | ✔ | Last automatic email. The activity is created at the same time as the email so the salesperson is notified. After execution, the Next Reminder Date is cleared — no further follow-up is scheduled. The quotation remains open until confirmed or cancelled manually. |
Quotation fields
Fields added to the quotation
The module adds the following fields to sale.order. They are visible
in the Other Information tab of the quotation form, inside the
Quotation Follow-up group (only shown when the quotation is in
Quotation Sent state).
| Field | Type | Description |
|---|---|---|
| Sent Quotation Date | Datetime (read-only) |
Set automatically when the salesperson clicks the standard Send
button on the quotation. All follow-up delays are calculated from this date. If the quotation was sent outside of Odoo (by email, phone, etc.), use the gear icon (⚙) on the quotation form and click Mark as Sent — this will set the date and activate the follow-up pipeline. |
| Last Follow-up Level | Many2one → sale.followup.line | The last follow-up level that was executed for this quotation. Displayed as a statusbar widget showing the full pipeline with the current level highlighted. |
| Follow-up Status | Selection (computed) |
In need of action — a level is due and waiting to be executed. No action needed — quotation is up to date, confirmed, cancelled, or follow-ups have been stopped. Displayed as a coloured badge (red / green). |
| Next Reminder Mode | Selection |
Reflects how the next follow-up level will be triggered.
Set automatically when the quotation is first sent (based on the first level)
and updated after each execution (based on the next level). Automatic: the cron will send the email automatically. Manual: the cron will not send an email — the salesperson must click "Execute Follow-up Now". Activities are still created automatically by the cron if configured on the level. Changes are tracked in the chatter. |
| Next Follow-up Date | Date | The date on or after which the next follow-up will be triggered. Clearing this field stops all further follow-ups on this quotation. Setting it to a past date triggers the follow-up on the next cron run. Changes are tracked in the chatter. |
state = 'sent'). Confirmed orders
and cancelled quotations are automatically excluded.
Email template
Default bilingual template
A default email template named "Quotation Follow-up - Reminder" is installed with the module. It is designed to be professional, personalised, and available in both English and French.
How the bilingual mechanism works
The template uses Odoo's native language field
(lang = {{ object.partner_id.lang }}). When Odoo renders the template
to send an email, it checks the partner's language:
- If the partner's language is
fr_FR,fr_BE, or any otherfr_*variant → the email is sent in French - Otherwise → the email is sent in English
This is entirely independent of the salesperson's UI language. A salesperson working in English will still send French emails to French-speaking customers automatically.
noupdate="1",
meaning module upgrades will never overwrite your customisations. You can freely edit
the template body, subject, or sender in Settings > Technical > Email > Templates.
Security
Access rights
The module adds access rules only for the new model sale.followup.line.
The follow-up fields on sale.order inherit the existing
access rules of the sales order model.
| Group | Read | Create | Edit | Delete | Notes |
|---|---|---|---|---|---|
| Sales Manager (sales_team.group_sale_manager) |
✔ | ✔ | ✔ | ✔ | Full access — can configure follow-up levels and the menu entry is visible |
| Salesperson (sales_team.group_sale_salesman) |
✔ | ✘ | ✘ | ✘ | Read-only — can see levels in the statusbar pipeline but cannot edit them. Can execute follow-ups manually via the button and receive activities automatically. |
action_execute_followup), not a direct write on sale.followup.line.
It therefore works within the standard sale.order write permissions.
Key logic
How the Next Follow-up Date controls everything
The Next Follow-up Date field is the single control point for the follow-up lifecycle. Understanding its behaviour is key to using the module effectively.
| Value | Behaviour |
|---|---|
| Empty (cleared) | All follow-ups are stopped on this quotation. The status becomes No action needed and the cron will not process it. Use this when you want to manually close a follow-up pipeline (e.g. the customer said they'll get back to you in a month). |
| Future date | The follow-up is postponed. The cron will not trigger until that date is reached. Useful to snooze a reminder. |
| Today or past date | The follow-up is due. On the next cron run, if a level is also due (based on elapsed days), it will be executed. |
What happens when you send the quotation again?
The Sent Quotation Date is captured only once — the first time the quotation is sent. Re-sending the quotation (e.g. after a price revision) does not reset the date. This ensures the follow-up timeline remains stable and consistent throughout the negotiation.
Does the email re-send every day?
No. Each follow-up level is executed exactly once. After a level is executed, the Last Follow-up Level is updated and that level will not trigger again. The Next Follow-up Date is then set for the next level (or cleared if there are no further levels).
FAQ
Frequently asked questions
Why doesn't Odoo already have this feature for quotations?
Odoo provides an invoice follow-up system for payment reminders, but has never extended this logic to sales quotations natively. The sales module focuses on order management rather than proactive follow-up. This module fills that gap with a dedicated, distinct model and configuration.
What is the difference between the level's "Automatic" checkbox and the quotation's "Next Reminder Mode"?
These two settings work together but serve different purposes:
- The level's Automatic checkbox: controls whether that specific level sends an email via the cron. If unchecked, the cron will never send an email for that level — but it will still create an activity automatically if Schedule Activity is enabled.
- The quotation's Next Reminder Mode: reflects the mode of the next level to be executed. It is set automatically when the quotation is sent and updated after each execution. It can also be overridden manually at any time.
The key difference from a classic "master switch": even in Manual mode, the cron still runs for the quotation — it just skips sending emails. Activities are always created automatically if configured, regardless of the mode.
Can I stop follow-ups for a specific quotation?
Yes. Clear the Next Reminder Date field — the cron will skip this quotation entirely as long as the field is empty. You can also set a future date to postpone the next reminder. Both changes are tracked in the chatter.
What happens when the quotation is confirmed or cancelled?
Follow-ups stop automatically. The Follow-up Status is computed only for quotations in the Quotation Sent state. A confirmed order or a cancelled quotation will always show No action needed and will be ignored by the cron.
Will the customer receive emails in their own language even if I'm working in English?
Yes. The email template uses the partner's language (partner_id.lang)
to determine which version to send. If the customer is configured with French as their
language, they will receive the email in French — regardless of the salesperson's UI language.
Can I use the module for multiple companies?
Yes. Follow-up levels are company-scoped. Each company manages its own set of levels independently. The cron job processes quotations per-company context as well.
Can I duplicate a follow-up level?
Yes. When duplicating a level, the delay is automatically increased by 5 days and the name gets a "(copy)" suffix to avoid the uniqueness constraint errors. You can then adjust both values freely.
Does the module create a new menu entry?
Yes, two new menu entries are created:
- Sales > Orders > Quotations to Follow Up — a dedicated list of all quotations currently requiring action (visible to all salespeople)
- Sales > Configuration > Quotation Follow-up Levels — the configuration screen (visible to Sales Managers only)
Installation
Getting started
Download and deploy the module
Download the module from Oddons. Then deploy it by either pushing it to your Odoo.sh repository or adding it to your custom addons repository. In Odoo, go to Apps > Update Apps List, search for Sale Quotation Follow-up and click Install.
Configure your follow-up levels
Go to Sales > Configuration > Quotation Follow-up Levels. A default "First Reminder" level (4 days, manual, with email) is already created. Edit it or add new levels to match your sales process.
Send a quotation and watch the magic
Send any quotation to a customer as usual. The Sent Quotation Date and Next Follow-up Date will be set automatically. Check the Other Information tab to see the follow-up pipeline.
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module