You printed the bracket, you picked up the M3 screw, and it will not start in the hole you modelled at 3.2mm. The caliper says 2.95mm. Nothing went wrong with the print — no warping, no under-extrusion, no visible defect at all. 3D printed holes come out undersized almost every time, for five separate reasons that all push the same way, and the fix depends entirely on which of them you are actually looking at.
This post contains affiliate links. If you purchase through these links, 3D Prototyping Hub may earn a small commission at no extra cost to you.
This post also contains Amazon affiliate links. As an Amazon Associate I earn from qualifying purchases.
Measure It Properly Before You Change Anything
Calipers are the right tool, but the inside jaws flex, and in a small bore you will read whatever pressure you applied. Take three readings at different angles and use the largest; a hole that is slightly oval reads small on every axis but the widest one.
Better, for anything under about 6mm: use ground steel dowel pins or the smooth shanks of drill bits as go/no-go gauges. A pin either enters or it does not. That is the same question the screw is asking, and it does not care how hard you squeezed the calipers.
| What you measure |
What it means |
Section |
| Every hole small by roughly the same amount, any size |
Facet error plus bead squeeze — one offset fixes all of them |
1 and 2 |
| Hole small only in the bottom one or two layers |
Elephant foot lip at the mouth |
3 |
| Hole round at the sides, drooping and flat at the top |
Horizontal hole, sagging roof |
4 |
| Each hole measures right, the pattern does not fit |
Scale and shrinkage, not hole size |
5 |
| Small holes badly off, large holes nearly right |
Export resolution — too few facets per circle |
1 |
1. The File Already Had a Smaller Hole Than You Drew
A CAD circle is exact. The STL you exported is not: it approximates that circle with a ring of flat facets, and those facets are drawn as chords inside the true circle. The hole is already undersized before the slicer has read it.
How much depends on how many segments the export used. The loss on the radius is the sagitta of each chord — r × (1 − cos(180° ÷ n)) for n segments, so twice that on diameter — and on a small hole the default chord tolerance in most CAD packages gives you very few segments to work with:
| Segments on the circle |
Lost diameter, 3mm hole |
Lost diameter, 10mm hole |
| 8 |
0.23mm |
0.76mm |
| 12 |
0.10mm |
0.34mm |
| 24 |
0.026mm |
0.085mm |
| 48 |
0.006mm |
0.021mm |
That is why the complaint is nearly always about small holes. Fix it at source: lower the chord or deviation tolerance on export (0.01mm is a sensible default), or export STEP and let the slicer do its own tessellation. If your slicer offers arc fitting, turn it on — it converts those chords back into G2/G3 arc moves and removes the faceting from the toolpath as well as smoothing the finish. The same geometry shows on curved outside surfaces too, which is the stair-stepping and faceting problem seen from the other side.
2. The Bead Squeezes Toward the Inside of the Curve
The second cause is the nozzle, and it is the reason a hole stays small even when the file is perfect.
The slicer plans a toolpath along the centre of the extruded bead and assumes the bead sits symmetrically on it. On a tight inside curve it does not. The same volume of plastic has to fill a shorter arc on the bore side than on the outside of the bead, so material piles inward. On top of that, melt pressure lags the commanded flow through a fast, tight loop, and the head tends to cut the corner slightly, pulling the path toward the centre of the hole.
The effect is roughly a fixed amount rather than a percentage, usually 0.05–0.15mm of radius with a 0.4mm nozzle, and it gets worse as the hole gets smaller relative to the bead. Three things help:
- Slow the perimeters on small holes. 20–30mm/s on external perimeters gives pressure advance time to work. Cheap in print time, because holes are a tiny fraction of the path length.
- Use a smaller nozzle for small-hole parts. A 0.4mm bead cannot describe a 2mm bore honestly; a 0.2 or 0.3mm nozzle can.
- Enter the measured error as hole compensation. PrusaSlicer and Orca call it hole XY compensation, Cura calls it hole horizontal expansion, and it opens up every hole by your number without touching outside dimensions. Set it from your own test plate rather than from a forum post, because it is a property of your machine and material — the same machine signature that decides whether printed parts fit together at all.
3. The First Layer Closes the Mouth of the Hole
If a screw will not start but slides freely once you force it past the first millimetre, the hole is the right size and the mouth is not.
The first layer is deliberately squashed into the bed, so the plastic spreads sideways. At the edge of a hole it spreads inward, leaving a lip at the bottom of the bore. That is the same mechanism as elephant foot on the outside of a part, and it responds to the same three fixes: a touch less first-layer squish on the Z offset, an elephant-foot compensation value in the slicer, and a 0.5mm chamfer modelled around the hole mouth so there is no sharp edge to spread in the first place.
For a part you have already printed, one pass of a deburring blade around the mouth takes the lip off in about ten seconds. A surprising number of reprints exist because nobody tried that first.
4. A Horizontal Hole Has to Hold Up Its Own Roof
Turn the axis of the hole sideways and a different failure takes over. The upper half of the bore is a progressively steeper overhang that finishes as an unsupported bridge across the top. The plastic sags into the opening, and you get the familiar D-shaped bore: about right across the width, undersized and drooping in height.
No compensation value fixes this, because it is not a sizing error — it is overhang sag happening inside a circle. The real options are:
- Reorient the part so the hole axis points up. This is free and it beats everything else.
- Model the hole as a teardrop — a circle with a 45° roof peak — or as a hexagon with a flat-topped vertex. Both close at a self-supporting angle and need no support material inside a bore you cannot reach.
- Print undersized and open it up afterwards with a brad-point drill, which centres itself and shears plastic cleanly. Keep a standard twist drill away from printed parts: it grabs, screws itself in and splits the part along a layer line, which is the same brittle, direction-dependent failure described in why 3D printed parts crack when you drill them. For a thin wall, a step drill is safer still and chamfers the mouth as it goes.
5. Shrinkage Is About Position, Not Diameter
This one gets blamed constantly and deserves it least.
PLA shrinks roughly 0.3% as it cools, PETG a little more, ABS and ASA substantially more. On a 3mm hole, 0.3% is 0.009mm — below the noise floor of the measurement you just took. Shrinkage is not why your M3 clearance hole is 0.25mm small.
Where it does matter is across distance. The same 0.3% over a 100mm bolt pattern is 0.3mm of drift, which is the difference between four screws dropping into a metal plate and two of them binding. If every hole measures correctly on its own and the pattern still will not fit, you are looking at a scale error, not a hole error — the territory covered in why 3D prints are the wrong size, and worth checking against the material's published shrinkage before you adjust anything.
Find Your Machine's Number Once, Then Stop Guessing
Print a flat test plate about 5mm thick with holes at 3, 4, 5, 6, 8 and 10mm, in the material you actually use. Measure each with calipers and with pins, and write the errors down.
What you will almost certainly see is a roughly constant shortfall — not a percentage — somewhere between 0.1mm and 0.3mm on diameter. That single number, entered once as hole compensation, corrects every hole in every file you slice from then on. Reprint the plate after a nozzle change, a material change or a flow recalibration, because all three move it.
Then deal with the holes that have a job:
- Holes that take a screw. Stop chasing the diameter and fit heat-set brass inserts, which make the printed bore a rough target rather than a precision one. The full comparison of inserts against tapped holes, captive nuts and thread-forming screws is in why 3D printed threads strip.
- Holes that must be an exact size. Print 0.2mm undersized on purpose and finish with a hand reamer. This is how machine shops have always done it, it takes seconds per hole, and it produces a round, straight, on-size bore that no slicer setting can.
- Holes that need a thread. Print at tap-drill diameter — 2.5mm for M3, 3.3mm for M4, 4.2mm for M5 — where the undersize error conveniently becomes part of the allowance the tap wants to cut into.
When the Hole Is Not a Printing Problem
There is a line past which none of this is the right work. A bearing seat held to a few hundredths, a shaft fit that has to stay concentric over 60mm of depth, a sealing face, a bolt pattern that must mate with a machined plate, or fifty parts that all need the same bore — printed plastic reamed by hand will not get you there repeatably, and the time spent trying is worth more than the parts.
That is the point to print the part and have the critical features machined, or to have the whole thing quoted properly. What a shop can actually hold, and how to state it on a drawing so you get what you meant, is set out in tolerances and accuracy in 3D printing and in CNC machining vs 3D printing. Shops that do both are listed by process and location in our provider directory.
For everything on the near side of that line: measure one test plate, enter one compensation number, chamfer the mouths, point the holes upward, and keep a reamer in the drawer. The screw will start.
Hero photograph by Kadir Celep on Unsplash.