diff --git a/src/build/functions/edge.ts b/src/build/functions/edge.ts
index f3f534c35b..77c79bf2e3 100644
--- a/src/build/functions/edge.ts
+++ b/src/build/functions/edge.ts
@@ -162,9 +162,11 @@ const buildHandlerDefinition = (
   }))
 }
 
-export const createEdgeHandlers = async (ctx: PluginContext) => {
+export const clearStaleEdgeHandlers = async (ctx: PluginContext) => {
   await rm(ctx.edgeFunctionsDir, { recursive: true, force: true })
+}
 
+export const createEdgeHandlers = async (ctx: PluginContext) => {
   const nextManifest = await ctx.getMiddlewareManifest()
   const nextDefinitions = [
     ...Object.values(nextManifest.middleware),
diff --git a/src/build/functions/server.ts b/src/build/functions/server.ts
index e34997ee06..dbdba6553f 100644
--- a/src/build/functions/server.ts
+++ b/src/build/functions/server.ts
@@ -127,12 +127,15 @@ const writeHandlerFile = async (ctx: PluginContext) => {
   await writeFile(join(ctx.serverHandlerRootDir, `${SERVER_HANDLER_NAME}.mjs`), handler)
 }
 
+export const clearStaleServerHandlers = async (ctx: PluginContext) => {
+  await rm(ctx.serverFunctionsDir, { recursive: true, force: true })
+}
+
 /**
  * Create a Netlify function to run the Next.js server
  */
 export const createServerHandler = async (ctx: PluginContext) => {
   await tracer.withActiveSpan('createServerHandler', async () => {
-    await rm(ctx.serverFunctionsDir, { recursive: true, force: true })
     await mkdir(join(ctx.serverHandlerDir, '.netlify'), { recursive: true })
 
     await copyNextServerCode(ctx)
diff --git a/src/index.ts b/src/index.ts
index 5e62ab6b47..58cb08fa35 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -13,8 +13,8 @@ import {
   publishStaticDir,
   unpublishStaticDir,
 } from './build/content/static.js'
-import { createEdgeHandlers } from './build/functions/edge.js'
-import { createServerHandler } from './build/functions/server.js'
+import { clearStaleEdgeHandlers, createEdgeHandlers } from './build/functions/edge.js'
+import { clearStaleServerHandlers, createServerHandler } from './build/functions/server.js'
 import { setImageConfig } from './build/image-cdn.js'
 import { PluginContext } from './build/plugin-context.js'
 import {
@@ -38,8 +38,15 @@ export const onPreBuild = async (options: NetlifyPluginOptions) => {
   await tracer.withActiveSpan('onPreBuild', async () => {
     // Enable Next.js standalone mode at build time
     process.env.NEXT_PRIVATE_STANDALONE = 'true'
-    if (!options.constants.IS_LOCAL) {
-      await restoreBuildCache(new PluginContext(options))
+    const ctx = new PluginContext(options)
+    if (options.constants.IS_LOCAL) {
+      // Only clear directory if we are running locally as then we might have stale functions from previous
+      // local builds. Directory clearing interferes with other integrations by deleting functions produced by them
+      // so ideally this is completely avoided.
+      await clearStaleServerHandlers(ctx)
+      await clearStaleEdgeHandlers(ctx)
+    } else {
+      await restoreBuildCache(ctx)
     }
   })
 }