diff --git a/e2e/test/scenarios/dashboard/reproductions/12926-editing-dashboards-doesnt-cancel-running-queries.cy.spec.js b/e2e/test/scenarios/dashboard/reproductions/12926-editing-dashboards-doesnt-cancel-running-queries.cy.spec.js
index 852ae5e5c0b7a3bdeb603858e46a53fa1eff758e..9074e19c81125051bc960772357dc272fb0b9eae 100644
--- a/e2e/test/scenarios/dashboard/reproductions/12926-editing-dashboards-doesnt-cancel-running-queries.cy.spec.js
+++ b/e2e/test/scenarios/dashboard/reproductions/12926-editing-dashboards-doesnt-cancel-running-queries.cy.spec.js
@@ -1,8 +1,10 @@
 import {
+  addTextBox,
   editDashboard,
   getDashboardCard,
   openQuestionsSidebar,
   popover,
+  removeDashboardCard,
   restore,
   saveDashboard,
   setFilter,
@@ -74,6 +76,20 @@ describe("issue 12926", () => {
 
       getDashboardCard().findByText(queryResult);
     });
+
+    it("should not break virtual cards (metabase#35545)", () => {
+      cy.createDashboard().then(({ body: { id: dashboardId } }) => {
+        visitDashboard(dashboardId);
+      });
+
+      addTextBox("Text card content");
+
+      removeDashboardCard();
+
+      undo();
+
+      getDashboardCard().findByText("Text card content");
+    });
   });
 
   describe("saving a dashboard that retriggers a non saved query (negative id)", () => {
diff --git a/frontend/src/metabase/dashboard/actions/cards.js b/frontend/src/metabase/dashboard/actions/cards.js
index 524567bd216c0380f7e6a7104e2ab18916eac5b7..1a92d7b9eb7d0beeeae7bf5536d95e6fe4ee7c47 100644
--- a/frontend/src/metabase/dashboard/actions/cards.js
+++ b/frontend/src/metabase/dashboard/actions/cards.js
@@ -13,6 +13,7 @@ import { createCard } from "metabase/lib/card";
 import { getVisualizationRaw } from "metabase/visualizations";
 import { trackCardCreated } from "../analytics";
 import { getDashCardById } from "../selectors";
+import { isVirtualDashCard } from "../utils";
 import {
   ADD_CARD_TO_DASH,
   REMOVE_CARD_FROM_DASH,
@@ -77,7 +78,9 @@ export const undoRemoveCardFromDashboard = createThunkAction(
       const dashcard = getDashCardById(getState(), dashcardId);
       const card = dashcard.card;
 
-      dispatch(fetchCardData(card, dashcard));
+      if (!isVirtualDashCard(dashcard)) {
+        dispatch(fetchCardData(card, dashcard));
+      }
 
       return { dashcardId };
     },