← API reference
CANONICAL TYPE REFERENCE

ProductState

A priced catalogue entry — what a customer is sold and charged for. Referenced by estimate and order lines, which take their price, quantity and kinds from it. Distinct from product_template, which is the manufacturing blueprint describing how a job is built: a product says what to charge, a template says what to make.

Unique identifier

nameString!

Human-readable name shown when picking the product on an estimate or order line.

skuString!

Catalogue code for this product. A product_template may carry the same SKU to link a priced catalogue entry to the blueprint that builds it, but nothing enforces the pairing — the two resources are independent.

Free-text description of what is being sold; surfaced on quotes and orders.

Whether this is a STANDARD catalogue line, a CUSTOM one-off, or a TEMPLATE used as the basis for quick reorders.

List price charged to the customer, before any per-customer override. Null when the product is always quoted bespoke.

ISO currency that basePrice and costPrice are denominated in.

What the product costs to produce or buy in. Used for margin reporting; never shown to a customer.

Production kind seeded onto a line created from this product, so a quote starts with the right manufacturing route. Overridable per line.

Commercial kind seeded onto a line created from this product. Overridable per line.

Quantity pre-filled when this product is added to an estimate or order line.

categoryString

Free-text grouping used to organise the catalogue; not a managed resource.

tags[String!]

Free-text labels for searching and filtering the catalogue.

isActiveBoolean!

Whether the product is offered. Inactive products are kept for historical lines but are not selectable on new ones.

notesString

Internal notes about the product; not shown to customers.

createdAtString!

Creation timestamp (ISO8601)

updatedAtString!

Last update timestamp (ISO8601)

View exact SDL
"""
A priced catalogue entry — what a customer is sold and charged for. Referenced by estimate and order lines, which take their price, quantity and kinds from it. Distinct from `product_template`, which is the manufacturing blueprint describing how a job is built: a product says what to charge, a template says what to make.
"""
type ProductState @iac_resource(name: "product") @iac_ops(create: "createProduct", read: "getProduct", update: "updateProduct", delete: "deleteProduct") {
  """Unique identifier"""
  id: ProductID! @iac_identity(assignedBy: SERVER) @iac_computed
  """
  Human-readable name shown when picking the product on an estimate or order line.
  """
  name: String!
  """
  Catalogue code for this product. A `product_template` may carry the same SKU to link a priced catalogue entry to the blueprint that builds it, but nothing enforces the pairing — the two resources are independent.
  """
  sku: String!
  """
  Free-text description of what is being sold; surfaced on quotes and orders.
  """
  description: String
  """
  Whether this is a STANDARD catalogue line, a CUSTOM one-off, or a TEMPLATE used as the basis for quick reorders.
  """
  productType: ProductType!
  """
  List price charged to the customer, before any per-customer override. Null when the product is always quoted bespoke.
  """
  basePrice: Float
  """ISO currency that `basePrice` and `costPrice` are denominated in."""
  currency: CurrencyISO
  """
  What the product costs to produce or buy in. Used for margin reporting; never shown to a customer.
  """
  costPrice: Float
  """
  Production kind seeded onto a line created from this product, so a quote starts with the right manufacturing route. Overridable per line.
  """
  defaultProductionKind: String
  """
  Commercial kind seeded onto a line created from this product. Overridable per line.
  """
  defaultCommercialKind: String
  """
  Quantity pre-filled when this product is added to an estimate or order line.
  """
  defaultQuantity: Int
  """
  Free-text grouping used to organise the catalogue; not a managed resource.
  """
  category: String
  """Free-text labels for searching and filtering the catalogue."""
  tags: [String!]
  """
  Whether the product is offered. Inactive products are kept for historical lines but are not selectable on new ones.
  """
  isActive: Boolean!
  """Internal notes about the product; not shown to customers."""
  notes: String
  """Creation timestamp (ISO8601)"""
  createdAt: String! @iac_computed
  """Last update timestamp (ISO8601)"""
  updatedAt: String! @iac_computed
}

One stable address across all schema views. Follow a field’s type to explore connections between domains.