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!nameStringResolved 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)
localeLocaledescriptionStringResolved for the given locale, falling back to English. Defaults to the viewer's locale.
Arguments (1)
localeLocalepriceInt!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.
featuredImageImageThe lead image, or null when nothing has been uploaded. The lowest-sortOrder entry of {@link CatalogItem.media}.