diff --git a/lib/modules/manager/npm/__snapshots__/utils.spec.ts.snap b/lib/modules/manager/npm/__snapshots__/utils.spec.ts.snap
index 070bcab6d4fe6c68448a39071a712ff8aae2e54a..e107e13d1ff153b1753bd1dc4c94da1ccdb3bc75 100644
--- a/lib/modules/manager/npm/__snapshots__/utils.spec.ts.snap
+++ b/lib/modules/manager/npm/__snapshots__/utils.spec.ts.snap
@@ -13,5 +13,6 @@ exports[`modules/manager/npm/utils composeLockFile composes lockfile string out
   },
   \\"requires\\": true,
   \\"version\\": \\"1.0.0\\"
-}"
+}
+"
 `;
diff --git a/lib/modules/manager/npm/post-update/__snapshots__/npm.spec.ts.snap b/lib/modules/manager/npm/post-update/__snapshots__/npm.spec.ts.snap
index 6c274a61ef9f65028e3ef16814c2f46be102d4ec..df3d739b113d73ddac2a86281cee3669d24e5825 100644
--- a/lib/modules/manager/npm/post-update/__snapshots__/npm.spec.ts.snap
+++ b/lib/modules/manager/npm/post-update/__snapshots__/npm.spec.ts.snap
@@ -176,7 +176,8 @@ exports[`modules/manager/npm/post-update/npm performs lock file updates retainin
       \\"integrity\\": \\"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\\"
     }
   }
-}"
+}
+"
 `;
 
 exports[`modules/manager/npm/post-update/npm performs lock file updates retaining the package.json counterparts 2`] = `
diff --git a/lib/modules/manager/npm/utils.spec.ts b/lib/modules/manager/npm/utils.spec.ts
index 6b5945592fcf6905bcb573cfa36cfb543cc3f082..c5c7d813368abd51af74910c440e634de5452e85 100644
--- a/lib/modules/manager/npm/utils.spec.ts
+++ b/lib/modules/manager/npm/utils.spec.ts
@@ -53,5 +53,12 @@ describe('modules/manager/npm/utils', () => {
       const lockFileComposed = composeLockFile(lockFile, '  ');
       expect(lockFileComposed).toMatchSnapshot();
     });
+
+    it('adds trailing newline to match npms behaviour and avoid diffs', () => {
+      const lockFile = loadFixture('lockfile-parsing/package-lock.json');
+      const { detectedIndent, lockFileParsed } = parseLockFile(lockFile);
+      const lockFileComposed = composeLockFile(lockFileParsed, detectedIndent);
+      expect(lockFileComposed).toBe(lockFile);
+    });
   });
 });
diff --git a/lib/modules/manager/npm/utils.ts b/lib/modules/manager/npm/utils.ts
index 20057b30d9352ca87d0f287fa2d69d916410d312..55d757d475bc880e1431b60867862f484701436e 100644
--- a/lib/modules/manager/npm/utils.ts
+++ b/lib/modules/manager/npm/utils.ts
@@ -16,5 +16,5 @@ export function parseLockFile(lockFile: string): ParseLockFileResult {
 }
 
 export function composeLockFile(lockFile: LockFile, indent: string): string {
-  return JSON.stringify(lockFile, null, indent);
+  return JSON.stringify(lockFile, null, indent) + '\n';
 }