X3DStudios

Bulk and production runs

Ordering 3D printed parts in quantity: the 5% and 10% discount tiers, how a run is spread across the fleet, lead time maths, and where injection moulding wins.

Printing the same part many times is priced the same way as printing it once — billable grams at the material's rate — with a discount on the line and no tooling to pay for. This page covers the discount tiers, where in the product they actually apply, how a run is spread across the fleet, what to expect for 50, 500 and 1,000 parts, and the point at which you should be talking to a moulder instead of us.

Discount tiers#

QuantityFactorEffect
1 to 4x 1.00No discount.
5 to 9x 0.955% off the line.
10 or morex 0.9010% off the line.
Applied to unit price x quantity. There is no tier above 10 in the pricing engine.
The discount follows the quantity you send the quoter
The tier is worked out inside the quote from the quantity it was given. POST /api/price and an API print order both pass your real quantity, so both come back discounted. The web cart prices each print at its single-unit rate and multiplies afterwards, so a cart line of ten does not show the 10%. For quantity work, order through the API or ask us for a quote.
POST/api/priceNo auth

Quote a part at a quantity. No authentication, no rate limit.

Ten of a 60 x 40 x 25 mm part in PLA
curl -s -X POST https://x3dstudios.com/api/price \
  -H "Content-Type: application/json" \
  -d '{"bboxMm":{"x":60,"y":40,"z":25},"material":"pla","quality":"standard","quantity":10}'
Response
{
  "grams": 34,
  "printHours": 1.65,
  "materialCost": 4.08,
  "machineCost": 0,
  "shipping": 7,
  "baseFee": 0,
  "perUnit": 4.08,
  "subtotal": 36.72,
  "total": 43.72,
  "currency": "USD",
  "material": "pla",
  "quality": "standard",
  "quantity": 10,
  "customColor": false,
  "pricePerGram": 0.12
}

Read that carefully: perUnit is the undiscounted unit price, $4.08. The discount lives in subtotal — 10 x $4.08 x 0.90 = $36.72, not $40.80. The same part at quantity 5 comes back at $19.38, and at quantity 1 at $4.08. Note also that /api/price works from the bounding box alone, which is a solid-block upper bound; a real quote is measured by slicing the actual model, so the ordered price is usually lower.

Quantity against approach#

QuantityHow to order itWhat matters at this size
1 to 4Upload at /print, or one API order per part.No discount. The $1.00 per-part minimum still applies to very small parts.
5 to 49One API order with quantity set, or ask for a quote.5% at 5, 10% at 10. Still lands in the general queue behind whatever is already there.
50 to 500Split across API orders (50 is the per-order cap), or talk to us first.Worth agreeing a colour and a material batch up front so the whole run comes off matching spools.
500 to 5,000Talk to us. This is scheduled work, not queue work.Machines are set aside for the run. Expect a delivery schedule in stages rather than one parcel.
5,000+Get a moulding quote as well, and compare honestly.Tooling starts paying for itself. Printing still wins if the design is not frozen.

How a run is spread across the fleet#

There is no batching magic. One printer runs one plate at a time, so a run of N parts is N plates spread over however many machines are productive, and the run finishes when the last plate does. That is why lead time is arithmetic rather than a promise.

  1. Throughput is measured, not assumed. The farm takes the last 200 completed jobs, turns each into grams per hour, throws out the junk (anything under five minutes, anything outside 1 to 120 g/h) and uses the median. With fewer than five usable jobs it falls back to 22 g/h.
  2. One order is modelled as 100 g of plastic. At 22 g/h that is 4.55 hours of printing plus 12 minutes of bed-clearing and restart, so 4.75 printer-hours per order.
  3. A printer is counted as productive for 22 hours a day. The rest is changeover and maintenance headroom.
  4. So one printer finishes about 4.6 orders a day, and the fleet finishes that times the number of machines that are neither offline, in maintenance, nor held by a customer reservation.
  5. Your run queues behind the existing backlog, and one handling day is added at the end to pack and hand the parcels to the carrier.
The lead-time formula
hoursPerOrder  = gramsPerOrder / gramsPerHour + 12/60
ordersPerDay   = printers * 22 / hoursPerOrder
printDays      = orders / ordersPerDay
quotedDays     = ceil(printDays + backlogDays + 1)   // min 1
Run sizePlastic at 100 g/partPrinter-days of machine time
50 parts5 kgabout 10.8
500 parts50 kgabout 108
1,000 parts100 kgabout 216
Divide by the number of productive printers to get calendar print days, then add the backlog and one handling day. At 22 g/h and 100 g a part.
Get the live number instead of guessing
GET /api/farm/capacity is public and returns the current fleet counts, the measured grams per hour, orders per day and the backlog in days, cached for 60 seconds. The panel on /farm does the same maths in front of you and lets you set your own part weight. Lead time counts calendar days — there is no weekend or holiday logic in it.

One thing to know before you plan around a number: printers held by a customer reservation are carved out of order capacity entirely. If you want guaranteed throughput rather than a share of the queue, reserve machines — see /docs/farm/reservations.

Consistency across a batch#

What is genuinely consistent across a run, and what is not:

  • Same slice, same profile, same nozzle and layer height on every plate in the run, so dimensional behaviour is repeatable.
  • Same price on every unit. Billable weight rounds up to the whole gram per part, so the unit price does not drift.
  • Colour is matched to a stock spool. The twelve stock colours are held; anything off that palette is priced at $0.20/g because a spool has to be bought in, and a long run may cross more than one spool of the same colour.
  • Parts may come off different machines. The fleet is Bambu Lab H2S and P2S, and a part printed on one is not bit-identical to the same part printed on the other.
  • There is no automated dimensional or cosmetic inspection. Parts are checked by hand before packing; there is no per-part inspection record you can query.
Order one before you order five hundred
Print a single unit first, in the exact material and colour you intend to run, and check the fit yourself. A tolerance problem found on part one costs $4. Found on part 500, it costs the run.

When to talk to us instead#

  • More than 50 of one part, which is the per-order cap on the API.
  • A colour or material we do not stock, where the spool has to be sourced for you.
  • A part larger than 340 x 320 x 340 mm, which is what the quote API will accept.
  • A deadline. The website quotes a lead time from live capacity; it does not reserve capacity for you.
  • A repeating order — the same part every month — which is worth scheduling rather than re-submitting.
  • Anything needing non-standard packaging or your own inserts. See /docs/farm/packaging.

Against injection moulding#

Printing does not beat moulding at every volume, and pretending otherwise wastes your money. The difference is the entry fee. Moulding costs a mould before it costs a part; printing has no tooling at all and a per-unit cost that stays flat from part one to part ten thousand.

3D printing at X3DInjection moulding
Tooling costNone$5,000 to $50,000+ per mould
Per-unit costFlat: grams x rate, less 10% at quantityVery low, once the mould is paid for
First partDaysWeeks, after the mould is cut
Design changeRe-upload and reprintRe-machine or re-cut the mould
Economic band1 to a few thousand partsRoughly 5,000 to 10,000 units and up
GeometryUndercuts and internal voids are freeNeeds draft, uniform walls, no undercuts without side actions

Choose moulding when the design is frozen, the volume is well past a few thousand, per-unit cost is the constraint you are optimising, and you can wait for tooling. Choose printing when any of those is not yet true — and note the common answer is both: print the first few hundred while the design settles and the market is proved, then cut a mould for the version you know works.