Skip to main content

KiCad zone not filling, or filling wrong: out-of-date fills, priority, thermal reliefs and islands

A copper zone in KiCad is an outline plus a fill, and the fill is a snapshot KiCad computes when you ask it to. Most zone problems come from that snapshot: it is older than the board, two zones disagree about who owns an area, a pad cannot be reached by enough spokes, or a keepout leaves a piece of copper on its own. Each case below was built on a real KiCad 9 board and run through KiCad’s own design rules check.

Last reviewed

Short answer

Press B (Edit → Fill All Zones) after any change, and tick “Refill all zones before performing DRC”: a stale fill shows up as clearance and solder mask errors that vanish on refill. If two pours overlap, give the one that should win a higher priority; at equal priority the winner is not yours to choose, and DRC does not complain. A “Thermal relief connection to zone incomplete” error means fewer spokes reach the pad than the zone requires (two by default). “Missing connection between items” between two pieces of the same zone means a keepout or a track cut the pour in two: join the pieces with a via or a track.

“Zone fills are out of date”: the fill is a snapshot

KiCad does not refill zones as you work. It fills them when you press B (Edit → Fill All Zones), when DRC runs with “Refill all zones before performing DRC” ticked, or when it asks “Zone fills are out-of-date. Refill?” and you say yes. Between those moments, the copper you see is whatever was filled last.

To see what that costs, the test board was filled, then the decoupling capacitor C1 was moved 2 mm and the board saved without refilling. KiCad 9.0.9’s DRC on that file:

[clearance]: Clearance violation (zone clearance 0.3000 mm; actual 0.0000 mm)
    @(123.2250 mm, 103.0000 mm): Pad 1 [+3V3] of C1 on F.Cu
    @(100.4000 mm, 100.4000 mm): Zone [GND] on F.Cu, priority 0
[solder_mask_bridge]: Front solder mask aperture bridges items with different nets
    @(123.2250 mm, 103.0000 mm): Pad 1 [+3V3] of C1 on F.Cu
    @(100.4000 mm, 100.4000 mm): Zone [GND] on F.Cu, priority 0
[track_dangling]: Track has unconnected end
    @(105.0000 mm, 105.0000 mm): Track [+3V3] on F.Cu, length 18.2250 mm
** Found 1 unconnected pads **

The first two errors are the old fill: the ground pour still has copper where C1’s +3V3 pad now sits. After a refill both disappear, and what remains is the real problem, the +3V3 track that still ends where C1 used to be. Refill first, then read the report; a stale fill hides real errors behind false ones.

Gerbers come from the saved fill too

Plotted copper is the fill saved in the file, so refill before plotting.

Running DRC from the command line

In a script or CI job, kicad-cli pcb drc checks the board as saved. Version 9.0.9 has no option to refill first, so the stale board above fails the same way on the command line. Refill with pcbnew’s Python API before the check:

import sys, pcbnew
b = pcbnew.LoadBoard(sys.argv[1])
pcbnew.ZONE_FILLER(b).Fill(b.Zones())
pcbnew.SaveBoard(sys.argv[1], b)

That is the script used for every board on this page, and running it on the stale board cleared the two fill errors.

Two pours over one area: zone priority

A common layout puts a +3V3 pour over part of the board and a ground pour over all of it. Where they overlap, KiCad fills the higher-priority zone first and makes the other flow around it. With both at the default priority, nothing says which comes first.

The test board was built ten times from the same script, with a +3V3 pour over the left half and a ground pour over the whole board, both at priority 0. In seven builds +3V3 filled its half (246.5 mm²). In three, the ground pour took the overlap and +3V3 was left with 4.8 mm². DRC reported 0 violations on both outcomes: neither is a rule error, so nothing tells you which one you got.

Top copper of a 30 × 20 mm KiCad 9 board. A +3V3 pour is drawn over the left half (orange dashed outline) and a GND pour over the whole board (green dashed outline), both at priority 0. The fill is green almost everywhere: GND took the left half.
Two pours at the same priority: +3V3 over the left half (orange dashes), GND over the whole board (green dashes). In this build GND took the overlap and +3V3 kept 4.8 mm². In seven of ten builds of the same board, +3V3 filled its half instead. KiCad 9.0.9’s DRC reported 0 violations on both outcomes.

Setting the +3V3 pour to priority 1 made the result the same on every build:

The same board with the +3V3 pour at priority 1: the left half fills with +3V3 copper and the GND pour fills the right half, with a clearance gap between them
The same board with the +3V3 pour at priority 1. It fills its half (246.5 mm²) on every build, and the GND pour flows around it.

Set priority in the Zone Manager, which lists every zone in priority order and moves a zone up or down. Any two zones of different nets that overlap on one layer should have different priorities. Then refill and look at the result layer by layer.

“Thermal relief connection to zone incomplete”

A pad in a pour normally joins it through thermal relief spokes: a gap around the pad, bridged by narrow copper, so the pad can be soldered without the pour soaking up the heat. KiCad checks that enough spokes actually reach copper. By default a zone requires two.

On the test board, a no-fill area around the header’s ground pad leaves only one way in. KiCad 9.0.9 reports it on both layers:

[starved_thermal]: Thermal relief connection to zone incomplete (layer F.Cu; zone min spoke count 2; actual 1)
    @(100.4000 mm, 100.4000 mm): Zone [GND] on F.Cu, priority 0
    @(105.0000 mm, 111.2700 mm): PTH pad 2 [GND] of J1
Close-up of header J1: its ground pad sits inside a hatched no-fill area that leaves only a notch to the lower right, so the pour reaches the pad through one thermal spoke
J1’s ground pad with a no-fill area around it (hatched) that leaves one way in, to the lower right. KiCad draws four 45° spokes on a round pad; only one reaches copper. DRC: “Thermal relief connection to zone incomplete (layer F.Cu; zone min spoke count 2; actual 1)”, and the same on B.Cu.

The pad is still connected, so this is not an open circuit; it is a weak joint and, with one spoke, one crack away from becoming one. Fixes, in order of preference:

  • Move what blocks the spokes: a track squeezed past the pad, a keepout, a neighbouring pad’s clearance.
  • Change the spoke angle so the spokes land where copper can reach.
  • Narrow the thermal gap, within your fab’s clearance.
  • Set that pad’s zone connection to solid. Fine for a pad that is easy to heat; harder to hand-solder on a large plane.
  • Where one spoke is acceptable by design, a custom rule with the min_resolved_spokes constraint lowers the requirement for those pads only.

The KiCad forum threads behind this page are the same family: a pad that cannot reach a zone of its own net because a clearance rule leaves no room for spokes or copper. Find the rule DRC names, then decide whether the rule or the layout should give.

Islands, keepouts and “Missing connection between items”

A rule area (keepout) can forbid tracks, vias, pads, zone fills or footprints inside it. One that keeps out zone fills is how you keep copper away from an antenna or a mounting hole. It also splits pours. On the test board, an L-shaped band keeps fills out and cuts the top-right corner, with C1’s ground pad, away from the rest of the top pour:

Top copper with a hatched L-shaped no-fill band that separates the top-right corner, where C1's ground pad is, from the rest of the GND pour
A no-fill band (hatched) cuts the top-right corner off the ground pour. KiCad keeps the corner, because C1’s ground pad is on it, and DRC reports “Missing connection between items” between the two pieces of the same zone. One via in the corner to the bottom pour clears it.
[unconnected_items]: Missing connection between items
    @(100.4000 mm, 100.4000 mm): Zone [GND] on F.Cu, priority 0
    @(100.4000 mm, 100.4000 mm): Zone [GND] on F.Cu, priority 0

“Missing connection between items”, naming the same zone twice, is the signature of a pour cut in two. The zone’s island setting decides what happens to pieces: Remove islands “Always”, “Never” or “Below area limit”. Here it was “Always”, yet the corner stayed, because C1’s ground pad sits on it; what is left is a real gap in the ground net. One via in the corner to the bottom pour joined the pieces, and DRC came back with 0 violations and 0 unconnected pads.

With island removal on, a piece that touches nothing of its net is deleted, which is why a zone can seem not to fill an area at all: the copper was there and was removed as an island. Add a via or a track into that area, or change the island setting, and refill.

When a zone will not fill at all

  • Refill (B). A zone drawn after the last fill shows only its outline.
  • Check the zone’s net. A zone on the wrong net, or on no net, never joins the pads you meant.
  • Check its layer. A pour drawn on one copper layer does nothing on the other.
  • Look for a higher-priority zone or a keepout over the same area.
  • Check clearance and minimum width. A large zone clearance plus a minimum width that does not fit between pads leaves no copper in dense areas.
  • Check the island setting, and whether the area has anything of the zone’s net in it.

How PCBEditor checks its pours

When PCBEditor routes a board with ground pours, its rules check reads the actual pour shapes rather than the outlines. It joins pads through traces, vias and the filled copper, then reports a net whose pads end up in separate pieces, with the pads left unreached and how many pieces there are. A pour piece that reaches no pad of its net is reported as isolated copper, and pour-to-copper clearance is checked like any other clearance.

It does not count thermal relief spokes, so a pad joined by a single spoke passes there. If you finish the board in KiCad, KiCad’s check is the one to read for thermal reliefs; the Gerber checklist covers what to look at before ordering.

Common questions

Why is my KiCad zone not filling?
Usually the fill is out of date (press B, Edit → Fill All Zones), the zone has no net or the wrong net, a higher-priority zone or a keepout covers the area, the clearance and minimum width leave no room for copper, or island removal deleted pieces that connect to nothing. Refill, then check the zone's net, priority, clearance and island setting.
What does “Zone fills are out of date” mean in KiCad?
Something changed on the board after the zones were last filled, so the saved fill no longer matches the parts and tracks, and KiCad can ask “Zone fills are out-of-date. Refill?”. Refill with B before running DRC or plotting Gerbers; a stale fill gives clearance and solder mask errors that are not real.
How do I set zone priority in KiCad 9?
In the Zone Manager, which lists the board's zones in priority order and moves a zone up or down. A higher-priority zone fills first and lower-priority zones flow around it with their clearance. Give every pair of overlapping zones on different nets different priorities.
How do I fix “Thermal relief connection to zone incomplete”?
Fewer thermal spokes reach the pad than the zone requires, two by default. Move whatever blocks the spokes (a track, a keepout, another pad), widen the space around the pad, change the spoke angle, or set that pad's zone connection to solid. A custom rule using the min_resolved_spokes constraint can lower the requirement where one spoke is acceptable.
What is a keepout area in KiCad?
A rule area that forbids items inside it: tracks, vias, pads, zone fills or footprints, each ticked separately (Keep out tracks, Keep out vias, Keep out pads, Keep out zone fills, Keep out footprints). One that keeps out zone fills is how you stop a pour under an antenna, but it can also cut a pour into islands.
Does kicad-cli refill zones before DRC?
kicad-cli 9.0.9's pcb drc has no refill option; it checks the fill saved in the file. Refill in a script with pcbnew's ZONE_FILLER first, or save the board after pressing B, so the command-line check sees current copper.

Let PCBEditor pour and check the ground plane

The editor opens with this board described in the chat box, ground pours included. Its rules check reads the filled copper and reports a net left in pieces or a pour that reaches no pad before you export.

Open the board in the editor→

Sources

DRC reports are kicad-cli’s text output with the rule-source lines removed. Fill areas are read from the zones KiCad filled and saved; the figures are drawn from those polygons.

  • KiCad 9.0.9 kicad-cli pcb drc, run on the seven test boards described on this page (built with the pcbnew Python API: a 30 × 20 mm 2-layer board with a 1×02 header, an SOIC-8 and an 0603 capacitor, ground pours on both layers).
  • KiCad 9.0.9 pcbnew: dialog and message text (Refill all zones before performing DRC; Zone fills are out-of-date. Refill?; Remove islands: Always, Never, Below area limit; Keep out tracks, vias, pads, zone fills, footprints; Zone Manager) and the min_resolved_spokes custom rule constraint.
  • KiCad 9.0 PCB Editor manual (docs.kicad.org): zones, zone priority, thermal reliefs, rule areas and custom design rules.
  • KiCad forum, November 2026: “Which clearance rule is stopping pad 28 from reaching Vdd-zone?” and “Issue #24443 - DRC errors with pad close to a zone with the same net”.

Related