diff --git a/lib/manager/npm/post-update/pnpm.spec.ts b/lib/manager/npm/post-update/pnpm.spec.ts
index 0c2991a4019d61c2d52611e6a975dd415687d43f..ce28dd90ef07340ec2b2c860cdc7c55759c9ffe6 100644
--- a/lib/manager/npm/post-update/pnpm.spec.ts
+++ b/lib/manager/npm/post-update/pnpm.spec.ts
@@ -20,7 +20,7 @@ delete process.env.NPM_CONFIG_CACHE;
 describe('generateLockFile', () => {
   let config: PostUpdateConfig;
   beforeEach(() => {
-    config = { cacheDir: 'some-cache-dir' };
+    config = { cacheDir: 'some-cache-dir', compatibility: { pnpm: '^2.0.0' } };
     env.getChildProcessEnv.mockReturnValue(envMock.basic);
   });
   it('generates lock files', async () => {
diff --git a/lib/manager/npm/post-update/pnpm.ts b/lib/manager/npm/post-update/pnpm.ts
index bec674a9b45c40cd15aa53da3372be6f0d6b792f..c3ea7793071d55892bcb8588973449777c025836 100644
--- a/lib/manager/npm/post-update/pnpm.ts
+++ b/lib/manager/npm/post-update/pnpm.ts
@@ -1,4 +1,6 @@
 import { readFile } from 'fs-extra';
+import { validRange } from 'semver';
+import { quote } from 'shlex';
 import { join } from 'upath';
 import { logger } from '../../../logger';
 import { ExecOptions, exec } from '../../../util/exec';
@@ -23,7 +25,12 @@ export async function generateLockFile(
   let stderr: string;
   let cmd = 'pnpm';
   try {
-    const preCommands = ['npm i -g pnpm'];
+    let installPnpm = 'npm i -g pnpm';
+    const pnpmCompatibility = config.compatibility?.pnpm;
+    if (validRange(pnpmCompatibility)) {
+      installPnpm += `@${quote(pnpmCompatibility)}`;
+    }
+    const preCommands = [installPnpm];
     const tagConstraint = await getNodeConstraint(config);
     const execOptions: ExecOptions = {
       cwd,