SMS Marketing

mass_mailing_sms
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/mass_mailing_sms
VERSION
VERSION 1.1
CATEGORY
CATEGORYMarketing/Email Marketing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Julien Castiaux, Adrien Dieudonné, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, William Braeckman, Florian Charlier, Renaud Thiry, Louis Wicket (wil), Maximilien (malb), Victor Piryns (pivi), Pierre-Yves Dufays, Dylan Kiss (dyki), nihp-odoo, aath-odoo, guce, yagp-odoo, Pierre Pulinckx, Bastien PIERRE, Anton Romanova (roan), Krzysztof Magusiak (krma), Jérôme Belpaire, Séna Nshimiyimana, ELCO, chpa-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/sms-marketing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal
    - web
    - base
    - html_editor
    - bus
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
    - mass_mailing
    - contacts
    - html_builder
    - utm
    - link_tracker
    - social_media
    - digest
    - resource
    - sms
    - iap_mail
    - iap
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
blacklist_main Unsubscribed ir.ui.view qweb New
blacklist_number Unsubscribed ir.ui.view qweb New
mailing_contact_view_form mailing.contact.view.form.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_form
mailing_contact_view_kanban mailing.contact.view.kanban.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_kanban
mailing_contact_view_search mailing.contact.view.search.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_search
mailing_contact_view_tree mailing.contact.view.list.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_tree
mailing_list_view_form mailing.list.view.form.inherit.sms mailing.list xpath Inherits mass_mailing.mailing_list_view_form
mailing_list_view_kanban mailing.list.view.kanban.inherit.mass.mailing.sms mailing.list xpath Inherits mass_mailing.mailing_list_view_kanban
mailing_mailing_view_form_mixed mailing.mailing.view.form.mixed mailing.mailing xpath Inherits mass_mailing_sms.mailing_mailing_view_form_sms
mailing_mailing_view_form_sms mailing.mailing.view.form.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_form
mailing_mailing_view_kanban_sms mailing.mailing.view.kanban.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_kanban
mailing_mailing_view_search_sms mailing.mailing.search mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_search
mailing_mailing_view_tree_sms mailing.mailing.view.list.sms mailing.mailing list New
mailing_sms_test_view_form mailing.sms.test.view.form mailing.sms.test form New
mailing_trace_report_sms_view_graph mailing.sms.trace.report.view.graph mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_graph
mailing_trace_report_sms_view_pivot mailing.sms.trace.report.view.pivot mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_pivot
mailing_trace_report_sms_view_tree mailing.sms.trace.report.view.list mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_tree
mailing_trace_view_form mailing.trace.view.form.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_form
mailing_trace_view_form_sms mailing.trace.view.form.sms mailing.trace form New
mailing_trace_view_search mailing.trace.view.search.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_search
mailing_trace_view_tree mailing.trace.view.list.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_tree
mailing_trace_view_tree_sms mailing.trace.view.list.sms mailing.trace list New
sms_composer_view_form sms.composer.views.inherit.sms sms.composer xpath Inherits sms.sms_composer_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
Models touched (11)

New fields (1)
  • mobile Char
    string='Mobile'
Public methods (0)

No public methods.

New fields (1)
  • contact_count_sms Integer
    compute='_compute_mailing_list_statistics' string='SMS Contacts'
Public methods (3)
  • action_send_mailing_sms(self)
  • action_view_contacts_sms(self)
  • action_view_mailings(self)

New fields (10)
  • ab_testing_mailings_sms_count Integer
    related='campaign_id.ab_testing_mailings_sms_count'
  • ab_testing_sms_winner_selection Selection
    copy=True default='clicks_ratio' readonly=False related='campaign_id.ab_testing_sms_winner_selection'
  • body_plaintext Text
    compute='_compute_body_plaintext' readonly=False store=True args: 'SMS Body'
  • mailing_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
  • sms_allow_unsubscribe Boolean
    default=False args: 'Include opt-out link'
  • sms_force_send Boolean
    help='Immediately send the SMS Mailing instead of queuing up. Use at your own risk.' args: 'Send Directly'
  • sms_has_insufficient_credit Boolean
    compute='_compute_sms_has_iap_failure' args: 'Insufficient IAP credits'
  • sms_has_unregistered_account Boolean
    compute='_compute_sms_has_iap_failure' args: 'Unregistered IAP account'
  • sms_subject Char
    help='For an email, the subject your recipients will see in their inbox.\nFor an SMS, the internal title of the message.' readonly=False related='subject' translate=False args: 'Title'
  • sms_template_id Many2one → sms.template
    ondelete='set null' string='SMS Template' args: 'sms.template'
Public methods (9)
  • action_buy_sms_credits(self)
  • action_retry_failed(self)
  • action_retry_failed_sms(self)
  • action_send_sms(self, res_ids=None)
  • action_test(self)
  • convert_links(self)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • get_sms_link_replacements_placeholders(self)
    Get placeholders for replaced links in sms widget for accurate computation of sms counts. Reminders and assumptions: * Links wille be transformed to the format ``"[base_url]/r/[link_tracker_code]/s/[sms_id]"``. * unsubscribe is formatted as: ``"STOP SMS : [base_url]/sms/[mailing_id]/[trace_code]"``. :returns: Character counts used for links, formatted as ``{link: str, unsubscribe: str}``.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    ondelete='cascade' required=True string='Mailing' args: 'mailing.mailing'
  • numbers Text
    default=_default_numbers help='Carriage-return-separated list of phone numbers' required=True string='Number(s)'
Public methods (1)
  • action_send_sms(self)

New fields (7)
  • failure_type Selection
    selection_add=[('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_country_not_supported', 'Country Not Supported'), ('sms_registration_needed', 'Country-specific Registration Required'), ('sms_server', 'Server Error'), ('sms_acc', 'Unregistered Account'), ('sms_blacklist', 'Blacklisted'), ('sms_duplicate', 'Duplicate'), ('sms_optout', 'Opted Out'), ('sms_expired', 'Expired'), ('sms_invalid_destination', 'Invalid Destination'), ('sms_not_allowed', 'Not Allowed'), ('sms_not_delivered', 'Not Delivered'), ('sms_rejected', 'Rejected'), ('twilio_authentication', 'Authentication Error"'), ('twilio_callback', 'Incorrect callback URL'), ('twilio_from_missing', 'Missing From Number'), ('twilio_from_to', 'From / To identic')]
  • sms_code Char
    args: 'Code'
  • sms_id Many2one → sms.sms
    compute='_compute_sms_id' store=False string='SMS' args: 'sms.sms'
  • sms_id_int Integer
    index='btree_not_null' string='SMS ID'
  • sms_number Char
    args: 'Number'
  • sms_tracker_ids One2many → sms.tracker
    string='SMS Trackers' args: 'sms.tracker', 'mailing_trace_id'
  • trace_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • mailing_id Many2one → mailing.mailing
    string='Mailing' args: 'mailing.mailing'
  • mass_sms_allow_unsubscribe Boolean
    default=True args: 'Include opt-out link'
  • utm_campaign_id Many2one → utm.campaign
    ondelete='set null' string='Campaign' args: 'utm.campaign'
