Skip to content

Forgotten quotations in Odoo: find them before they're lost

Maxime VanderhaeghePublished 10 min read

In short, A forgotten quotation in Odoo is a quote still sitting in the "Quotation" or "Quotation Sent" state that nobody is following anymore: its expiration date has passed, no follow-up activity is scheduled, or it was recreated as a duplicate. To find them, start from Sales, Orders, Quotations, keep only open quotes, then add a custom filter on the expiration date and the last update. Every quote you find gets a decision: follow up with a dated activity, cancel it, or keep a single version of a duplicate. A fifteen-minute weekly review is enough to keep the pipeline clean.

A forgotten quotation makes no noise. It creates no unpaid invoice, no customer complaint, no alert. It just stays in the list among the others, its amount still inflating the pipeline. The salesperson thinks the customer is thinking it over, the customer thinks you forgot about them, and the CEO is looking at potential revenue that stopped existing weeks ago.

The issue isn't carelessness. Odoo's default quotation list is sorted by order date and makes no visual difference between a quote sent yesterday and one that expired four months ago. Until someone applies the right filter, they look the same.

This article gives you the full method: understand why quotes get lost, find them by hand in Odoo, requalify them one by one, and set up the routine that stops the list from filling up again.

Why quotations get lost in Odoo#

In Odoo, until a quotation is confirmed, it has one of two statuses: "Quotation" or "Quotation Sent". It only leaves them in three ways: it gets confirmed into a sales order, it gets cancelled, or it stays there forever. That third path is the problem, and it almost always has one of these causes.

No follow-up activity is scheduled. Sending a quote by email from Odoo moves it to "Quotation Sent", but it doesn't create a reminder. Unless the salesperson schedules an activity themselves (a call in seven days, a follow-up email), nothing in Odoo will bring them back to it. The quote drops off their radar the moment something more urgent comes in.

The expiration date is ignored. Every quote carries an expiration date, often filled in automatically from the default quotation validity set in the Sales settings or in the quotation template. On the customer side, in the portal, an expired quote can no longer be signed or paid online. Internally, however, it stays open in the list with no change of state. Odoo knows it has expired, but doesn't put it anywhere special.

Salespeople recreate instead of editing. The customer asks for a variant, a discount, a different lead time: it is often quicker to duplicate the quote or enter a new one than to rework the old one. The new one is sent, the old one is never cancelled. The result: two near-identical quotes for the same customer, one of which will stay open for good.

A salesperson leaves or changes territory. Their quotes stay assigned to someone who no longer looks at them, and nobody picks them up.

What it really costs#

The most obvious cost is commercial. A quote followed up at the right time has a chance of closing. The same quote followed up three months later, after the customer signed elsewhere, has almost none. Every week without follow-up lowers the odds, and nobody notices because the quote is never flagged as "at risk".

The second cost is in decision-making. A pipeline cluttered with dead quotes gives an overly optimistic view of upcoming business. You hire, invest or order stock based on a figure that includes deals lost long ago. That is exactly why a pipeline cleaned of dormant quotes is one of the seven KPIs an SMB CEO should read every Monday.

The third cost is operational. Duplicates skew conversion statistics (a signed quote and its abandoned twin count as one loss out of two), create a risk of confirming the wrong version, and slow down every customer lookup. And a customer who receives two different quotes for the same request rarely comes away impressed.

There is no universal figure for how much of a late-followed quote can still be recovered: it depends on your sales cycle, your sector and the amount. Keep the order of things in mind rather than a percentage: a quote followed up on time is worth a lot, a forgotten one is worth almost nothing, and a dead one left open costs you in decision quality.

Finding them by hand in Odoo, step by step#

Everything is doable in standard Odoo with the Sales app. The path below is the same in recent versions; only the look of the filter editor changes slightly.

1. Open the quotation list. Go to Sales, Orders, Quotations. By default the view is limited to your own quotes (the "My Quotations" filter): remove it if you want the whole team's view. Make sure you only keep open quotes, meaning the "Quotation" and "Quotation Sent" states: the ready-made "Quotations" filter covers exactly those two states.

2. Expired quotes. In the search menu, choose "Add Custom Filter". Build the rule: "Expiration" is before a given date. To target quotes that expired long ago, use for example the date 90 days back. Sort the list by amount, descending: the largest expired quotes rise to the top. Be clear about one limit: Odoo does know a quote has expired, but you can't filter the list on that information. Going through the expiration date is the only reliable route.

