Project management

# Project management

Odoo Project uses the Kanban project management system. This means all projects are broken down
into tasks, which are categorized on a whiteboard according to what production phase they are in.
The word Kanban comes from Japanese and refers to the âvisual boardâ management method.

## Configuration

Open the Project app and click Create to start a new project. Enter a Name for your project and click Create Project .
You can customize your existing projects from the dashboard by clicking the drop-down toggle
button ( â® ) on your projectâs card .
This enables a new menu divided into four parts:
- View : see an overview of your projectâs components, such as its Tasks , Milestones and Project Updates . Depending on which apps you have
activated, more options may be available, such as Documents . All uploaded files can be
found under this menu, as well as in the Documents app, under Projects ;
View : see an overview of your projectâs components, such as its Tasks , Milestones and Project Updates . Depending on which apps you have
activated, more options may be available, such as Documents . All uploaded files can be
found under this menu, as well as in the Documents app, under Projects ;
- Reporting : analyze your projectâs progress and profitability through graphics and
statistics;
Reporting : analyze your projectâs progress and profitability through graphics and
statistics;
- Color : make a line of color appear on the left side of the card so that your project is more
recognizable;
Color : make a line of color appear on the left side of the card so that your project is more
recognizable;
- Settings : you can change the following: the Name of the project; the Name of the tasks found under that project; the Customer for whom the project is intended; the Tags used for filtering; the Company responsible for the project; the employee designated as Project Manager ; the Planned Date of the project; the total Allocated Hours for that project.
Settings : you can change the following:
- the Name of the project;
the Name of the project;
- the Name of the tasks found under that project;
the Name of the tasks found under that project;
- the Customer for whom the project is intended;
the Customer for whom the project is intended;
- the Tags used for filtering;
the Tags used for filtering;
- the Company responsible for the project;
the Company responsible for the project;
- the employee designated as Project Manager ;
the employee designated as Project Manager ;
- the Planned Date of the project;
the Planned Date of the project;
- the total Allocated Hours for that project.
the total Allocated Hours for that project.
Additionally, you can mark the project as Favorite , allowing you to find it using the My Favorites filter on the Kanban view;
Odoo Tutorials: Customize projects
Further settings are available under the Settings tab. Most of them are only available
depending on the activated apps.

### Visibility and collaboration

Odoo allows you to set visibility settings for each project, enabling you to make your project
available to everyone in your organization or restrict access to certain internal or external users.
To do so, go to the projectâs Settings tab and choose the desired Visibility option:
- Invited internal users (private) : Only users following the project and users with the
Project Administrator access right can
access the project and its tasks.
Invited internal users (private) : Only users following the project and users with the
Project Administrator access right can
access the project and its tasks.
- All internal users : All internal users can access the project and all of its tasks.
All internal users : All internal users can access the project and all of its tasks.
- Invited portal users and all internal users (public) : All internal users can access
the project and all of its tasks. When following a project, portal users only have access to the specific tasks they are following.
This option is selected by default.
Invited portal users and all internal users (public) : All internal users can access
the project and all of its tasks. When following a project, portal users only have access to the specific tasks they are following.
This option is selected by default.

### Inviting external users

To invite external users, make sure that Invited portal users and all internal users
(public) is selected, then click Share Project at the top of the projectâs settings.
The following options are available:
- Copy and share the Public Link displayed at the top of the pop-up window. Anyone with
this link can access the project in read mode.
Copy and share the Public Link displayed at the top of the pop-up window. Anyone with
this link can access the project in read mode.
- Or click Add a line , select a Collaborator , choose the Access Mode , and check the box to send an invitation to their email address. There are three types of Access Mode for collaborators: Read : Collaborators can view tasks but cannot edit them. Edit with limited access : Collaborators can view and edit the tasks they follow. Edit : Collaborators can view and edit all tasks.
Or click Add a line , select a Collaborator , choose the Access Mode , and check the box to send an invitation to their email address.
There are three types of Access Mode for collaborators:
- Read : Collaborators can view tasks but cannot edit them.
Read : Collaborators can view tasks but cannot edit them.
- Edit with limited access : Collaborators can view and edit the tasks they follow.
Edit with limited access : Collaborators can view and edit the tasks they follow.
- Edit : Collaborators can view and edit all tasks.
Edit : Collaborators can view and edit all tasks.
To revoke an invited collaboratorâs access, click Share Project at the top of the
projectâs settings, then click the (trash) icon.
Internal users without access to the project can still access a task if the URL has been shared
with them. For projects set as Invited internal users (private) , they must also
be a follower of the task.

## Scheduling activities

You can schedule activities (ex. Call , Meeting , etc.) per project by
clicking on the clock icon on a project. Doing so opens a list with already scheduled activities
and allows planning new activities by clicking + Schedule an activity . On the pop-up
window, select the Activity Type , enter a Summary for that activity, a Due Date , and assign it to an employee. According to the Activity Type , you
may have additional options available.
If an activity is already scheduled, the icon may change to a phone , group of people ,
or other.

## Top bar

In project management, reviewing the various records and documents related to a project is often
necessary. Odoo Projectâs top bar provides quick access to these essential resources. You can
customize each projectâs top bar to match its specific needs.
To set up the top bar for a project, go to the Project app, click the projectâs card,
then click the top bar (sliders) button. In the bar that appears
above the search bar, click the (sliders) button to select the records
you want to display, such as timesheets, sales orders, invoices, documents, dashboards, etc.
You can then click the buttons to access the related records without leaving the Project app. To
return to your project tasksâ Kanban view, click the Tasks button in the top bar.

### Custom top bar buttons

You can also create your own buttons to access more specific views:
- Click an existing top bar button to access the view.
Click an existing top bar button to access the view.
- Customize the view with keywords, filters, and grouping options using the search bar.
Customize the view with keywords, filters, and grouping options using the search bar.
- Click the (sliders) button in the top bar and select Save View .
Click the (sliders) button in the top bar and select Save View .
- Edit the default button name if necessary, then enable Shared if you want to share
the button with other users.
Edit the default button name if necessary, then enable Shared if you want to share
the button with other users.

Configuration
Visibility and collaboration
Inviting external users
Scheduling activities
Top bar
Custom top bar buttons


Project dashboard

# Project dashboard

The project dashboard allows you to get a comprehensive overview of your projectâs status. It
displays information such as the total number of tasks, timesheets, and planned hours linked to the
project, as well as detailed information about project milestones and its costs and revenues. Within
the project dashboard, you can create Project updates , which allow you to take a
snapshot of the projectâs status at a certain point in time. As such, it is a crucial tool for
effective project management and ensuring that your project stays on track.

## Using the project dashboard

To access the project dashboard, open the Project app and navigate to the applicable project.
Click the ( sliders ) icon to add Dashboard to the
projectâs top bar .
You can also access the project dashboard by hovering over the desired projectâs card, clicking
the ( vertical ellipsis ), and selecting Dashboard .
The left side of the dashboard displays a list of existing project updates ,
and the right side provides detailed information about records linked to the project , as well as milestones , profitability , and budgets .
The information displayed on the project dashboard varies depending on the applications installed
on your database. For example, you will not see information about Timesheets , Planning ,
or Purchase Orders if the corresponding applications are not installed.

### Totals smart buttons

The following smart buttons are displayed on the top right of the project dashboard:
- Tasks : the number of completed (i.e., Done or Canceled tasks ) and all tasks, in format
completed/all, as well as the entire projectâs completion percentage estimation.
Tasks : the number of completed (i.e., Done or Canceled tasks ) and all tasks, in format
completed/all, as well as the entire projectâs completion percentage estimation.
- Timesheets : the number of hours or days (depending on the Timesheets app
configuration) allocated in the projectâs settings . This includes all timesheets , whether or not they have been validated.
Timesheets : the number of hours or days (depending on the Timesheets app
configuration) allocated in the projectâs settings . This includes all timesheets , whether or not they have been validated.
- Planned : the number of hours that have been planned for shifts in the Planning app. This includes all planned shifts , including past
shifts and shifts that have not yet been published.
Planned : the number of hours that have been planned for shifts in the Planning app. This includes all planned shifts , including past
shifts and shifts that have not yet been published.
- Documents : number of documents in the
projectâs workspace.
Documents : number of documents in the
projectâs workspace.
- Burndown Chart : click the smart button to access a report on the status of the projectâs tasks over time.
Burndown Chart : click the smart button to access a report on the status of the projectâs tasks over time.
- Timesheets and Planning : click the smart button to access a report on the projectâs timesheets and shifts. This allows you to easily compare planned and effective
hours of work on the project.
Timesheets and Planning : click the smart button to access a report on the projectâs timesheets and shifts. This allows you to easily compare planned and effective
hours of work on the project.
- Additional fields , such as Sales Orders , Sales Order Items , Purchase Orders , and more, represent the number of records linked to the project.
Additional fields , such as Sales Orders , Sales Order Items , Purchase Orders , and more, represent the number of records linked to the project.
Use the project dashboard smart buttons to update the project records easily. Click Timesheets to validate timesheets, Planned to create project planning, Documents to view and validate documents, etc.

### Milestones

