P0128: Coolant Thermostat Below Regulating Temperature
P0128 Code: Coolant Thermostat Too Cold - Causes & Fixes. See symptoms, common causes, urgency and practical checks before parts are replaced.

Save all codes and freeze-frame data. The code tells you what the control module detected, not which component must be replaced.
Quick answer
P0128 code means your engine's coolant thermostat is stuck open or malfunctioning, preventing the engine from reaching its normal operating temperature. The ECM detects this when the coolant temperature remains below the expected regulating threshold for an extended period.
Why P0128 Triggers: Coolant Thermostat Below Regulating Temperature
The P0128 code is set when the Engine Control Module (ECM) observes that the engine coolant temperature (ECT) sensor reading stays abnormally low for a prolonged time after startup. This typically happens because the thermostat; a wax pellet or electronically controlled valve; fails to close properly, allowing coolant to circulate continuously through the radiator. As a result, the engine struggles to warm up, and the ECM interprets this as a thermostat that's stuck open or otherwise not regulating temperature as designed.
The ECM monitors the ECT sensor (usually a two-wire thermistor) and compares its data against expected warmth-up curves. In most vehicles, the ECM expects the engine to reach around 160-200°F (71-93°C) within a set timeframe (often 5-10 minutes, depending on ambient temperature). If the temperature stays below a calibrated threshold; commonly around 140-160°F (60-71°C) for more than a few minutes; the P0128 code is triggered. Some vehicles also factor in intake air temperature (IAT) and engine load to refine the diagnosis.
It's important to note that the code doesn't always mean the thermostat itself is faulty. A defective ECT sensor, wiring issues in the sensor circuit, or even low coolant levels can also cause the ECM to misread the temperature. However, in the vast majority of P0128 cases, the thermostat is the culprit, especially if the engine consistently runs cold or takes excessively long to warm up. The ECM's logic prioritizes this code because an engine that never reaches proper operating temperature can lead to increased emissions, poor fuel economy, and long-term wear due to incomplete fuel combustion and excessive condensation in the oil.
Mechanically, a stuck-open thermostat bypasses the normal restriction that allows the engine to heat up quickly. Coolant flows freely through the radiator at all times, dissipating heat too efficiently. This can also cause the heater core to blow cold air, as the coolant never gets hot enough to transfer heat into the cabin. The ECM may also adjust fuel delivery and ignition timing to compensate for the perceived cold conditions, which can reduce performance and increase fuel consumption.
Common Symptoms of P0128
Drivers often notice the temperature gauge staying on the cold side or the heater failing to produce warm air. Poor fuel economy and a rough idle may also occur as the ECM over-fuels the engine to compensate for the perceived cold state.
How to Diagnose P0128
Diagnosis usually starts with verifying the ECT sensor reading with a scan tool to confirm the engine isn't warming up. Checking the thermostat's operation; either by testing it in hot water or inspecting it visually; can confirm if it's stuck open. A visual inspection of the coolant level and condition is also wise, as low coolant can mimic thermostat issues.
Can You Still Drive With Code P0128?
You can usually drive with P0128 in the short term, but it's not advisable long-term. The engine may run inefficiently, leading to increased fuel consumption and potential long-term damage from condensation buildup in the oil. If the vehicle overheats or shows other warning signs, stop driving immediately.
Details that improve the diagnosis
Compare the reported value with engine temperature, barometric pressure, throttle position and related sensors. A signal that is electrically valid can still be implausible. Fuel trims at idle and at a steady higher speed help separate an intake leak from a fuel-delivery or measurement problem.
Before clearing anything, record whether the code is current, pending, history or permanent. Save companion codes and freeze-frame conditions, then note recent repairs, a weak battery, weather changes and the exact moment the symptom appears. After a confirmed repair, clear only the erasable codes and complete the appropriate drive cycle. A permanent code normally clears only after the onboard monitor verifies that the fault is gone.
Related trouble codes
Information to record before any repair
Write down the exact code, its status and every companion code reported by a complete vehicle scan. Save the freeze-frame values, including engine speed, load, coolant temperature, vehicle speed, battery voltage and fuel trims when available. Note whether the warning appeared during a cold start, at idle, under acceleration, after refueling, in wet weather or immediately after other work. These details help separate an intermittent electrical problem from a repeatable mechanical or operating-condition fault.
Identify the exact year, make, model, engine, transmission and market version before using a wiring diagram or specification. Connector pinouts, monitor thresholds, component locations and test procedures can change within the same model line. Check current manufacturer service information and relevant technical service bulletins. A bulletin can improve the test sequence, but it should not be treated as proof that the same fault exists on every vehicle.
How to verify the repair
A warning light that stays off immediately after codes are cleared does not by itself confirm a repair. Recheck live data, repeat the operating condition that originally set the code when it is safe to do so, and confirm that no pending code returns. Some monitors need a specific drive cycle before they run. Permanent codes are normally removed by the control module only after it sees enough successful monitor results. If symptoms remain or the code returns, continue testing instead of replacing another part by guesswork.