Skip to content

CatalogItem

Anything that appears in a business's catalog — the admin's single inventory of what it offers, whether that's something a customer buys outright (a pass, a membership, a gift card, a physical good) or a priced line item a customer books (a {@link Service}).

Deliberately thin. This is the presentation contract a mixed catalog list needs — a name, a price, an image, a link — and nothing more. It is not a statement that every member is independently purchasable: that stronger contract (its own Stripe checkout, visibility, sale window, purchase and pricing rules) is {@link Product}, which only the four buy-outright types implement. A service has no standalone checkout — it's a line item on an appointment — so it implements this interface and not that one.

Consume via Business.catalog, which returns every member type in one cursor-paginated list. Surfaces that must accept only services (a booking activity's service menu) read the typed Business.services field instead, so the type system — not a runtime filter — keeps non-services off a booking menu.

Fields

idID!
nameString

Resolved for the given locale, falling back to English. Defaults to the viewer's locale. Nullable because the buy-outright types allow an unnamed product and derive a display name from their own fields (a pass's session count, a membership's billing cycle); consumers should fall back the same way.

Arguments (1)
localeLocale
descriptionString

Resolved for the given locale, falling back to English. Defaults to the viewer's locale.

Arguments (1)
localeLocale
priceInt!

Price in cents. For a {@link Product} this is the list price before pricing rules (see Product.effectivePrice for what a given viewer would pay); for a {@link Service} it's the amount the service adds to an appointment's total. Zero means free.

featuredImageImage

The lead image, or null when nothing has been uploaded. The lowest-sortOrder entry of {@link CatalogItem.media}.

Used in