Why the SGP41 Can't Measure Ambient NOx

Ethan Brooke
July 7, 2026

We recently published an article looking at how the SGP41's NOx index performs indoors. The short version was that it detects events well enough, but it struggles to put a reliable number on them. However, the results were interesting enough that we wanted to add a second part to the series series: how the same sensor holds up outdoors, in ambient air.

Before discussing the results, however, I want to mention a few caveats, as they matter even more here than they did indoors. Sensirion is clear that the SGP41 is an indoor sensor, built for air treatment and ventilation control rather than ambient monitoring. The datasheet backs that up with numbers, as the specified range for NO2 is 50 to 650 ppb, and the limit of detection sits around 20 ppb. Outdoor air usually sits below both.

With that said, we were curious anyway. The SGP41, and the SEN6x modules built on the same technology, turn up in plenty of monitors that get used outdoors, or that report a NOx figure people take at face value. So whether or not it's the intended use, it's worth knowing what the sensor actually does out there. For that reason, and to fully understand our own monitor's performance, we conducted a few tests and today I want to share the results with you.

Our Results

At risk of spoiling the whole article, it's clear that outdoors is where the SGP41 really struggles, and it struggles consistently. We compared its index and raw outputs against co-located reference NO2 measurements, using data from EMPA in Switzerland and Cambridge University in the UK. The headline is that there's no relationship between either output (raw or the index) and the reference NO2. Both often move opposite to the real signal, rising when reference NOx is falling or absent, and staying flat when it actually spikes.

Figure 1
Figure 1

Figure 1 stacks the index from one SGP41 sensor (blue) over the reference NOx (red) for the same week. The reference is normal ambient air, mostly sitting between 0 and 40 ppb, under the sensor's 50 ppb range the whole time. The index pays it no attention and, as the labels show, it climbs when the reference NOx is falling or absent altogether, and sits flat through the stretches when the reference is actually rising. There's no point where the two line up.

Figure 2
Figure 2

Comparing a different SGP41’s output highlights a reproducibility problem. Sensor b20 (Figure 1) produces rounded humps reaching about 20, while e58 (Figure 2) stays flat for days then fires a cluster of sharp spikes past 350, none of which match the reference's own peaks back around May 14. So outdoors the index neither follows real NOx nor agrees with itself between units.

Figure 3
Figure 3

We had a third SGP41 at the colocation site, so we added that to the comparison and found that f48 and b20 moved with the same rounded humps rising and falling at the same times around May 15 and May 17, with f48 reaching about 50 and b20 about 20. e58 again does its own thing, sitting flat then firing sharp spikes. The part that caught our attention is that two of the three agree this closely. Two units rising and falling together at the same moments doesn't look like random drift, it looks like they're both reacting to something. Since it clearly isn’t NOx, the question became what.

Figure 4
Figure 4

So, we started ruling things out. Figure 4 shows the NOx index and reference concentration up against O3 - a common cross-sensitivity - and there's no match. The index humps on May 15 and 17 don't follow O3, which runs on its own daily cycle peaking around 50 to 60 ppb. We checked temperature and relative humidity too, with the same result, no relation to either.

figure 4
figure 4

Since the raw signal was able to show trends better than the index indoors, Figure 4 goes further and looks at the raw signal directly, over a longer stretch, in case the algorithm was masking something underneath. It wasn't. The raw b20 signal drifts up and down across the month without tracking the reference NOx spikes below it. So whatever is moving these sensors, it isn't the reference NOx, and it isn't O3, temperature, or humidity. None of the usual suspects fit.

Figure 5
Figure 5

Finally, we checked reproducibility in the raw signals by pulling data from two colocated sensors in Cambridge. Figure 5 shows the raw NOx signal from these two SGP41 sensors over a week in October, and the two traces barely resemble each other. SGP5 (blue) swings sharply and erratically between about 18,000 and 40,000 ticks, while SGP6 (green) stays smooth, drifting gently between 20,000 and 26,000. The two don't agree on the raw signal, or, when we checked, on the index either.

Interestingly, in the EMPA colocation, the trends from the three SGP41 sensors better agreed than in Cambridge, but e58 still showed a very different index output. However, the reproducibility from the raw signal was still not what we would consider good.

Conclusion

Put simply, the SGP41 doesn't work outdoors at typical ambient concentrations. The index shows no relationship to real NOx, and none of the usual suspects, O3, temperature or humidity, explain what it's doing instead. Even the raw signal, which tracked events reasonably well indoors, falls apart out here. It doesn't follow the reference, and it doesn't stay consistent from one sensor to the next.

None of this is a knock on Sensirion. The company is clear that this is an indoor sensor, and ambient outdoor air sits well below the range it's built for. We ran the tests because these sensors sit inside our own monitors, and we'd rather know exactly where they can and can't be trusted than assume. If you want to see how the same sensor performs in the conditions it was actually designed for, our indoor testing is here.

Open and Accurate Air Quality Monitors
This is an Ad for our Own Product

Open and Accurate Air Quality Monitors

We design professional, accurate and long-lasting air quality monitors that are open-source and open-hardware so that you have full control on how you want to use the monitor.

Learn More

Your are being redirected to AirGradient Dashboard...