This section is only visible if milestones have been enabled in the Projectâs app settings. Click Add Milestone to create a new
milestone. Click a milestone in the checklist to edit it, enable its checkbox to mark it as
completed, or click the ( trash ) icon to remove it.
The milestones are displayed in red if theyâre past their deadline, or in green if they are ready to
be marked as reached (i.e. tasks linked to the milestone that have been marked with done or canceled status ).

### Profitability

The profitability dashboard provides a breakdown of project costs and revenues, which are impacted by all records linked to the
project and its Analytic account .
The profitability report is only displayed for billable projects.

### Budgets

If a budget has been set for the project, its status and related details are displayed in this
section. Click Add Budget to create a new budget for the project.
Budgets must be enabled in your
databaseâs Accounting application in order for this section to be displayed.

## Project updates

Project updates allow you to take a snapshot of the projectâs overall status at a given point in
time, for example, during a periodic (weekly, bi-weekly, or monthly) review. This allows you to
compare specific data points, note any aspects of the project that need improvement, and estimate
if the project is on or off track.
To create a new project update, go to the project dashboard, click New , and fill in the
following fields:
- Status : Choose between On Track , At Risk , Off
Track , On Hold , and Done . Once the status is set, a color-coded dot is
displayed on the projectâs Kanban card, allowing the project manager to easily identify which
projects need attention.
Status : Choose between On Track , At Risk , Off
Track , On Hold , and Done . Once the status is set, a color-coded dot is
displayed on the projectâs Kanban card, allowing the project manager to easily identify which
projects need attention.
- Progress : Manually input the completion percentage based on the projectâs progress.
Progress : Manually input the completion percentage based on the projectâs progress.
- Date and Author : These fields are automatically filled in with
appropriate information based on the user who created the update and the current date.
Date and Author : These fields are automatically filled in with
appropriate information based on the user who created the update and the current date.
- Description : Use this rich-text field to gather notes. Depending on the project
configuration (e.g., if the project is billable), this field may be pre-filled with current
information on aspects such as profitability, budget, milestones, etc.
Description : Use this rich-text field to gather notes. Depending on the project
configuration (e.g., if the project is billable), this field may be pre-filled with current
information on aspects such as profitability, budget, milestones, etc.

Using the project dashboard
Totals smart buttons
Milestones
Profitability
Budgets
Project updates


Project profitability

# Project profitability

When handling billable projects, it is essential to determine whether your projects are turning a
profit. Measuring project profitability involves keeping track of the costs of resources used to
carry out the project, such as employee costs, materials used, purchases, expenses, or after-sales
services, and comparing them with the project revenues.
Project profitability is tracked in the project dashboard on all billable
projects.
To access the project dashboard , open the Project app and navigate to
the applicable project. Click the ( sliders ) icon to add Dashboard to the projectâs top bar .
You can also access the project dashboard by hovering over the desired
projectâs card, clicking the ( vertical ellipsis ), and selecting Dashboard .
The profitability dashboard is on the right side of the project dashboard and displays data for
all records linked to the project and its analytic account . Itâs
divided into two major sections: revenues , which
displays a breakdown of income generated by the project, and costs accrued by your company. The same record can be
displayed in both sections, e.g., the same timesheet is listed under Revenues with the
amount the customer paid for the work and under Costs with the amount of wages paid to
the employees.
The amounts displayed in the profitability report are divided into three columns:
- Expected : the amounts expected based on existing sales or purchase orders.
Expected : the amounts expected based on existing sales or purchase orders.
- To invoice (revenues) or To bill (costs): the amounts are moved to this
column when the work or goods have been delivered, e.g., a timesheet has been created and/or validated, a
delivery order has been marked as done, or the delivered quantity has been manually updated on
the sales order.
To invoice (revenues) or To bill (costs): the amounts are moved to this
column when the work or goods have been delivered, e.g., a timesheet has been created and/or validated, a
delivery order has been marked as done, or the delivered quantity has been manually updated on
the sales order.
- Invoiced or Billed : the amounts are moved to this column once an invoice
or bill has been confirmed.
Invoiced or Billed : the amounts are moved to this column once an invoice
or bill has been confirmed.
Based on the same principle, the revenues section is further divided into Sold , Delivered , and Invoiced columns. Use the ( arrow ) icon to see a detailed breakdown for each line.
Use the projectâs top bar to easily access and edit
records linked to the projectâs profitability from the projectâs Kanban view.
In order for a record to be displayed on the profitability dashboard, it must be linked to the
project and its analytic account .
The following records can be displayed in the profitability dashboard.

## Revenues

- Timesheets : revenues from timesheets ,
broken down according to the Invoicing Policy selected on the product form (e.g., Prepaid/Fixed Price , Based on Timesheets , Based on Milestones ).
Timesheets : revenues from timesheets ,
broken down according to the Invoicing Policy selected on the product form (e.g., Prepaid/Fixed Price , Based on Timesheets , Based on Milestones ).
- Materials : total of sales prices of products sold via sales orders linked to the
project.
Materials : total of sales prices of products sold via sales orders linked to the
project.
- Customer invoices : a total of invoices linked to the project.
Customer invoices : a total of invoices linked to the project.
- Subscriptions : a total of sales prices of subscriptions linked to the project.
Subscriptions : a total of sales prices of subscriptions linked to the project.
- Down payments : a total of down payments linked to the project.
Down payments : a total of down payments linked to the project.
- Expenses : any expenses that have been
reinvoiced to the customer.
Expenses : any expenses that have been
reinvoiced to the customer.

## Costs

- Timesheets : total cost of time tracked by employees via timesheets , based on the employeeâs HR settings .
Timesheets : total cost of time tracked by employees via timesheets , based on the employeeâs HR settings .
- Purchase Orders : total cost of purchase orders linked to the
project. Those could cover goods, materials, or even subcontracted services. This entry only
appears once the vendor bill is posted.
Purchase Orders : total cost of purchase orders linked to the
project. Those could cover goods, materials, or even subcontracted services. This entry only
appears once the vendor bill is posted.
- Materials : total cost of products included in stock moves (deliveries and
receipts) that have been validated for the project. This section is only displayed if Analytic Costs have been enabled in Inventory â£ Configuration â£ Operations Types for applicable operations. This
ensures that the productâs cost is tracked during the stock move.
Materials : total cost of products included in stock moves (deliveries and
receipts) that have been validated for the project. This section is only displayed if Analytic Costs have been enabled in Inventory â£ Configuration â£ Operations Types for applicable operations. This
ensures that the productâs cost is tracked during the stock move.
- Expenses : total costs of expenses linked to
the project that have been submitted and approved.
Expenses : total costs of expenses linked to
the project that have been submitted and approved.
- Vendor bills : total costs of vendor bills linked to the
projectâs analytic account.
Vendor bills : total costs of vendor bills linked to the
projectâs analytic account.
- Manufacturing orders : total costs of manufacturing orders linked to the projectâs
analytic account.
Manufacturing orders : total costs of manufacturing orders linked to the projectâs
analytic account.
- Other costs : any other costs linked to the projectâs analytic account.
Other costs : any other costs linked to the projectâs analytic account.


Recurring tasks

# Recurring tasks

When handling a project, the same task often needs to be performed several times: for example,
weekly meetings or status reports. The recurring tasks feature allows you to automate the
creation of those tasks.
Odoo Tutorials: Recurring tasks

## Configuration

To enable recurring tasks, go to Project â£ Configuration â£ Settings , then
activate Recurring Tasks , and press Save .

### Set up task recurrence

In an existing task, click the ( Recurrent ) button next to the Deadline field. Then, configure the Repeat Every field according to your
needs.
A new task in recurrence will be created once the status of the previous task is set to Done or Canceled .
The new task is created on the project dashboard with the following configuration:
- Stage : is set to the first stage of the project dashboard ( New or
equivalent);
Stage : is set to the first stage of the project dashboard ( New or
equivalent);
- Name , Description , Project , Assignees , Customer , Tags : are copied from the original task;
Name , Description , Project , Assignees , Customer , Tags : are copied from the original task;
- Deadline : is updated based on the Repeat Every field (e.g., if the task is
set to repeat once a week, 7 days will be added to the deadline);
Deadline : is updated based on the Repeat Every field (e.g., if the task is
set to repeat once a week, 7 days will be added to the deadline);
- Milestones , Timesheets , Chatter , Activities , Subtasks : are not copied from the original task.
Milestones , Timesheets , Chatter , Activities , Subtasks : are not copied from the original task.
Once a recurrence is configured, a smart button on the task displays the total number of
existing recurrences.

### Edit or stop task recurrence

To edit the recurrence, open the last task in recurrence. Any changes made on the task will be
applied to the tasks that will be created in the future.
To stop the recurrence, open the last task in recurrence and press the Recurrent button next to the Planned date .

Configuration
Set up task recurrence
Edit or stop task recurrence


Sub-tasks

# Sub-tasks

When handling project tasks, you can often benefit from splitting the workload into smaller sub-tasks , making it easier to track progress and manage the work.
Odooâs sub-task feature is particularly useful in some of the following cases:
- The task workload is too big to handle in one record.
The task workload is too big to handle in one record.
- Thereâs a clear sequence of steps to follow.
Thereâs a clear sequence of steps to follow.
- Some parts of the workload fall under the scope of different projects and/or assignees.
Some parts of the workload fall under the scope of different projects and/or assignees.
The original task to which sub-tasks are linked is referred to as the parent task . The sub-tasks
of the parent task are known as child tasks .

