diff --git a/spec/ndx-extracellular-channels.extensions.yaml b/spec/ndx-extracellular-channels.extensions.yaml
index 05ed9ea..e53447d 100644
--- a/spec/ndx-extracellular-channels.extensions.yaml
+++ b/spec/ndx-extracellular-channels.extensions.yaml
@@ -310,11 +310,11 @@ groups:
     attributes:
     - name: unit
       dtype: text
-      value: volts
+      value: microvolts
       doc: Base unit of measurement for working with the data. This value is fixed
-        to 'volts'. Actual stored values are not necessarily stored in these units.
-        To access the data in these units, multiply 'data' by 'conversion', followed
-        by 'channel_conversion' (if present), and then add 'offset'.
+        to 'microvolts'. Actual stored values are not necessarily stored in these
+        units. To access the data in these units, multiply 'data' by 'conversion',
+        followed by 'channel_conversion' (if present), and then add 'offset'.
   - name: channels
     neurodata_type_inc: DynamicTableRegion
     doc: DynamicTableRegion pointer to rows in a ChannelsTable that represent the
@@ -328,7 +328,7 @@ groups:
     doc: Channel-specific conversion factor. Multiply the data in the 'data' dataset
       by these values along the channel axis (as indicated by axis attribute) AND
       by the global conversion factor in the 'conversion' attribute of 'data' to get
-      the data values in Volts, i.e, data in Volts = data * data.conversion * channel_conversion.
+      the data values in microvolts, i.e, data in microvolts = data * data.conversion * channel_conversion.
       This approach allows for both global and per-channel data conversion factors
       needed to support the storage of electrical recordings as native values generated
       by data acquisition systems. If this dataset is not present, then there is no
diff --git a/src/pynwb/ndx_extracellular_channels/__init__.py b/src/pynwb/ndx_extracellular_channels/__init__.py
index 2edcb68..b0910d5 100644
--- a/src/pynwb/ndx_extracellular_channels/__init__.py
+++ b/src/pynwb/ndx_extracellular_channels/__init__.py
@@ -1,6 +1,8 @@
 import os
 
-from pynwb import get_class, load_namespaces
+from hdmf.utils import docval, get_docval
+
+from pynwb import get_class, load_namespaces, register_class
 
 try:
     from importlib.resources import files
@@ -24,7 +26,21 @@
 ProbeModel = get_class("ProbeModel", "ndx-extracellular-channels")
 Probe = get_class("Probe", "ndx-extracellular-channels")
 ChannelsTable = get_class("ChannelsTable", "ndx-extracellular-channels")
-ExtracellularSeries = get_class("ExtracellularSeries", "ndx-extracellular-channels")
+AutoExtracellularSeries = get_class("ExtracellularSeries", "ndx-extracellular-channels")
+
+init_dv = [dv for dv in get_docval(AutoExtracellularSeries.__init__) if dv["name"] != "unit"]
+
+
+@register_class("ExtracellularSeries", "ndx-extracellular-channels")
+class ExtracellularSeries(AutoExtracellularSeries):
+
+    @docval(*init_dv)
+    def __init__(self, **kwargs):
+        # NOTE: "unit" is a required constructor argument in the auto-generated class
+        # but it's value is fixed to "microvolts"
+        kwargs["unit"] = "microvolts"
+        super().__init__(**kwargs)
+
 
 from .io import from_probeinterface, to_probeinterface
 
@@ -40,4 +56,4 @@
 )
 
 # Remove these functions from the package
-del load_namespaces, get_class
+del load_namespaces, get_class, init_dv
diff --git a/src/pynwb/tests/test_classes.py b/src/pynwb/tests/test_classes.py
index 870096e..06ce7b2 100644
--- a/src/pynwb/tests/test_classes.py
+++ b/src/pynwb/tests/test_classes.py
@@ -638,7 +638,6 @@ def test_constructor(self):
             channel_conversion=[1.1],
             conversion=1e5,
             offset=0.001,
-            unit="volts",  # TODO should not have to specify this in init
         )
 
         assert es.name == "ExtracellularSeries"
@@ -649,7 +648,7 @@ def test_constructor(self):
         assert es.conversion == 1e5
         assert es.offset == 0.001
         # NOTE: the TimeSeries mapper maps spec "ExtracellularSeries/data/unit" to "ExtracellularSeries.unit"
-        assert es.unit == "volts"
+        assert es.unit == "microvolts"
         assert es.timestamps_unit == "seconds"
 
 
@@ -694,7 +693,6 @@ def addContainer(self):
             channel_conversion=[1.0, 1.1, 1.2],
             conversion=1e5,
             offset=0.001,
-            unit="volts",  # TODO should not have to specify this in init
         )
         self.nwbfile.add_acquisition(es)
 
diff --git a/src/pynwb/tests/test_example_usage_all.py b/src/pynwb/tests/test_example_usage_all.py
index ad3c087..6d4e4e3 100644
--- a/src/pynwb/tests/test_example_usage_all.py
+++ b/src/pynwb/tests/test_example_usage_all.py
@@ -145,7 +145,6 @@ def test_all_classes():
         channel_conversion=[1.0, 1.1, 1.2],
         conversion=1e5,
         offset=0.001,
-        unit="volts",  # TODO should not have to specify this in init
     )
 
     nwbfile.add_acquisition(es)
@@ -171,7 +170,7 @@ def test_all_classes():
         np.testing.assert_array_equal(read_eseries.channel_conversion[:], [1.0, 1.1, 1.2])
         assert read_eseries.conversion == 1e5
         assert read_eseries.offset == 0.001
-        assert read_eseries.unit == "volts"
+        assert read_eseries.unit == "microvolts"
 
         assert read_channels_table.name == "Neuropixels1ChannelsTable"
         assert read_channels_table.description == "Test channels table"
diff --git a/src/spec/create_extension_spec.py b/src/spec/create_extension_spec.py
index 1819bcd..ba1ffd7 100644
--- a/src/spec/create_extension_spec.py
+++ b/src/spec/create_extension_spec.py
@@ -465,11 +465,11 @@ def main():
                         name="unit",
                         doc=(
                             "Base unit of measurement for working with the data. This value is fixed to "
-                            "'volts'. Actual stored values are not necessarily stored in these units. To "
+                            "'microvolts'. Actual stored values are not necessarily stored in these units. To "
                             "access the data in these units, multiply 'data' by 'conversion', followed by "
                             "'channel_conversion' (if present), and then add 'offset'."
                         ),
-                        value="volts",
+                        value="microvolts",
                         dtype="text",
                     )
                 ],
@@ -491,7 +491,7 @@ def main():
                     "Channel-specific conversion factor. Multiply the data in the 'data' dataset by these "
                     "values along the channel axis (as indicated by axis attribute) AND by the global "
                     "conversion factor in the 'conversion' attribute of 'data' to get the data values in "
-                    "Volts, i.e, data in Volts = data * data.conversion * channel_conversion. This "
+                    "microvolts, i.e, data in microvolts = data * data.conversion * channel_conversion. This "
                     "approach allows for both global and per-channel data conversion factors needed "
                     "to support the storage of electrical recordings as native values generated by data "
                     "acquisition systems. If this dataset is not present, then there is no channel-specific "