OdooWiki OCA HUB

Email tracking

mail_tracking folder_open OCA/mail open_in_new
Social Network License: AGPL-3

This module shows email notification tracking status for any messages in mail thread (chatter). Each notified partner will have an intuitive icon just right to his name.

auto_awesome What this module does

AI-generated from the code · Odoo 19.0

Adds email tracking to Odoo: every outgoing email gets a tracking record, and the chatter shows per-recipient status (sent, delivered, opened, bounced, error). Users can also see failed messages and a partner's email reputation score.

This module turns Odoo's outgoing emails into tracked messages. Each time an email is prepared for sending, a tracking record is created for every recipient, and a small invisible image is added to the email body. When the recipient opens the email, that image is loaded and the status changes to "Opened".

In the chatter of any record, each notified partner now shows a status icon next to their name: Waiting, Sent, Delivered, Opened, Error or Unknown. Hovering or clicking gives the error reason when something went wrong.

A new "Failed sent messages" filter appears in the search views of every model that uses the chatter, and a failed-messages panel lets users review messages that bounced, were rejected or marked as spam, then mark them as handled.

Two new menus under the Email section list all tracking emails and tracking events, with their own list, form and search views. Tracking events record opens, clicks (with the clicked URL, IP address, browser and country), deliveries, bounces, spam complaints and unsubscribes.

On contacts, a new tab shows the tracking emails of that partner and an email score between 0 and 100, computed from past delivery results. Contacts can be filtered by bounced status, and a contact's email is automatically flagged as bounced when a hard bounce, spam complaint or rejection is received.

Settings let administrators show or hide aliases in tracking, and automatically delete old tracking records after a configurable number of days.

Depends on

mail

Menus it adds

Tracking emailsTracking events
Models and fields (12)
  • mail.mail · extends an existing model
  • mail.alias · extends an existing model
  • mail.thread · extends an existing modelfailed_message_ids (Failed Messages)
  • res.company · extends an existing modelmail_tracking_show_aliases (Show Aliases in Mail Tracking)
  • res.partner · new modelemail_score, tracking_emails_count
  • mail.message · extends an existing modelemail_cc (Cc), email_to (To), is_failed_message, mail_tracking_ids (Mail Trackings), mail_tracking_needs_action
  • ir.mail_server · extends an existing model
  • mail.alias.domain · extends an existing model
  • mail.bounced.mixin · new modelemail_bounced
  • mail.tracking.email · new modeldate, name (Subject), time, state, token (Security Token), sender (Sender email), mail_id (Email), recipient (Recipient email), timestamp (UTC timestamp), error_type, message_id, partner_id, bounce_type, display_name, mail_message_id, error_description, error_smtp_server (Error SMTP server), recipient_address (Recipient email address), bounce_description, tracking_event_ids (Tracking events)
  • mail.tracking.event · new modelip (User IP), url (Clicked URL), date, time, mobile (Is mobile?), ua_type (User agent type), os_family (Operating system family), recipient, timestamp (UTC timestamp), ua_family (User agent family), error_type, event_type, user_agent, smtp_server (SMTP server), error_details, user_country_id (User country), error_description, recipient_address (Recipient email address), tracking_email_id (Message)
  • res.config.settings · extends an existing modelmail_tracking_show_aliases, mail_tracking_email_max_age_days (Max age in days of mail tracking email records)

Text generated by AI (DeepSeek) from reading the Odoo 19.0 code on GitHub; it may contain mistakes, so check the code before deciding. The module is very large and only part of the code was read. View the code on GitHub

Availability by version

Reviewed: 2026-11-03
Confirmed (verified in repository and branch) Estimated (unverified) No information

Confirmation status: 8 confirmed, 1 with no information of 9 versions.

terminal Installation and usage

OCA documentation · Odoo 19.0

If you're using a multi-database installation (with or without dbfilter option) where /web/databse/selector returns a list of more than one database, then you need to add mail_tracking addon to wide load addons list (by default, only web addon), setting --load option. For example, --load=web,mail,mail_tracking

The first update of the module after this index was added creates a partial index on mail_message (mail_message_mail_tracking_needs_action_index). Later updates do not build it again: Odoo keeps it while its definition does not change.

On a database with a very large mail_message table that first build blocks writes to the table while it runs (13 minutes on 122 million rows). To avoid the lock, create the index beforehand exactly as the ORM would, with the comment it stores on it; Odoo compares that comment with the index definition and keeps the index when they match:

CREATE INDEX CONCURRENTLY mail_message_mail_tracking_needs_action_index
    ON mail_message (id) WHERE mail_tracking_needs_action IS TRUE;
COMMENT ON INDEX mail_message_mail_tracking_needs_action_index
    IS 'INDEX (id) WHERE mail_tracking_needs_action IS TRUE';

As there can be scenarios where sending a tracking img in the email body is not desired, there is a global system parameter "mail_tracking.tracking_img_disabled" that can be set to True to remove the tracking img from all outgoing emails. Note that the Opened status will not be available in this case.

When user sends a message in mail_thread (chatter), for instance in partner form, then an email tracking is created for each email notification. Then a status icon will appear just right to name of notified partner.

These are all available status icons:

Unknown: No email tracking info available. Maybe this notified partner has 'Receive Inbox Notifications by Email' == 'Never'

Waiting: Waiting to be sent

Error: Error while sending

Sent: Sent to SMTP server configured

Delivered: Delivered to final MX server

Opened: Opened by partner

Cc: It's a Carbon-Copy recipient. Can't know the status so is 'Unknown'

No Email: The partner doesn't have a defined email

No Partner: The recipient doesn't have a defined partner

If you want to see all tracking emails and events you can go to

  • Settings \> Technical \> Email \> Tracking emails
  • Settings \> Technical \> Email \> Tracking events

When the message generates an 'error' status, it will apear on discuss 'Failed' channel. Any view with chatter can show the failed messages too.

  • Discuss
  • Chatter

You can use "Failed sent messages" filter present in all views to show records with messages in failed status and that needs an user action.

  • Filter
info

Data imported from GitHub: this sheet reflects the latest catalog review, not a live lookup. Always check the module documentation and staging before installing in production.