# Errors a shopper can see

Every shopper-facing message Orbit3D produces is listed here, with what it
means, what caused it, and what to do. If a shopper reports wording that is not
on this page, it came from your theme or from Shopify, not from us.

They come from two places. Messages on the **product page** come from the
Orbit3D block. Messages at **checkout** come from the checkout guard, which is a
separate check that runs on Shopify's servers and cannot be bypassed.

---

## At checkout

### "This custom item needs to be added to your cart again before you can check out."

**What it means:** a configured line is claiming a price your store did not
sign, so the order is refused.

**Usually harmless.** The common cause is a cart older than your last Orbit3D
update — the shopper left it open across a change. They rebuild the item and
check out normally.

**The cause that is not harmless** is someone editing the price in their
browser. That is exactly what this message exists to stop, and seeing it means
the system is working. You need do nothing.

**What to tell the shopper:** remove the item, configure it again, check out.
Nothing is lost — the product page starts fresh.

**When to tell us:** if it reaches shoppers who configured their item minutes
earlier, on a store you have not just updated. That would mean the signing key
and the checkout guard disagree, and it is ours to fix.

### "There are more custom items here than one order can carry. Please remove a few and order them separately."

**What it means:** the cart holds more configured items than one order can
carry, and checkout has refused it.

You will rarely see this one, because the product page normally refuses the item
before it gets in (see below). It is the backstop for a cart assembled another
way — a saved cart, a draft order, a third-party app.

**What to tell the shopper:** remove a few configured items and place them as a
second order.

---

## On the product page

### "Your cart already holds as many custom items as one order can carry. Please check these out first, then start another order."

**What it means:** the cart already holds 26 different configurations, which is
the most one order can carry. The item was **not** added.

**Not a bug, and not negotiable.** Past that point Shopify stops applying your
configured prices and charges the plain product price for every line in the
cart. Refusing one item is better than undercharging for all of them.

**It counts different configurations, not units.** Ten identical items on one
line count as one. Ordinary shopping rarely reaches it; a wholesale buyer will,
and splitting the order is the right answer.

See [How pricing works](../configure/pricing-and-checkout.md).

### "Type your text for {option}, or switch it off." / "Add your artwork for {option}, or switch it off."

**Where:** under Add to cart, which stays disabled until it is resolved.

**What it means:** an option that charges a fee is switched on with nothing
filled in.

**Why we refuse the sale.** Without this, a shopper turns on engraving, forgets
to type anything, pays the fee and receives a plain product. They find out on
delivery, and it becomes your support ticket and your refund. The message names
the option and gives both ways out — fill it in, or switch it off and stop
paying for it.

If a shopper submits anyway, the same text appears after **"Please review your
selection:"**.

### "We could not confirm the price just now. Please try again in a moment."

**What it means:** the app could not price the configuration, so it refused
rather than guessing. The item was not added.

**What to check, in order:**

1. **Orbit3D → Pricing function** should say **Active** and **Tamper check: on**.
   If it does not, that is the cause — press Activate, or publish any product.
2. Whether the product has been published since its last change. Drafts do not
   reach the storefront until you press Publish.

**It never guesses.** A configurator that invents a price when it cannot reach
its rules will eventually invent a wrong one. Refusing a sale is recoverable;
selling a $700 product for $450 is not.

### "Could not add to cart. Please try again."

**What it means:** the price was confirmed, but Shopify rejected the add. This
is a Shopify or theme problem rather than an Orbit3D one — most often the
variant is out of stock or unavailable on that sales channel.

**What to check:** that the product's variants are in stock and available on the
Online Store channel.

### "No purchasable variant matches this configuration."

**What it means:** the shopper has chosen a combination with no variant behind
it — commonly a size that exists in your configurator but not in your Shopify
product.

**What to check:** the product's variants against the option values you
published. Every selectable combination needs somewhere to land.

### "This product is not configured yet."

**What it means:** the Orbit3D block is on the page but this product has no
published configuration.

**What to check:** publish the product in Orbit3D, or remove the block from that
template.

---

## Preview messages, which are not errors

These concern the 3D preview only. **Prices and options are unaffected**, and
the shopper can still buy.

| Message | Meaning |
|---|---|
| "Loading your 3D preview…" | Normal, while models load. |
| "3D preview is not available in this browser." | No WebGL — very old browser, or hardware acceleration switched off. |
| "The 3D preview could not be loaded." | A model file did not load. Check the product's 3D files in Orbit3D. |
| "One part of the preview could not be loaded; the price and options are unaffected." | One part is missing; the rest of the product still shows. |
| "That image is too large (12 MB max). Try a smaller file." | Shopper artwork upload. |
| "That image is {w} by {h}…" | A warning, not a refusal — small artwork may print soft. |

---

*Every message on this page was taken from the source rather than from memory:
the product-page strings from the block's own string table, the checkout ones
from the guard. If we change the wording, this page changes in the same commit.*
