TL;DR: a client leaves for two weeks, their auto-reply tells you so, and by the following Tuesday nobody remembers. Outreach platforms have been reading those auto-replies for years, but they use them to pause a campaign, never to warn the person writing an ordinary email. Our Contact Absences module puts the information where it actually helps: a dated window on the contact record, with the name of whoever is covering, and a banner that shows up the moment you write, text or call. It never blocks a send. It offers to schedule the message for the morning of the return, and it sets a reminder to pick the thread back up. Auto-replies that come in become suggestions a human accepts in one click, never automatic writes.
In this article
- The tools that already read auto-replies, and what they use them for: Salesloft and lemlist read the auto-reply to reschedule a campaign, never to warn whoever is writing.
- Recognizing an auto-reply is harder than it looks: RFC 3834 recommends a label without requiring it, and the return date arrives as prose.
- A dated window on the record, with a mandatory return date: from, to, a category and the backup contact, with a mandatory return date so the warning stays credible.
- The banner shows up where the action happens: message thread, compose window and text conversation, and it never blocks a send.
- Schedule it for their return instead of giving up: one button files the message in scheduled sends, dated the morning of the return.
- A return reminder that gives you something to hold: an activity the day after the return, naming the last exchange instead of saying check in.
- When you are the one leaving: one gesture arms your own responder for the period, and shows the text before it does.
- The shutdowns you can know a year ahead: CCQ dates are published years ahead, and a quarter of Quebec's workforce leaves at the same time.
- The calendar you already keep by hand: a bridge reads the shared calendar, turns it into proposals, and never writes back into it.
- Starting with a year of auto-replies already read: one pass rereads 400 days of received mail and proposes the windows, writing nothing on its own.
- What we chose not to keep: a window, a category, a backup contact, never the auto-reply text or a health reason.
- What this does not solve: with no data entry it stays empty, many auto-replies carry no date, and mobile is not covered.
- Our position: public on GitHub under a licence that converts to open source, and we charge hosting and support.
"I will be away until September 15." You read that sentence three weeks ago, in the reply that landed twelve seconds after your email. You read it, you shrugged, and you moved on.
The following Tuesday, you follow up. On Thursday your colleague follows up too, because they had no idea. The quote sits there, the file stalls, and the whole time there was someone else to write to: the auto-reply gave their address, spelled out, on the very next line.
The information existed. It arrived on your side, for free, and it died in an inbox.
Odoo already tracks your employees' time off: that is what its Time Off app does, with balances, approvals and a team calendar. The record of a client, a supplier or a partner has no field for any of it. That is exactly the gap we filled.
The tools that already read auto-replies, and what they use them for
Out-of-office detection is not new. Salesloft has been selling it since 2022: the tool recognizes the automatic message, pulls the return date out of it even when it reads "I will be back the Tuesday after next", and reschedules the campaign steps. lemlist does the same, reading the date with artificial intelligence and creating a task on the return day.
One detail in Salesloft's own announcement is worth keeping, because it is right: steps do not resume on the return day, they resume the day after. On that first morning your message would drown among four hundred others. The next day, it has a chance of being read.
These tools protect a campaign. They are cadence machines, and the auto-reply is there so a step does not get wasted. Nobody in that category warns the human who is about to write a one-off email, send a text or dial a number. lemlist's own documentation says it plainly about its own detection: "The campaign is not automatically paused or resumed by this feature." It moves a step, it warns nobody.
If your sales follow-ups already live in your ERP, that is a neighbouring subject we covered elsewhere: outreach inside your Odoo. A contact's absence, though, reaches well past outreach.
Recognizing an auto-reply is harder than it looks
There is a standard for this. RFC 3834, published in 2004, recommends that every automatic response carry a technical label saying "this came from a machine". The word that matters is recommends: it is not an obligation, and a fair share of mail software simply does not add it.
Worse, the same standard defines a second label for messages a machine produces without them being a reply: your backup reports, your appointment confirmations, your password resets. A filter that accepts both labels catches all of your organization's service mail and files it as holidays. That is the kind of mistake you fix in one line, provided you have seen it happen.
So the subject line is what is left, and there the real world takes over. "Automatic reply", "Réponse automatique", "Out of office", sometimes nothing at all. The French Outlook subject even slips a non-breaking space in before the colon, invisible to the eye and quite enough to break a filter written in a hurry.
And the return date, when there is one, is prose: "back on August 17" with no year, "from Thursday 13 to Friday 21 August inclusive", "I will reply when I am back at the office on Monday May 4". A human reads that without effort. A regular expression does not.
That is why the module proposes instead of writing. A recognized auto-reply creates a suggestion, filed in the proposed absences queue, with the dates it read. Someone accepts it in one click, or turns it down. A wrong record is worse than an empty one.
A dated window on the record, with a mandatory return date
An absence is not a checkbox. It is a window: from this day to that day, a category picked from a short list (holidays, leave, closure, training or conference, other), and above all the backup contact, meaning who to write to in the meantime: a contact record, or plain text such as "the front desk" or a phone number.
The end date is mandatory, and that is a decision rather than an oversight. An absence with no return leaves a warning lit forever, and a warning that cries wolf gets dismissed by the third time it appears. No return, no absence.
A company shutdown is not one person being away: set on a company, it warns for every contact attached to it, with wording about closing and reopening rather than being away. Three people from the same firm sending the same shutdown notice is one single thing to record.
A small detail that matters: the sentence on screen is a noun phrase. "Dominique Fortin: away until September 15, 2026, back on September 16, 2026" rather than "Dominique Fortin is away". A contact record carries no gender, and guessing it from a first name gets real people wrong.
The banner shows up where the action happens
A report you read on Monday is useless. The warning has to arrive the second you are about to write.
So it appears in the message thread of any record, whether that is a task, an opportunity or a support ticket, and at the top of the contact record itself. It appears in the full compose window, the one you also use when replying from your mailbox built into Odoo. It appears at the top of a text-message conversation, before you have typed a single word. A fourth bridge, already running but not yet in the public repository, also shows it in the softphone, on whoever is on the line.
The banner names three things: who is away, until when, and who to write to in the meantime. Past three absent recipients, it names three and counts the rest, because a wall of text stops being a warning.
What it never does is block. Writing to someone on holiday is often exactly what you want: let it wait for them, in their inbox, with nothing left on your mind.
Schedule it for their return instead of giving up
Next to the banner, a button. "Schedule for their return" in the compose window, files your message in Odoo's scheduled messages, dated the morning they get back, at 9 a.m. by default. When several recipients are away, the latest return is the one that counts. You write while it is on your mind, the message leaves when it has a chance of being read, and you have nothing to note down anywhere.
It is Salesloft's idea, applied to an email written by hand rather than to a campaign. Salesloft waits one more day, while the button aims for the first morning. The other difference is that you keep control: nothing reschedules itself behind your back.
A return reminder that gives you something to hold
When someone comes back from three weeks off, you usually want to pick the thread back up. The module sets an activity for the day after the return, on the contact record, assigned by default to whoever recorded the absence, or to the person chosen to follow up.
A reminder that says "check in with them" gets closed without action. This one names the last exchange you had with that person, for example "Last exchange: Quote 2026-0042". It hands you a starting point rather than a good intention. And if the return date moves, the reminder moves with it.
When you are the one leaving
The problem has a flip side. Your clients write to you too while you are at the cottage, and your auto-reply is often the one message of the year you have never reread: you do not receive your own outgoing mail.
A fifth module, published with the others, connects both ends. The "I'm away" gesture asks for the dates, the backup contact, the tone of the message, and whether to decline invitations that land in the period. It shows the exact text before arming anything. From then on the responder follows the absence: it arms for the period, moves when the dates move, and switches off when the absence is removed.
Two messages ship at installation, meant to be rewritten your way: one that announces a delay ("I am travelling until the 12th, my replies will be slower") and one that announces an absence. No text, nothing arms. An empty auto-reply sent to a client costs more than silence.
Two limits hold the rest together. Anyone can note that a colleague is away, but arming a responder means writing to clients under their name, from their mailbox: that belongs to the person concerned or to the email administrator. And nothing ever arms for an outside contact. Their absence stays information for you, not a commitment that answers on their behalf.
The shutdowns you can know a year ahead
Some absences need no auto-reply to teach you about them. In Quebec, the construction holidays are set by collective agreements and published years in advance by the Commission de la construction du Québec: July 19 to August 1 in 2026, December 20, 2026 to January 2, 2027 for the winter break, July 25 to August 7 in 2027, then December 19, 2027 to January 1, 2028.
And it does not only concern your clients in that industry. The CCQ estimates that roughly a quarter of Quebec's active workforce takes its holidays during that same summer window. If your follow-up lands right there, it is not a calendar coincidence, it is the calendar.
The module carries those windows and a wizard that seeds them: you pick the shutdown, then named companies or a whole industry. It can skip companies with no attached contact and no email address, and it never duplicates a window you already know about. The next window, the holiday break, starts on December 20: November is when to seed it, not the 19th.
Three habits that need no software at all and already solve half the problem:
- When a client tells you on the phone that they are leaving, write down the return date, not the departure date. That is the one you will need.
- Ask who is covering, every time. Most people answer gladly, and almost nobody asks.
- Put the industry shutdowns you know about in the calendar once a year, in January. It takes ten minutes and saves you three dead follow-ups in July.
The calendar you already keep by hand
Before having a module, people note their clients' holidays somewhere. Very often it is a shared calendar where somebody writes "Holidays - First Last" on the day of departure, and sometimes "Back from holidays First" on the day of return.
A bridge reads that calendar, when it is kept in Nextcloud, and turns it into proposals. It understands both of the shapes you find in real life: the lone marker, which gives an absence with no end date for you to complete in one gesture, and the departure-and-return pair, which gives a full window. It also learns the shorthand, one line at a time: initials, a nickname, the name of a file rather than a person. A company name in brackets is recognized from the start.
Two things it deliberately does not do. It never writes into the calendar, which stays its owner's notepad. And it creates no contacts. An entry it does not recognize is reported as is, with its title, rather than attached to the client it most resembles. Mixing up two people who share a first name means sending one client's mail to another.
Starting with a year of auto-replies already read
An absence tool that starts empty helps nobody for months. Yet your mailbox already holds dozens of auto-replies received over the past year, and nobody has reread them.
A catch-up pass, "Read mail already received", picks them up once over the last 400 days: enough to cover a full summer and winter without rereading years of archives. It files the windows it finds under proposed absences and writes nothing on its own. On the first morning, the queue sorts out in a few minutes, one click per line.
Day to day, two buttons are then all it takes. The "Away today" filter on the contact list tells you who not to write to this morning. And when someone comes back sooner than planned, "Back early" switches the warning off the same day, so it does not stay lit on someone who is already answering you.
What we chose not to keep
An absence is personal information. So we decided up front what we would not write down.
What is kept: a window, a category from a list of five, a backup contact's name, and a one-line note if needed. What is never kept: the free text of the auto-reply, and any health-related reason. The list of categories is short on purpose, and it has no "sick leave" option.
The rest follows the same logic: the information comes from what the person wrote to you themselves or told you on the phone, never from an inference. If those questions of collection and retention speak to you, we went through what Quebec law requires in Law 25, four years on.
What this does not solve
The module guesses nothing. If nobody ever enters anything and no auto-reply comes in, it stays empty. It is a team tool, and it is worth exactly as much as the habit of feeding it.
Plenty of auto-replies announce no readable date. Those arrive as an empty suggestion waiting for a human decision, which is the intended behaviour but still a gesture someone has to make.
There is also a known false positive: when someone replies by hand to an auto-reply, their answer keeps the "Automatic reply" subject line and gets recognized as one. The suggestion shows up, and a human turns it down in one click.
Date reading works without artificial intelligence: the reading rules are written out in plain code. When an assistant is connected, it rereads every recognized auto-reply, and its dates win when it finds both the departure and the return. A module installed on an instance with no AI still works, with a bit less recovery on odd wording.
Finally, the banner does not follow your team onto the mobile app yet, and the module deliberately holds back no overdue invoice reminder. Someone on holiday is still someone who owes an invoice: we warn, and we let it go out.
Our position
Contact Absences is part of Symbifox, our suite of modules that add to Odoo Community. The core module and three of its bridges are public on GitHub, under a licence (BUSL 1.1) that allows production use for your own internal needs and converts to an open source licence (LGPL) at the latest four years after each version ships. You can read every line, and your instance keeps running without us.
What we charge for is hosting and support, never the right to use. That is the rule for all our modules.
If your team already keeps a client holiday calendar in some corner, we can plug it in rather than ask you to retype everything. And if you keep none, reading the auto-replies is enough for the first records to appear on their own. Let's simplify this together.
The logical next step is to stop guessing altogether: when two organizations each run their own Odoo, an absence could travel from one to the other the way a shared task already does between two Odoo instances that talk. That is not built, and it will probably come from there.
Losing weeks because the right person was on holiday and nobody knew? Let's chat whenever you like.
Sources
- RFC 3834, Recommendations for Automatic Responses to Electronic Mail: the 2004 standard that recommends labelling an automatic response, and separates a reply from a machine-generated notification.
- Salesloft, Out-of-Office Detection: out-of-office detection inside an outreach platform, and the rule of resuming the day after the return rather than on the day itself.
- lemlist, Out of Office Detection: reading the return date with artificial intelligence, and the task created on the return day.
- CCQ, construction holidays and leave dates: the official mandatory shutdown dates and the estimate that about a quarter of Quebec's active workforce takes holidays at the same time.
- Odoo documentation, Time Off app: what Odoo handles natively, meaning your employees' absences, not your contacts'.
- Contact Absences module source code: the public repository, the licence, the three published bridges (auto-replies, text messages, Nextcloud calendar) and the out-of-office responder.