diff --git a/scipost_django/submissions/templates/submissions/pool/_referee_invitations.html b/scipost_django/submissions/templates/submissions/pool/_referee_invitations.html
index 0914fed9664c1dcfc9f65dea5c8a775b917a6185..909c90182281d48456aa249140bde4157827275a 100644
--- a/scipost_django/submissions/templates/submissions/pool/_referee_invitations.html
+++ b/scipost_django/submissions/templates/submissions/pool/_referee_invitations.html
@@ -106,7 +106,17 @@
           </td>
           <td>
             {% if not invitation.fulfilled %}
-              <a href="{% url 'submissions:cancel_ref_invitation' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr invitation_id=invitation.id %}">Cancel invitation</a>
+            <div class="d-flex flex-column justify-contents-between align-center bg-light">
+              <button class="btn btn-sm btn-light"
+                 hx-get="{% url 'submissions:_hx_cancel_ref_invitation' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr invitation_id=invitation.id %}"
+                 hx-target="closest div"
+                 hx-include="next input[name='notify_by_email']">Cancel invitation
+              </button>
+              <div class="d-flex flex-row justify-content-evenly align-items-center border-secondary border-top py-1">
+                <label for="email-checkbox-{{invitation.id}}" class="text-muted">Notify by email?</label>
+                <input id="email-checkbox-{{invitation.id}}" class="checkbox-lg" type="checkbox" name="notify_by_email" checked/>
+              </div>
+            </div>
             {% endif %}
           </td>
         {% else %}
diff --git a/scipost_django/submissions/urls/__init__.py b/scipost_django/submissions/urls/__init__.py
index 78d80a3b9d0a4aae566669473f8d4c78812b0315..dfa86aff36f12d086d3664dbf29161860ee64b44 100644
--- a/scipost_django/submissions/urls/__init__.py
+++ b/scipost_django/submissions/urls/__init__.py
@@ -364,9 +364,9 @@ urlpatterns = [
         name="ref_invitation_reminder",
     ),
     path(
-        "cancel_ref_invitation/<identifier:identifier_w_vn_nr>/<int:invitation_id>",
-        views.cancel_ref_invitation,
-        name="cancel_ref_invitation",
+        "_hx_cancel_ref_invitation/<identifier:identifier_w_vn_nr>/<int:invitation_id>",
+        views._hx_cancel_ref_invitation,
+        name="_hx_cancel_ref_invitation",
     ),
     path(
         "extend_refereeing_deadline/<identifier:identifier_w_vn_nr>/<int:days>",
diff --git a/scipost_django/submissions/utils.py b/scipost_django/submissions/utils.py
index 412d64e3f27ed031113ee95340a04c714f4c3973..40f32cc85bfbea1808ad96ca34332ac0bd28df72 100644
--- a/scipost_django/submissions/utils.py
+++ b/scipost_django/submissions/utils.py
@@ -421,7 +421,7 @@ class SubmissionUtils(BaseMailUtil):
     def send_ref_cancellation_email(cls):
         """
         This method is used to inform a referee that his/her services are no longer required.
-        It is called from the cancel_ref_invitation method in submissions/views.py.
+        It is called from the _hx_cancel_ref_invitation method in submissions/views.py.
         """
         email_text = (
             "Dear "
diff --git a/scipost_django/submissions/views/__init__.py b/scipost_django/submissions/views/__init__.py
index 37d4f10647310d145f91b69f41933c3a3f7a896f..67e26e3e7b541bd56ed0af619da48bbb7aeafdda 100644
--- a/scipost_django/submissions/views/__init__.py
+++ b/scipost_django/submissions/views/__init__.py
@@ -1828,7 +1828,7 @@ def decline_ref_invitation(request, invitation_key):
 
 
 @login_required
-def cancel_ref_invitation(request, identifier_w_vn_nr, invitation_id):
+def _hx_cancel_ref_invitation(request, identifier_w_vn_nr, invitation_id):
     """Cancel a RefereeInvitation.
 
     This method is used by the Editor-in-charge from the editorial_page to remove a referee
@@ -1842,13 +1842,16 @@ def cancel_ref_invitation(request, identifier_w_vn_nr, invitation_id):
             submission__in=submissions, pk=invitation_id
         )
     except RefereeInvitation.DoesNotExist:
-        raise Http404
+        return HTMXResponse("Invitation not found/accessible", tag="danger")
 
     invitation.cancelled = True
     invitation.save()
-    SubmissionUtils.load({"invitation": invitation})
-    if invitation.date_invited is not None:
-        SubmissionUtils.send_ref_cancellation_email()
+
+    notify_by_email = request.GET.get("notify_by_email", False)
+    if notify_by_email:
+        SubmissionUtils.load({"invitation": invitation})
+        if invitation.date_invited is not None:
+            SubmissionUtils.send_ref_cancellation_email()
 
     # Add SubmissionEvents
     invitation.submission.add_event_for_author(
@@ -1858,13 +1861,7 @@ def cancel_ref_invitation(request, identifier_w_vn_nr, invitation_id):
         "Referee invitation for %s has been cancelled." % invitation.last_name
     )
 
-    messages.success(request, "Invitation cancelled")
-    return redirect(
-        reverse(
-            "submissions:editorial_page",
-            kwargs={"identifier_w_vn_nr": identifier_w_vn_nr},
-        )
-    )
+    return HTMXResponse("Invitation cancelled", tag="success")
 
 
 @login_required