diff --git a/src/backoffice/views/assemblies.py b/src/backoffice/views/assemblies.py
index 04f3360b4156a35c6cbc94a92db2ff7f72f5b46c..d5c894fbc64d1872d30c00d28867687532ad1b68 100644
--- a/src/backoffice/views/assemblies.py
+++ b/src/backoffice/views/assemblies.py
@@ -260,10 +260,10 @@ class EditAssemblyView(AssemblyMixin, UpdateView):
             changes[fld] = change
 
         # auto-advance assembly/channel states from 'planned' to 'registered' on (first) save
-        if assembly.state_assembly == Assembly.State.PLANNED and not self.staff_mode:
+        if assembly.state_assembly == Assembly.State.PLANNED and (assembly.user_can_manage(self.request.user) or not self.staff_mode):
             assembly.state_assembly = Assembly.State.REGISTERED
             changes['state_assembly'] = (Assembly.State.PLANNED, Assembly.State.REGISTERED)
-        if assembly.state_channel == Assembly.State.PLANNED and not self.staff_mode:
+        if assembly.state_channel == Assembly.State.PLANNED and (assembly.user_can_manage(self.request.user) or not self.staff_mode):
             assembly.state_channel = Assembly.State.REGISTERED
             changes['state_channel'] = (Assembly.State.PLANNED, Assembly.State.REGISTERED)
 
@@ -317,7 +317,7 @@ class EditAssemblyView(AssemblyMixin, UpdateView):
                 del changes['parent_id']
 
         # log latest update timestamp
-        if self.staff_access:
+        if self.staff_mode and not assembly.user_can_manage(self.request.user):
             assembly.last_update_staff = timezone.now()
             changes['last_update_staff'] = str(assembly.last_update_staff)
         else: