Key takeaways
- On flat ground the backtracked angle is the sun-facing angle ω minus arccos(cos ω ÷ GCR), once cos ω falls below GCR. pvlib and NLR (formerly NREL) give the same rule.
- In our illustrative case (GCR 0.35, 60° limit) the sun-facing angle at 7:00 is 78.4° and the row sits at 23.5°. A row held at the 60° limit would be 39.5% shaded.
- Backtracking’s benefit is even light across the row, which limits string mismatch. For direct beam on endless flat rows, the sunlit beam per square metre is cos ω ÷ GCR with or without it. Electrical mismatch is the difference.
- At GCR 0.35 the correction is active in 26.8% of daylight hours in Phoenix and 29.8% in Des Moines. Only 5.9% and 8.1% of annual GHI falls in those hours (modelled).
- SAM, pvlib, HelioScope and PVsyst document backtracking. The PVcase help page cited below does not mention it.
To model backtracking in software, see best solar simulation software.
Backtracking at a glance
Backtracking ties a tracker’s morning and evening angle to row spacing. A tighter GCR means the rows must lie flatter, earlier in the day.
| Item | Detail |
|---|---|
| Formula (flat ground) | θ = ω − sign(ω) × arccos(|cos ω| ÷ GCR) when |cos ω| < GCR. Otherwise θ = ω. ω is the sun-facing (true-tracking) angle. |
| Starts when | The sun-facing angle passes arccos(GCR): 75.5° at GCR 0.25, 69.5° at 0.35, 63.3° at 0.45 and 53.1° at 0.60. |
| Inputs | GCR, sun position, rotation limit, axis tilt and cross-axis slope. |
| Standard or rule | No standard. The equation comes from Lorenzo and co-authors (2011), NLR (formerly NREL) reports (2013, 2020) and the pvlib code. |
| In software | SAM, pvlib, HelioScope and PVsyst document it (Table 3). |
Why does backtracking matter for designers?
It decides how much shade a tracker row takes in the first and last hours of the day. If the controller and the energy model use different GCRs, the model no longer matches the plant.
Pitch fixes GCR. See ground coverage ratio and row spacing and pitch. Partial shade also drives string losses. See mismatch loss.
Figure 1. At GCR 0.35 the row sits at 23.5° at 7:00 while the sun-facing angle is 78.4°. The correction is active in 27% to 30% of daylight hours but only 6% to 8% of GHI.
How is the backtracking angle calculated?
Find the sun-facing angle, test it against GCR, then back off by arccos(cos ω ÷ GCR). pvlib’s tracking.singleaxis does this. NLR’s (formerly NREL) 2020 report gives the same flat-ground equation (cos θc = cos θT ÷ GCR) and credits Lorenzo and co-authors (2011).
- Find ω. This is the sun’s direction projected onto the plane across the axis. pvlib calls it the projected solar zenith angle. For a north-south axis, tan ω = east component ÷ up component of the sun’s direction.
- Test it. Compute cos ω ÷ GCR. At 1 or above the rows do not shade, so θ = ω.
- Back off. Below 1, θ = ω − sign(ω) × arccos(cos ω ÷ GCR).
- Apply the limit. pvlib clips θ to max_angle after the correction.
- Check for shade. The rows are shade-free when GCR × cos(θ − ω) ≤ cos ω.
The check is our derivation. Seen along the sun’s rays, a row of width ℓ looks ℓ × cos(θ − ω) wide. The ray lines through neighbouring axes are p × cos ω apart. Equal widths give the tangent case NREL describes: one row’s shadow just reaches the next row’s lower edge. Setting θ = ω gives cos ω = GCR, so backtracking starts at arccos(GCR). The GCR page gives the same threshold as sin(sun angle) = GCR.
In pvlib 0.16.1, tracking.singleaxis sets backtrack to True by default and gcr to 2/7 if you give none. The docs say GCR must be at or below 1. With axis azimuth 180° it returns a negative angle for a sun in the east. We print east as positive.
Worked example: a morning at 40°N, GCR 0.35
At 7:00 the sun-facing angle is 78.4°, so the row backtracks to 23.5° instead. Without backtracking the limit would hold it at 60° and shade 39.5% of it. All inputs are illustrative: latitude 40°N, equinox (declination 0°), solar time, flat ground, 60° limit.
Table 1. Morning rotation with GCR 0.35 and a 60° limit (east positive).
| Solar time (sun elevation) | Sun-facing angle ω | Backtracking angle | Shaded without backtracking |
|---|---|---|---|
| 6:30 (sun at 5.7°) | 84.2° | 10.9° | 68.6% |
| 7:00 (sun at 11.4°) | 78.4° | 23.5° | 39.5% |
| 7:30 (sun at 17.0°) | 72.4° | 42.2° | 11.5% |
| 8:00 (sun at 22.5°) | 66.1° | 60.0° | 0.0% |
| 8:30 (sun at 27.8°) | 59.6° | 59.6° | 0.0% |
| 9:00 (sun at 32.8°) | 52.5° | 52.5° | 0.0% |
| 10:00 (sun at 41.6°) | 37.0° | 37.0° | 0.0% |
The last column holds the row at the 60° limit. The ratio cos ω ÷ GCR is 0.287 at 6:30, 0.864 at 7:30, 1.156 at 8:00, 1.448 at 8:30, 1.737 at 9:00 and 2.282 at 10:00. Backtracking applies only while it is below 1.
The 7:00 row by hand:
- The hour angle is −75° (15° per hour before noon).
- With declination 0°, tan ω = tan 75° ÷ cos 40° = 4.872, so ω = 78.4°.
- Then cos ω = 0.2011, and 0.2011 ÷ 0.35 = 0.5745, which is below 1.
- The correction is arccos(0.5745) = 54.9°. So θ = 78.4° − 54.9° = 23.5°.
The check passes with equality: 0.35 × cos(54.9°) = 0.2011 = cos ω. The onset is arccos(0.35) = 69.5°, so backtracking starts at about 7:44 solar time. At 8:00 the 60° limit has already pulled the row off the sun, and the rows still clear. In the tested cases, the rotation limit did not add shade in this flat-ground geometry.
We checked the example against pvlib and a ray-casting test, and both agree. The checks are listed under Sources.
Backtracking angle calculator
Enter GCR, rotation limit and either the sun-facing angle or a latitude, declination and solar time. It returns the backtracking angle, the shaded share without backtracking and a shade-free check. The first preset reproduces the 7:00 row of Table 1, and the table under it reproduces the rest.
Does backtracking change energy yield?
For endless flat rows and direct beam alone, backtracking and a self-shading row collect the same per square metre of row. The gain is even light, which protects strings. While rows would shade, that beam is cos ω ÷ GCR. At 7:00 that is 0.574 either way.
Ray casting matched this in 296 cases to 0.0002. So an irradiance-only model shows a small yearly effect. The single-axis tracker page has the pvlib run. Electrical loss is the reason to backtrack. NLR’s (formerly NREL) 2020 report says it matters most for conventional crystalline modules, where shade on a few cells causes mismatch. Sandia’s PVPMC page says crystalline modules lose power non-linearly when shaded.
How much of the year is affected? Table 2 counts hours when the correction is non-zero, ignoring the rotation limit. It uses the two NSRDB typical-year files from the single-axis page. They hold 4,437 (Phoenix) and 4,436 (Des Moines) daylight hours. The data are modelled, not measured.
Table 2. Share of the year with backtracking active (modelled).
| Site | GCR | Daylight hours | Annual GHI | Annual DNI |
|---|---|---|---|---|
| Phoenix | 0.35 | 26.8% | 5.9% | 13.3% |
| Phoenix | 0.60 | 47.1% | 21.6% | 33.8% |
| Des Moines | 0.35 | 29.8% | 8.1% | 16.3% |
| Des Moines | 0.60 | 50.3% | 25.0% | 37.2% |
These are shares of light that arrives while backtracking is on, not losses. Run an energy yield simulation with the same GCR to size any effect.
Where does the flat-ground formula stop working?
On sloped sites. Standard backtracking assumes level ground, and pvlib’s cross_axis_tilt input adjusts it for a slope across the rows. NLR’s (formerly NREL) 2020 report is titled Slope-Aware Backtracking for Single-Axis Trackers.
Soltec’s whitepaper (16 December 2020) says standard backtracking ignores slopes, which can cause shading or misorientation losses. A DNV and Nevados talk at PVPMC (9 May 2024) compared standard, planar slope-aware and custom rotation schedules on 3D terrain. In both case studies custom schedules brought mismatch loss to about flat-site levels. They raised normalised generation by 0.31% and 0.73% against a flat reference. Case B was a fictitious project, and the schedules are Nevados’s product. See topography and terrain modelling.
How solar software handles backtracking
Four of the six tools document backtracking: SAM, pvlib, HelioScope and PVsyst. The PVcase help page cited here does not mention it. SAM and pvlib expose a rotation limit and GCR as inputs. HelioScope keeps its toggle in the Condition Set. Ranked options are in best solar simulation software.
Table 3. Backtracking in six tools, checked 27 October 2026.
| Software | Backtracking documented? |
|---|---|
| SAM | Yes |
| pvlib python | Yes |
| HelioScope | Yes |
| PVsyst | Yes |
| PVcase Ground Mount | Not stated |
| Solargis climData | Partly |
Not stated: the company page we cite does not say. Partly: only a company blog post mentions it. What each page says:
- SAM. It lists GCR and a one-axis rotation limit as inputs. SAM help, PV system design (no date printed): "Backtracking is a one-axis tracking strategy that avoids row-to-row shading."
- pvlib python. A code library. tracking.singleaxis (0.16.1) has backtrack, gcr and max_angle inputs. The page says backtrack "Controls whether the tracker has the capability to “backtrack” to avoid row-to-row shading."
- HelioScope. Help article (19 September 2025): single-axis trackers are an Enterprise-plan feature. Backtracking, "flattening out when the sun is low to avoid shading adjacent rows", is a toggle in the Condition Set’s Trackers tab. It is not shown in the designer.
- PVsyst. PVsyst 8 help, Tracking strategies (no date printed): "The backtracking strategy aims to avoid mutual shadings between trackers in the morning and the evening."
- PVcase Ground Mount. The single-axis layout article (updated 13 October 2026) sets a turning-angle range and pitch. It does not mention backtracking or GCR.
- Solargis climData. A company blog (13 February 2018) describes a 3D tool with rotation limits and a way to "enable/disable backtracking". It is a blog, not a help page.
Common mistakes with backtracking
FAQs
What is the difference between backtracking and true tracking?
True tracking points the row straight at the sun all day. Backtracking does the same until cos ω drops below GCR. Then it turns the row flatter, so the shadow stops at the edge of the next row.
At what sun angle does backtracking start?
When the sun-facing rotation passes arccos(GCR). That is 75.5° at GCR 0.25 and 63.3° at 0.45. The tighter the rows, the earlier it starts. Before that angle the rows do not shade, so the tracker simply faces the sun.
Does backtracking increase energy yield?
It barely changes annual irradiance. Its benefit is less shade mismatch on strings. In our endless-row geometry it collects the same direct beam per square metre as a row that follows the sun and shades itself. That is a geometry result, not a yield claim.
Can backtracking be switched off?
Yes. In pvlib set backtrack to False, and HelioScope has a toggle in the Condition Set’s Trackers tab. Switching it off lets rows shade each other at low sun, so test both settings against your string layout.
Related terms
- Single-axis tracker: a mount that turns modules about one axis.
- Solar tracker: a mount that moves modules to follow the sun.
- Ground coverage ratio: module area divided by the ground area allotted to it.
- pvlib python: the open-source library whose tracking code is used here.
Next step: to compare tools that model backtracking, read the best solar simulation software list, or the best utility-scale solar design software list for large sites.
Sources
All sources checked 27 October 2026.
- Formula. pvlib tracking.singleaxis (0.16.1). pvlib tracking source (0.16.2.dev13). NREL/TP-5K00-76626, Slope-Aware Backtracking for Single-Axis Trackers (July 2020). Marion, NREL/TP-6A20-58891 (2013).
- Effects. Sandia PVPMC, single axis tracking (updated 19 April 2024). Soltec whitepaper (16 December 2020, page removed by November 2026, read via web archive). DNV and Nevados, PVPMC (9 May 2024).
- Tools. SAM help, PV system design. HelioScope, Single-Axis Trackers. PVsyst, Tracking strategies. PVcase, single-axis layout. Solargis, tracker configurator (2018).
- Model. pvlib and NSRDB typical-year files as on the single-axis tracker page.
- Checks run: our own scripts compared sun angles with pvlib (within 0.25°) and compared the formula with pvlib’s output. A separate ray-casting test agreed on shade.
Last updated 30 October 2026. Next scheduled review: 30 January 2027.