3. Quotes with no activity. This is the hardest case to isolate in standard Odoo, because Odoo shows no "date of last interaction". Two complementary approaches:

  • Filter on activities: open quotes with no scheduled activity are the ones nobody plans to chase. In the custom filter editor, the rule "Activities is not set" isolates them. The late-activity filters, where your version offers them, also show follow-ups that were planned but never done.
  • Filter on the last update: add a rule on "Last Updated on" before, say, six months ago. Careful: this date changes whenever the quote is modified, including by an automated action or an Odoo update, so a quote can look recent without any human having touched it. Conversely, a message or email sent from the quote's message history normally doesn't update this date. Open the message history (below or beside the quote) on the biggest quotes to check the date of the last real exchange.

4. Duplicates. Standard Odoo doesn't detect duplicate quotations. The manual method: in the list of open quotes, group by Customer, then go through the groups that contain several quotes. Two quotes for the same customer, with the same or a very close amount, created a few days apart, are likely duplicates. Include recent sales orders too: a quote left open can be the twin of an order that has already been confirmed.

5. Export and hand out. Select the rows, then Action, Export, adding the useful columns (reference, customer, salesperson, amount, expiration date, last update). Grouping by Salesperson before exporting lets you send each person their own list. Also save your filters as favorites: the weekly routine then only has to recall them.

Plan for an hour the first time, mostly for the duplicate step and the message history checks. The real challenge, as usual, is doing it again every week.

Requalifying them: one decision per quote#

The goal isn't to empty the list at all costs, it's to make sure no open quote is left without a decision. Work through them in this order.

  1. Start with the duplicates. For each pair, identify the reference version (usually the most recent, the one the customer actually received or signed). Odoo has no quotation merge: if the older version holds a line or a discount the newer one lacks, carry it over by hand, then cancel the duplicate. Leave a note in the message history of the version you keep so the trail survives.
  2. Follow up on what still has a chance. A recently expired quote with a meaningful amount, for an active customer, deserves a phone call rather than an email. If the customer is still interested, update the expiration date and prices if needed, then immediately schedule a dated follow-up activity. A quote chased without a scheduled activity will simply become a forgotten quote again.
  3. Close what is lost. A quote with no answer for months, or whose customer clearly went another way, should be cancelled. The Cancel button on the quote moves it to "Cancelled"; depending on your Odoo version, for a quote that was already sent, a dialog may offer to notify the customer by email ("Send and cancel") or to cancel without sending. Write the reason in the quote's message history. If you use CRM, also mark the linked opportunity as lost with a reason: those reasons are what will teach you why you lose deals.
  4. Reassign the orphans. Quotes belonging to a salesperson who left or changed territory need a new owner before any follow-up, or they will slip right back into oblivion.

A properly cancelled quote isn't a failure. It's reliable information, where a ghost quote is just noise in the pipeline.

Stopping them from coming back: the weekly routine#

A one-off cleanup won't hold if the causes stay in place. Three commitments are enough.

A written follow-up rule. For example: every quote that is sent gets a follow-up activity scheduled at the moment it is sent, and every quote past its expiration date by a set delay (30, 60 or 90 days depending on your sales cycle) is either chased or cancelled. The exact threshold matters less than applying it consistently.

A rule on variants. When the customer asks for a change, edit the existing quote, or cancel the old one at the moment you send the new one. Odoo's quotation templates and optional products help offer variants without multiplying records.

Fifteen minutes each week, with a named owner. On Monday morning, the sales lead recalls their saved filters: expired quotes, quotes with no activity, quotes grouped by customer. Every line leaves with a decision and a name. If nobody is named, the routine dies by the third busy week.

This is typically the kind of monitoring an AI agent connected to Odoo handles at every scan: it doesn't replace the salesperson's call, but it puts the list to decide on in front of them every week.

Conclusion#

Forgotten quotations aren't a willpower problem. They are quotes nobody sees anymore because no Odoo view brings them forward. The method comes down to three filters (expiration date, activity, grouping by customer) and one decision per line: follow up with a dated activity, cancel with a reason, or keep a single version.

If you'd like to know where your pipeline stands before spending an hour on it, the UpBoard scan does that spotting in read-only mode. Among its 92 checks, it flags open quotes more than 90 days past their expiration date (with an estimate of the revenue still recoverable), quotes with neither an edit nor a message for more than 180 days, and pairs of quotes for the same customer, with a near-identical amount, created less than seven days apart. The scan is free, results arrive within minutes, and your score is shown before you leave any contact details. It detects and quantifies; any cancellation or change in Odoo stays subject to your approval.

See what your Odoo data has to tell you

A few minutes, read-only, no card. Then a trial on your real data: 14 days, or until the trial credit is used up.