diff --git a/addons/sale_coupon/models/sale_order.py b/addons/sale_coupon/models/sale_order.py
index a5ff759a92af6023aaa72731b51727bd3f8e362a..e057e3761472ea11756e90dcbdd515a0184eeab7 100644
--- a/addons/sale_coupon/models/sale_order.py
+++ b/addons/sale_coupon/models/sale_order.py
@@ -393,6 +393,10 @@ class SaleOrder(models.Model):
         def update_line(order, lines, values):
             '''Update the lines and return them if they should be deleted'''
             lines_to_remove = self.env['sale.order.line']
+            # move global coupons to the end of the SO
+            if program.discount_apply_on == 'on_order':
+                values['sequence'] = max(order.order_line.mapped('sequence')) + 1
+
             # Check commit 6bb42904a03 for next if/else
             # Remove reward line if price or qty equal to 0
             if values['product_uom_qty'] and values['price_unit']:
diff --git a/addons/sale_coupon/tests/test_sale_invoicing.py b/addons/sale_coupon/tests/test_sale_invoicing.py
index 773df31492092f6b78e1cbed554561c91b653827..03574db275ec60d4e091d0fc8cee67228ff54a32 100644
--- a/addons/sale_coupon/tests/test_sale_invoicing.py
+++ b/addons/sale_coupon/tests/test_sale_invoicing.py
@@ -52,3 +52,38 @@ class TestSaleInvoicing(TestSaleCouponCommon):
         self.assertEqual(order.order_line, invoiceable_lines)
         account_move = order._create_invoices()
         self.assertEqual(len(account_move.invoice_line_ids), 2)
+
+    def test_coupon_on_order_sequence(self):
+        # discount_coupon_program
+        self.env['coupon.program'].create({
+            'name': '10% Discount', # Default behavior
+            'program_type': 'coupon_program',
+            'reward_type': 'discount',
+            'discount_apply_on': 'on_order',
+            'promo_code_usage': 'no_code_needed',
+        })
+        order = self.empty_order
+
+        # orderline1
+        self.env['sale.order.line'].create({
+            'product_id': self.env.ref('product.product_product_6').id,
+            'name': 'largeCabinet',
+            'product_uom_qty': 1.0,
+            'order_id': order.id,
+        })
+
+        order.recompute_coupon_lines()
+        self.assertEqual(len(order.order_line), 2, 'Coupon correctly applied')
+
+        # orderline2
+        self.env['sale.order.line'].create({
+            'product_id': self.env.ref('product.product_product_11').id,
+            'name': 'conferenceChair',
+            'product_uom_qty': 1.0,
+            'order_id': order.id,
+        })
+
+        order.recompute_coupon_lines()
+        self.assertEqual(len(order.order_line), 3, 'Coupon correctly applied')
+
+        self.assertTrue(order.order_line.sorted(lambda x: x.sequence)[-1].is_reward_line, 'Global coupons appear on the last line')