TIP: You can type at any time to perform a new search.
Marketing Campaigns
marketing_campaign · odoo/odoo
- Repository
- odoo/odoo · module folder
- Module version
- 1.1
- Category
- Marketing
- Folder size
- 3.42 MB
- License
- LGPL-3
- Application
- No
- Auto-installable
- No
- Website
- https://www.odoo.com/page/lead-automation
- Last tracking update
- 2026-08-07 04:59:46
- Authors
- Maintainers
- None
- Committers
- Olivier Dony, Fabien Pinckaers, Raphael Collet, Christophe Simonis, Thibault Delavallée, Martin Trigaux, Odoo Translation Bot, Denis Ledoux, Simon Lejeune, Nicolas Martinelli, Jérome Maes, Julien Legros, xmo-odoo, Richard Mathot, qdp-odoo, Jeremy Kersten, Yannick Tivisse, qsm-odoo
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- marketing_campaign_crm_demo
- Description
This module provides leads automation through marketing campaigns (campaigns can in fact be defined on any resource, not just CRM Leads). ========================================================================================================================================= The campaigns are dynamic and multi-channels. The process is as follows: ------------------------------------------------------------------------ * Design marketing campaigns like workflows, including email templates to send, reports to print and send by email, custom actions * Define input segments that will select the items that should enter the campaign (e.g leads from certain countries.) * Run your campaign in simulation mode to test it real-time or accelerated, and fine-tune it * You may also start the real campaign in manual mode, where each action requires manual validation * Finally launch your campaign live, and watch the statistics as the campaign does everything fully automatically. While the campaign runs you can of course continue to fine-tune the parameters, input segments, workflow. **Note:** If you need demo data, you can install the marketing_campaign_crm_demo module, but this will also install the CRM application as it depends on CRM Leads.
Code Analysis ⓘ
Views touched (16)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
view_campaign_analysis_search |
campaign.analysis.search | campaign.analysis | search | New |
view_campaign_analysis_tree |
campaign.analysis.tree | campaign.analysis | tree | New |
view_marketing_campaign_activity_form |
marketing.campaign.activity.form | marketing.campaign.activity | form | New |
view_marketing_campaign_activity_tree |
marketing.campaign.activity.tree | marketing.campaign.activity | tree | New |
view_marketing_campaign_diagram |
marketing.campaign.diagram | marketing.campaign | diagram | New |
view_marketing_campaign_form |
marketing.campaign.form | marketing.campaign | form | New |
view_marketing_campaign_search |
marketing.campaign.search | marketing.campaign | search | New |
view_marketing_campaign_segment_form |
marketing.campaign.segment.form | marketing.campaign.segment | form | New |
view_marketing_campaign_segment_search |
marketing.campaign.segment.search | marketing.campaign.segment | search | New |
view_marketing_campaign_segment_tree |
marketing.campaign.segment.tree | marketing.campaign.segment | tree | New |
view_marketing_campaign_tree |
marketing.campaign.tree | marketing.campaign | tree | New |
view_marketing_campaign_workitem_form |
marketing.campaign.workitem.form | marketing.campaign.workitem | form | New |
view_marketing_campaign_workitem_search |
marketing.campaign.workitem.search | marketing.campaign.workitem | search | New |
view_marketing_campaign_workitem_tree |
marketing.campaign.workitem.tree | marketing.campaign.workitem | tree | New |
view_report_campaign_analysis_graph |
campaign.analysis.graph | campaign.analysis | graph | New |
view_report_campaign_analysis_pivot |
campaign.analysis.pivot | campaign.analysis | pivot | New |
HTTP endpoints (0)
No HTTP endpoints found for this module.
Models touched (8)
New fields (14)
-
activity_idMany2one → marketing.campaign.activityreadonly=True args: 'marketing.campaign.activity', 'Activity' -
campaign_idMany2one → marketing.campaignreadonly=True args: 'marketing.campaign', 'Campaign' -
countIntegerreadonly=True args: '# of Actions' -
country_idMany2one → res.countryrelated='partner_id.country_id'string='Country' args: 'res.country' -
dateDateindex=Truereadonly=True args: 'Execution Date' -
dayCharreadonly=True args: 'Execution Day' -
monthSelectionreadonly=True args: [('01', 'January'), ('02', 'February'), ('03', 'March'), ('04', 'April'), ('05', 'May'), ('06', 'June'), ('07', 'July'), ('08', 'August'), ('09', 'September'), ('10', 'October'), ('11', 'November'), ('12', 'December')], 'Execution Month' -
partner_idMany2one → res.partnerreadonly=True args: 'res.partner', 'Partner' -
res_idIntegerreadonly=True args: 'Resource' -
revenueFloatdigits=0readonly=True args: 'Revenue' -
segment_idMany2one → marketing.campaign.segmentreadonly=True args: 'marketing.campaign.segment', 'Segment' -
stateSelectionreadonly=True args: [('todo', 'To Do'), ('exception', 'Exception'), ('done', 'Done'), ('cancelled', 'Cancelled')], 'Status' -
total_costFloatcompute='_compute_total_cost'string='Cost' -
yearCharreadonly=True args: 'Execution Year'
-
init(self)@api.model_cr
New fields (0)
No new fields.
Public methods (1)-
search(self, args, offset=0, limit=None, order=None, count=False)@api.model
New fields (1)
-
model_idMany2one → ir.modeldefault=<expr> args: 'ir.model'
No public methods.
New fields (10)
-
activity_idsOne2many → marketing.campaign.activityargs: 'marketing.campaign.activity', 'campaign_id', 'Activities' -
fixed_costFloatdigits=dp.get_precision('Product Price')help='Fixed cost for running this campaign. You may also specify variable cost and revenue on each campaign activity. Cost and Revenue statistics are included in Campaign Reporting.' args: 'Fixed Cost' -
modeSelectiondefault='test'help="Test - It creates and process all the activities directly (without waiting for the delay on transitions) but does not send emails or produce reports. \nTest in Realtime - It creates and processes all the activities directly but does not send emails or produce reports.\nWith Manual Confirmation - the campaigns runs normally, but the user has to \n validate all workitem manually.\nNormal - the campaign runs normally and automatically sends all emails and reports (be very careful with this mode, you're live!)"required=True args: [('test', 'Test Directly'), ('test_realtime', 'Test in Realtime'), ('manual', 'With Manual Confirmation'), ('active', 'Normal')], 'Mode' -
nameCharrequired=True args: 'Name' -
object_idMany2one → ir.modelhelp='Choose the resource on which you want this campaign to be run'required=True args: 'ir.model', 'Resource' -
partner_field_idMany2one → ir.model.fieldsdomain="[('model_id', '=', object_id), ('ttype', '=', 'many2one'), ('relation', '=', 'res.partner')]"help='The generated workitems will be linked to the partner related to the record. If the record is the partner itself leave this field empty. This is useful for reporting purposes, via the Campaign Analysis or Campaign Follow-up views.' args: 'ir.model.fields', 'Partner Field' -
segment_idsOne2many → marketing.campaign.segmentreadonly=False args: 'marketing.campaign.segment', 'campaign_id', 'Segments' -
segments_countIntegercompute='_compute_segments_count'string='Segments' -
stateSelectioncopy=Falsedefault='draft' args: [('draft', 'New'), ('running', 'Running'), ('cancelled', 'Cancelled'), ('done', 'Done')], 'Status' -
unique_field_idMany2one → ir.model.fieldsdomain="[('model_id', '=', object_id), ('ttype', 'in', ['char','int','many2one','text','selection'])]"help='If set, this field will help segments that work in "no duplicates" mode to avoid selecting similar records twice. Similar records are records that have the same value for this unique field. For example by choosing the "email_from" field for CRM Leads you would prevent sending the same campaign to the same email address again. If not set, the "no duplicates" segments will only avoid selecting the same record again if it entered the campaign previously. Only easily comparable fields like textfields, integers, selections or single relationships may be used.' args: 'ir.model.fields', 'Unique Field'
-
copy(self, default=None)@api.multi -
state_cancel_set(self)@api.multi -
state_done_set(self)@api.multi -
state_draft_set(self)@api.multi -
state_running_set(self)@api.multi
New fields (15)
-
action_typeSelectiondefault='email'help='The type of action to execute when an item enters this activity, such as:\n- Email: send an email using a predefined email template \n- Report: print an existing Report defined on the resource item and save it into a specific directory \n- Custom Action: execute a predefined action, e.g. to modify the fields of the resource record'oldname='type'required=True args: [('email', 'Email'), ('report', 'Report'), ('action', 'Custom Action')], 'Type' -
campaign_idMany2one → marketing.campaignindex=Trueondelete='cascade'required=True args: 'marketing.campaign', 'Campaign' -
conditionTextdefault='True'help='Python expression to decide whether the activity can be executed, otherwise it will be deleted or cancelled.The expression may use the following [browsable] variables:\n - activity: the campaign activity\n - workitem: the campaign workitem\n - resource: the resource object this campaign item represents\n - transitions: list of campaign transitions outgoing from this activity\n...- re: Python regular expression module'required=True args: 'Condition' -
email_template_idMany2one → mail.templatehelp='The email to send when this activity is activated' args: 'mail.template', 'Email Template' -
from_idsOne2many → marketing.campaign.transitionargs: 'marketing.campaign.transition', 'activity_to_id', 'Previous Activities' -
keep_if_condition_not_metBooleanhelp="By activating this option, workitems that aren't executed because the condition is not met are marked as cancelled instead of being deleted." args: "Don't Delete Workitems" -
nameCharrequired=True args: 'Name' -
object_idMany2onereadonly=Truerelated='campaign_id.object_id'relation='ir.model'string='Object' -
report_idMany2one → ir.actions.report.xmlhelp='The report to generate when this activity is activated' args: 'ir.actions.report.xml', 'Report' -
revenueFloatdigits=0help='Set an expected revenue if you consider that every campaign item that has reached this point has generated a certain revenue. You can get revenue statistics in the Reporting section' args: 'Revenue' -
server_action_idMany2one → ir.actions.serverhelp='The action to perform when this activity is activated'string='Action' args: 'ir.actions.server' -
signalCharhelp='An activity with a signal can be called programmatically. Be careful, the workitem is always created when a signal is sent' args: 'Signal' -
startBooleanhelp='This activity is launched when the campaign starts.'index=True args: 'Start' -
to_idsOne2many → marketing.campaign.transitionargs: 'marketing.campaign.transition', 'activity_from_id', 'Next Activities' -
variable_costFloatdigits=dp.get_precision('Product Price')help='Set a variable cost if you consider that every campaign item that has reached this point has entailed a certain cost. You can get cost statistics in the Reporting section' args: 'Variable Cost'
-
process(self, workitem)@api.multi -
search(self, args, offset=0, limit=None, order=None, count=False)@api.model
New fields (10)
-
campaign_idMany2one → marketing.campaignindex=Trueondelete='cascade'required=True args: 'marketing.campaign', 'Campaign' -
date_doneDatetimehelp='Date this segment was last closed or cancelled.' args: 'End Date' -
date_next_syncDatetimecompute='_compute_date_next_sync'help='Next time the synchronization job is scheduled to run automatically'string='Next Synchronization' -
date_runDatetimehelp='Initial start date of this segment.' args: 'Launch Date' -
ir_filter_idMany2one → ir.filtersdomain=<expr>help='Filter to select the matching resource records that belong to this segment. New filters can be created and saved using the advanced search on the list view of the Resource. If no filter is set, all records are selected without filtering. The synchronization mode may also add a criterion to the filter.'ondelete='restrict' args: 'ir.filters', 'Filter' -
nameCharrequired=True args: 'Name' -
object_idMany2one → ir.modelrelated='campaign_id.object_id'string='Resource' args: 'ir.model' -
stateSelectioncopy=Falsedefault='draft' args: [('draft', 'New'), ('cancelled', 'Cancelled'), ('running', 'Running'), ('done', 'Done')], 'Status' -
sync_last_dateDatetimehelp='Date on which this segment was synchronized last time (automatically or manually)' args: 'Last Synchronization' -
sync_modeSelectiondefault='create_date'help='Determines an additional criterion to add to the filter when selecting new records to inject in the campaign. "No duplicates" prevents selecting records which have already entered the campaign previously.If the campaign has a "unique field" set, "no duplicates" will also prevent selecting records which have the same value for the unique field as other records that already entered the campaign.' args: [('create_date', 'Only records created after last sync'), ('write_date', 'Only records modified after last sync (no duplicates)'), ('all', 'All records (no duplicates)')], 'Synchronization mode'
-
onchange_campaign_id(self)@api.onchange('campaign_id') -
process_segment(self)@api.multi -
state_cancel_set(self)@api.multi -
state_done_set(self)@api.multi -
state_draft_set(self)@api.multi -
state_running_set(self)@api.multi
New fields (6)
-
activity_from_idMany2one → marketing.campaign.activityindex=1ondelete='cascade'required=True args: 'marketing.campaign.activity', 'Previous Activity' -
activity_to_idMany2one → marketing.campaign.activityondelete='cascade'required=True args: 'marketing.campaign.activity', 'Next Activity' -
interval_nbrIntegerdefault=1required=True args: 'Interval Value' -
interval_typeSelectiondefault='days'required=True args: _interval_units, 'Interval Unit' -
nameCharcompute='_compute_name'string='Name' -
triggerSelectiondefault='time'help='How is the destination workitem triggered'required=True args: [('auto', 'Automatic'), ('time', 'Time'), ('cosmetic', 'Cosmetic')], 'Trigger'
No public methods.
New fields (10)
-
activity_idMany2one → marketing.campaign.activityreadonly=Truerequired=True args: 'marketing.campaign.activity', 'Activity' -
campaign_idMany2one → marketing.campaignreadonly=Truerelated='activity_id.campaign_id'store=Truestring='Campaign' args: 'marketing.campaign' -
dateDatetimedefault=Falsehelp='If date is not set, this workitem has to be run manually'readonly=True args: 'Execution Date' -
error_msgTextreadonly=True args: 'Error Message' -
object_idMany2one → ir.modelindex=1readonly=Truerelated='activity_id.campaign_id.object_id'store=Truestring='Resource' args: 'ir.model' -
partner_idMany2one → res.partnerindex=1readonly=True args: 'res.partner', 'Partner' -
res_idIntegerindex=1readonly=True args: 'Resource ID' -
res_nameCharcompute='_compute_res_name'search='_search_res_name'string='Resource Name' -
segment_idMany2one → marketing.campaign.segmentreadonly=True args: 'marketing.campaign.segment', 'Segment' -
stateSelectioncopy=Falsedefault='todo'readonly=True args: [('todo', 'To Do'), ('cancelled', 'Cancelled'), ('exception', 'Exception'), ('done', 'Done')], 'Status'
-
button_cancel(self)@api.multi -
button_draft(self)@api.multi -
preview(self)@api.multi -
process(self)@api.multi -
process_all(self, camp_ids=None)@api.model
Loading…
Loading…
Loading…
Loading…