diff --git a/packages/tanstackstart/docs/hosting-provider-esm-hooks.md b/packages/tanstackstart/docs/hosting-provider-esm-hooks.md
new file mode 100644
index 000000000000..cf2df38e753c
--- /dev/null
+++ b/packages/tanstackstart/docs/hosting-provider-esm-hooks.md
@@ -0,0 +1,30 @@
+> NOTE: These are docs for the maintainers of the TanStack Start SDK and not for users of the package.
+
+# Hosting Provider ESM Loader Hooks
+
+This file contains the code for ESM loader hooks that can be base64 encoded and passed to the `NODE_OPTIONS` environment variable as `--import "data:text/javascript;base64,1234BASE64HERE1324"`.
+
+Before encoding the snippets below and pasting them in docs or whatever, make sure to minify them as much as possible.
+
+In their current state the hooks are as minimal as possible. Do not remove things from them because you think they can be smaller - unless thoroughly testing them beforehand!
+
+## Vercel
+
+```mjs
+import { register, createRequire } from 'module';
+if (!process.env.CI) {
+  try {
+    const moduleResolutionContext = `file://${process.cwd()}/index.js`;
+    const req = createRequire(moduleResolutionContext);
+    const { createAddHookMessageChannel } = req('import-in-the-middle');
+    const { addHookMessagePort } = createAddHookMessageChannel();
+    register('import-in-the-middle/hook.mjs', moduleResolutionContext, {
+      data: { addHookMessagePort, include: [] },
+      transferList: [addHookMessagePort],
+    });
+    globalThis._sentryEsmLoaderHookRegistered = true;
+  } catch (e) {
+    globalThis._sentryEsmLoaderHookError = `${e}`;
+  }
+}
+```
diff --git a/packages/tanstackstart/package.json b/packages/tanstackstart/package.json
index 63a7916ff3dd..454cc1020966 100644
--- a/packages/tanstackstart/package.json
+++ b/packages/tanstackstart/package.json
@@ -54,7 +54,8 @@
     "@sentry/core": "9.2.0",
     "@sentry/node": "9.2.0",
     "@sentry/opentelemetry": "9.2.0",
-    "@sentry/react": "9.2.0"
+    "@sentry/react": "9.2.0",
+    "import-in-the-middle": "^1.13.0"
   },
   "scripts": {
     "build": "run-p build:transpile build:types",
diff --git a/packages/tanstackstart/rollup.npm.config.mjs b/packages/tanstackstart/rollup.npm.config.mjs
index 9b334bdbae41..86db6e7e013b 100644
--- a/packages/tanstackstart/rollup.npm.config.mjs
+++ b/packages/tanstackstart/rollup.npm.config.mjs
@@ -10,6 +10,9 @@ export default [
         'src/server/index.ts',
         'src/config/index.ts',
       ],
+      packageSpecificConfig: {
+        external: ['import-in-the-middle/hook.mjs'],
+      },
     }),
   ),
   ...makeOtelLoaders('./build', 'sentry-node'),
diff --git a/packages/tanstackstart/src/server/index.ts b/packages/tanstackstart/src/server/index.ts
index d61c75b7bfb4..b636eb94e2af 100644
--- a/packages/tanstackstart/src/server/index.ts
+++ b/packages/tanstackstart/src/server/index.ts
@@ -1 +1,5 @@
 export * from '@sentry/node';
+
+// We're importing this hook to explicitly tell tools like Vercel's `nft` not to throw the file away because it seems unused, because it is actually used by ESM loader hooks the user defines via node CLI arguments.
+import 'import-in-the-middle/hook.mjs';
+import 'import-in-the-middle';