diff --git a/lib/util/template/index.ts b/lib/util/template/index.ts
index 1e3ab8e9c9518288efd39b2fad1eed64040baa42..c7a4b453ed614709650dca72d59323fc61e34a40 100644
--- a/lib/util/template/index.ts
+++ b/lib/util/template/index.ts
@@ -147,6 +147,7 @@ export const exposedConfigOptions = [
   'semanticCommitType',
   'separateMajorMinor',
   'separateMinorPatch',
+  'sourceDirectory',
 ];
 
 export const allowedFields = {
diff --git a/lib/workers/repository/updates/flatten.spec.ts b/lib/workers/repository/updates/flatten.spec.ts
index 402efb5d6833b2e64326af96883a6dca210a81b6..42cd3a7b3b6fe7ef5cdea73af0d7b717572eeec0 100644
--- a/lib/workers/repository/updates/flatten.spec.ts
+++ b/lib/workers/repository/updates/flatten.spec.ts
@@ -29,6 +29,11 @@ describe('workers/repository/updates/flatten', () => {
             enabled: false,
           },
         },
+        {
+          matchPackageNames: ['@monorepo/package'],
+          sourceUrl: 'https://github.com/some/monorepo',
+          sourceDirectory: "subfolder/{{ lookup (split packageName '/') 1 }}",
+        },
       ];
       config.remediations = {
         'package-lock.json': [
@@ -65,6 +70,17 @@ describe('workers/repository/updates/flatten', () => {
                   },
                 ],
               },
+              {
+                depName: '@monorepo/package',
+                updates: [
+                  {
+                    newValue: '2.0.0',
+                    sourceUrl: 'https://github.com/some/monorepo',
+                    sourceDirectory:
+                      "subfolder/{{ lookup (split depName '/') 1 }}",
+                  },
+                ],
+              },
               {
                 updateTypes: ['pin'],
                 updates: [{ newValue: '2.0.0' }],
@@ -144,7 +160,7 @@ describe('workers/repository/updates/flatten', () => {
         ],
       };
       const res = await flattenUpdates(config, packageFiles);
-      expect(res).toHaveLength(14);
+      expect(res).toHaveLength(15);
       expect(
         res.every(
           (upgrade) =>
@@ -178,16 +194,29 @@ describe('workers/repository/updates/flatten', () => {
         res.filter((update) => update.sourceRepoName)[1].sourceRepoName,
       ).toBe('repo');
       expect(
-        res.filter((update) => update.sourceRepoSlug)[2].sourceRepoSlug,
+        res.filter((update) => update.depName === '@monorepo/package')[0],
+      ).toEqual(
+        expect.objectContaining({
+          depName: '@monorepo/package',
+          sourceRepoOrg: 'some',
+          sourceRepoName: 'monorepo',
+          sourceRepo: 'some/monorepo',
+          sourceRepoSlug: 'some-monorepo',
+          sourceUrl: 'https://github.com/some/monorepo',
+          sourceDirectory: 'subfolder/package',
+        }),
+      );
+      expect(
+        res.filter((update) => update.sourceRepoSlug)[3].sourceRepoSlug,
       ).toBe('nodejs-node');
-      expect(res.filter((update) => update.sourceRepo)[2].sourceRepo).toBe(
+      expect(res.filter((update) => update.sourceRepo)[3].sourceRepo).toBe(
         'nodejs/node',
       );
       expect(
-        res.filter((update) => update.sourceRepoOrg)[2].sourceRepoOrg,
+        res.filter((update) => update.sourceRepoOrg)[3].sourceRepoOrg,
       ).toBe('nodejs');
       expect(
-        res.filter((update) => update.sourceRepoName)[2].sourceRepoName,
+        res.filter((update) => update.sourceRepoName)[3].sourceRepoName,
       ).toBe('node');
       expect(
         res.filter(
diff --git a/lib/workers/repository/updates/flatten.ts b/lib/workers/repository/updates/flatten.ts
index 1ff393b4abeff8b7eb2313661391bbb0d8298f09..93b1d51c8556c48307fea4232b84b74c356016fd 100644
--- a/lib/workers/repository/updates/flatten.ts
+++ b/lib/workers/repository/updates/flatten.ts
@@ -9,6 +9,7 @@ import { get } from '../../../modules/manager';
 import { detectSemanticCommits } from '../../../util/git/semantic';
 import { applyPackageRules } from '../../../util/package-rules';
 import { regEx } from '../../../util/regex';
+import * as template from '../../../util/template';
 import { parseUrl } from '../../../util/url';
 import type { BranchUpgradeConfig } from '../../types';
 import { generateBranchName } from './branch-name';
@@ -57,6 +58,12 @@ export function applyUpdateConfig(input: BranchUpgradeConfig): any {
       ); // remove everything up to the last slash
     }
   }
+  if (updateConfig.sourceDirectory) {
+    updateConfig.sourceDirectory = template.compile(
+      updateConfig.sourceDirectory,
+      updateConfig,
+    );
+  }
   generateBranchName(updateConfig);
   return updateConfig;
 }