## Creating sub-tasks

To create a sub-task:
- Open the Project app, then go into your desired project.
Open the Project app, then go into your desired project.
- Click the task where you want to add the sub-task, then click the Sub-tasks tab.
Click the task where you want to add the sub-task, then click the Sub-tasks tab.
- Click Add a line , then fill in the Title .
Click Add a line , then fill in the Title .
- Click the ( save ) icon to save the task manually.
Click the ( save ) icon to save the task manually.
You can edit several fields of a sub-task directly from the parent taskâs sub-task tab without
opening the individual sub-task. By default, those are: Title , Priority , Status , and Assignees . Use the ( sliders )
icon to add or remove fields.
Once the new sub-task is created, the following changes occur in the parent task:
- A smart button displays the total number of sub-tasks, as well as the number of closed
( done or canceled ) sub-tasks. Click the smart button to access the list of the sub-tasks.
A smart button displays the total number of sub-tasks, as well as the number of closed
( done or canceled ) sub-tasks. Click the smart button to access the list of the sub-tasks.
- The Allocated time displays the amount of time allocated to the parent task, as well
as time allocated to the sub-tasks. This can be used to ensure that the time allocated to
sub-tasks does not exceed time allocated to the parent task.
The Allocated time displays the amount of time allocated to the parent task, as well
as time allocated to the sub-tasks. This can be used to ensure that the time allocated to
sub-tasks does not exceed time allocated to the parent task.
- The Timesheets tab includes a breakdown of time spent on the parent task as well as
sub-tasks.
The Timesheets tab includes a breakdown of time spent on the parent task as well as
sub-tasks.
Click View to open the sub-task you created. The sub-task form is identical to the task form .
- A smart button allows to navigate back to the Parent task .
A smart button allows to navigate back to the Parent task .
- The Sub-tasks tab allows for further creation of sub-tasks.
The Sub-tasks tab allows for further creation of sub-tasks.
- Selecting a Project will trigger this sub-task to be displayed in the Kanban view of
the selected project.
Selecting a Project will trigger this sub-task to be displayed in the Kanban view of
the selected project.


Task creation

# Task creation

Tasks in Odoo Project can be created manually or automatically, including from emails or website
forms.

## Manual task creation

Open the Project app and choose the desired project. Create a new task by doing one of the
following:
- Clicking the ( plus ) button in the upper left corner. This creates
a new task in the first stage of your Kanban view.
Clicking the ( plus ) button in the upper left corner. This creates
a new task in the first stage of your Kanban view.
- Pressing the ( plus ) button next to the Kanban stage name. This
creates a new task in this Kanban stage.
Pressing the ( plus ) button next to the Kanban stage name. This
creates a new task in this Kanban stage.
Fill in the Task Title and add one or more Assignees , then click Add .

### Task configuration

Click the task to open it. The task form includes the following fields that you can fill in:
- Task Title : title of the task.
Task Title : title of the task.
- ( Star ): click the ( star ) icon to mark
the task as high priority. The icon will turn yellow. Click it again to remove the high priority.
( Star ): click the ( star ) icon to mark
the task as high priority. The icon will turn yellow. Click it again to remove the high priority.
- Project : the project that this task belongs to.
Project : the project that this task belongs to.
- Assignees : the person(s) in charge of handling the work on this task.
Assignees : the person(s) in charge of handling the work on this task.
- Tags : custom labels allowing to categorize and filter your tasks.
Tags : custom labels allowing to categorize and filter your tasks.
- Customer : the person or company that will be billed for this task. This field only
appears in tasks that belong to billable projects.
Customer : the person or company that will be billed for this task. This field only
appears in tasks that belong to billable projects.
- Sales Order Item : this can be either the sales order that was used to create this
task, or a sales order that was linked to this task manually. This field only appears in tasks
linked to billable projects.
Sales Order Item : this can be either the sales order that was used to create this
task, or a sales order that was linked to this task manually. This field only appears in tasks
linked to billable projects.
- Allocated Time : the amount of time that the work on this task is expected to last,
tracked by timesheets.
Allocated Time : the amount of time that the work on this task is expected to last,
tracked by timesheets.
- Deadline : the expected end date of the task. Once this field is filled in, you can
also add a start date to designate the entire time frame of the tasksâ duration.
Deadline : the expected end date of the task. Once this field is filled in, you can
also add a start date to designate the entire time frame of the tasksâ duration.
- You can also create new tasks by switching to the list or Gantt view and clicking New .
You can also create new tasks by switching to the list or Gantt view and clicking New .
- The following fields can also be edited directly from the Kanban view without opening the
individual task: ( priority ), Allocated hours , Assignees , and task status . You can also color code or Set a
Cover image to your task by clicking the ( vertical ellipsis ).
The following fields can also be edited directly from the Kanban view without opening the
individual task: ( priority ), Allocated hours , Assignees , and task status . You can also color code or Set a
Cover image to your task by clicking the ( vertical ellipsis ).
- You can use the following keyboard shortcuts in the task title to configure new tasks (modify
the values in the examples below according to your needs): 30h : to allocate 30 hours to the task. #tags : to add tags to the task. @user : to assign the task to a user. ! : to star the task as high priority. Along with using the correct format, follow this order: the taskâs name, followed by the
allocated time, the tags, the assignee, and then the priority. For example, if you want to create a task named âPrepare workshopâ, allocate 5h hours to it,
add the âSchoolâ tag, assign it to Audrey and set its priority to High , enter the
following task title: Prepare workshop 5h #school @Audrey !
You can use the following keyboard shortcuts in the task title to configure new tasks (modify
the values in the examples below according to your needs):
- 30h : to allocate 30 hours to the task.
30h : to allocate 30 hours to the task.
- #tags : to add tags to the task.
#tags : to add tags to the task.
- @user : to assign the task to a user.
@user : to assign the task to a user.
- ! : to star the task as high priority.
! : to star the task as high priority.
Along with using the correct format, follow this order: the taskâs name, followed by the
allocated time, the tags, the assignee, and then the priority.
For example, if you want to create a task named âPrepare workshopâ, allocate 5h hours to it,
add the âSchoolâ tag, assign it to Audrey and set its priority to High , enter the
following task title: Prepare workshop 5h #school @Audrey !

## Creating tasks from an email alias

This feature allows for project tasks to be automatically created once an email is delivered to a
designated email address.
To configure it, open the Project app, then click the ( vertical
ellipsis ) icon next to the desired projectâs name. Select Settings , then open the Settings tab.
Fill in the Create tasks by sending an email to field as follows:
- Section of the alias before the @ symbol : type the name of the email alias, e.g. contact , help , jobs .
Section of the alias before the @ symbol : type the name of the email alias, e.g. contact , help , jobs .
`contact`
`help`
`jobs`
- Domain : in most cases, this is filled in by default with your domain .
Domain : in most cases, this is filled in by default with your domain .
- Accept Emails From : refine the senders whose emails will create tasks in the project.
Accept Emails From : refine the senders whose emails will create tasks in the project.
Once configured, the email alias can be seen under the name of your project on the Kanban dashboard.
When an email is sent to the alias, the email is automatically converted into a project task. The
following rules apply:
- The email sender is displayed in the Customer field.
The email sender is displayed in the Customer field.
- The email subject is displayed in the Task Title field.
The email subject is displayed in the Task Title field.
- The email body is displayed in the Description field.
The email body is displayed in the Description field.
- The whole content of the email is additionally displayed in the chatter .
The whole content of the email is additionally displayed in the chatter .
- All the recipients of the email (To/Cc/Bcc) that are Odoo users are automatically added as followers of the task.
All the recipients of the email (To/Cc/Bcc) that are Odoo users are automatically added as followers of the task.

## Creating tasks from a website form

If you have the Website app installed in your database, you can configure any form on your
website to trigger the creation of tasks in a project.
- Go to the website page where you wish to add the form and add the Form building block .
Go to the website page where you wish to add the form and add the Form building block .
- In the website editor, edit the following fields: Action : select Create a Task . Project : choose the project that you want the new tasks to be created in.
In the website editor, edit the following fields:
- Action : select Create a Task .
Action : select Create a Task .
- Project : choose the project that you want the new tasks to be created in.
Project : choose the project that you want the new tasks to be created in.
- Customize the form .
When the form is submitted, it automatically creates a project task. The taskâs content is defined
by the formâs corresponding fields.

Manual task creation
Task configuration
Creating tasks from an email alias
Creating tasks from a website form


Task dependencies

# Task dependencies

Odoo Project allows you to break down projects into tasks and establish relationships between those
tasks to determine the order in which they are executed. Task dependencies ensure that certain tasks
begin only after the preceding tasks are completed.
To enable task dependencies in projects, go to Project â£ Configuration â£
Settings , enable Task Dependencies , and click Save .

## Set task dependencies

