diff --git a/docsource/modules160-170.rst b/docsource/modules160-170.rst
index 6c902f5d5492..55ebba7bef13 100644
--- a/docsource/modules160-170.rst
+++ b/docsource/modules160-170.rst
@@ -138,7 +138,7 @@ Module coverage 16.0 -> 17.0
 +---------------------------------------------------+----------------------+-------------------------------------------------+
 | event_crm_sale                                    |                      |                                                 |
 +---------------------------------------------------+----------------------+-------------------------------------------------+
-| event_sale                                        |                      |                                                 |
+| event_sale                                        | Done                 |                                                 |
 +---------------------------------------------------+----------------------+-------------------------------------------------+
 | event_sms                                         |                      |No DB layout changes.                            |
 +---------------------------------------------------+----------------------+-------------------------------------------------+
diff --git a/openupgrade_scripts/scripts/event_sale/17.0.1.3/pre-migration.py b/openupgrade_scripts/scripts/event_sale/17.0.1.3/pre-migration.py
new file mode 100644
index 000000000000..d9c255cf0338
--- /dev/null
+++ b/openupgrade_scripts/scripts/event_sale/17.0.1.3/pre-migration.py
@@ -0,0 +1,52 @@
+# Copyright 2025 Tecnativa - Pedro M. Baeza
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openupgradelib import openupgrade
+
+
+def _adjust_event_ticket_sequence(env):
+    """As now the order is by sequence, and on v16 it was the price, we have to assign
+    the sequence numbers to preserve the previous order by default. Once in v17, you
+    can redefine the order to your choice if desired.
+    """
+    openupgrade.logged_query(
+        env.cr,
+        """
+        UPDATE event_event_ticket eet
+        SET sequence = sub.row_number
+        FROM (
+            SELECT id, event_id, row_number()
+            OVER (PARTITION BY event_id order by price)
+            FROM event_event_ticket
+        ) as sub
+        WHERE sub.id = eet.id
+        """,
+    )
+
+
+def _prefill_event_registration_sale_status(env):
+    openupgrade.add_columns(
+        env, [(False, "sale_status", "char", "to_pay", "event_registration")]
+    )
+    openupgrade.logged_query(
+        env.cr,
+        """
+        UPDATE event_registration er
+        SET sale_status = 'free'
+        FROM sale_order_line sol
+        WHERE sol.id = er.sale_order_line_id AND sol.price_total = 0
+        """,
+    )
+    openupgrade.logged_query(
+        env.cr,
+        """UPDATE event_registration
+        SET sale_status = 'sold'
+        WHERE is_paid AND sale_status = 'to_pay'
+        """,
+    )
+
+
+@openupgrade.migrate()
+def migrate(env, version):
+    _adjust_event_ticket_sequence(env)
+    _prefill_event_registration_sale_status(env)
diff --git a/openupgrade_scripts/scripts/event_sale/17.0.1.3/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/event_sale/17.0.1.3/upgrade_analysis_work.txt
new file mode 100644
index 000000000000..c781262f2968
--- /dev/null
+++ b/openupgrade_scripts/scripts/event_sale/17.0.1.3/upgrade_analysis_work.txt
@@ -0,0 +1,25 @@
+---Models in module 'event_sale'---
+---Fields in module 'event_sale'---
+event_sale   / event.event.ticket       / _order                        : _order is now 'event_id, sequence, price, name, id' ('event_id, price')
+# DONE: pre-migration: Preserve the previous order on existing tickets assigning the sequence by price
+
+event_sale   / event.event.ticket       / price_incl (float)            : NEW hasdefault: compute
+# NOTHING TO DO: While computing by ORM is not optimal, given the complexity of the computations and the expected number of records, let's keep it this way for now
+
+event_sale   / event.registration       / is_paid (boolean)             : DEL
+event_sale   / event.registration       / sale_status (selection)       : NEW selection_keys: ['free', 'sold', 'to_pay'], isfunction: function, stored
+# DONE: pre-migration: filled sale_status by SQL, using is_paid and SOL price as data source
+
+event_sale   / event.registration       / state (False)                 : NEW mode: modify, hasdefault: compute
+# NOTHING TO DO: existing field in event module being added a compute (which is not the best practice).
+
+event_sale   / product.template         / detailed_type (False)         : selection_keys is now '['combo', 'consu', 'event', 'product', 'service']' ('['consu', 'event', 'product', 'service']')
+# NOTHING TO DO: The detailed_type value already exists
+
+event_sale   / sale.order.line          / registration_ids (one2many)   : NEW relation: event.registration
+# NOTHING TO DO: one2many counterpart over existing m2o field
+
+---XML records in module 'event_sale'---
+NEW ir.ui.view: event_sale.event_registration_view_graph
+DEL ir.ui.view: event_sale.event_report_template_full_page_ticket_inherit_sale
+# NOTHING TO DO: ir noupdate=0 stuff
