diff --git a/addons/website_sale/data/demo.xml b/addons/website_sale/data/demo.xml
index 568c0f968b85ca7eeb0976fa29fc3fa0aa56afb7..c55f9e1224bb9c0cb48b918e42fbb9404023d9e2 100644
--- a/addons/website_sale/data/demo.xml
+++ b/addons/website_sale/data/demo.xml
@@ -63,7 +63,6 @@
 
         <record id="product.product_product_6" model="product.product">
             <field name="is_published" eval="True"/>
-            <field name="website_sequence">10010</field>
         </record>
 
         <record id="product.product_product_7" model="product.product">
@@ -183,6 +182,7 @@
             <field name="public_categ_ids" eval="[(6,0,[ref('public_category_cabinets')])]"/>
         </record>
         <record id="product.product_product_11_product_template" model="product.template">
+            <field name="website_sequence">9990</field>
             <field name="public_categ_ids" eval="[(6,0,[ref('public_category_furnitures_chairs')])]"/>
         </record>
         <record id="product.product_product_12_product_template" model="product.template">
diff --git a/addons/website_sale/models/product.py b/addons/website_sale/models/product.py
index fd7430790055cc8febbd617962aee825f9ac39bd..4cfb9878536f860119baac7d752a2cf5619c4d37 100644
--- a/addons/website_sale/models/product.py
+++ b/addons/website_sale/models/product.py
@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
+import logging
 
 from odoo import api, fields, models, tools, _
 from odoo.exceptions import ValidationError, UserError
@@ -7,6 +8,9 @@ from odoo.addons.http_routing.models.ir_http import slug
 from odoo.addons.website.models import ir_http
 from odoo.tools.translate import html_translate
 from odoo.osv import expression
+from psycopg2.extras import execute_values
+
+_logger = logging.getLogger(__name__)
 
 
 class ProductRibbon(models.Model):
@@ -339,6 +343,25 @@ class ProductTemplate(models.Model):
         website = self.website_id or kwargs.get('website')
         return website and website.company_id or res
 
+    def _init_column(self, column_name):
+        # to avoid generating a single default website_sequence when installing the module,
+        # we need to set the default row by row for this column
+        if column_name == "website_sequence":
+            _logger.debug("Table '%s': setting default value of new column %s to unique values for each row", self._table, column_name)
+            self.env.cr.execute("SELECT id FROM %s WHERE website_sequence IS NULL" % self._table)
+            prod_tmpl_ids = self.env.cr.dictfetchall()
+            max_seq = self._default_website_sequence()
+            query = """
+                UPDATE {table}
+                SET website_sequence = p.web_seq
+                FROM (VALUES %s) AS p(p_id, web_seq)
+                WHERE id = p.p_id
+            """.format(table=self._table)
+            values_args = [(prod_tmpl['id'], max_seq + i * 5) for i, prod_tmpl in enumerate(prod_tmpl_ids)]
+            execute_values(self.env.cr._obj, query, values_args)
+        else:
+            super(ProductTemplate, self)._init_column(column_name)
+
     def _default_website_sequence(self):
         ''' We want new product to be the last (highest seq).
         Every product should ideally have an unique sequence.