Task dependencies can be created from the task form or the projectâs Gantt view by linking the
successor task (i.e., the task blocked by other tasks) to its predecessor task(s) (i.e., the tasks
blocking the successor task).
To create task dependencies from the task form, access the desired task and, in the Blocked by tab, click Add a line . Click View to access the
predecessor task. To access the successor tasks from the predecessor task, click the Blocked Tasks smart button.
To create a task dependency from the Gantt view, hover your mouse over the predecessor task, then
click one of the dots that appear around it. Drag and drop the dot onto the successor task. An arrow
appears, indicating the dependency from the predecessor task to the successor.
Odoo automatically manages task progress based on their dependency. Successor tasks are assigned the Waiting status and cannot be moved to In Progress until their predecessor
task(s) are marked as Approved , Cancelled , or Done .

## Remove dependencies

To remove a task dependency, proceed as follows:
- From the task form, go to the Blocked by tab and click the ( times ) button.
From the task form, go to the Blocked by tab and click the ( times ) button.
- From the Gantt view, click the red ( times ) button that appears at the
center of the arrow when you hover your mouse over it.
From the Gantt view, click the red ( times ) button that appears at the
center of the arrow when you hover your mouse over it.

Set task dependencies
Remove dependencies


Task stages and statuses

# Task stages and statuses

## Task stages

Task stages are displayed as columns in the projectâs Kanban view, and allow you to update the
progress of its tasks with a drag-and-drop. In most projects, the stages will be akin to New , In progress , Backlog , etc.
By default, task stages are project-specific but can be shared across multiple projects that follow
the same workflow.

### Creating task stages

Odoo Project doesnât provide default stages but instead allows you to create custom stages tailored
to your specific business needs. You are prompted to do so immediately after creating a new
project .
To create a stage, type its name into the Stageâ¦ field, then click Add .
Click See examples to find ideas for stage names applicable to your line of business.

### Editing task stages

To edit the task stage, click the ( cog ) icon next to its name. From
there, click one of the following:
- Fold : to hide the task stage and all of the tasks in this stage from the Kanban view.
Fold : to hide the task stage and all of the tasks in this stage from the Kanban view.
- Edit : Name : to change the name of the stage. SMS/Email Template : to automatically send an email or SMS notification to the
customer when a task reaches this stage. Folded in Kanban : to hide the task stage and all of the tasks in this stage from
the Kanban view. Projects : to share this task stage between several projects. Automations : to create custom rules that trigger automatic actions (e.g., creating activities, adding followers, or sending
webhook notifications). Note that this will activate Studio in your database, which may impact
your pricing plan.
- Name : to change the name of the stage.
Name : to change the name of the stage.
- SMS/Email Template : to automatically send an email or SMS notification to the
customer when a task reaches this stage.
SMS/Email Template : to automatically send an email or SMS notification to the
customer when a task reaches this stage.
- Folded in Kanban : to hide the task stage and all of the tasks in this stage from
the Kanban view.
Folded in Kanban : to hide the task stage and all of the tasks in this stage from
the Kanban view.
- Projects : to share this task stage between several projects.
Projects : to share this task stage between several projects.
- Automations : to create custom rules that trigger automatic actions (e.g., creating activities, adding followers, or sending
webhook notifications). Note that this will activate Studio in your database, which may impact
your pricing plan.
Automations : to create custom rules that trigger automatic actions (e.g., creating activities, adding followers, or sending
webhook notifications). Note that this will activate Studio in your database, which may impact
your pricing plan.
- Delete : to delete this stage.
Delete : to delete this stage.
- Archive/Unarchive all : to archive or unarchive all of the tasks in this stage.
Archive/Unarchive all : to archive or unarchive all of the tasks in this stage.

## Task statuses

Task statuses are used to track the status of tasks within the Kanban stage, as well as to close the
task when itâs done or canceled. Unlike Kanban stages, they cannot be customized; five task statuses
exist in Odoo and are used as follows:
- In Progress : this is the default state of all tasks, meaning that work required for
the task to move to the next Kanban stage is ongoing.
In Progress : this is the default state of all tasks, meaning that work required for
the task to move to the next Kanban stage is ongoing.
- Changes Requested : to highlight that changes, either requested by the customer or
internally, are needed before the task is moved to the next Kanban stage.
Changes Requested : to highlight that changes, either requested by the customer or
internally, are needed before the task is moved to the next Kanban stage.
- Approved : to highlight that the task is ready to be moved to the next stage.
Approved : to highlight that the task is ready to be moved to the next stage.
- Canceled : to cancel the task.
Canceled : to cancel the task.
- Done : to close the task once itâs been completed.
Done : to close the task once itâs been completed.
- The Changes Requested and Approved task statuses are cleared as soon as
the task is moved to another Kanban stage. The task status reverts to the default In
Progress status so that Changes Requested or Approved status can be
applied again once the necessary work has been completed in this Kanban stage.
The Changes Requested and Approved task statuses are cleared as soon as
the task is moved to another Kanban stage. The task status reverts to the default In
Progress status so that Changes Requested or Approved status can be
applied again once the necessary work has been completed in this Kanban stage.
- The Done and Canceled statuses are independent from the Kanban stage.
Once a task is marked as Done or Canceled , it is closed. If needed, it
can be reopened by changing its status.
The Done and Canceled statuses are independent from the Kanban stage.
Once a task is marked as Done or Canceled , it is closed. If needed, it
can be reopened by changing its status.

Task stages
Creating task stages
Editing task stages
Task statuses


Timesheet billing rates and leaderboard

# Timesheet billing rates and leaderboard

Odooâs Timesheets app allows you to set personalized billing rate targets for employees. In addition to billing rate targets, a leaderboard can be enabled to motivate employees and gamify their experience. The leaderboard displays the
billable and total time logged by employees, and can be enhanced with motivational tips .

## Billing rate indicators

### Configuration

To enable billing rate indicators, navigate to Timesheets â£ Configuration â£
Settings , then enable Billing Rate Indicators , and click Save .
To set up the targets, click Set employee billable time targets , access the employee
form that you wish to edit, navigate to the Settings tab, then encode the monthly Billing Time Target in hours or days, depending on the Encoding Method selected in the Timesheets Settings .
Once the Billing Rate Indicators have been enabled, you can also set the employeesâ Monthly Billing Time Target directly from the Employees app.

### Using the billing rate indicators

Once enabled, the billing rate indicators are displayed in the upper right corner of the My Timesheets menu in Kanban, grid, and list views for all users. The monthly amount of
time logged by the user is displayed in the following format: logged billable time / billable time
target . The percentage of completion of the billing rate target is also displayed, highlighted in
red if the user falls below the target and in green once the target is reached.
Below the billing rate indicators, the total monthly amount of time logged by the user is also
displayed.

## Billing rate leaderboard

### Configuration

After the monthly billing time targets have been enabled,
Odoo offers the possibility of activating a billing rate leaderboard in order to motivate
employees and enhance workplace transparency.
To enable the billing rate leaderboard, navigate to Timesheets â£ Configuration â£
Settings , activate Billing Rate Leaderboard , then click Save .

### Using the billing rate leaderboard

The billing rate leaderboard is then displayed in the upper right corner of the My Timesheets view, next to the billing rate indicators. It displays the current top
three performers who have logged the highest percentage of their allocated billing hours.
It also shows the amount of time logged by the signed-in user in the format: logged billable
time / billable time target, as well as the total time logged.
Clicking on the area of the top three performers opens the leaderboard for all team members. Use the
drop-down menu in the upper left corner to switch between the Billing Rate Leaderboard and the Total Time Leaderboard , which displays the total time logged by team members
across billable and internal projects.

## Leaderboard tips

Daily motivational tips , displayed on the right side of the leaderboard, enhance the billing
rate and total time leaderboard. The tips are randomly selected and change daily.
To create or edit existing tips, navigate to Timesheets â£ Configuration â£ Tips ,
then click New or double-click a tipâs text.

Billing rate indicators
Configuration
Using the billing rate indicators
Billing rate leaderboard
Configuration
Using the billing rate leaderboard
Leaderboard tips


Time off entries

# Time off entries

Odoo automatically generates timesheet entries on projects and tasks once a time off request is
approved. This streamlines timesheet validation by ensuring approved time off is accurately
reflected in timesheets.

## Configuration

First, activate the developer mode , then open the Timesheets app, and
navigate to Configuration â£ Settings . Scroll to the Time Off section
and enable the Time Off checkbox. Enabling this option creates timesheet entries for
validated time off requests and public holidays.
Once enabled, two fields appear: Project and Task . The default selection
for Project is Internal , and the default selection for Task is Time Off . These inform Odoo where to log the time off requests, which project, and task.
These can be modified, if desired, using the drop-down menu.
The available options presented vary based on the installed applications.
Time off categories without validation requirements create timesheet records instantly. Requests
requiring validation creates timesheet entries after the time off request is approved.
To check if a time off type requires approval, check the Approvals section of the time off type form .

## Workflow

