diff --git a/lib/manager/npm/post-update/index.ts b/lib/manager/npm/post-update/index.ts
index 4b0a360607d15830d2610e3fe796fc87506af28a..b957e78e03d6fdcefb7d437e77f7d9231a1dc4b4 100644
--- a/lib/manager/npm/post-update/index.ts
+++ b/lib/manager/npm/post-update/index.ts
@@ -1,5 +1,6 @@
 import is from '@sindresorhus/is';
 import deepmerge from 'deepmerge';
+import detectIndent from 'detect-indent';
 import { dump, load } from 'js-yaml';
 import upath from 'upath';
 import { getGlobalConfig } from '../../../config/global';
@@ -167,9 +168,11 @@ export async function writeExistingFiles(
       } else {
         logger.debug(`Writing ${npmLock}`);
         let existingNpmLock: string;
+        let detectedIndent: string;
         let npmLockParsed: any;
         try {
           existingNpmLock = await getFile(npmLock);
+          detectedIndent = detectIndent(existingNpmLock).indent || '  ';
           npmLockParsed = JSON.parse(existingNpmLock);
         } catch (err) {
           logger.warn({ err }, 'Error parsing npm lock file');
@@ -217,7 +220,11 @@ export async function writeExistingFiles(
           }
           if (lockFileChanged) {
             logger.debug('Massaging npm lock file before writing to disk');
-            existingNpmLock = JSON.stringify(npmLockParsed, null, 2);
+            existingNpmLock = JSON.stringify(
+              npmLockParsed,
+              null,
+              detectedIndent
+            );
           }
           await outputFile(npmLockPath, existingNpmLock);
         }
@@ -258,6 +265,8 @@ export async function writeUpdatedPackageFiles(
       continue;
     }
     logger.debug(`Writing ${String(packageFile.name)}`);
+    const detectedIndent =
+      detectIndent(packageFile.contents.toString()).indent || '  ';
     const massagedFile = JSON.parse(packageFile.contents.toString());
     try {
       const { token } = hostRules.find({
@@ -279,7 +288,7 @@ export async function writeUpdatedPackageFiles(
     }
     await outputFile(
       upath.join(localDir, packageFile.name),
-      JSON.stringify(massagedFile)
+      JSON.stringify(massagedFile, null, detectedIndent)
     );
   }
 }
diff --git a/lib/manager/npm/update/locked-dependency/index.ts b/lib/manager/npm/update/locked-dependency/index.ts
index f968303915510c84bd1ea8405a30894d6b722c22..e9dd8f6d29d8eed56a0393edda667f7f02cf7e1b 100644
--- a/lib/manager/npm/update/locked-dependency/index.ts
+++ b/lib/manager/npm/update/locked-dependency/index.ts
@@ -1,3 +1,4 @@
+import detectIndent from 'detect-indent';
 import type { PackageJson } from 'type-fest';
 import { logger } from '../../../../logger';
 import { api as semver } from '../../../../versioning/npm';
@@ -46,6 +47,7 @@ export async function updateLockedDependency(
     }
     let packageJson: PackageJson;
     let packageLockJson: PackageLockOrEntry;
+    const detectedIndent = detectIndent(lockFileContent).indent || '  ';
     let newPackageJsonContent: string;
     try {
       packageJson = JSON.parse(packageFileContent);
@@ -161,7 +163,11 @@ export async function updateLockedDependency(
       delete dependency.resolved;
       delete dependency.integrity;
     }
-    let newLockFileContent = JSON.stringify(packageLockJson, null, 2);
+    let newLockFileContent = JSON.stringify(
+      packageLockJson,
+      null,
+      detectedIndent
+    );
     // iterate through the parent updates first
     for (const parentUpdate of parentUpdates) {
       const parentUpdateConfig = {