Public methods (0)

No public methods.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    string='Mass Mailing' args: 'mailing.mailing'
  • mailing_trace_ids One2many → mailing.trace
    string='Statistics' args: 'mailing.trace', 'sms_id_int'
Public methods (0)

No public methods.

New fields (1)
  • mailing_trace_id Many2one → mailing.trace
    index='btree_not_null' ondelete='cascade' args: 'mailing.trace'
Public methods (0)

No public methods.

New fields (4)
  • ab_testing_mailings_sms_count Integer
    compute='_compute_mailing_sms_count' args: 'A/B Test Mailings SMS #'
  • ab_testing_sms_winner_selection Selection
    default='clicks_ratio' string='SMS Winner Selection' args: [('manual', 'Manual'), ('clicks_ratio', 'Highest Click Rate')]
  • mailing_sms_count Integer
    compute='_compute_mailing_sms_count' groups='mass_mailing.group_mass_mailing_user' args: 'Number of Mass SMS'
  • mailing_sms_ids One2many → mailing.mailing
    domain=[('mailing_type', '=', 'sms')] groups='mass_mailing.group_mass_mailing_user' string='Mass SMS' args: 'mailing.mailing', 'campaign_id'
Public methods (2)
  • action_create_mass_sms(self)
  • action_redirect_to_mailing_sms(self)

New fields (0)

No new fields.

Public methods (1)
  • SELF_REQUIRED_UTM_MEDIUMS_REF(self)
    @property
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/mass_mailing_sms
VERSION
VERSION 1.1
CATEGORY
CATEGORYMarketing/Email Marketing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Xavier Morel, Odoo Online, Jorge Pinna Puissant, Aurélien Warnon, Sébastien Theys, std-odoo, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Florian Charlier, Renaud Thiry, Vincent Larcin, bve-odoo, Louis Wicket (wil), Maximilien (malb), amdi-odoo, Dylan Kiss (dyki), Vivek Pathak, Nguyễn Đại Dương, omra-odoo, dane@odoo.com, nihp-odoo, Louis (wil), Clément Cardot, guce, yagp-odoo, Pierre Pulinckx (PIPU), Pierre Pulinckx (pipu), Bastien PIERRE, kusi-odoo, Thomas Josse (THJO), Earth Patel, saurabh, Séna Nshimiyimana
WEBSITE
WEBSITEhttps://www.odoo.com/app/sms-marketing
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:54
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal
    - web
    - base
    - web_editor
    - bus
    - html_editor
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
    - mass_mailing
    - contacts
    - utm
    - link_tracker
    - social_media
    - digest
    - resource
    - sms
    - iap_mail
    - iap
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
blacklist_main Unsubscribed ir.ui.view qweb New
blacklist_number Unsubscribed ir.ui.view qweb New
mailing_contact_view_form mailing.contact.view.form.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_form
mailing_contact_view_kanban mailing.contact.view.kanban.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_kanban
mailing_contact_view_search mailing.contact.view.search.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_search
mailing_contact_view_tree mailing.contact.view.list.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_tree
mailing_list_view_form mailing.list.view.form.inherit.sms mailing.list xpath Inherits mass_mailing.mailing_list_view_form
mailing_list_view_kanban mailing.list.view.kanban.inherit.mass.mailing.sms mailing.list xpath Inherits mass_mailing.mailing_list_view_kanban
mailing_mailing_view_form_mixed mailing.mailing.view.form.mixed mailing.mailing xpath Inherits mass_mailing_sms.mailing_mailing_view_form_sms
mailing_mailing_view_form_sms mailing.mailing.view.form.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_form
mailing_mailing_view_kanban_sms mailing.mailing.view.kanban.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_kanban
mailing_mailing_view_search_sms mailing.mailing.search mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_search
mailing_mailing_view_tree_sms mailing.mailing.view.list.sms mailing.mailing list New
mailing_sms_test_view_form mailing.sms.test.view.form mailing.sms.test form New
mailing_trace_report_sms_view_graph mailing.sms.trace.report.view.graph mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_graph
mailing_trace_report_sms_view_pivot mailing.sms.trace.report.view.pivot mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_pivot
mailing_trace_report_sms_view_tree mailing.sms.trace.report.view.list mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_tree
mailing_trace_view_form mailing.trace.view.form.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_form
mailing_trace_view_form_sms mailing.trace.view.form.sms mailing.trace form New
mailing_trace_view_search mailing.trace.view.search.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_search
mailing_trace_view_tree mailing.trace.view.list.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_tree
mailing_trace_view_tree_sms mailing.trace.view.list.sms mailing.trace list New
sms_composer_view_form sms.composer.views.inherit.sms sms.composer xpath Inherits sms.sms_composer_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
Models touched (11)

New fields (1)
  • mobile Char
    string='Mobile'
Public methods (0)

No public methods.

New fields (1)
  • contact_count_sms Integer
    compute='_compute_mailing_list_statistics' string='SMS Contacts'
Public methods (3)
  • action_send_mailing_sms(self)
  • action_view_contacts_sms(self)
  • action_view_mailings(self)

New fields (10)
  • ab_testing_mailings_sms_count Integer
    related='campaign_id.ab_testing_mailings_sms_count'
  • ab_testing_sms_winner_selection Selection
    copy=True default='clicks_ratio' readonly=False related='campaign_id.ab_testing_sms_winner_selection'
  • body_plaintext Text
    compute='_compute_body_plaintext' readonly=False store=True args: 'SMS Body'
  • mailing_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
  • sms_allow_unsubscribe Boolean
    default=False args: 'Include opt-out link'
  • sms_force_send Boolean
    help='Immediately send the SMS Mailing instead of queuing up. Use at your own risk.' args: 'Send Directly'
  • sms_has_insufficient_credit Boolean
    compute='_compute_sms_has_iap_failure' args: 'Insufficient IAP credits'
  • sms_has_unregistered_account Boolean
    compute='_compute_sms_has_iap_failure' args: 'Unregistered IAP account'
  • sms_subject Char
    help='For an email, the subject your recipients will see in their inbox.\nFor an SMS, the internal title of the message.' readonly=False related='subject' translate=False args: 'Title'
  • sms_template_id Many2one → sms.template
    ondelete='set null' string='SMS Template' args: 'sms.template'