Once the employee has requested time off , and the
request has been validated, if necessary, the time is automatically logged on the Timesheets app, under the respective project and task.
To view the logged entry, open the Timesheets app and navigate to the relevant time period. The
time off appears in the corresponding field, according to the configuration .
To view the timesheet entry details, click the (magnifying glass) icon
that appears when hovering over the entry, and the detailed timesheet information appears.
An employee is attending internal training the week of December 15-19, 2025, and logs their time
in the Timesheets app under the Internal project, with a task of Training . On December
19, 2025, the employee is home sick, and requests the day off in the Time Off app.
`Internal`
`Training`
The time off type they request is Sick Time off , which is configured to not require
validation. The employeeâs time off request is automatically approved, and is logged in the Timesheets app, under the Internal project, and the Time Off task.
`Internal`
`TimeOff`


Studio

# Studio

Odoo Studio is a toolbox used to customize Odoo without coding knowledge. For example, in any
app, add or modify:
- Fields
- Models
- Automation rules
- Webhooks
- PDF reports
- Approval rules
- Security rules
Learn how to build an app from scratch .
To access Studio , navigate to the app and model you want to modify, then click the ( Toggle Studio ) icon. Alternatively, with any app open, click the ( Toggle Studio ) icon and navigate to the relevant app and model.
To close Studio , click Close in the upper-right corner.
Installing Studio in an Odoo database on the Standard pricing plan automatically triggers
an upsell to the Custom pricing plan.
- For yearly or multi-year contracts : An upsell order is created with a 30-day limit.
For yearly or multi-year contracts : An upsell order is created with a 30-day limit.
- For monthly contracts : The subscription automatically switches to the Custom plan and
the new rate is applied when the next bill is generated.
For monthly contracts : The subscription automatically switches to the Custom plan and
the new rate is applied when the next bill is generated.
For more information, refer to Odooâs pricing page or
contact your account manager.
Odoo Tutorials: Studio


Approval rules

# Approval rules

Approval rules are used to automate approval processes for actions. They allow you to define
the criteria for when an approval is required before an action can be performed using a button.

## Configuration

To add approval rules with Studio, proceed as follows:
- Open Studio and switch to the required view .
Open Studio and switch to the required view .
- Select the button to which the rule should be applied.
Select the button to which the rule should be applied.
- Click Add an approval step in the Properties tab.
Click Add an approval step in the Properties tab.
- Specify which users are responsible for approving the action by using one of the following fields
or both: Approvers to specify one or several users; Approver Group to specify one user group. Note An activity is created for all users set as Approvers when their approval is
requested.
Specify which users are responsible for approving the action by using one of the following fields
or both:
- Approvers to specify one or several users;
Approvers to specify one or several users;
- Approver Group to specify one user group. Note An activity is created for all users set as Approvers when their approval is
requested.
Approver Group to specify one user group.
An activity is created for all users set as Approvers when their approval is
requested.
- ( optional ) Select the Users to Notify via an internal note when the action is
approved or rejected.
( optional ) Select the Users to Notify via an internal note when the action is
approved or rejected.
- ( optional ) Add a Description to be displayed on the button.
( optional ) Add a Description to be displayed on the button.
You can specify under which condition(s) an approval step should be applied by clicking the ( filter ) icon next to the Approvers field.
To add another approval step, click Add an approval step . When there are
multiple steps, you can:
- Enable Exclusive Approval on any step so that a user who approves a step cannot
approve another step for the same record.
Enable Exclusive Approval on any step so that a user who approves a step cannot
approve another step for the same record.
- Change the Approval Order of the steps by selecting a number, 1 being the first
step, 2 the second step, and so on. A user responsible for a higher step can approve/reject
previous step(s) unless Exclusive Approval is selected.
Change the Approval Order of the steps by selecting a number, 1 being the first
step, 2 the second step, and so on. A user responsible for a higher step can approve/reject
previous step(s) unless Exclusive Approval is selected.
`1`
`2`
Click the ( trash ) icon next to the Approvers field to
remove an approval step.
You can create user groups specifically for approvals.

## Use

Once an approval rule has been defined for a button, a user avatar icon is displayed next to the
buttonâs label for each approval step. Clicking an icon reveals the step(s).
If an unauthorized user clicks the button, an error message is displayed and an activity is
created for the users specified in the Approvers field, if any.
Authorized users can:
- Perform the action directly by clicking the button if it is the last/only approval step.
Perform the action directly by clicking the button if it is the last/only approval step.
- Approve the action and let another user perform it - or move it to the next approval step - by
clicking the user avatar icon next to the buttonâs label, then clicking the ( approve ).
Approve the action and let another user perform it - or move it to the next approval step - by
clicking the user avatar icon next to the buttonâs label, then clicking the ( approve ).
- Reject the action by clicking the user avatar icon next to the buttonâs label and then the ( reject ) button.
Reject the action by clicking the user avatar icon next to the buttonâs label and then the ( reject ) button.
- (only for users selected under the Approvers field) Delegate their approval rights to
one or several users for all records by: Clicking the ( kanban view ) icon and then Delegate . Selecting one or several Approvers , Until when they will have approval
rights (forever if left empty), and, optionally, the user(s) who should be notified via an
internal note using the Notify to field.
(only for users selected under the Approvers field) Delegate their approval rights to
one or several users for all records by:
- Clicking the ( kanban view ) icon and then Delegate .
Clicking the ( kanban view ) icon and then Delegate .
- Selecting one or several Approvers , Until when they will have approval
rights (forever if left empty), and, optionally, the user(s) who should be notified via an
internal note using the Notify to field.
Selecting one or several Approvers , Until when they will have approval
rights (forever if left empty), and, optionally, the user(s) who should be notified via an
internal note using the Notify to field.
- A user who approves/rejects an action can revoke their decision by clicking the user avatar icon next to the buttonâs label and then the ( revoke ) button. They
can also revoke the decision of other users for steps with a lower Approval Order unless Exclusive Approval is enabled.
A user who approves/rejects an action can revoke their decision by clicking the user avatar icon next to the buttonâs label and then the ( revoke ) button. They
can also revoke the decision of other users for steps with a lower Approval Order unless Exclusive Approval is enabled.
- Approvals are tracked in the recordâs chatter. An approval entry is also created every time
a Studio approval-related action is performed. To access approval entries, activate the
developer mode and go to Settings â£
Technical â£ Studio Approval Entries .
Approvals are tracked in the recordâs chatter. An approval entry is also created every time
a Studio approval-related action is performed. To access approval entries, activate the
developer mode and go to Settings â£
Technical â£ Studio Approval Entries .


Automation rules

# Automation rules

Automation rules allow the execution of one or more predefined actions in response to a specific
trigger, e.g., create an activity when a field is set to a specific value, or archive a record 7
days after its last update.
When creating an automation rule, domain filters allow you to add conditions that must be met for the automation rule to run, e.g., the opportunity
must be assigned to a specific salesperson, or the state of the record must not be Draft .
To create an automation rule with Odoo Studio , proceed as follows:
- Open Studio and click Automations , then New .
Open Studio and click Automations , then New .
- Give the automation rule a clear, meaningful name that identifies its purpose.
Give the automation rule a clear, meaningful name that identifies its purpose.
- Select the trigger and, if necessary, fill in the
fields that appear on the screen based on the chosen trigger.
Select the trigger and, if necessary, fill in the
fields that appear on the screen based on the chosen trigger.
- Click Add an action , then select the Type of action and fill in the fields that appear on the screen
based on your selected action.
Click Add an action , then select the Type of action and fill in the fields that appear on the screen
based on your selected action.
- Click Save & Close or Save & New .
Click Save & Close or Save & New .
To ensure follow-up on less satisfied clients, this automation rule creates an activity 3 months
after a sales order is created for clients with a satisfaction percentage lower than 30%.
- Use the Notes tab to document the purpose and functioning of automation rules. This
makes rules easier to maintain and facilitates collaboration between users.
Use the Notes tab to document the purpose and functioning of automation rules. This
makes rules easier to maintain and facilitates collaboration between users.
- To modify the model targeted by the automation rule, switch models
before clicking Automations in Studio, or activate developer mode , create or edit an automation rule, and select the Model in the Automation Rules form.
To modify the model targeted by the automation rule, switch models
before clicking Automations in Studio, or activate developer mode , create or edit an automation rule, and select the Model in the Automation Rules form.
- Automation rules can be created from any kanban stage by clicking the (Settings) icon that appears when hovering over the kanban stage name, then
selecting Automations . In this case, the Trigger is set to Stage is set to by default, but it can be changed if necessary.
Automation rules can be created from any kanban stage by clicking the (Settings) icon that appears when hovering over the kanban stage name, then
selecting Automations . In this case, the Trigger is set to Stage is set to by default, but it can be changed if necessary.

## Trigger

The Trigger is used to define what kind of event needs to occur for the automation rule
to run. The available triggers depend on the model . Five trigger
categories are available overall:
- Values Updated
- Email Events
- Timing Conditions
- Custom
- External

### Adding conditions

