diff --git a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs
index 42a56b649f035bdf10aa18099fe3851a3b5d238e..3d297af00f2f3e62fab5ccd9c81a5399236190ed 100644
--- a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs
+++ b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs
@@ -286,6 +286,7 @@ fn build_polkadot_full_node(
 			grandpa_pause: None,
 			// Disable BEEFY. It should not be required by the internal relay chain node.
 			enable_beefy: false,
+			force_authoring_backoff: false,
 			jaeger_agent: None,
 			telemetry_worker_handle,
 
diff --git a/polkadot/cli/src/cli.rs b/polkadot/cli/src/cli.rs
index e20e35c9103813e7884c2a56a9d9d82d061b8768..6a7a8b4ad7bbcd1cb0bc505692dbf995748de8a3 100644
--- a/polkadot/cli/src/cli.rs
+++ b/polkadot/cli/src/cli.rs
@@ -98,6 +98,10 @@ pub struct RunCmd {
 	#[arg(long)]
 	pub no_beefy: bool,
 
+	/// Enable the block authoring backoff that is triggered when finality is lagging.
+	#[arg(long)]
+	pub force_authoring_backoff: bool,
+
 	/// Add the destination address to the 'Jaeger' agent.
 	///
 	/// Must be valid socket address, of format `IP:Port` (commonly `127.0.0.1:6831`).
diff --git a/polkadot/cli/src/command.rs b/polkadot/cli/src/command.rs
index 2dcf5e0e8d7bf616d5c1eef3a775ddfa25d44721..c9c3c39aab1fd43a79b6023acc822ebefd781d0e 100644
--- a/polkadot/cli/src/command.rs
+++ b/polkadot/cli/src/command.rs
@@ -259,6 +259,7 @@ where
 				is_parachain_node: service::IsParachainNode::No,
 				grandpa_pause,
 				enable_beefy,
+				force_authoring_backoff: cli.run.force_authoring_backoff,
 				jaeger_agent,
 				telemetry_worker_handle: None,
 				node_version,
diff --git a/polkadot/node/service/src/lib.rs b/polkadot/node/service/src/lib.rs
index c03835b2a4b04c9aac9669402823b409000ae627..fafdc5860093b57399999dbb89937c51d0e739dc 100644
--- a/polkadot/node/service/src/lib.rs
+++ b/polkadot/node/service/src/lib.rs
@@ -625,6 +625,9 @@ pub struct NewFullParams<OverseerGenerator: OverseerGen> {
 	pub is_parachain_node: IsParachainNode,
 	pub grandpa_pause: Option<(u32, u32)>,
 	pub enable_beefy: bool,
+	/// Whether to enable the block authoring backoff on production networks
+	/// where it isn't enabled by default.
+	pub force_authoring_backoff: bool,
 	pub jaeger_agent: Option<std::net::SocketAddr>,
 	pub telemetry_worker_handle: Option<TelemetryWorkerHandle>,
 	/// The version of the node. TESTING ONLY: `None` can be passed to skip the node/worker version
@@ -716,6 +719,7 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
 		is_parachain_node,
 		grandpa_pause,
 		enable_beefy,
+		force_authoring_backoff,
 		jaeger_agent,
 		telemetry_worker_handle,
 		node_version,
@@ -733,15 +737,21 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
 	let is_offchain_indexing_enabled = config.offchain_worker.indexing_enabled;
 	let role = config.role.clone();
 	let force_authoring = config.force_authoring;
-	let backoff_authoring_blocks = {
+	let backoff_authoring_blocks = if !force_authoring_backoff &&
+		(config.chain_spec.is_polkadot() || config.chain_spec.is_kusama())
+	{
+		// the block authoring backoff is disabled by default on production networks
+		None
+	} else {
 		let mut backoff = sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging::default();
 
 		if config.chain_spec.is_rococo() ||
 			config.chain_spec.is_wococo() ||
-			config.chain_spec.is_versi()
+			config.chain_spec.is_versi() ||
+			config.chain_spec.is_dev()
 		{
-			// it's a testnet that's in flux, finality has stalled sometimes due
-			// to operational issues and it's annoying to slow down block
+			// on testnets that are in flux (like rococo or versi), finality has stalled
+			// sometimes due to operational issues and it's annoying to slow down block
 			// production to 1 block per hour.
 			backoff.max_interval = 10;
 		}
diff --git a/polkadot/node/test/service/src/lib.rs b/polkadot/node/test/service/src/lib.rs
index be2746daf32121651d7d5c1bbf395ff3e243976a..a8352b607517700007b3fc69b3f6673c500066c5 100644
--- a/polkadot/node/test/service/src/lib.rs
+++ b/polkadot/node/test/service/src/lib.rs
@@ -82,6 +82,7 @@ pub fn new_full(
 			is_parachain_node,
 			grandpa_pause: None,
 			enable_beefy: true,
+			force_authoring_backoff: false,
 			jaeger_agent: None,
 			telemetry_worker_handle: None,
 			node_version: None,
diff --git a/polkadot/parachain/test-parachains/adder/collator/src/main.rs b/polkadot/parachain/test-parachains/adder/collator/src/main.rs
index dfaa1973206c24b27f87cec591bd249c83754e43..1558df6708d1ef27367901ba4c3e0bc10dccb6d5 100644
--- a/polkadot/parachain/test-parachains/adder/collator/src/main.rs
+++ b/polkadot/parachain/test-parachains/adder/collator/src/main.rs
@@ -64,6 +64,7 @@ fn main() -> Result<()> {
 						),
 						grandpa_pause: None,
 						enable_beefy: false,
+						force_authoring_backoff: false,
 						jaeger_agent: None,
 						telemetry_worker_handle: None,
 
diff --git a/polkadot/parachain/test-parachains/undying/collator/src/main.rs b/polkadot/parachain/test-parachains/undying/collator/src/main.rs
index c6b338a20dc051f1a899a51eccb64a24a72663f5..1db1b6f1102e86d91465df872698f3973337fb83 100644
--- a/polkadot/parachain/test-parachains/undying/collator/src/main.rs
+++ b/polkadot/parachain/test-parachains/undying/collator/src/main.rs
@@ -84,6 +84,7 @@ fn main() -> Result<()> {
 						),
 						grandpa_pause: None,
 						enable_beefy: false,
+						force_authoring_backoff: false,
 						jaeger_agent: None,
 						telemetry_worker_handle: None,