kapy academy

Assemblies and tolerance stackups

13 min readUpdated Jun 2026

A single joint is easy: you pick a clearance, print it, and it goes together on the first try. The trouble starts when parts chain together. A bracket bolts to a plate, the plate carries a rail, the rail carries a carriage, and by the time you reach the last part, the small errors of every part before it have added up, and the final hole misses its screw by half a millimeter. Nobody drew that error. It accumulated. And what makes it maddening is that every part, measured on its own, was in tolerance: the assembly fails even though no single part fails. Managing that buildup is what separates an assembly that clicks together from one you end up filing and cursing.

Variation adds up along the chain

First, a distinction that everything else takes for granted. Clearance is the nominal gap you draw on purpose: the 0.2 mm you leave between a shaft and its hole. Tolerance is the uncertain variation around that dimension: how far the real part drifts from what you drew, up or down. You choose the clearance; the process forces the tolerance on you. What accumulates along a chain is the tolerance — the variation — not the clearance. And the condition for the assembly to go together is straightforward: the clearance you leave has to be larger than all the tolerance that stacks up against it.

Five stacked plates whose individual oversize adds up, so the column overshoots a single part of the same nominal height (generated illustration)
Five stacked plates whose individual oversize adds up, so the column overshoots a single part of the same nominal height (generated illustration)

Now the arithmetic that trips everyone up. Your printer doesn't hit the exact dimension: every feature comes out a few hundredths of a millimeter off from what you drew. Suppose each joint in an assembly holds ±0.15 mm, an honest figure for well-calibrated FDM. Note the convention: that ±0.15 is the half-band, the error on each side of nominal, so the full band of one joint is 0.3 mm peak to peak. A single joint drifts at most 0.15 mm in either direction. But chain five joints so the carriage depends on the rail, the rail on the bracket, the bracket on the plate, and the errors no longer stand alone: they stack. In the worst case, when all five push the same way, the whole chain can drift by as much as ±0.75 mm.

The physical reason is direct. Each error comes from something real and independent: the half extrusion bead that intrudes into a hole, the wall that shrinks as it cools, the elephant's foot that splays a base. None of them knows what its neighbor did. When a feature is located from another feature, it inherits that other feature's error and adds its own on top. Chain it five times and you're summing five independent errors in series. The chain doesn't average: it accumulates.

That's why the tolerance-budgeting question isn't "What fit does each part get?" but "How much total error can the last feature in the chain absorb and still work?" That final joint is the one that pays the bill for everything before it. Start there and work backward.

How the worst case grows with each joint (±0.15 mm half-band per joint)
Joints in series Worst-case accumulated error What it means
1 ±0.15 mm a normal clearance soaks it up without thinking
2 ±0.30 mm still comfortable with a slightly open hole
3 ±0.45 mm starts eating into the clearance of a sliding fit
5 ±0.75 mm a precise feature no longer fits without a redesign

Why few parts means worst case

The temptation is to assume the errors cancel: one feature comes out big, the next small, and the chain compensates for itself. In fact, some cancellation almost always happens within a single part, which is why the ±0.75 mm worst case is a number you'll rarely see. It's statistically rare for all five joints to drift the same way, at the same time, and each at its maximum.

That partial cancellation is exactly what the statistical sum captures (the root of the sum of the squares of each tolerance). It doesn't assume you print thousands of units: it models a single part whose five errors are independent and predicts how that part's error is distributed. For our five ±0.15 joints, the root-sum-of-squares gives √(5 × 0.15²) ≈ ±0.34 mm, less than half the worst case. That's the error you'd expect most of the time.

That difference is the trap. Designing to the statistical sum works when you can afford to have an occasional part land near the worst case and scrap it. But you print only a few parts, sometimes just one, and you usually can't afford a single failure: the part you pull off the bed today has to assemble. There's no second run to average out the bad one. And if that part is the one that landed badly, ±0.34 won't rescue it: you needed to have left room for ±0.75.

The practical rule, then, doesn't depend on the number of units but on how many links the chain has and on what a failure costs. Few parts and a failure you can't afford → design to the worst case: sum the raw tolerances and make sure the assembly goes together even if they all conspire against you. Save the statistical sum for long runs, where the isolated failure is cheap. It's more conservative, spends a little more clearance, and in return the assembly doesn't depend on luck.

Count the chain per axis: XY isn't Z

So far we've treated the ±0.15 as if it were the same in every direction. It isn't. In FDM the precision is sharply anisotropic: dimensions in the XY plane are set by the bead width, dimensions in height are set by the layer height, and they're two different regimes, with different shrinkage. A hole with its axis in Z (vertical) comes out rounder and closer to size; the same hole laid down, with its axis horizontal, sags at its roof and comes out oval. A chain that crosses from XY into Z can't be summed with a single number.

