# 3D printing tolerances: making parts that fit together

Why printed holes come out undersized, real FDM clearance numbers for running and press fits, and how to test-fit and adjust a parametric part instead of a mesh

---

Two parts that are each dimensionally "correct" can still refuse to go together. A shaft
modeled at 8 mm and a hole modeled at 8 mm sound like a perfect match on screen, and on
the printer they come out as a shaft that will not enter the hole at all. This is not a
modeling mistake. It is what FDM printing does to every hole, every time, and once you
know the pattern you can design for it instead of fighting it print after print.

This post covers why holes shrink, what clearance numbers actually work, the difference
between horizontal and vertical accuracy, a short test-fit routine, and why a slider on a
parametric part beats editing a mesh when the fit is off.

## Why printed holes come out undersized

A hole is the one feature FDM is worst at reproducing accurately, for a mechanical
reason baked into how the printer draws it. When a nozzle traces a circle, it has to
decelerate into the curve, and the extruder keeps pushing plastic through that
deceleration. The result is a small amount of over-extrusion right at the curve, most
noticeable on the tightest curves a print has: circular holes. The perimeter bulges
inward by a fraction of a millimeter, and the hole ends up smaller than the model that
generated it.

Outer features go the opposite direction for a related reason. A boss or a peg (plastic
you want to keep, bounded by an outward-facing wall) tends to print slightly oversized,
because the same corner-rounding and extrusion behavior adds material to a convex
boundary instead of removing it from a concave one. Put the two together and you get the
rule every functional printer eventually learns the hard way: holes print small, pegs
print big, and a part designed with zero clearance between them will not assemble.

The size of the error depends on your printer, nozzle, and slicer settings, but for a
well-tuned FDM machine at 0.2 mm layer height, expect circular holes to come out
0.1 to 0.3 mm undersized versus the CAD model. That is a small number, but it is bigger
than the clearance most people leave, which is why "it worked in the CAD program" and
"it worked on the bed" are two different claims.

## Real clearance numbers for running and press fits

Rather than guessing, size the gap between mating parts to the kind of joint you want.

**Running fit (parts that rotate or slide against each other, like a shaft in a
bearing bore or a hinge pin):** leave 0.2 to 0.4 mm of total diametral clearance. A
10 mm shaft wants a 10.2 to 10.4 mm hole. Go toward the low end for a snug, low-wobble
joint you will lubricate; go toward the high end if the parts need to move freely
right out of the printer with no post-processing.

**Press fit (parts meant to snap together and stay together with friction, like a peg
that should not need glue):** leave 0.1 to 0.2 mm of clearance, sometimes an
interference fit of a few hundredths of a millimeter if your printer is well
calibrated and the joint is small. Too tight and the peg splits the hole's walls on
insertion; too loose and it falls out. This is the fit worth test-printing before you
commit to a full assembly, because the acceptable window is narrow. Seating a real
ball bearing in a printed pocket is the same idea with a specific target number; see
[designing a 3D printed bearing mount that fits](/blog/3d-printed-bearing-mount-that-fits).

**Sliding fit for larger, less critical parts (drawer in a housing, lid on a box):**
0.3 to 0.5 mm per side is a comfortable, forgiving default that tolerates some
warping and printer-to-printer variation without binding.

These numbers assume PLA or PETG on a reasonably well-calibrated hobby or prosumer FDM
printer. They are a starting point, not a guarantee, because tolerance is a function of
your specific machine, not just the material. A printer with a worn nozzle, an
under-tensioned belt, or an uncalibrated extruder can easily be off by another 0.1 to
0.2 mm in either direction, which is exactly why the test-fit step below matters more
than any table of numbers.

## Horizontal accuracy versus vertical accuracy

Tolerances are not the same in every direction, and treating a print as uniformly
accurate is a common source of "it fit in one orientation but not the other."

**Horizontal accuracy (X/Y, the plane the printer draws each layer in)** is governed by
the belt-and-pulley motion system, the nozzle diameter, and the extrusion behavior
described above. This is where the hole-shrink and peg-grow effect lives, and it is
generally the more consistent axis: a well-tuned printer holds X/Y dimensions within
0.1 to 0.2 mm across most of the bed.

