diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py
index fdbb1e80a18137fdba00a7d5e335bb49d45556eb..4436ccd00a5456db3a8f206d140d0b18d93b5662 100644
--- a/addons/sale/models/sale.py
+++ b/addons/sale/models/sale.py
@@ -511,13 +511,19 @@ class SaleOrder(models.Model):
         return result
 
     def _compute_field_value(self, field):
+        send_mail = True
+        for record in self:
+            if field.name == 'invoice_status' and record._origin.invoice_status == 'upselling':
+                send_mail = False
+
         super()._compute_field_value(field)
-        if field.name != 'invoice_status' or self.env.context.get('mail_activity_automation_skip'):
+        if field.name != 'invoice_status' or self.env.context.get('mail_activity_automation_skip') or not send_mail:
             return
-
+        
         filtered_self = self.filtered(lambda so: so.user_id and so.invoice_status == 'upselling')
         if not filtered_self:
             return
+    
 
         filtered_self.activity_unlink(['sale.mail_act_sale_upsell'])
         for order in filtered_self:
diff --git a/addons/sale_timesheet/tests/__init__.py b/addons/sale_timesheet/tests/__init__.py
index db81f9e58641ed38de28b01bb6ba8f277966f7b8..e38fc12667a69ea4110b1a591369869a4a7989be 100644
--- a/addons/sale_timesheet/tests/__init__.py
+++ b/addons/sale_timesheet/tests/__init__.py
@@ -10,3 +10,4 @@ from . import test_reinvoice
 from . import test_reporting
 from . import test_project_overview
 from . import test_project_billing_multicompany
+
diff --git a/addons/sale_timesheet/tests/common.py b/addons/sale_timesheet/tests/common.py
index d17db84ad9ba81c0c619bf81d8ffb0ea68d55188..993e9dc2b539315ef8116688850f3344c749c233 100644
--- a/addons/sale_timesheet/tests/common.py
+++ b/addons/sale_timesheet/tests/common.py
@@ -319,3 +319,20 @@ class TestCommonSaleTimesheet(TestSaleCommon):
             'taxes_id': False,
             'property_account_income_id': cls.account_sale.id,
         })
+
+        cls.service_prepaid = cls.env['product.product'].create({
+            'name': "Service delivered, create task in new project",
+            'standard_price': 10,
+            'list_price': 20,
+            'type': 'service',
+            'invoice_policy': 'delivery',
+            'uom_id': uom_hour.id,
+            'uom_po_id': uom_hour.id,
+            'default_code': 'SERV-DELI3',
+            'service_type': 'manual',
+            'service_tracking': 'task_in_project',
+            'project_id': False,  # will create a project
+            'taxes_id': False,
+            'property_account_income_id': cls.account_sale.id,
+            'service_policy': 'ordered_timesheet'
+        })
diff --git a/addons/sale_timesheet/tests/test_sale_service.py b/addons/sale_timesheet/tests/test_sale_service.py
index ca4875593c1e44b24f4e1755eab92a0e60cf680c..a62d869651fa3cbb1b3468083bebe8d4cc30d643 100644
--- a/addons/sale_timesheet/tests/test_sale_service.py
+++ b/addons/sale_timesheet/tests/test_sale_service.py
@@ -596,4 +596,4 @@ class TestSaleService(TestCommonSaleTimesheet):
 
         # copy the task
         task_copy = task.copy()
-        self.assertEqual(task_copy.sale_line_id, task.sale_line_id, "Duplicating task should keep its Sale line")
+        self.assertEqual(task_copy.sale_line_id, task.sale_line_id, "Duplicating task should keep its Sale line")
\ No newline at end of file
diff --git a/addons/sale_timesheet/tests/test_sale_timesheet.py b/addons/sale_timesheet/tests/test_sale_timesheet.py
index cc8ea6102d28e3e8d806f1ee3502e1b16cda1107..636ca4cbaf0982fd2d202b46795adb2036803414 100644
--- a/addons/sale_timesheet/tests/test_sale_timesheet.py
+++ b/addons/sale_timesheet/tests/test_sale_timesheet.py
@@ -671,3 +671,63 @@ class TestSaleTimesheet(TestCommonSaleTimesheet):
         self.assertEqual(self.partner_b, task_so1_timesheet2.partner_id, "The Task's second Timesheet entry should have its partner changed, as it was not invoiced and the Task's partner/customer changed.")
         self.assertEqual(so1_product_global_project_so_line, task_so1_timesheet1.so_line, "The Task's first Timesheet entry should not have changed as it was already invoiced (its so_line should still be equal to the first Sales Order line).")
         self.assertEqual(so2_product_global_project_so_line, task_so1_timesheet2.so_line, "The Task's second Timesheet entry should have it's so_line changed, as the Sales Order Item of the Task changed, and this entry was not invoiced.")
+
+    def test_timesheet_upsell(self):
+        """ Test timesheet upselling and email """
+
+        self.sale_order_with_user = self.env['sale.order'].with_context(mail_notrack=True, mail_create_nolog=True).create({
+            'partner_id': self.partner_a.id,
+            'partner_invoice_id': self.partner_a.id,
+            'partner_shipping_id': self.partner_a.id,
+            'user_id' : self.user_employee_company_B.id
+        })
+        # create SO and confirm it
+        uom_days = self.env.ref('uom.product_uom_day')
+        sale_order_line = self.env['sale.order.line'].create({
+            'order_id': self.sale_order_with_user.id,
+            'name': self.service_prepaid.name,
+            'product_id': self.service_prepaid.id,
+            'product_uom_qty': 1,
+            'product_uom': uom_days.id,
+            'price_unit': self.service_prepaid.list_price,
+        })
+        self.sale_order_with_user.action_confirm()
+        task = self.env['project.task'].search([('sale_line_id', '=', sale_order_line.id)])
+
+        # let's log some timesheets
+        self.env['account.analytic.line'].create({
+            'name': 'Test Line',
+            'project_id': task.project_id.id,
+            'task_id': task.id,
+            'unit_amount': 8,
+            'employee_id': self.employee_manager.id,
+        })
+        
+        self.sale_order_with_user._create_invoices()
+        id_max = self.env['mail.message'].search([], order='id desc', limit=1)
+        if id_max:
+            id_max = id_max[0].id
+        else:
+            id_max = 0
+        self.env['account.analytic.line'].create({
+            'name': 'Test Line',
+            'project_id': task.project_id.id,
+            'task_id': task.id,
+            'unit_amount': 5,
+            'employee_id': self.employee_user.id,
+        })
+
+        self.assertEqual(self.sale_order_with_user.invoice_status, 'upselling', 'Sale Timesheet: "invoice on delivery" timesheets should not modify the invoice_status of the so')
+        message_sent = self.env['mail.message'].search([('id', '>', id_max), ('subject', 'like', 'Upsell')])
+        self.assertEqual(len(message_sent),1,'Sale Timesheet: An email should always be sent to the saleperson when the state of the sale order change to upselling')
+
+        self.env['account.analytic.line'].create({
+            'name': 'Test Line',
+            'project_id': task.project_id.id,
+            'task_id': task.id,
+            'unit_amount': 5,
+            'employee_id': self.employee_user.id,
+        })
+
+        message_sent = self.env['mail.message'].search([('id', '>', id_max), ('subject', 'like', 'Upsell')])
+        self.assertEqual(len(message_sent),1,'Sale Timesheet: An email should only be sent to the saleperson when the state of the sale order change to upselling')
\ No newline at end of file