Public methods (9)
  • action_buy_sms_credits(self)
  • action_retry_failed(self)
  • action_retry_failed_sms(self)
  • action_send_sms(self, res_ids=None)
  • action_test(self)
  • convert_links(self)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • get_sms_link_replacements_placeholders(self)
    Get placeholders for replaced links in sms widget for accurate computation of sms counts. Reminders and assumptions: * Links wille be transformed to the format "[base_url]/r/[link_tracker_code]/s/[sms_id]". * unsubscribe is formatted as: " STOP SMS : [base_url]/sms/[mailing_id]/[trace_code]". :return: Character counts used for links, formatted as `{link: str, unsubscribe: str}`.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    ondelete='cascade' required=True string='Mailing' args: 'mailing.mailing'
  • numbers Text
    default=_default_numbers help='Carriage-return-separated list of phone numbers' required=True string='Number(s)'
Public methods (1)
  • action_send_sms(self)

New fields (7)
  • failure_type Selection
    selection_add=[('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_country_not_supported', 'Country Not Supported'), ('sms_registration_needed', 'Country-specific Registration Required'), ('sms_server', 'Server Error'), ('sms_acc', 'Unregistered Account'), ('sms_blacklist', 'Blacklisted'), ('sms_duplicate', 'Duplicate'), ('sms_optout', 'Opted Out'), ('sms_expired', 'Expired'), ('sms_invalid_destination', 'Invalid Destination'), ('sms_not_allowed', 'Not Allowed'), ('sms_not_delivered', 'Not Delivered'), ('sms_rejected', 'Rejected'), ('twilio_authentication', 'Authentication Error"'), ('twilio_callback', 'Incorrect callback URL'), ('twilio_from_missing', 'Missing From Number'), ('twilio_from_to', 'From / To identic')]
  • sms_code Char
    args: 'Code'
  • sms_id Many2one → sms.sms
    compute='_compute_sms_id' store=False string='SMS' args: 'sms.sms'
  • sms_id_int Integer
    index='btree_not_null' string='SMS ID'
  • sms_number Char
    args: 'Number'
  • sms_tracker_ids One2many → sms.tracker
    string='SMS Trackers' args: 'sms.tracker', 'mailing_trace_id'
  • trace_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
Public methods (2)
  • create(self, values_list)
    @api.model_create_multi
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • mailing_id Many2one → mailing.mailing
    string='Mailing' args: 'mailing.mailing'
  • mass_sms_allow_unsubscribe Boolean
    default=True args: 'Include opt-out link'
  • utm_campaign_id Many2one → utm.campaign
    ondelete='set null' string='Campaign' args: 'utm.campaign'
Public methods (0)

No public methods.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    string='Mass Mailing' args: 'mailing.mailing'
  • mailing_trace_ids One2many → mailing.trace
    string='Statistics' args: 'mailing.trace', 'sms_id_int'
Public methods (0)

No public methods.

New fields (1)
  • mailing_trace_id Many2one → mailing.trace
    ondelete='cascade' args: 'mailing.trace'
Public methods (0)

No public methods.

New fields (4)
  • ab_testing_mailings_sms_count Integer
    compute='_compute_mailing_sms_count' args: 'A/B Test Mailings SMS #'
  • ab_testing_sms_winner_selection Selection
    default='clicks_ratio' string='SMS Winner Selection' args: [('manual', 'Manual'), ('clicks_ratio', 'Highest Click Rate')]
  • mailing_sms_count Integer
    compute='_compute_mailing_sms_count' groups='mass_mailing.group_mass_mailing_user' args: 'Number of Mass SMS'
  • mailing_sms_ids One2many → mailing.mailing
    domain=[('mailing_type', '=', 'sms')] groups='mass_mailing.group_mass_mailing_user' string='Mass SMS' args: 'mailing.mailing', 'campaign_id'
Public methods (2)
  • action_create_mass_sms(self)
  • action_redirect_to_mailing_sms(self)

New fields (0)

No new fields.

Public methods (1)
  • SELF_REQUIRED_UTM_MEDIUMS_REF(self)
    @property
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/mass_mailing_sms
VERSION
VERSION 1.1
CATEGORY
CATEGORYMarketing/Email Marketing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Xavier Morel, Odoo Online, Julien Castiaux, Aurélien Warnon, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, Antoine Guenet, Florian Charlier, Achraf, Renaud Thiry, niyasraphy, bve-odoo, Louis Wicket (wil), tsm-odoo, amdi-odoo, Pierre-Yves Dufays, Dylan Kiss (dyki), Vivek Pathak, Hugo Carlier (Huca), Brieuc-brd, Nguyễn Đại Dương, Astik Singh, Julien Carion (juca), Louis (wil), Pratik Raval (PRRA), guce, yagp-odoo, Earth Patel
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:05
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal
    - web
    - base
    - web_editor
    - bus
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
    - mass_mailing
    - contacts
    - utm
    - link_tracker
    - social_media
    - digest
    - resource
    - sms
    - iap_mail
    - iap
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
blacklist_main Unsubscribed ir.ui.view qweb New
blacklist_number Unsubscribed ir.ui.view qweb New
mailing_contact_view_form mailing.contact.view.form.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_form
mailing_contact_view_kanban mailing.contact.view.kanban.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_kanban
mailing_contact_view_search mailing.contact.view.search.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_search
mailing_contact_view_tree mailing.contact.view.tree.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_tree
mailing_list_view_form mailing.list.view.form.inherit.sms mailing.list xpath Inherits mass_mailing.mailing_list_view_form
mailing_list_view_kanban mailing.list.view.kanban.inherit.mass.mailing.sms mailing.list xpath Inherits mass_mailing.mailing_list_view_kanban
mailing_mailing_view_form_mixed mailing.mailing.view.form.mixed mailing.mailing xpath Inherits mass_mailing_sms.mailing_mailing_view_form_sms
mailing_mailing_view_form_sms mailing.mailing.view.form.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_form
mailing_mailing_view_kanban_sms mailing.mailing.view.kanban.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_kanban
mailing_mailing_view_search_sms mailing.mailing.search mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_search
mailing_mailing_view_tree_sms mailing.mailing.view.tree.sms mailing.mailing tree New
mailing_sms_test_view_form mailing.sms.test.view.form mailing.sms.test form New
mailing_trace_report_sms_view_graph mailing.sms.trace.report.view.graph mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_graph
mailing_trace_report_sms_view_pivot mailing.sms.trace.report.view.pivot mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_pivot
mailing_trace_report_sms_view_tree mailing.sms.trace.report.view.tree mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_tree
mailing_trace_view_form mailing.trace.view.form.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_form
mailing_trace_view_form_sms mailing.trace.view.form.sms mailing.trace form New
mailing_trace_view_search mailing.trace.view.search.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_search
mailing_trace_view_tree mailing.trace.view.tree.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_tree
mailing_trace_view_tree_sms mailing.trace.view.tree.sms mailing.trace tree New
sms_composer_view_form sms.composer.views.inherit.sms sms.composer xpath Inherits sms.sms_composer_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
Models touched (11)