The practical consequence is that you have to account for the chain per axis. If your stack of five joints has three dimensions in XY and two in height, those are two separate chains, each with its own per-joint tolerance, and they close independently. And the other way around: orienting the critical dimensions in the plane where your printer is most precise is as powerful a lever as any datum scheme. Put the fits that matter in XY and leave the dimensions with clearance to spare in Z. How FDM shapes your design explains where each of these precisions comes from.

Compensate the predictable, budget only the random

Not every error on the list is symmetric noise. Several have a known sign, and that changes how they enter the chain. A hole printed vertically comes out systematically smaller than its nominal: the slicer approximates the bore as an inward-biased polygon and the bead bites into the diameter, always in the same direction. The elephant's foot splays the base, also always in the same direction. Those aren't a ±: they're predictable shifts.

You compensate for a known-sign error ahead of time — enlarge the nominal hole, chamfer the base — instead of budgeting it as tolerance. If you feed a systematic error into the sum as if it were random, you spend clearance covering a margin in both directions when it only drifts in one. Only the variation that's genuinely unpredictable enters the chain as a tolerance band. Holes, pegs and first-layer squish spells out how much to compensate in each case.

Concentrate the adjustment in a single adjustment joint

The most effective way to brake a chain is to stop chaining. If part B is located off A, and C off B, each error compounds with the one before it. Instead, locate everything off the same origin, a common reference or datum.

Two fastening points on one plate: a round hole that fixes the position, and a slot where the same bolt can sit anywhere — the single joint that swallows the accumulated error (generated illustration)
Two fastening points on one plate: a round hole that fixes the position, and a slot where the same bolt can sit anywhere — the single joint that swallows the accumulated error (generated illustration)

In practice, you pick a face and an edge — or a hole — as the part's origin, and you dimension every important feature from that same reference, not from the neighboring feature. Now an error in one feature isn't inherited by the next: they all hang off the same fixed point, so their errors stay independent instead of summing in series. Note that the datum doesn't make the error disappear: it makes it independent. Two features referenced to the same origin still each carry their own ±0.15, so the fit between the two inherits both errors: ±0.30 mm in the worst case, not ±0.15. What you've avoided is the five-link chain drifting to ±0.75; you've folded it down to ±0.30 for any single pair.

And instead of spreading the fine adjustment across all the joints, concentrate it in a single adjustment joint. The intuition of "I'll center the fit and split half the play to each side" is exactly the mistake that costs you the assembly: it leaves you with many equally critical dimensions and none you can touch without moving the rest. Do the opposite. Let a single feature do all the precision work — a snug pivot, a shoulder that defines where the part seats — and give the others generous clearance. A box that locates the plate by its four mounting holes and lets the port cutouts float will always close up; another that expects the plate and every port to seat against its own wall at once will seize on the first print.

The double fit is the most common self-inflicted chain: constraining a single joint in two places at once. A lid that seats both on an inner lip and on an outer rim has to hit two clearances at once, and one of them missing by a tenth of a millimeter is enough to keep it from seating. Two pins in two tight holes fight each other unless the spacing between holes is perfect, which it never is. The rule is simple: one feature locates, the rest gets clearance. Let the second pin drop into a slot or an oversized hole; register the lid on the rim or on the lip, never both.

Fewer joints, and one part to absorb the rest

All this discipline rests on an even simpler truth: every joint you remove is an error you no longer sum. Before you wrestle with datums and single adjustments, ask whether that joint has to exist at all. Two bolted parts that always travel together can be a single printed part, and a single part doesn't stack tolerance the way a chain of parts does. Merging two components into one doesn't just save screws — it deletes a whole link from the chain.

When the joint does have to be there, give the accumulated play somewhere to go instead of dropping it onto the fit that matters. A spacer, a custom-printed washer, or an adjusting screw absorbs the entire chain at one point designed for it. In a stack of three plates bolted through a common hole, give the holes in the middle and top plates generous clearance and let the bottom plate locate: the screw finds its way and the play lives in the holes that can afford to be loose. You're not eliminating the chain's ±0.45 mm — you can't — you're choosing where it ends up: in a gap you designed to house it, not in the one fit that needs to be precise.

That's the whole recipe: count the joints and remove what you can; count the chain per axis; compensate the predictable and budget only the random; dimension every feature from a common reference; adjust each joint exactly once; and route whatever error remains into a clearance you designed on purpose. To put values on those clearances, Real printed clearances gives you the actual clearance for your printer, and Choosing the fit: clearance, transition, interference takes you from function to the fit for each joint. And when the assembly still doesn't close on the first try — it happens — Iterate and measure shows how: measure where the chain drifted instead of guessing.

Discord