**Vertical accuracy (Z, the stacking direction)** is governed by layer height and how
consistently the Z axis moves, and it behaves differently. Z dimensions are usually more
accurate in the sense of "matches the model," because a wall built from twenty
0.2 mm layers really is close to 4 mm tall, with error measured in fractions of a layer
rather than fractions of a millimeter. But Z is where you pay for a different problem:
elephant's foot (the first layer squashing slightly wider than the rest) and layer
adhesion variance, both of which matter more for a tight vertical stack, like a lid that
needs to seat flush, than for a hole diameter.

The practical takeaway: orient the feature that needs the tightest tolerance so it prints
in X/Y where you have the most control, not stacked in Z where you are relying on
uniform layer height across the whole print. A hole that must be round and precisely
sized should almost always be drilled through the top or bottom face in the print
orientation, not built up as a stack of arcs along the Z axis.

<TryMeshra />

## A simple test-fit workflow

You do not need a full assembly to find out if a clearance is right. A five-minute test
coupon saves a much longer wasted print.

1. **Isolate the mating feature.** Print just the hole or just the peg, in a small block,
   at the same layer height and orientation you plan to use for the real part. A 20 mm
   cube with a hole in it tells you as much about that hole as the full assembly does.
2. **Print a small range of clearances, not one guess.** If you are unsure, print the
   mating feature at three clearance values (for example 0.15 mm, 0.25 mm, and 0.35 mm
   per side) in one plate. Fifteen minutes of print time answers the question that would
   otherwise take three separate full-length prints to answer by trial and error.
3. **Test with the actual mating part, not a caliper reading.** A caliper tells you the
   hole measured 10.2 mm; it does not tell you whether the real shaft, with its own
   printed tolerance, slides in the way you want. Fit the two printed pieces together
   and judge the joint by feel: does it rotate freely, does it need a light press, does
   it rattle.
4. **Record which clearance worked.** Once you know 0.25 mm per side gives you the
   running fit you wanted on this printer, that number is reusable across every future
   part on the same machine and material, not just this one.

## Fixing a bad fit: a slider, not a mesh edit

This is where the difference between a parametric part and a downloaded mesh actually
shows up. If you generated your part as an STL from somewhere else and the hole prints
0.2 mm too tight, your options are to re-model it from scratch, hand-edit the mesh in a
tool that was not built for precise dimensional changes, or just live with the bad fit.
None of those are good.

A part built in Meshra keeps every meaningful dimension, including a clearance or hole
diameter, as a named parameter in the manifest generated alongside the CadQuery code. If
your test coupon shows the hole needs another 0.15 mm of clearance, you open the
parameter drawer, drag that one value, and the same code re-executes with the new
number: the hole grows, everything else in the part (wall thickness, hole spacing, the
rest of the geometry) stays exactly where it was, and there is no LLM call involved. It
is a deterministic re-run of the same program with one number changed, so it is instant
and free on every plan. Our post on [how Meshra turns a sentence into a printable
part](/blog/from-a-sentence-to-a-printable-part) covers how that parameter manifest and
slider-driven re-execution work under the hood.

That is the practical argument for designing fits parametrically instead of guessing
once and hoping: the correction after a bad test fit is a five-second slider drag, not a
redesign.

## Where to start

If you have a part with a shaft, peg, or snap-fit joint in mind, browse the [template
gallery](/templates) for a close starting point with a clearance parameter already
exposed, or describe the part in the builder and call out the fit you want directly, for
example "a 10 mm shaft bore with a 0.3 mm running-fit clearance." Free and Maker plans
include AI generations for this kind of iteration; see [pricing](/pricing) for the
current allowances, or [create an account](/sign-up) to save your part and dial in the
clearance after your first test print.

Tolerance on a printed part is not a fixed property of your printer, it is a number you
choose, test, and correct. Pick a clearance from the ranges above, print a small test
coupon before you commit to the full part, and when the fit is off, fix the one number
that is wrong instead of starting over.
