diff --git a/doc/changes/dev/13518.bugfix.rst b/doc/changes/dev/13518.bugfix.rst
new file mode 100644
index 00000000000..7b74ebb4453
--- /dev/null
+++ b/doc/changes/dev/13518.bugfix.rst
@@ -0,0 +1 @@
+Make :meth:`~mne.io.Raw.interpolate_bads` method flexible (ignore, warn, raise) about how to handle interpolation of channels with invalid positions, by `Himanshu Mahor`_.
diff --git a/mne/channels/channels.py b/mne/channels/channels.py
index ab54bf200dd..fbfb759cf92 100644
--- a/mne/channels/channels.py
+++ b/mne/channels/channels.py
@@ -829,6 +829,7 @@ def interpolate_bads(
         origin="auto",
         method=None,
         exclude=(),
+        on_bad_position="warn",
         verbose=None,
     ):
         """Interpolate bad MEG and EEG channels.
@@ -874,6 +875,12 @@ def interpolate_bads(
         exclude : list | tuple
             The channels to exclude from interpolation. If excluded a bad
             channel will stay in bads.
+        on_bad_position : "raise" | "warn" | "ignore"
+            What to do when one or more sensor positions are invalid (zero or NaN).
+            If ``"warn"`` or ``"ignore"``, channels with invalid positions will be
+            filled with :data:`~numpy.nan`.
+
+            .. versionadded:: 1.12
         %(verbose)s
 
         Returns
@@ -898,6 +905,32 @@ def interpolate_bads(
 
         _check_preload(self, "interpolation")
         _validate_type(method, (dict, str, None), "method")
+
+        # check for channels with invalid position(s)
+        invalid_chs = []
+        for ch in self.info["bads"]:
+            loc = self.info["chs"][self.ch_names.index(ch)]["loc"][:3]
+            if np.allclose(loc, 0.0, rtol=0, atol=1e-16) or np.isnan(loc).any():
+                invalid_chs.append(ch)
+
+        if invalid_chs:
+            if on_bad_position == "raise":
+                msg = (
+                    f"Channel(s) {invalid_chs} have invalid sensor position(s). "
+                    "Interpolation cannot proceed correctly. If you want to "
+                    "continue despite missing positions, set "
+                    "on_bad_position='warn' or 'ignore', which outputs all "
+                    "NaN values (np.nan) for the interpolated channel(s)."
+                )
+            else:
+                msg = (
+                    f"Channel(s) {invalid_chs} have invalid sensor position(s) "
+                    "and cannot be interpolated. The values of these channels "
+                    "will be all NaN. To ignore this warning, pass "
+                    "on_bad_position='ignore'."
+                )
+            _on_missing(on_bad_position, msg)
+
         method = _handle_default("interpolation_method", method)
         ch_types = self.get_channel_types(unique=True)
         # figure out if we have "mag" for "meg", "hbo" for "fnirs", ... to filter the
diff --git a/mne/channels/tests/test_interpolation.py b/mne/channels/tests/test_interpolation.py
index ae5247ed091..1c61ede72f2 100644
--- a/mne/channels/tests/test_interpolation.py
+++ b/mne/channels/tests/test_interpolation.py
@@ -421,6 +421,27 @@ def test_nan_interpolation(raw):
     raw.interpolate_bads(method="nan", reset_bads=False)
     assert raw.info["bads"] == ch_to_interp
 
+    store = raw.info["chs"][1]["loc"]
+    # for on_bad_position="raise"
+    raw.info["bads"] = ch_to_interp
+    raw.info["chs"][1]["loc"] = np.full(12, np.nan)
+    with pytest.raises(ValueError, match="have invalid sensor position"):
+        # DOES NOT interpolates at all. So raw.info["bads"] remains as is
+        raw.interpolate_bads(on_bad_position="raise")
+
+    # for on_bad_position="warn"
+    with pytest.warns(RuntimeWarning, match="have invalid sensor position"):
+        # this DOES the interpolation BUT with a warning
+        # so raw.info["bad"] will be empty again,
+        # and interpolated channel with be all np.nan
+        raw.interpolate_bads(on_bad_position="warn")
+
+    # for on_bad_position="ignore"
+    raw.info["bads"] = ch_to_interp
+    assert raw.interpolate_bads(on_bad_position="ignore")
+    assert np.isnan(bad_chs).all, "Interpolated channel should be all NaN"
+    raw.info["chs"][1]["loc"] = store
+
     # make sure other channels are untouched
     raw.drop_channels(ch_to_interp)
     good_chs = raw.get_data()
