diff --git a/packages/flutter_tools/lib/src/windows/build_windows.dart b/packages/flutter_tools/lib/src/windows/build_windows.dart
index c614c64b4e9f6..d82c68345c94b 100644
--- a/packages/flutter_tools/lib/src/windows/build_windows.dart
+++ b/packages/flutter_tools/lib/src/windows/build_windows.dart
@@ -21,6 +21,7 @@ import '../flutter_plugins.dart';
 import '../globals.dart' as globals;
 import '../migrations/cmake_custom_command_migration.dart';
 import '../migrations/cmake_native_assets_migration.dart';
+import '../shorebird/shorebird_yaml.dart';
 import 'migrations/build_architecture_migration.dart';
 import 'migrations/show_window_migration.dart';
 import 'migrations/version_migration.dart';
@@ -127,6 +128,21 @@ Future<void> buildWindows(
     'Built ${globals.fs.path.relative(buildOutput.path)}',
     color: TerminalColor.green,
   );
+  final File shorebirdYamlFile = buildDirectory
+    .childDirectory('runner')
+    .childDirectory(sentenceCase(buildModeName))
+    .childDirectory('data')
+    .childDirectory('flutter_assets')
+    .childFile('shorebird.yaml');
+
+  if (shorebirdYamlFile.existsSync()) {
+    try {
+      updateShorebirdYaml(buildInfo, shorebirdYamlFile.path, environment: globals.platform.environment);
+    } on Exception catch (error) {
+      globals.printError('[shorebird] failed to generate shorebird configuration.\n$error');
+      throw Exception('Failed to generate shorebird configuration');
+    }
+  }
 
   if (buildInfo.codeSizeDirectory != null && sizeAnalyzer != null) {
     final String arch = getNameForTargetPlatform(targetPlatform);
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart
index 8a317a99b2036..5370d475ccdb3 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart
@@ -37,6 +37,15 @@ final Platform windowsPlatform = FakePlatform(
     'USERPROFILE': '/',
   }
 );
+final Platform windowsPlatformWithPublicKey = FakePlatform(
+  operatingSystem: 'windows',
+  environment: <String, String>{
+    'PROGRAMFILES(X86)':  r'C:\Program Files (x86)\',
+    'FLUTTER_ROOT': flutterRoot,
+    'USERPROFILE': '/',
+    'SHOREBIRD_PUBLIC_KEY': 'my_public_key',
+  }
+);
 final Platform notWindowsPlatform = FakePlatform(
   environment: <String, String>{
     'FLUTTER_ROOT': flutterRoot,
@@ -1069,6 +1078,39 @@ No file or variants found for asset: images/a_dot_burr.jpeg.
     Platform: () => windowsPlatform,
     FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true),
   });
+
+  testUsingContext(
+      'shorebird.yaml is updated when SHOREBIRD_PUBLIC_KEY env var is set',
+      () async {
+    final FakeVisualStudio fakeVisualStudio = FakeVisualStudio();
+    final BuildWindowsCommand command = BuildWindowsCommand(
+        logger: BufferLogger.test(),
+        operatingSystemUtils: FakeOperatingSystemUtils())
+      ..visualStudioOverride = fakeVisualStudio;
+    setUpMockProjectFilesForBuild();
+    final File shorebirdYamlFile = fileSystem.file(
+      r'build\windows\x64\runner\Release\data\flutter_assets\shorebird.yaml',
+    )
+      ..createSync(recursive: true)
+      ..writeAsStringSync('app_id: my-app-id');
+
+    processManager = FakeProcessManager.list(<FakeCommand>[
+      cmakeGenerationCommand(),
+      buildCommand('Release'),
+    ]);
+
+    await createTestCommandRunner(command)
+        .run(const <String>['windows', '--release', '--no-pub']);
+
+    final String updatedYaml = shorebirdYamlFile.readAsStringSync();
+    expect(updatedYaml, contains('app_id: my-app-id'));
+    expect(updatedYaml, contains('patch_public_key: my_public_key'));
+  }, overrides: <Type, Generator>{
+    FileSystem: () => fileSystem,
+    ProcessManager: () => processManager,
+    Platform: () => windowsPlatformWithPublicKey,
+    FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true),
+  });
 }
 
 class FakeVisualStudio extends Fake implements VisualStudio {