Domain filters allow you to determine the records an automation rule should target or exclude.
Efficient filtering enhances overall performance as it avoids unnecessary processing on records that
are not impacted by the rule.
Activate developer mode before creating an automation rule to have the
most flexibility in adding domain filters.
Depending on the trigger chosen, it is possible to define one or more conditions a record must meet before and/or after a trigger occurs.
- The Before Update Domain defines the conditions a record must meet before the
trigger event occurs, e.g., the record must have Type = Customer Invoice and Status = Posted . With developer mode activated , click Edit Domain , if
available, then New Rule .
The Before Update Domain defines the conditions a record must meet before the
trigger event occurs, e.g., the record must have Type = Customer Invoice and Status = Posted .
`Type=CustomerInvoice`
`Status=Posted`
With developer mode activated , click Edit Domain , if
available, then New Rule .
- Extra Conditions , or in some cases Apply on filters, define the conditions
a record must meet after the trigger event occurs, e.g., the customer invoice must have Payment Status = Partially Paid . With developer mode activated if needed, click Add conditions or Edit Domain , as relevant, then New Rule .
Extra Conditions , or in some cases Apply on filters, define the conditions
a record must meet after the trigger event occurs, e.g., the customer invoice must have Payment Status = Partially Paid .
`PaymentStatus=PartiallyPaid`
With developer mode activated if needed, click Add conditions or Edit Domain , as relevant, then New Rule .
When a trigger occurs, e.g., the payment status of a
posted customer invoice is updated, the automation rule checks the defined conditions and only
executes the action if the record matches those conditions.
If the automated action should be executed when an email address is set for the first time (in
contrast to modifying an email address) on an existing contact that is an individual rather than
a company, use Email is not set and Is a Company is not set as the Before Update
Domain and Email is set as the Apply on domain.
`Emailisnotset`
`IsaCompanyisnotset`
`Emailisset`
The Before Update Domain is not checked upon the creation of a record.

### Values Updated

Trigger automated actions when specific changes happen in the database. The triggers available in
this category depend on the model and are based on common changes, such as adding a specific tag
(e.g., to a task) or setting a fieldâs value (e.g., setting the User field).
Select the trigger, then select a value if required.

### Email Events

Trigger automated actions upon receiving or sending emails.

### Timing Conditions

Trigger automated actions at a point in time relative to a date field or to the creation or update
of a record. The following triggers are available:
- Based on date field : The action is triggered a defined period of time before or after
the date of the selected date field.
Based on date field : The action is triggered a defined period of time before or after
the date of the selected date field.
- After creation : The action is triggered a defined period of time after a record is
created and saved.
After creation : The action is triggered a defined period of time after a record is
created and saved.
- After last update : The action is triggered a defined period of time after an existing
record is edited and saved.
After last update : The action is triggered a defined period of time after an existing
record is edited and saved.
- a Delay : Specify the number of minutes, hours, days, or months. To have an action
executed before the trigger date, specify a negative number. If you selected the Based
on date field trigger, you must also select the date field to be used to determine the delay. Note By default, the scheduler checks for time-triggered automation rules every 240 minutes, or 4
hours. This frequency is generally sufficient for delays such as 3 months after the order date
or 7 days after the last update. For delays of less than the equivalent of 2400 minutes, or 40 hours, the system recalculates
the frequency of this check to ensure that more granular delays, e.g., 1 hour before the event
start date and time, or 30 minutes after creation, can be respected as closely as possible. An on-screen message indicates the possible delay after the scheduled triggering of the rule. To view or manually edit the frequency of the scheduler, with developer mode activated , go to Settings â£ Technical â£ Scheduled Actions to see
all scheduled actions for your database. Enter Automation in the search bar, then, in the list of results, click Automation
Rules: check and execute . If desired, update the value of the Execute Every field.
Click Run Manually at any time to manually trigger this scheduled action.
a Delay : Specify the number of minutes, hours, days, or months. To have an action
executed before the trigger date, specify a negative number. If you selected the Based
on date field trigger, you must also select the date field to be used to determine the delay.
By default, the scheduler checks for time-triggered automation rules every 240 minutes, or 4
hours. This frequency is generally sufficient for delays such as 3 months after the order date
or 7 days after the last update.
For delays of less than the equivalent of 2400 minutes, or 40 hours, the system recalculates
the frequency of this check to ensure that more granular delays, e.g., 1 hour before the event
start date and time, or 30 minutes after creation, can be respected as closely as possible.
An on-screen message indicates the possible delay after the scheduled triggering of the rule.
To view or manually edit the frequency of the scheduler, with developer mode activated , go to Settings â£ Technical â£ Scheduled Actions to see
all scheduled actions for your database.
Enter Automation in the search bar, then, in the list of results, click Automation
Rules: check and execute . If desired, update the value of the Execute Every field.
Click Run Manually at any time to manually trigger this scheduled action.
`Automation`
- Extra Conditions : Click Add condition , then specify the conditions to be
met for the automation rule to run. Click New Rule to add another condition.
Extra Conditions : Click Add condition , then specify the conditions to be
met for the automation rule to run. Click New Rule to add another condition.
The action is executed when the delay is reached and the conditions are met.
To send a reminder email 30 minutes before the start of a calendar event, select Start (Calendar Event) as the date field for the Trigger and set the Delay to -30 Minutes .
`-30`

### Custom

Trigger automated actions:
- On save : when a record is saved.
On save : when a record is saved.
- On deletion : when a record is deleted.
On deletion : when a record is deleted.
- On UI change : when a fieldâs value is changed on the Form view , even before the record is saved.
On UI change : when a fieldâs value is changed on the Form view , even before the record is saved.
For the On save and On UI change triggers, you must then select the
field(s) to be used to trigger the automation rule in the When updating field.
If no field is selected in the When updating field, the automated action may be
executed multiple times per record.
Optionally, you can also define additional conditions to be met to trigger the automation rule in
the Apply on field.
To trigger an automated action upon the creation of a record, e.g., when a new contact is
created, select the On save trigger and use ID is not set as the Before Update Domain and ID is set as the Apply on domain. Make sure the correct field is selected in the When
updating field.
`IDisnotset`
`IDisset`
When a new contact is saved, it is automatically assigned a database ID, thereby triggering the
automation rule.
The On UI change trigger can only be used with the Execute Code action and only works when a modification is made
manually. The action is not executed if the field is changed through another automation rule.

### External

Trigger automated actions based on a specific event in an external system or application using a webhook .
After the webhook is configured in Odoo, where the webhookâs URL is generated and the target record
defined, it needs to be implemented in the external system.
It is highly recommended to consult with a developer, solution architect, or another technical
role when deciding to use webhooks and throughout the implementation process. If not properly
configured, webhooks may disrupt the Odoo database and can take time to revert.
It is also possible to set up an automated action that sends data to a external systemâs
webhook when an event occurs in your Odoo database.
Webhook documentation

## Actions

Once you have defined the automation ruleâs trigger , click Add an action in the Actions To Do tab to define the action to be executed.
You can define multiple actions for the same automation rule. By default, actions are executed in
the order in which they were defined.
This means, for example, that if you define an Update record action and then a Send email action where the email references the field that was updated, the email
uses the updated values. However, if the Send email action is defined before the Update record action, the email uses the values set before the record is updated.
To change the order of defined actions, click the (drag handle) icon beside an action and drag it to the desired position.

### Update Record

This action updates one of the recordâs (related) fields. Click the Update field and, in
the list that opens, select or search for the field to be updated. If needed, click the (right arrow) next to the field name to access the list of
related fields.
If you selected a many2many field , choose whether
the field must be updated by Adding , Removing , or Setting it to the selected value or by Clearing it .
If you want the automated action to remove a tag from the customer record, set the Update field to Customer > Tags , select by Removing , then
select the tag.
Alternatively, you can also set a recordâs field dynamically using Python code. To do so, select Compute instead of Update , then enter the code to be used for computing
the fieldâs value. For example, if you want the automation rule to compute a custom datetime field when a taskâs priority is set to High (by starring the task), you can define the trigger Priority is set to to High and define the Update Record action as follows:
`High`
`High`

### Create Activity

This action is used to schedule a new activity linked to the record. Select an Activity
Type , enter a Title and description, then specify when you want the activity to be
scheduled in the Due Date In field, and select a User type :
- To always assign the activity to the same user, select Specific User , then add the
user in the Responsible field;
To always assign the activity to the same user, select Specific User , then add the
user in the Responsible field;
- To target a user linked to the record dynamically, select Dynamic User (based on
record) and change the User Field if necessary.
To target a user linked to the record dynamically, select Dynamic User (based on
record) and change the User Field if necessary.
After a lead is turned into an opportunity, you want the automated action to set up a call for
the user responsible for the lead. To do so, set the Activity Type to Call and the User Type to Dynamic User (based on record) .

### Send Email and Send SMS

These actions are used to send an email or a text message to a contact linked to a specific record.
To do so, select or create an Email Template or an SMS Template , then, in
the Send Email As or Send SMS As field, choose how you want to send the
email or text message:
- Email : to send the message as an email to the recipients of the Email
Template .
Email : to send the message as an email to the recipients of the Email
Template .
- Message : to post the message on the record and notify the recordâs followers.
Message : to post the message on the record and notify the recordâs followers.
- Note : to send the message as an internal note visible to internal users in the
chatter.
Note : to send the message as an internal note visible to internal users in the
chatter.
- SMS (without note) : to send the message as a text message to the recipients of the SMS template .
SMS (without note) : to send the message as a text message to the recipients of the SMS template .
- SMS (with note) : to send the message as a text message to the recipients of the SMS template and post it as an internal note in the chatter.
SMS (with note) : to send the message as a text message to the recipients of the SMS template and post it as an internal note in the chatter.
- Note only : to only post the message as an internal note in the chatter.
Note only : to only post the message as an internal note in the chatter.

