diff --git a/gracedb/superevents/api/view_templates.py b/gracedb/superevents/api/view_templates.py
index 7aba61e66ff2c8b54dcb18d33bcbf6b810b0a009..2b3f5537c5c08bf9d66a4192fec984e66f48ad92 100644
--- a/gracedb/superevents/api/view_templates.py
+++ b/gracedb/superevents/api/view_templates.py
@@ -7,7 +7,7 @@ from .views import SupereventViewSet, SupereventEventViewSet, \
 
 # Placeholder parameters for getting URLs with reverse
 PH = {
-    SupereventViewSet.lookup_field: 'S800106', # superevent_id
+    SupereventViewSet.lookup_field: 'S800106a', # superevent_id
     SupereventEventViewSet.lookup_field: 'G1234', # graceid
     SupereventLabelViewSet.lookup_field: 'LABEL_NAME', # label name
     SupereventLogViewSet.lookup_field: '3333', # log number (N)
diff --git a/gracedb/superevents/migrations/0011_superevent_suffix_required.py b/gracedb/superevents/migrations/0011_superevent_suffix_required.py
new file mode 100644
index 0000000000000000000000000000000000000000..7a396df5ae4368cf6f54d5ac3fae8d52cf658193
--- /dev/null
+++ b/gracedb/superevents/migrations/0011_superevent_suffix_required.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.14 on 2018-07-25 20:24
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('superevents', '0010_superevent_category'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='superevent',
+            name='base_letter_suffix',
+            field=models.CharField(default='a', editable=False, max_length=10),
+            preserve_default=False,
+        ),
+    ]
diff --git a/gracedb/superevents/models.py b/gracedb/superevents/models.py
index 80d2509ef03c0e62c13e6338d87af823150a2252..453229773b1bf9853fa00f983925a0d5d6f86a40 100644
--- a/gracedb/superevents/models.py
+++ b/gracedb/superevents/models.py
@@ -38,10 +38,7 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel):
     """
 
     Superevent date-based IDs:
-        Initially, a superevent has an ID like 'Syymmdd' (S180101)
-        If there are multiple superevents on the same date, a letter prefix is
-            added: S180101a, S180101b, etc., based on how many other
-            superevents exist for the given date.
+        Initially, a superevent has an ID like 'S180725a'
         Once a superevent is confirmed as a GW, its prefix is changed to 'GW'
             and its suffix is recalculated in terms of how many confirmed GWs
             exist for the given date. Ex: S180101b -> GW180101A
@@ -65,8 +62,8 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel):
 
     # Full date-based ID regex:
     # (T|M)?S180709abc OR (T|M)?GW180709ABC
-    ID_REGEX = (r'(({test}|{mdc})?({0})(\d{{6}})([a-z]*)|'
-        '({test}|{mdc})?({1})(\d{{6}})([A-Z]*))').format(DEFAULT_ID_PREFIX,
+    ID_REGEX = (r'(({test}|{mdc})?({0})(\d{{6}})([a-z]+)|'
+        '({test}|{mdc})?({1})(\d{{6}})([A-Z]+))').format(DEFAULT_ID_PREFIX,
         GW_ID_PREFIX, test=SUPEREVENT_CATEGORY_TEST,
         mdc=SUPEREVENT_CATEGORY_MDC)
 
@@ -103,7 +100,7 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel):
     # Fields for handling date-based IDs
     t_0_date = models.DateField(null=False, editable=False)
     base_date_number = models.PositiveIntegerField(null=False, editable=False)
-    base_letter_suffix = models.CharField(max_length=10, null=True,
+    base_letter_suffix = models.CharField(max_length=10, null=False,
         editable=False)
     gw_date_number = models.PositiveIntegerField(null=True, editable=False)
     gw_letter_suffix = models.CharField(max_length=10, null=True,
@@ -169,23 +166,9 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel):
 
         # Update letter suffix from date number
         if not pk_set:
-            if self.base_date_number == 1:
-                # No letter suffix for only one superevent on a given date
-                self.base_letter_suffix = ""
-            else:
-                self.base_letter_suffix = int_to_letters(self.base_date_number)
+            self.base_letter_suffix = int_to_letters(self.base_date_number)
             self.save(update_fields=['base_letter_suffix'])
 
-            # If a second superevent is found on a given date, update the first
-            # one from that date to now use a letter suffix for the ID.
-            if self.base_date_number == 2:
-                first_for_date = self.__class__.objects.get(
-                    t_0_date=self.t_0_date, category=self.category,
-                    base_date_number=1)
-                first_for_date.base_letter_suffix = int_to_letters(
-                    first_for_date.base_date_number)
-                first_for_date.save(update_fields=['base_letter_suffix'])
-
         # Add preferred event to events list. Have to do this after base save
         # because the superevent needs a pk to be used as a foreign key in the
         # event table
@@ -258,24 +241,11 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel):
         self.auto_increment_update('gw_date_number', constraint_fields)
 
         # Update gw_letter_suffix from gw_date_number
-        if self.gw_date_number == 1:
-            # No letter suffix for only one confirmed GW on a given date
-            self.gw_letter_suffix = ""
-        else:
-            self.gw_letter_suffix = int_to_letters(self.gw_date_number).upper()
+        self.gw_letter_suffix = int_to_letters(self.gw_date_number).upper()
 
         # Save the fields which have changed
         self.save(update_fields=['is_gw', 'gw_letter_suffix'])
 
-        # If a second confirmed GW is found for a given date, update the first
-        # one from that date to now use a letter suffix for the ID.
-        if self.gw_date_number == 2:
-            first_for_date = self.__class__.objects.get(is_gw=True,
-                t_0_date=self.t_0_date, gw_date_number=1)
-            first_for_date.gw_letter_suffix = int_to_letters(
-                    first_for_date.gw_date_number).upper()
-            first_for_date.save(update_fields=['gw_letter_suffix'])
-
     def get_absolute_url(self):
         return self.get_web_url()
 
@@ -335,7 +305,7 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel):
             d = datetime.datetime.strptime(date_str, cls.DATE_STR_FMT).date()
         except ValueError as e:
             # Catch error for bad date string (i.e., month=13 or something)
-            raise cls.DateIdError(_('Bad superevent date string'))
+            raise cls.DateIdError(_('Bad superevent date string.'))
 
         # FIXME: someone will have to deal with this in 2080
         # Safety check for 2 digit years: enforce year range of [1980 - 2079),
@@ -353,10 +323,7 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel):
             d = d.replace(year=replace_yr)
 
         # Determine date_number from letter suffix
-        if suffix == "":
-            date_number = 1
-        else:
-            date_number = letters_to_int(suffix.lower())
+        date_number = letters_to_int(suffix.lower())
 
         # Compile query kwargs - we don't have to be too careful here
         # since the regex match above will filter out any issues
diff --git a/gracedb/superevents/query.py b/gracedb/superevents/query.py
index f5918980db20cd925f1157b64ceab575a59271ef..e2077907541409f98f7eca484cf01e89b9d94258 100644
--- a/gracedb/superevents/query.py
+++ b/gracedb/superevents/query.py
@@ -33,9 +33,9 @@ superevent_preprefix = Optional(Or([CaselessLiteral(pref) for pref in
 superevent_prefix = Or([CaselessLiteral(pref) for pref in
     Superevent.DEFAULT_ID_PREFIX, Superevent.GW_ID_PREFIX])
 superevent_date = Word(nums, exact=6)
-superevent_suffix = Optional(Word(alphas))
-superevent_expr = Combine(superevent_prefix + superevent_date +
-    superevent_suffix)
+superevent_suffix = Word(alphas)
+superevent_expr = Combine(superevent_preprefix + superevent_prefix +
+    superevent_date + superevent_suffix)
 
 # Dict of queryable parameters which are compiled into a pyparsing
 # expression below
diff --git a/gracedb/templates/search/query_help_frag.html b/gracedb/templates/search/query_help_frag.html
index 558b1da58e710ee0a11ca0082c95882e25cf8f2a..9e4477a6422cf95d148adf432ac84d9f29f10257 100644
--- a/gracedb/templates/search/query_help_frag.html
+++ b/gracedb/templates/search/query_help_frag.html
@@ -97,7 +97,7 @@
  <h4>By id</h4>
   The keywords <code>id:</code> or <code>superevent_id:</code> are optional.
   <ul>
-   <li>id: S180525</li>
+   <li>id: S180525a</li>
    <li>superevent_id: S170817b</li>
    <li>GW180428C</li>
   </ul>