diff --git a/src/core/models/events.py b/src/core/models/events.py
index ef18c9cc5797cdce3fa622ceea1ddc5c36580d95..c05859c5818348c64210734f4037a2a62c5651b5 100644
--- a/src/core/models/events.py
+++ b/src/core/models/events.py
@@ -425,10 +425,10 @@ class Event(TaggedItemMixin, BackendMixin, ActivityLogMixin, models.Model):
         if 'speakers' in data:
             if speaker_lookup is not None:
                 obj.save()  # TODO: check if we can do this better, but we need the model saved for adding speakers
-                for item in data['speakers']:
+                for order, item in enumerate(data['speakers']):
                     speaker = speaker_lookup(item)
                     if speaker is not None:
-                        obj.ensure_speaker(speaker)
+                        obj.ensure_speaker(speaker, order)
             else:
                 raise RuntimeWarning('Event.from_dict() got data with "speakers" but no speaker_lookup was provided.')
             if pop_used_keys:
@@ -632,7 +632,7 @@ class Event(TaggedItemMixin, BackendMixin, ActivityLogMixin, models.Model):
         # we require a configured BigBlueButton integration
         return settings.INTEGRATIONS_BBB
 
-    def ensure_speaker(self, user: PlatformUser):
+    def ensure_speaker(self, user: PlatformUser, order: int):
         entry, created = self.participants.get_or_create(participant=user)
         if created:
             logger.info(
@@ -646,6 +646,7 @@ class Event(TaggedItemMixin, BackendMixin, ActivityLogMixin, models.Model):
         entry.role = EventParticipant.Role.SPEAKER
         entry.is_public = True
         entry.is_accepted = True
+        entry.order = order
         entry.save()
         logger.info(
             'Forced participant #%s (%s) of event %s to accepted+public+speaker.',
@@ -714,7 +715,7 @@ class EventParticipant(models.Model):
     )
 
     # Future TODO: evaluate https://pypi.org/project/django-sortedm2m/ but for now we just use a simple order field
-    order = models.PositiveIntegerField()
+    order = models.PositiveIntegerField(default=0)
 
     is_accepted = models.BooleanField(default=False, help_text=_('EventParticipant__is_accepted__help'), verbose_name=_('EventParticipant__is_accepted'))
     is_public = models.BooleanField(default=False, help_text=_('EventParticipant__is_public__help'), verbose_name=_('EventParticipant__is_public'))
@@ -733,7 +734,7 @@ class EventParticipant(models.Model):
         except ConferenceMember.DoesNotExist:
             raise ValidationError(_('EventParticipant__must_be_conference_member'))
 
-        if self.order is None:  # if 'order' is not explicitly set
+        if not self.order:  # if 'order' is not explicitly set
             last_order = EventParticipant.objects.filter(event=self.event).aggregate(models.Max('order')).get('order__max')
             self.order = (last_order or 0) + 1