### Send WhatsApp

To automate the sending of WhatsApp messages, one or more WhatsApp templates must be created.
This action is used to send a WhatsApp message to a contact linked to a specific record.
To do so, select the appropriate WhatsApp Template from the dropdown menu.

### Add Followers and Remove Followers

This action is used to subscribe/unsubscribe existing contacts to/from the record.

### Create Record

This action is used to create a new record on any model.
Select the required model in the Record to Create field; it contains the current model
by default. Specify a Name for the record, and then, if you want to create the record on
another model, select a field in the Link Field field to link the record that
triggered the creation of the new record.
The dropdown list related to the Link Field field only contains one2many fields existing on the current model that are linked to a many2one field on the target model.
You can create another automation rule with Update Record actions to update the fields of the new record if necessary. For example, you can use a Create Record action to create a new project task and then assign it to a specific
user using an Update Record action.

### Execute Code

For automation rules that require the execution of custom code , note that maintenance of custom code is not
included in the Standard or Custom pricing plans and incurs additional fees .
This action is used to execute Python code. You can write your code into the Code tab
using the following variables:
- env : environment on which the action is triggered
env : environment on which the action is triggered
`env`
- model : model of the record on which the action is triggered; is a void recordset
model : model of the record on which the action is triggered; is a void recordset
`model`
- record : record on which the action is triggered; may be void
record : record on which the action is triggered; may be void
`record`
- records : recordset of all records on which the action is triggered in multi-mode; this may be
left empty
records : recordset of all records on which the action is triggered in multi-mode; this may be
left empty
`records`
- time , datetime , dateutil , timezone : useful Python libraries
time , datetime , dateutil , timezone : useful Python libraries
`time`
`datetime`
`dateutil`
`timezone`
- float_compare : utility function to compare floats based on specific precision
float_compare : utility function to compare floats based on specific precision
`float_compare`
- log(message, level='info') : logging function to record debug information in ir.logging
table
log(message, level='info') : logging function to record debug information in ir.logging
table
`log(message,level='info')`
- _logger.info(message) : logger to emit messages in server logs
_logger.info(message) : logger to emit messages in server logs
`_logger.info(message)`
- UserError : exception class for raising user-facing warning messages
UserError : exception class for raising user-facing warning messages
`UserError`
- Command : x2many commands namespace
Command : x2many commands namespace
`Command`
- action = {...} : to return an action
action = {...} : to return an action
`action={...}`
The available variables are described both in the Code and Help tabs.
Odooâs ORM capabilities

### Send Webhook Notification

This action is used to send a POST API request with the values of the selected Fields to the webhook URL specified in the URL field.
`POST`
The Sample Payload provides a preview of the data included in the request using a random
recordâs data or dummy data if no record is available.
It is also possible to set up an automated action that uses a webhook to receive data from
an external system when a predefined event occurs in that system.

### Execute Existing Actions

The action is used to trigger multiple actions (linked to the current model) at the same time. To do
so, click on Add a line , then, in the Add: Child Actions pop-up, select an
existing action or click New to create a new one.

Trigger
Adding conditions
Values Updated
Email Events
Timing Conditions
Custom
External
Actions
Update Record
Create Activity
Send Email and Send SMS
Send WhatsApp
Add Followers and Remove Followers
Create Record
Execute Code
Send Webhook Notification
Execute Existing Actions


Webhooks

# Webhooks

It is highly recommended to consult with a developer, solution architect, or another technical
role when deciding to use webhooks and throughout the implementation process. If not properly
configured, webhooks may disrupt the Odoo database and can take time to revert.
Webhooks, which can be created in Odoo Studio , allow you to automate an action in your Odoo
database when a specific event occurs in another, external system.
In practice, this works as follows: when the event occurs in the external system, a data file (the
âpayloadâ) is sent to the Odoo webhookâs URL via a POST API request, and a predefined action is
performed in your Odoo database.
`POST`
Unlike scheduled actions, which run at predefined intervals, or manual API requests, which need to
be explicitly invoked, webhooks enable real-time, event-driven communication and automation. For
example, you can set up a webhook to have your Odoo inventory data updated automatically when a
sales order is confirmed in an external point-of-sale system.
Setting up a webhook in Odoo requires no coding when connecting two Odoo databases, but testing a webhook requires an external tool. Custom target records or actions may require programming
skills.
This article covers creating a webhook that receives data from an external source. However,
it is also possible to create an automated action that sends data to an external webhook when a change occurs in your Odoo database.

## Create a webhook in Odoo

Before implementing a webhook in a live database, configure and test it using a duplicate
database to ensure the webhook performs as intended.
Activating developer mode before creating up a webhook gives greater
flexibility in selecting the model the automation rule
targets. It also allows you to find the technical name of the model and fields, which may be
needed to configure the payload.
To find a modelâs technical name, with developer mode activated, hover over the model name and
then click (Internal link) . The technical name can be found in
the Model field. For example, a sales order webhook uses the Sales
Order model, but the technical name sale.order is used in the payload.
`sale.order`
To create a webhook in Studio , proceed as follows:
- Open Studio and click Webhooks , then New .
Open Studio and click Webhooks , then New .
- Give the webhook a clear, meaningful name that identifies its purpose.
Give the webhook a clear, meaningful name that identifies its purpose.
- If needed, and provided developer mode is activated, select the appropriate Model from the dropdown. If developer mode is not activated, the automation rule targets the current
model by default.
If needed, and provided developer mode is activated, select the appropriate Model from the dropdown. If developer mode is not activated, the automation rule targets the current
model by default.
- The webhookâs URL is automatically generated, but can be changed if needed by clicking Rotate Secret . This is the URL that should be used when implementing the webhook in
the external system that will send updates to the database. Warning The URL is confidential and should be treated with care. Sharing it online or without
caution can provide unintended access to the Odoo database. If the URL is updated after the
initial implementation, make sure to update it in the external system.
The webhookâs URL is automatically generated, but can be changed if needed by clicking Rotate Secret . This is the URL that should be used when implementing the webhook in
the external system that will send updates to the database.
The URL is confidential and should be treated with care. Sharing it online or without
caution can provide unintended access to the Odoo database. If the URL is updated after the
initial implementation, make sure to update it in the external system.
- If desired, enable Log Calls to track the history of API requests made to the
webhookâs URL, e.g., for troubleshooting purposes.
If desired, enable Log Calls to track the history of API requests made to the
webhookâs URL, e.g., for troubleshooting purposes.
- If the system sending the webhook is not Odoo, adjust the Target Record code to look
for the JSON record included in the payload when the API request is made to the webhookâs URL. If
the system sending the webhook is an Odoo database, ensure that the id and model appear in
the payload. If the webhook is used to create records in the Odoo database, use model.browse(i) or model.search(i) instead of the default Target Record format.
If the system sending the webhook is not Odoo, adjust the Target Record code to look
for the JSON record included in the payload when the API request is made to the webhookâs URL. If
the system sending the webhook is an Odoo database, ensure that the id and model appear in
the payload.
`id`
`model`
If the webhook is used to create records in the Odoo database, use model.browse(i) or model.search(i) instead of the default Target Record format.
`model.browse(i)`
`model.search(i)`
- Click Add an action in the Actions To Do tab to define the actions to be executed.
Click Add an action in the Actions To Do tab to define the actions to be executed.
- Before implementing the webhook in the external system, test it to ensure it works as intended.
Before implementing the webhook in the external system, test it to ensure it works as intended.
- Webhooks can also be created via the Automations menu in Studio by selecting
the trigger On webhook .
Webhooks can also be created via the Automations menu in Studio by selecting
the trigger On webhook .
- To access the history of API requests if Log Calls has been enabled, click the Logs smart button at the top of the Automation rules form.
To access the history of API requests if Log Calls has been enabled, click the Logs smart button at the top of the Automation rules form.
- If the purpose of the webhook is anything other than to update an existing record, e.g., to
create a new record, the Execute Code action must be chosen.
If the purpose of the webhook is anything other than to update an existing record, e.g., to
create a new record, the Execute Code action must be chosen.

## Test a webhook