New fields (1)
  • mobile Char
    string='Mobile'
Public methods (0)

No public methods.

New fields (1)
  • contact_count_sms Integer
    compute='_compute_mailing_list_statistics' string='SMS Contacts'
Public methods (3)
  • action_send_mailing_sms(self)
  • action_view_contacts_sms(self)
  • action_view_mailings(self)

New fields (10)
  • ab_testing_mailings_sms_count Integer
    related='campaign_id.ab_testing_mailings_sms_count'
  • ab_testing_sms_winner_selection Selection
    copy=True default='clicks_ratio' readonly=False related='campaign_id.ab_testing_sms_winner_selection'
  • body_plaintext Text
    compute='_compute_body_plaintext' readonly=False store=True args: 'SMS Body'
  • mailing_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
  • sms_allow_unsubscribe Boolean
    default=False args: 'Include opt-out link'
  • sms_force_send Boolean
    help='Immediately send the SMS Mailing instead of queuing up. Use at your own risk.' args: 'Send Directly'
  • sms_has_insufficient_credit Boolean
    compute='_compute_sms_has_iap_failure' args: 'Insufficient IAP credits'
  • sms_has_unregistered_account Boolean
    compute='_compute_sms_has_iap_failure' args: 'Unregistered IAP account'
  • sms_subject Char
    help='For an email, the subject your recipients will see in their inbox.\nFor an SMS, the internal title of the message.' readonly=False related='subject' translate=False args: 'Title'
  • sms_template_id Many2one → sms.template
    ondelete='set null' string='SMS Template' args: 'sms.template'
Public methods (10)
  • action_buy_sms_credits(self)
  • action_retry_failed(self)
  • action_retry_failed_sms(self)
  • action_send_mail(self, res_ids=None)
  • action_send_sms(self, res_ids=None)
  • action_test(self)
  • convert_links(self)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • get_sms_link_replacements_placeholders(self)
    Get placeholders for replaced links in sms widget for accurate computation of sms counts. Reminders and assumptions: * Links wille be transformed to the format "[base_url]/r/[link_tracker_code]/s/[sms_id]". * unsubscribe is formatted as: " STOP SMS : [base_url]/sms/[mailing_id]/[trace_code]". :return: Character counts used for links, formatted as `{link: str, unsubscribe: str}`.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    ondelete='cascade' required=True string='Mailing' args: 'mailing.mailing'
  • numbers Text
    default=_default_numbers help='Carriage-return-separated list of phone numbers' required=True string='Number(s)'
Public methods (1)
  • action_send_sms(self)

New fields (7)
  • failure_type Selection
    selection_add=[('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_country_not_supported', 'Country Not Supported'), ('sms_registration_needed', 'Country-specific Registration Required'), ('sms_server', 'Server Error'), ('sms_acc', 'Unregistered Account'), ('sms_blacklist', 'Blacklisted'), ('sms_duplicate', 'Duplicate'), ('sms_optout', 'Opted Out'), ('sms_expired', 'Expired'), ('sms_invalid_destination', 'Invalid Destination'), ('sms_not_allowed', 'Not Allowed'), ('sms_not_delivered', 'Not Delivered'), ('sms_rejected', 'Rejected'), ('twilio_authentication', 'Authentication Error"'), ('twilio_callback', 'Incorrect callback URL'), ('twilio_from_missing', 'Missing From Number'), ('twilio_from_to', 'From / To identic')]
  • sms_code Char
    args: 'Code'
  • sms_id Many2one → sms.sms
    compute='_compute_sms_id' store=False string='SMS' args: 'sms.sms'
  • sms_id_int Integer
    index='btree_not_null' string='SMS ID'
  • sms_number Char
    args: 'Number'
  • sms_tracker_ids One2many → sms.tracker
    string='SMS Trackers' args: 'sms.tracker', 'mailing_trace_id'
  • trace_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
Public methods (2)
  • create(self, values_list)
    @api.model_create_multi
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • systray_get_activities(self)
    @api.model
    Split mass_mailing and mass_mailing_sms activities in systray by removing the single mailing.mailing activity represented and doing a new query to split them by mailing_type.

New fields (3)
  • mailing_id Many2one → mailing.mailing
    string='Mailing' args: 'mailing.mailing'
  • mass_sms_allow_unsubscribe Boolean
    default=True args: 'Include opt-out link'
  • utm_campaign_id Many2one → utm.campaign
    ondelete='set null' string='Campaign' args: 'utm.campaign'
Public methods (0)

No public methods.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    string='Mass Mailing' args: 'mailing.mailing'
  • mailing_trace_ids One2many → mailing.trace
    string='Statistics' args: 'mailing.trace', 'sms_id_int'
Public methods (0)

No public methods.

New fields (1)
  • mailing_trace_id Many2one → mailing.trace
    ondelete='cascade' args: 'mailing.trace'
Public methods (0)

No public methods.

New fields (4)
  • ab_testing_mailings_sms_count Integer
    compute='_compute_mailing_sms_count' args: 'A/B Test Mailings SMS #'
  • ab_testing_sms_winner_selection Selection
    default='clicks_ratio' string='SMS Winner Selection' args: [('manual', 'Manual'), ('clicks_ratio', 'Highest Click Rate')]
  • mailing_sms_count Integer
    compute='_compute_mailing_sms_count' groups='mass_mailing.group_mass_mailing_user' args: 'Number of Mass SMS'
  • mailing_sms_ids One2many → mailing.mailing
    domain=[('mailing_type', '=', 'sms')] groups='mass_mailing.group_mass_mailing_user' string='Mass SMS' args: 'mailing.mailing', 'campaign_id'
Public methods (2)
  • action_create_mass_sms(self)
  • action_redirect_to_mailing_sms(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/mass_mailing_sms
VERSION
VERSION 1.0
CATEGORY
CATEGORYMarketing/Email Marketing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Yannick Tivisse, Dharmraj Jhala, Julien Castiaux, Aurélien Warnon, Romeo Fragomeli, Victor Feyens, Sébastien Theys, std-odoo, Tiffany Chang (tic), Romain Estievenart, Antoine Guenet, Florian Charlier, Patrick Hoste, Achraf, Renaud Thiry, bve-odoo, Louis Wicket (wil), Sébastien Geelen (sge), Mitul Shah, Vivek Pathak, Pratik Raval, guce
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:47
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal
    - web
    - base
    - web_editor
    - bus
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
    - mass_mailing
    - contacts
    - utm
    - link_tracker
    - web_kanban_gauge
    - social_media
    - digest
    - resource
    - sms
    - iap_mail
    - iap
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
blacklist_main Unsubscribed ir.ui.view qweb New
blacklist_number Unsubscribed ir.ui.view qweb New
mailing_contact_view_form mailing.contact.view.form.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_form
mailing_contact_view_kanban mailing.contact.view.kanban.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_kanban
mailing_contact_view_search mailing.contact.view.search.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_search
mailing_contact_view_tree mailing.contact.view.tree.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_tree
mailing_list_view_kanban mailing.list.view.kanban.inherit.mass.mailing.sms mailing.list xpath Inherits mass_mailing.mailing_list_view_kanban
mailing_mailing_view_form_mixed mailing.mailing.view.form.mixed mailing.mailing xpath Inherits mass_mailing_sms.mailing_mailing_view_form_sms
mailing_mailing_view_form_sms mailing.mailing.view.form.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_form
mailing_mailing_view_kanban_sms mailing.mailing.view.kanban.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_kanban
mailing_mailing_view_search_sms mailing.mailing.search mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_search
mailing_mailing_view_tree_sms mailing.mailing.view.tree.sms mailing.mailing tree New
mailing_sms_test_view_form mailing.sms.test.view.form mailing.sms.test form New
mailing_trace_report_sms_view_graph mailing.sms.trace.report.view.graph mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_graph
mailing_trace_report_sms_view_pivot mailing.sms.trace.report.view.pivot mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_pivot
mailing_trace_report_sms_view_tree mailing.sms.trace.report.view.tree mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_tree
mailing_trace_view_form mailing.trace.view.form.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_form
mailing_trace_view_form_sms mailing.trace.view.form.sms mailing.trace form New
mailing_trace_view_search mailing.trace.view.search.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_search
mailing_trace_view_tree mailing.trace.view.tree.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_tree
mailing_trace_view_tree_sms mailing.trace.view.tree.sms mailing.trace tree New
sms_composer_view_form sms.composer.views.inherit.sms sms.composer xpath Inherits sms.sms_composer_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
Models touched (10)

New fields (1)
  • mobile Char
    string='Mobile'
Public methods (0)

No public methods.

New fields (1)
  • contact_count_sms Integer
    compute='_compute_mailing_list_statistics' string='SMS Contacts'
Public methods (2)
  • action_view_contacts_sms(self)
  • action_view_mailings(self)

New fields (9)
  • ab_testing_sms_winner_selection Selection
    copy=True default='clicks_ratio' readonly=False related='campaign_id.ab_testing_sms_winner_selection'
  • body_plaintext Text
    compute='_compute_body_plaintext' readonly=False store=True args: 'SMS Body'
  • mailing_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
  • sms_allow_unsubscribe Boolean
    default=False args: 'Include opt-out link'
  • sms_force_send Boolean
    help='Immediately send the SMS Mailing instead of queuing up. Use at your own risk.' args: 'Send Directly'
  • sms_has_insufficient_credit Boolean
    compute='_compute_sms_has_iap_failure' args: 'Insufficient IAP credits'
  • sms_has_unregistered_account Boolean
    compute='_compute_sms_has_iap_failure' args: 'Unregistered IAP account'
  • sms_subject Char
    help='For an email, the subject your recipients will see in their inbox.\nFor an SMS, the internal title of the message.' readonly=False related='subject' translate=False args: 'Title'
  • sms_template_id Many2one → sms.template
    ondelete='set null' string='SMS Template' args: 'sms.template'
Public methods (10)
  • action_buy_sms_credits(self)
  • action_retry_failed(self)
  • action_retry_failed_sms(self)
  • action_send_mail(self, res_ids=None)
  • action_send_sms(self, res_ids=None)
  • action_test(self)
  • convert_links(self)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • get_sms_link_replacements_placeholders(self)
    Get placeholders for replaced links in sms widget for accurate computation of sms counts. Reminders and assumptions: * Links wille be transformed to the format "[base_url]/r/[link_tracker_code]/s/[sms_id]". * unsubscribe is formatted as: " STOP SMS : [base_url]/sms/[mailing_id]/[trace_code]". :return: Character counts used for links, formatted as `{link: str, unsubscribe: str}`.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    ondelete='cascade' required=True string='Mailing' args: 'mailing.mailing'
  • numbers Text
    default=_default_numbers help='Carriage-return-separated list of phone numbers' required=True string='Number(s)'
Public methods (1)
  • action_send_sms(self)

New fields (6)
  • failure_type Selection
    selection_add=[('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error'), ('sms_acc', 'Unregistered Account'), ('sms_blacklist', 'Blacklisted'), ('sms_duplicate', 'Duplicate'), ('sms_optout', 'Opted Out')]
  • sms_code Char
    args: 'Code'
  • sms_number Char
    args: 'Number'
  • sms_sms_id Many2one → sms.sms
    index='btree_not_null' ondelete='set null' string='SMS' args: 'sms.sms'
  • sms_sms_id_int Integer
    index='btree_not_null' string='SMS ID (tech)'
  • trace_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
Public methods (1)
  • create(self, values_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (1)
  • systray_get_activities(self)
    @api.model
    Split mass_mailing and mass_mailing_sms activities in systray by removing the single mailing.mailing activity represented and doing a new query to split them by mailing_type.

New fields (3)
  • mailing_id Many2one → mailing.mailing
    string='Mailing' args: 'mailing.mailing'
  • mass_sms_allow_unsubscribe Boolean
    default=True args: 'Include opt-out link'
  • utm_campaign_id Many2one → utm.campaign
    ondelete='set null' string='Campaign' args: 'utm.campaign'
Public methods (0)

No public methods.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    string='Mass Mailing' args: 'mailing.mailing'
  • mailing_trace_ids One2many → mailing.trace
    string='Statistics' args: 'mailing.trace', 'sms_sms_id'
Public methods (0)

No public methods.

New fields (4)
  • ab_testing_mailings_sms_count Integer
    compute='_compute_mailing_sms_count' args: 'A/B Test Mailings SMS #'
  • ab_testing_sms_winner_selection Selection
    default='clicks_ratio' string='SMS Winner Selection' args: [('manual', 'Manual'), ('clicks_ratio', 'Highest Click Rate')]
  • mailing_sms_count Integer
    compute='_compute_mailing_sms_count' groups='mass_mailing.group_mass_mailing_user' args: 'Number of Mass SMS'
  • mailing_sms_ids One2many → mailing.mailing
    domain=[('mailing_type', '=', 'sms')] groups='mass_mailing.group_mass_mailing_user' string='Mass SMS' args: 'mailing.mailing', 'campaign_id'
Public methods (2)
  • action_create_mass_sms(self)
  • action_redirect_to_mailing_sms(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/mass_mailing_sms
VERSION
VERSION 1.0
CATEGORY
CATEGORYMarketing/Email Marketing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Xavier Morel, Jeremy Kersten, Dharmraj Jhala, Romain Derie, Adrien Dieudonne, Aurélien Warnon, Xavier-Do, Achraf (abz), Jérémy Hennecart, Tiffany Chang (tic), nounoubensebia, Kevin Baptiste, Florian Charlier, Nicolas Bayet, dht-odoo, bve-odoo, Mariska Archielli (ram), Mitul Shah, Noe Antoine, Damien (abd), MAHAMADASIF ANSARI, Pratik Raval
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:27
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal
    - web
    - base
    - web_editor
    - http_routing
    - mail
    - base_setup
    - bus
    - web_tour
    - auth_signup
    - mass_mailing
    - contacts
    - utm
    - link_tracker
    - web_kanban_gauge
    - social_media
    - digest
    - resource
    - sms
    - iap_mail
    - iap
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
blacklist_main Unsubscribed ir.ui.view qweb New
blacklist_number Unsubscribed ir.ui.view qweb New
mailing_contact_view_form mailing.contact.view.form.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_form
mailing_contact_view_kanban mailing.contact.view.kanban.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_kanban
mailing_contact_view_search mailing.contact.view.search.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_search
mailing_contact_view_tree mailing.contact.view.tree.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_tree
mailing_list_view_kanban mailing.list.view.kanban.inherit.mass.mailing.sms mailing.list xpath Inherits mass_mailing.mailing_list_view_kanban
mailing_mailing_view_form_mixed mailing.mailing.view.form.mixed mailing.mailing xpath Inherits mass_mailing_sms.mailing_mailing_view_form_sms
mailing_mailing_view_form_sms mailing.mailing.view.form.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_form
mailing_mailing_view_kanban_sms mailing.mailing.view.kanban.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_kanban
mailing_mailing_view_search_sms mailing.mailing.search mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_search
mailing_mailing_view_tree_sms mailing.mailing.view.tree.sms mailing.mailing tree New
mailing_sms_test_view_form mailing.sms.test.view.form mailing.sms.test form New
mailing_trace_report_sms_view_graph mailing.sms.trace.report.view.graph mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_graph
mailing_trace_report_sms_view_pivot mailing.sms.trace.report.view.pivot mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_pivot
mailing_trace_report_sms_view_tree mailing.sms.trace.report.view.tree mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_tree
mailing_trace_view_form mailing.trace.view.form.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_form
mailing_trace_view_form_sms mailing.trace.view.form.sms mailing.trace form New
mailing_trace_view_search mailing.trace.view.search.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_search
mailing_trace_view_tree mailing.trace.view.tree.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_tree
mailing_trace_view_tree_sms mailing.trace.view.tree.sms mailing.trace tree New
sms_composer_view_form sms.composer.views.inherit.sms sms.composer xpath Inherits sms.sms_composer_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
Models touched (9)

New fields (1)
  • mobile Char
    string='Mobile'
Public methods (0)

No public methods.

New fields (1)
  • contact_count_sms Integer
    compute='_compute_mailing_list_statistics' string='SMS Contacts'
Public methods (2)
  • action_view_contacts_sms(self)
  • action_view_mailings(self)

New fields (9)
  • ab_testing_sms_winner_selection Selection
    copy=True default='clicks_ratio' readonly=False related='campaign_id.ab_testing_sms_winner_selection'
  • body_plaintext Text
    compute='_compute_body_plaintext' readonly=False store=True args: 'SMS Body'
  • mailing_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
  • sms_allow_unsubscribe Boolean
    default=False args: 'Include opt-out link'
  • sms_force_send Boolean
    help='Immediately send the SMS Mailing instead of queuing up. Use at your own risk.' args: 'Send Directly'
  • sms_has_insufficient_credit Boolean
    compute='_compute_sms_has_iap_failure' help='UX Field to propose to buy IAP credits' args: 'Insufficient IAP credits'
  • sms_has_unregistered_account Boolean
    compute='_compute_sms_has_iap_failure' help='UX Field to propose to Register the SMS IAP account' args: 'Unregistered IAP account'
  • sms_subject Char
    help='For an email, the subject your recipients will see in their inbox.\nFor an SMS, the internal title of the message.' readonly=False related='subject' translate=False args: 'Title'
  • sms_template_id Many2one → sms.template
    ondelete='set null' string='SMS Template' args: 'sms.template'
Public methods (10)
  • action_buy_sms_credits(self)
  • action_retry_failed(self)
  • action_retry_failed_sms(self)
  • action_send_mail(self, res_ids=None)
  • action_send_sms(self, res_ids=None)
  • action_test(self)
  • convert_links(self)
  • create(self, values)
    @api.model
  • default_get(self, fields)
    @api.model
  • get_sms_link_replacements_placeholders(self)
    Get placeholders for replaced links in sms widget for accurate computation of sms counts. Reminders and assumptions: * Links wille be transformed to the format "[base_url]/r/[link_tracker_code]/s/[sms_id]". * unsubscribe is formatted as: " STOP SMS : [base_url]/sms/[mailing_id]/[trace_code]". :return: Character counts used for links, formatted as `{link: str, unsubscribe: str}`.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    ondelete='cascade' required=True string='Mailing' args: 'mailing.mailing'
  • numbers Text
    default=_default_numbers help='Carriage-return-separated list of phone numbers' required=True string='Number(s)'
Public methods (1)
  • action_send_sms(self)

New fields (6)
  • failure_type Selection
    selection_add=[('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error'), ('sms_acc', 'Unregistered Account'), ('sms_blacklist', 'Blacklisted'), ('sms_duplicate', 'Duplicate'), ('sms_optout', 'Opted Out')]
  • sms_code Char
    args: 'Code'
  • sms_number Char
    args: 'Number'
  • sms_sms_id Many2one → sms.sms
    index=True ondelete='set null' string='SMS' args: 'sms.sms'
  • sms_sms_id_int Integer
    help='ID of the related sms.sms. This field is an integer field because the related sms.sms can be deleted separately from its statistics. However the ID is needed for several action and controllers.' index=True string='SMS ID (tech)'
  • trace_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
Public methods (1)
  • create(self, values_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (1)
  • systray_get_activities(self)
    @api.model
    Split mass_mailing and mass_mailing_sms activities in systray by removing the single mailing.mailing activity represented and doing a new query to split them by mailing_type.

New fields (3)
  • mailing_id Many2one → mailing.mailing
    string='Mailing' args: 'mailing.mailing'
  • mass_sms_allow_unsubscribe Boolean
    default=True args: 'Include opt-out link'
  • utm_campaign_id Many2one → utm.campaign
    string='Campaign' args: 'utm.campaign'
Public methods (0)

No public methods.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    string='Mass Mailing' args: 'mailing.mailing'
  • mailing_trace_ids One2many → mailing.trace
    string='Statistics' args: 'mailing.trace', 'sms_sms_id'
Public methods (0)

No public methods.

New fields (3)
  • ab_testing_sms_winner_selection Selection
    default='clicks_ratio' string='SMS Winner Selection' args: [('manual', 'Manual'), ('clicks_ratio', 'Highest Click Rate')]
  • mailing_sms_count Integer
    compute='_compute_mailing_sms_count' args: 'Number of Mass SMS'
  • mailing_sms_ids One2many → mailing.mailing
    domain=[('mailing_type', '=', 'sms')] string='Mass SMS' args: 'mailing.mailing', 'campaign_id'
Public methods (2)
  • action_create_mass_sms(self)
  • action_redirect_to_mailing_sms(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/mass_mailing_sms
VERSION
VERSION 1.0
CATEGORY
CATEGORYMarketing/Email Marketing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Nicolas Lempereur, Aaron Bohy, GitHub, Barad Mahendra, Yannick Tivisse, Dharmraj Jhala, Adrien Dieudonne, Rémi Rahir, Xavier-Do, Nasreddin (bon), fw-bot, Debauche Stéphane, Tiffany Chang (tic), Kevin Baptiste, bve-odoo, Krupal Oza, Mariska Archielli (ram)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:28
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal
    - web
    - base
    - web_editor
    - http_routing
    - mail
    - base_setup
    - bus
    - web_tour
    - auth_signup
    - mass_mailing
    - contacts
    - utm
    - link_tracker
    - web_kanban_gauge
    - social_media
    - digest
    - resource
    - sms
    - iap_mail
    - iap
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (22)
XML IDNameModelTypeStatus
blacklist_main Unsubscribed ir.ui.view qweb New
blacklist_number Unsubscribed ir.ui.view qweb New
mailing_contact_view_form mailing.contact.view.form.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_form
mailing_contact_view_kanban mailing.contact.view.kanban.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_kanban
mailing_contact_view_search mailing.contact.view.search.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_search
mailing_contact_view_tree mailing.contact.view.tree.inherit.sms mailing.contact xpath Inherits mass_mailing.mailing_contact_view_tree
mailing_mailing_view_form_mixed mailing.mailing.view.form.mixed mailing.mailing xpath Inherits mass_mailing_sms.mailing_mailing_view_form_sms
mailing_mailing_view_form_sms mailing.mailing.view.form.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_form
mailing_mailing_view_kanban_sms mailing.mailing.view.kanban.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_kanban
mailing_mailing_view_search_sms mailing.mailing.search mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_search
mailing_mailing_view_tree_sms mailing.mailing.view.tree.sms mailing.mailing tree New
mailing_sms_test_view_form mailing.sms.test.view.form mailing.sms.test form New
mailing_trace_report_sms_view_graph mailing.sms.trace.report.view.graph mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_graph
mailing_trace_report_sms_view_pivot mailing.sms.trace.report.view.pivot mailing.trace.report xpath Inherits mass_mailing.mailing_trace_report_view_pivot
mailing_trace_view_form mailing.trace.view.form.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_form
mailing_trace_view_form_sms mailing.trace.view.form.sms mailing.trace form New
mailing_trace_view_search mailing.trace.view.search.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_search
mailing_trace_view_tree mailing.trace.view.tree.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_tree
mailing_trace_view_tree_sms mailing.trace.view.tree.sms mailing.trace tree New
sms_composer_view_form sms.composer.views.inherit.sms sms.composer xpath Inherits sms.sms_composer_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
Models touched (9)

New fields (1)
  • mobile Char
    string='Mobile'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_view_contacts(self)

New fields (8)
  • body_plaintext Text
    compute='_compute_body_plaintext' readonly=False store=True args: 'SMS Body'
  • mailing_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
  • sms_allow_unsubscribe Boolean
    default=False args: 'Include opt-out link'
  • sms_force_send Boolean
    help='Use at your own risks.' args: 'Send Directly'
  • sms_has_insufficient_credit Boolean
    compute='_compute_sms_has_iap_failure' help='UX Field to propose to buy IAP credits' args: 'Insufficient IAP credits'
  • sms_has_unregistered_account Boolean
    compute='_compute_sms_has_iap_failure' help='UX Field to propose to Register the SMS IAP account' args: 'Unregistered IAP account'
  • sms_subject Char
    help='For an email, the subject your recipients will see in their inbox.\nFor an SMS, the internal title of the message.' readonly=False related='subject' translate=True args: 'Title'
  • sms_template_id Many2one → sms.template
    ondelete='set null' string='SMS Template' args: 'sms.template'
Public methods (10)
  • action_buy_sms_credits(self)
  • action_put_in_queue_sms(self)
  • action_retry_failed(self)
  • action_retry_failed_sms(self)
  • action_send_mail(self, res_ids=None)
  • action_send_now_sms(self)
  • action_send_sms(self, res_ids=None)
  • action_test(self)
  • create(self, values)
    @api.model
  • default_get(self, fields)
    @api.model

New fields (2)
  • mailing_id Many2one → mailing.mailing
    ondelete='cascade' required=True string='Mailing' args: 'mailing.mailing'
  • numbers Char
    default=_default_numbers help='Comma-separated list of phone numbers' required=True string='Number(s)'
Public methods (1)
  • action_send_sms(self)

New fields (6)
  • failure_type Selection
    selection_add=[('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error'), ('sms_acc', 'Unregistered Account'), ('sms_blacklist', 'Blacklisted'), ('sms_duplicate', 'Duplicate')]
  • sms_code Char
    args: 'Code'
  • sms_number Char
    args: 'Number'
  • sms_sms_id Many2one → sms.sms
    index=True ondelete='set null' string='SMS' args: 'sms.sms'
  • sms_sms_id_int Integer
    help='ID of the related sms.sms. This field is an integer field because the related sms.sms can be deleted separately from its statistics. However the ID is needed for several action and controllers.' index=True string='SMS ID (tech)'
  • trace_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
Public methods (6)
  • create(self, values_list)
    @api.model_create_multi
  • set_failed(self, failure_type)
  • set_sms_clicked(self, sms_sms_ids=None)
  • set_sms_exception(self, sms_sms_ids=None)
  • set_sms_ignored(self, sms_sms_ids=None)
  • set_sms_sent(self, sms_sms_ids=None)

New fields (0)

No new fields.

Public methods (1)
  • systray_get_activities(self)
    @api.model
    Split mass_mailing and mass_mailing_sms activities in systray by removing the single mailing.mailing activity represented and doing a new query to split them by mailing_type.

New fields (3)
  • mailing_id Many2one → mailing.mailing
    string='Mailing' args: 'mailing.mailing'
  • mass_sms_allow_unsubscribe Boolean
    default=True args: 'Include opt-out link'
  • utm_campaign_id Many2one → utm.campaign
    string='Campaign' args: 'utm.campaign'
Public methods (0)

No public methods.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    string='Mass Mailing' args: 'mailing.mailing'
  • mailing_trace_ids One2many → mailing.trace
    string='Statistics' args: 'mailing.trace', 'sms_sms_id'
Public methods (0)

No public methods.

New fields (2)
  • mailing_sms_count Integer
    compute='_compute_mailing_sms_count' args: 'Number of Mass SMS'
  • mailing_sms_ids One2many → mailing.mailing
    domain=[('mailing_type', '=', 'sms')] string='Mass SMS' args: 'mailing.mailing', 'campaign_id'
Public methods (2)
  • action_create_mass_sms(self)
  • action_redirect_to_mailing_sms(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/mass_mailing_sms
VERSION
VERSION 1.0
CATEGORY
CATEGORYMarketing/Email Marketing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Nicolas Lempereur, GitHub, Aurélien Warnon, Xavier-Do, Paul Morelle, Nasreddin (bon), sri-odoo, ryv-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal
    - web
    - base
    - web_editor
    - http_routing
    - mail
    - base_setup
    - bus
    - web_tour
    - auth_signup
    - mass_mailing
    - contacts
    - utm
    - link_tracker
    - web_kanban_gauge
    - social_media
    - sms
    - iap
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
blacklist_main Unsubscribed ir.ui.view qweb New
blacklist_number Unsubscribed ir.ui.view qweb New
mailing_contact_view_form mailing.contact.view.form.inherit.sms mailing.contact xpath Inherits mass_mailing.view_mail_mass_mailing_contact_form
mailing_contact_view_kanban mailing.contact.view.kanban.inherit.sms mailing.contact xpath Inherits mass_mailing.view_mail_mass_mailing_contact_kanban
mailing_contact_view_search mailing.contact.view.search.inherit.sms mailing.contact xpath Inherits mass_mailing.view_mail_mass_mailing_contact_search
mailing_contact_view_tree_sms mailing.contact.view.tree.sms mailing.contact tree New
mailing_mailing_view_form_mixed mailing.mailing.view.form.mixed mailing.mailing xpath Inherits mass_mailing_sms.mailing_mailing_view_form_sms
mailing_mailing_view_form_sms mailing.mailing.view.form.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_form
mailing_mailing_view_kanban_sms mailing.mailing.view.kanban.inherit.sms mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_kanban
mailing_mailing_view_search_sms mailing.mailing.search mailing.mailing xpath Inherits mass_mailing.view_mail_mass_mailing_search
mailing_mailing_view_tree_sms mailing.mailing.view.tree.sms mailing.mailing tree New
mailing_sms_test_view_form mailing.sms.test.view.form mailing.sms.test form New
mailing_trace_report_view_graph mailing.trace.report.view.graph mailing.trace.report graph New
mailing_trace_report_view_pivot mailing.trace.report.view.pivot mailing.trace.report pivot New
mailing_trace_report_view_search mailing.trace.report.view.search mailing.trace.report search New
mailing_trace_view_form mailing.trace.view.form.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_form
mailing_trace_view_form_sms mailing.trace.view.form.sms mailing.trace form New
mailing_trace_view_search mailing.trace.view.search.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_search
mailing_trace_view_tree mailing.trace.view.tree.inherit.sms mailing.trace xpath Inherits mass_mailing.mailing_trace_view_tree
mailing_trace_view_tree_sms mailing.trace.view.tree.sms mailing.trace tree New
sms_composer_view_form sms.composer.views.inherit.sms sms.composer xpath Inherits sms.sms_composer_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
Models touched (8)

New fields (1)
  • mobile Char
    string='Mobile'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_view_contacts(self)

New fields (6)
  • body_plaintext Text
    args: 'SMS Body'
  • mailing_type Selection
    selection_add=[('sms', 'SMS')]
  • sms_allow_unsubscribe Boolean
    default=False args: 'Include opt-out link'
  • sms_force_send Boolean
    help='Use at your own risks.' args: 'Send Directly'
  • sms_has_insufficient_credit Boolean
    compute='_compute_sms_has_insufficient_credit' help='UX Field to propose to buy IAP credits' args: 'Insufficient IAP credits'
  • sms_template_id Many2one → sms.template
    ondelete='set null' string='SMS Template' args: 'sms.template'
Public methods (10)
  • action_buy_sms_credits(self)
  • action_put_in_queue_sms(self)
  • action_retry_failed(self)
  • action_retry_failed_sms(self)
  • action_send_mail(self, res_ids=None)
  • action_send_now_sms(self)
  • action_send_sms(self, res_ids=None)
  • action_test(self)
  • create(self, values)
    @api.model
  • default_get(self, fields)
    @api.model

New fields (2)
  • mailing_id Many2one → mailing.mailing
    ondelete='cascade' required=True string='Mailing' args: 'mailing.mailing'
  • numbers Char
    default=_default_numbers help='Comma-separated list of phone numbers' required=True string='Number(s)'
Public methods (1)
  • action_send_sms(self)

New fields (6)
  • failure_type Selection
    selection_add=[('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error'), ('sms_blacklist', 'Blacklisted'), ('sms_duplicate', 'Duplicate')]
  • sms_code Char
    args: 'Code'
  • sms_number Char
    args: 'Number'
  • sms_sms_id Many2one → sms.sms
    index=True ondelete='set null' string='SMS' args: 'sms.sms'
  • sms_sms_id_int Integer
    help='ID of the related sms.sms. This field is an integer field because the related sms.sms can be deleted separately from its statistics. However the ID is needed for several action and controllers.' index=True string='SMS ID (tech)'
  • trace_type Selection
    selection_add=[('sms', 'SMS')]
Public methods (6)
  • create(self, values_list)
    @api.model_create_multi
  • set_failed(self, failure_type)
  • set_sms_clicked(self, sms_sms_ids=None)
  • set_sms_exception(self, sms_sms_ids=None)
  • set_sms_ignored(self, sms_sms_ids=None)
  • set_sms_sent(self, sms_sms_ids=None)

New fields (3)
  • mailing_id Many2one → mailing.mailing
    string='Mailing' args: 'mailing.mailing'
  • mass_sms_allow_unsubscribe Boolean
    default=True args: 'Include opt-out link'
  • utm_campaign_id Many2one → utm.campaign
    string='Campaign' args: 'utm.campaign'
Public methods (0)

No public methods.

New fields (2)
  • mailing_id Many2one → mailing.mailing
    string='Mass Mailing' args: 'mailing.mailing'
  • mailing_trace_ids One2many → mailing.trace
    string='Statistics' args: 'mailing.trace', 'sms_sms_id'
Public methods (0)

No public methods.

New fields (2)
  • mailing_sms_count Integer
    compute='_compute_mailing_sms_count' args: 'Number of Mass SMS'
  • mailing_sms_ids One2many → mailing.mailing
    domain=[('mailing_type', '=', 'sms')] string='Mass SMS' args: 'mailing.mailing', 'campaign_id'
Public methods (2)
  • action_create_mass_sms(self)
  • action_redirect_to_mailing_sms(self)