diff --git a/e2e/test/scenarios/sharing/public-dashboard.cy.spec.js b/e2e/test/scenarios/sharing/public-dashboard.cy.spec.js
index a99eb9a389d529866108cf780b40d70f6613921c..1e3d17cca036497659c6ca174388f449b63acbe1 100644
--- a/e2e/test/scenarios/sharing/public-dashboard.cy.spec.js
+++ b/e2e/test/scenarios/sharing/public-dashboard.cy.spec.js
@@ -245,4 +245,16 @@ describe("scenarios > public > dashboard", () => {
 
     assertDashboardFullWidth();
   });
+
+  it("should render when a filter passed with value starting from '0' (metabase#41483)", () => {
+    cy.get("@dashboardId").then(id => {
+      visitPublicDashboard(id, {
+        params: { text: "002" },
+      });
+    });
+
+    cy.url().should("include", "text=002");
+
+    filterWidget().findByText("002").should("be.visible");
+  });
 });
diff --git a/frontend/src/metabase/lib/browser.js b/frontend/src/metabase/lib/browser.js
index 94324621047b63501b361d303b660456e3777d8f..77a9cb778a79fb378ff79d6af9e974dfac09ab83 100644
--- a/frontend/src/metabase/lib/browser.js
+++ b/frontend/src/metabase/lib/browser.js
@@ -1,5 +1,7 @@
 import querystring from "querystring";
 
+import { safeJsonParse } from "metabase/lib/utils";
+
 function parseQueryStringOptions(s) {
   const options = querystring.parse(s);
 
@@ -7,7 +9,7 @@ function parseQueryStringOptions(s) {
     if (options[name] === "") {
       options[name] = true;
     } else if (/^(true|false|-?\d+(\.\d+)?)$/.test(options[name])) {
-      options[name] = JSON.parse(options[name]);
+      options[name] = safeJsonParse(options[name]);
     }
   }
 
diff --git a/frontend/src/metabase/lib/utils.ts b/frontend/src/metabase/lib/utils.ts
index eef73460d82be87fe133baf4e1aefc4d3ce3e4a0..a7dc02eb659a1a62eca1088aae569f30aca08ad3 100644
--- a/frontend/src/metabase/lib/utils.ts
+++ b/frontend/src/metabase/lib/utils.ts
@@ -184,3 +184,16 @@ export function compareVersions(
 }
 
 export const isEEBuild = () => PLUGIN_IS_EE_BUILD.isEEBuild();
+
+export const safeJsonParse = (value: string | null | undefined) => {
+  if (!value) {
+    return null;
+  }
+
+  try {
+    return JSON.parse(value);
+  } catch (e) {
+    console.error("Unable to parse JSON: ", value, e);
+    return null;
+  }
+};
diff --git a/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.unit.spec.tsx b/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.unit.spec.tsx
index 9c1e8c125a8f49f02fbd62313ec6c610c612c47d..30c5e9cfbe36e220cf9428e28215e8a40e132286 100644
--- a/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.unit.spec.tsx
+++ b/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.unit.spec.tsx
@@ -70,6 +70,16 @@ describe("PublicDashboard", () => {
 
     expect(firstTab).toHaveAttribute("aria-selected", "true");
   });
+
+  it("should render when a filter passed with value starting from '0' (metabase#41483)", async () => {
+    // note: as all slugs this is ignored and we only use the id
+    await setup({
+      queryString: "?my-filter-value=01",
+    });
+
+    // should not throw runtime error and render dashboard content
+    expect(screen.getByText(DASHBOARD_TITLE)).toBeInTheDocument();
+  });
 });
 
 async function setup({