Testing a webhook requires a test payload and an external tool or system, like Postman , to send the payload via a POST API request. This section
presents the steps to test a webhook in Postman.
`POST`
- See the webhook use cases section for step-by-step
explanations of how to test webhooks using test payloads.
See the webhook use cases section for step-by-step
explanations of how to test webhooks using test payloads.
- To get specific help with testing a webhook with Postman, contact their support team.
To get specific help with testing a webhook with Postman, contact their support team.
- In Postman, create a new HTTP request and set its method to POST .
In Postman, create a new HTTP request and set its method to POST .
- Copy the webhookâs URL from your Odoo database using the (link) icon
and paste it into the URL field in Postman.
Copy the webhookâs URL from your Odoo database using the (link) icon
and paste it into the URL field in Postman.
- Click the Body tab and select raw .
Click the Body tab and select raw .
- Set the file type to JSON , then copy the code from the test payload and paste it into
the code editor.
Set the file type to JSON , then copy the code from the test payload and paste it into
the code editor.
- Click Send .
In the Response viewer at the bottom of the screen in Postman, details, including a HTTP
response code, indicate whether or not the webhook is functioning correctly.
- A 200 OK or status: ok message indicates that the webhook is functioning properly on Odooâs
side. From here, implementation can begin with the other system to automatically send the API
requests to the Odoo webhookâs URL.
A 200 OK or status: ok message indicates that the webhook is functioning properly on Odooâs
side. From here, implementation can begin with the other system to automatically send the API
requests to the Odoo webhookâs URL.
`200OK`
`status:ok`
- If any other response is returned, the number associated with it helps to identify the problem.
For example, a 500 Internal Server Error message means that Odoo could not interpret the call
properly. In this case, ensure the fields found in the JSON file are properly mapped in the
webhookâs configuration and in the system sending the test call.
If any other response is returned, the number associated with it helps to identify the problem.
For example, a 500 Internal Server Error message means that Odoo could not interpret the call
properly. In this case, ensure the fields found in the JSON file are properly mapped in the
webhookâs configuration and in the system sending the test call.
`500InternalServerError`
Turning on call logging in the webhookâs configuration in Odoo provides error logs if the webhook
is not functioning as intended.

## Implement a webhook in an external system

When the webhook has been successfully created in Odoo and tested, implement it in the system that
sends data to the Odoo database, making sure the POST API requests are sent to the webhookâs URL.
`POST`

## Webhook use cases

Below are two examples of how to use webhooks in Odoo. A test payload is provided for each example,
and can be found in the section on testing the webhook. Postman is
used to send the test payload.

### Update a sales orderâs currency

This webhook updates a sales order in the Sales app to USD when the external system sends a POST API request to the webhookâs URL that includes that sales order number (which is identified
by the payloadâs id record).
`USD`
`POST`
`id`
This could be useful for subsidiaries outside the United States with a mother company located inside
the United States or during mergers when consolidating data into one Odoo database.

#### Create the webhook

To create this webhook, proceed as follows:
- Open the Sales app, then open Studio and click Webhooks .
The Sales Order model is selected by default.
Open the Sales app, then open Studio and click Webhooks .
The Sales Order model is selected by default.
- Click New . The Trigger is set to On webhook by default.
Click New . The Trigger is set to On webhook by default.
- Set the Target Record to model.env[payload.get('model')].browse(int(payload.get('id'))) , where: payload.get('model') retrieves the value associated with the model key in the payload,
i.e., sale.order , which is the technical name of the Sales Order model. payload.get('id') retrieves the value associated with the id key in the payload, i.e.,
the number of the target sales order in your Odoo database with the S and leading
zeros removed. int converts the retrieved id to an integer (i.e., a whole number) because the method browse() can only be used with an integer.
Set the Target Record to model.env[payload.get('model')].browse(int(payload.get('id'))) , where:
`model.env[payload.get('model')].browse(int(payload.get('id')))`
- payload.get('model') retrieves the value associated with the model key in the payload,
i.e., sale.order , which is the technical name of the Sales Order model.
payload.get('model') retrieves the value associated with the model key in the payload,
i.e., sale.order , which is the technical name of the Sales Order model.
`payload.get('model')`
`model`
`sale.order`
- payload.get('id') retrieves the value associated with the id key in the payload, i.e.,
the number of the target sales order in your Odoo database with the S and leading
zeros removed.
payload.get('id') retrieves the value associated with the id key in the payload, i.e.,
the number of the target sales order in your Odoo database with the S and leading
zeros removed.
`payload.get('id')`
`id`
`S`
- int converts the retrieved id to an integer (i.e., a whole number) because the method browse() can only be used with an integer.
int converts the retrieved id to an integer (i.e., a whole number) because the method browse() can only be used with an integer.
`int`
`browse()`
- Click Add an action .
Click Add an action .
- In the Type section, click Update Record .
In the Type section, click Update Record .
- In the Action details section, select Update , choose the field Currency , and select USD .
In the Action details section, select Update , choose the field Currency , and select USD .
- Click Save & Close .

#### Test the webhook

To test this webhook, proceed as follows:
- With Postman open, create a new HTTP request and set its method to POST .
With Postman open, create a new HTTP request and set its method to POST .
- Copy the URL of the Odoo webhook using the (link) icon and paste it
into the URL field in Postman.
Copy the URL of the Odoo webhook using the (link) icon and paste it
into the URL field in Postman.
- Click the Body tab and select raw .
Click the Body tab and select raw .
- Set the file type to JSON , then copy this code, i.e., the payload, and paste it into
the code editor: { "model" : "sale.order" , "id" : "SALES ORDER NUMBER" }
Set the file type to JSON , then copy this code, i.e., the payload, and paste it into
the code editor:
- In your Odoo database, choose a sales order to test the webhook on. In the pasted code, replace SALES ORDER NUMBER with the sales orderâs number without the S or any zeros before the
number. For example, a sales order with the number S00007 should be entered as 7 in Postman.
In your Odoo database, choose a sales order to test the webhook on. In the pasted code, replace SALES ORDER NUMBER with the sales orderâs number without the S or any zeros before the
number. For example, a sales order with the number S00007 should be entered as 7 in Postman.
`SALESORDERNUMBER`
`S`
`S00007`
`7`
- Click Send .
- Consult the Response viewer in Postman to
determine whether or not the webhook is functioning properly. If a message other than 200 OK or status: ok is returned, the number associated with the message helps to identify the problem.
Consult the Response viewer in Postman to
determine whether or not the webhook is functioning properly. If a message other than 200 OK or status: ok is returned, the number associated with the message helps to identify the problem.
`200OK`
`status:ok`

### Create a new contact

This webhook uses custom code to create a new contact in an Odoo database when the external system
sends a POST API request to the webhookâs URL that includes the contactâs information. This could
be helpful for automatically creating new vendors or customers.
`POST`

#### Create the webhook

To create this webhook, proceed as follows:
- Open the Contacts app, then open Studio and click Webhooks .
The Contact model is selected by default.
Open the Contacts app, then open Studio and click Webhooks .
The Contact model is selected by default.
- Click New . The Trigger is set to On webhook by default.
Click New . The Trigger is set to On webhook by default.
- Set the Target Record to model.browse([2]) . This is essentially a placeholder as
the code in the automated action tells the webhook what needs to be retrieved from the payload
and in which model the record needs to be created.
Set the Target Record to model.browse([2]) . This is essentially a placeholder as
the code in the automated action tells the webhook what needs to be retrieved from the payload
and in which model the record needs to be created.
`model.browse([2])`
- Click Add an action .
Click Add an action .
- In the Type section, click Execute Code .
In the Type section, click Execute Code .
- Copy this code and paste it into the code editor in the Code tab of the Action details section: # variables to retrieve and hold data from the payload contact_name = payload . get ( 'name' ) contact_email = payload . get ( 'email' ) contact_phone = payload . get ( 'phone' ) # a Python function to turn the variables into a contact in Odoo if contact_name and contact_email : new_partner = env [ 'res.partner' ] . create ({ 'name' : contact_name , 'email' : contact_email , 'phone' : contact_phone , 'company_type' : 'person' , 'customer_rank' : 1 , }) # an error message for missing required data in the payload else : raise ValueError ( "Missing required fields: 'name' and 'email'" )
Copy this code and paste it into the code editor in the Code tab of the Action details section:
- Click Save & Close .

#### Test the webhook

To test this webhook, proceed as follows:
- In Postman , create a new HTTP request and set its method to POST .
In Postman , create a new HTTP request and set its method to POST .
- Copy the URL of the Odoo webhook using the (link) icon and paste it
into the URL field in Postman.
Copy the URL of the Odoo webhook using the (link) icon and paste it
into the URL field in Postman.
- Click the Body tab and select raw .
Click the Body tab and select raw .
- Set the file type to JSON , then copy this code, i.e., the payload, and paste it into
the code editor: { "name" : "CONTACT NAME" , "email" : "CONTACTEMAIL@EMAIL.COM" , "phone" : "CONTACT PHONE NUMBER" }
Set the file type to JSON , then copy this code, i.e., the payload, and paste it into
the code editor:
- In the pasted code, replace the CONTACT NAME , CONTACTEMAIL@EMAIL.COM , and CONTACT PHONE NUMBER with a new contactâs information.
In the pasted code, replace the CONTACT NAME , CONTACTEMAIL@EMAIL.COM , and CONTACT PHONE NUMBER with a new contactâs information.
`CONTACTNAME`
`CONTACTEMAIL@EMAIL.COM`
`CONTACTPHONENUMBER`
- Click Send .
- Consult the Response viewer in Postman to
determine whether or not the webhook is functioning properly. If a message other than 200 OK or status: ok is returned, the number associated with the message helps to identify the problem.
Consult the Response viewer in Postman to
determine whether or not the webhook is functioning properly. If a message other than 200 OK or status: ok is returned, the number associated with the message helps to identify the problem.
`200OK`
`status:ok`