Products
Learn how products are organized and priced.
Productgroups
Products are organized into productgroups. A productgroup represents a category of similar products that share the same pricing and production technique.
For example, a productgroup might be "Soft Cases (back printed, transparent)" which contains individual products for each compatible device model: iPhone 15, iPhone 15 Pro, Samsung Galaxy S24, and so on.
Productgroup: Soft Cases (back printed, transparent)
├── iPhone 15 Soft Case
├── iPhone 15 Pro Soft Case
├── iPhone 15 Pro Max Soft Case
├── Samsung Galaxy S24 Soft Case
└── ...
Pricing
Prices are set at the productgroup level, not per individual product. All products within a productgroup share the same price.
This means when you query the price for any product, you're effectively getting the price of its productgroup. If pricing changes, it changes for all products in that group simultaneously.
Some productgroups may be private to your organization. These contain custom products created specifically for you, with pricing agreed upon separately.
Lifecycle
Every product follows a defined lifecycle. The lifecycle determines whether a product is visible to your organization and whether it can be ordered.
announced → prelaunched → launched → sunsetted → ended → archived
| Stage | Description |
|---|---|
announced |
Product is visible in the catalog. Print specifications may still be incomplete. |
prelaunched |
Product can be ordered. Orders are queued as pre-orders until launch. |
launched |
Product is fully available for production and shipping. |
sunsetted |
Product is being phased out. Still orderable, but consider alternatives. |
ended |
Product is no longer orderable. Existing orders will be fulfilled. |
archived |
Product has been removed from the catalog entirely. |
Syncing your catalog
When you mirror our catalog into your own system, page through GET /products to pick up name, status and availableQuantity changes. Stock levels change often, so you will typically sync the full list regularly anyway.
To avoid re-fetching detail you already have, each product in the list carries two timestamps:
| Field | Bumped when |
|---|---|
layersModified |
The product's print layers (the layer image assets) change. |
printModified |
The product's print dimensions change. |
Store these alongside each product on your side. On a later sync, only call GET /products/{productReference} (and re-download the layer assets) for products where the timestamp moved past what you stored. A product whose timestamps are unchanged needs no detail fetch. The detail response mirrors these as layers.modified and print.modified.
These timestamps cover product configuration only. Live stock is not reflected here; read availableQuantity from the list on each sync.
