Orders and tracking
The stages an X3D order moves through, which ones email you, and what /orders shows: status, totals, tracking, date-range statements and search.
Every paid order moves through five stages, and /orders is where you watch it. That page lists each order with its stage, date, total and tracking number, lets you search and filter by date, and builds a printable statement for any range. This is what a customer sees; the machine-side view of a job at the farm is a separate thing.
The five stages#
An order record only exists once payment has been confirmed, and it is created at placed. Cancelled sits off the pipeline rather than at the end of it, so a cancelled order shows a plain statement instead of a progress bar that looks like it is still moving.
| Stage | What has happened | Emails you |
|---|---|---|
| placed | Payment confirmed and the order is in the queue. | No — the checkout confirmation already covered it |
| printed | Your parts are off the printer and cooling. Packing is next. | Yes |
| packed | Boxed and waiting for the carrier pickup. | No — internal milestone |
| shipped | Handed to the carrier. This is where a tracking number appears. | Yes |
| delivered | The carrier reported the parcel as delivered. | Yes |
| cancelled | Cancelled; any payment taken is being refunded. | No |
These stages are bookkeeping, not automation. A website order never becomes a print job at the farm, so nothing on a printer advances them — an operator sets each one by hand. Delivered is the single exception.
Delivered is set automatically#
A nightly sweep asks the carrier about every order sitting at shipped that has both a tracking number and a carrier we can query. Only a delivered answer moves anything: the order advances to delivered and the delivery email goes out. Any other answer — still in transit, returned, or no answer at all — leaves the order where it is and is tried again the next night. A tracking number filed under the carrier Other is never queried, because there is no carrier account behind it. The sweep is also compare-and-set, so if an operator has already marked the order delivered by hand, no second email goes out.
What /orders shows#
- The order id, in mono — CART- for a cart checkout, ORD- for a Print and Ship order, STORE- for a single store product.
- A status pill and the five-dot progress timeline underneath it.
- The date and time the order was placed, and the total charged.
- For a print order: material, colour, quality, size and quantity (quantity only when it is more than one).
- For a cart order: a one-line item summary, such as 2x Desk Clock — PLA, Black; 1x Custom print.
- The delivery name, city, state and postcode. The street line is deliberately not printed on screen.
- A tracking number, once one has been entered.
- A Payment History section listing Stripe charges on your account, each with a Receipt link whenever Stripe issued one.
Per-item prices are not shown on the order card either. What was actually charged per line is on the Stripe receipt, and the order card shows the order total.
Search and date range#
One search box and two date fields sit above the list. Every term you type has to match somewhere — searching black shipped means the black one that shipped, not everything black plus everything shipped. The fields searched are the order id, the account email, the item summary, material, colour, quality, status, tracking number, carrier, the full delivery address and the order date.
The From and To dates are both inclusive and compared in UTC, so an order placed at 18:33 UTC on 7 September is the 7th wherever you open the page. Filtering runs over the orders already loaded for your account, so it is a view rather than a query and can never reach anyone else's data.
Statement and invoice#
The Statement / invoice link exports exactly the range you have filtered to, defaulting to every order the account holds. It renders as a printable document: issuer block, the email it is billed to, a Date / Order / Items / Amount table, and a total.
- Cancelled, refunded, failed and voided orders are listed under Not charged rather than hidden, and are left out of the total.
- Anything else counts, including a status we add later — an unexpected line in the total is a visible error somebody queries, where one silently dropped is not.
- Totals are summed in cents, so a hundred orders cannot drift a penny.
- There is no PDF export. Print / Save as PDF uses the browser's own print dialog; the page hides the site chrome and sets a 16 mm margin for it.
Looking an order up#
/api/ordersSigned inEvery order on the signed-in account, newest first.
No parameters, no body. It returns up to 50 orders for the signed-in account, sorted newest first. The cap is applied by the database before that sort, so on an account holding more than 50 orders you get 50 of them rather than reliably the 50 newest. Scoping is by the account email alone — there is no order-id or account parameter, so this route cannot be pointed at someone else's history. Signed out it answers 401.
/api/order-statusSigned inThe stage and tracking number for one of your orders.
orderIdstringrequired- The order id as shown on /orders, for example CART-8f1c… — must belong to the signed-in account.
# Runs in a signed-in browser session; pass your session cookie from a script.
curl "https://x3dstudios.com/api/order-status?orderId=CART-8f1c2b04-…" \
-H "Cookie: $X3D_SESSION_COOKIE"The reply is a projection, not the whole record: orderId, status, description, trackingNumber (null when there is none), createdAt and updatedAt. No carrier, no total, no address. An order that does not exist and an order belonging to somebody else both answer 404, so the endpoint leaks nothing about which ids are real.
Without signing in#
There is one public lookup, and it covers orders placed through the print API or the no-code form at /farm/submit. Those carry a short code like X3D-K7M2QP, and /print/order/X3D-K7M2QP shows that order's progress to anyone holding the code — the code is the credential. It lists the file, material, colour, nozzle, layer height, quantity and total, plus carrier and tracking number as plain text, and offers a payment link when the order is still unpaid.
If an order is not there#
In rough order of likelihood:
- You are signed in as a different account. An order is filed under the email on the checkout session, which is prefilled from the account that started it.
- The account holds more than 50 orders. That is the cap on the list, and the search and date filters run over what has already been loaded rather than fetching more, so an older order cannot be filtered back into view. Ask us for it by order id.
- It was placed through the print API or the form at /farm/submit, so it lives at /print/order/<code> instead.
- The payment did not complete. An order record is only written once Stripe confirms the charge, so an abandoned checkout leaves nothing behind. Check Payment History on the same page: no charge means no order.
- The payment went through but the order never appeared. That means the confirmation callback did not land. Send us the order id or the Stripe receipt and we will reconcile it by hand.
Reply to any order email, or use /contact. Quoting the order id or the tracking number gets to an answer fastest.