> ## Documentation Index
> Fetch the complete documentation index at: https://docs.exclusivo.one/llms.txt
> Use this file to discover all available pages before exploring further.

# Products

> Adding things to sell — the fields that matter and the ones people trip over.

## Pick the right type first

It's the field that decides what else you'll be asked for.

| Type         | Shipping | Stock    | How they get it               |
| ------------ | -------- | -------- | ----------------------------- |
| **Physical** | Yes      | Optional | You post it                   |
| **Digital**  | No       | —        | Download links, automatically |
| **Service**  | No       | Optional | You arrange it                |

Physical and digital sit separately in your catalogue, so a shop selling both
doesn't have to keep filtering one out.

## The fields

<AccordionGroup>
  <Accordion title="Name, URL and description">
    The URL comes from the name, and you can edit it. Change it later and old
    links break — add a [redirect](/stashed/storefront/redirects) at the same
    time.
  </Accordion>

  <Accordion title="Price">
    In your shop's currency. Individual variants can override it.
  </Accordion>

  <Accordion title="Images">
    One main image, plus up to 20 more.
  </Accordion>

  <Accordion title="Stock, and when to warn you">
    Turn on stock tracking and the product can sell out. Leave it off and it
    never does.

    **Warn me at** is where you want to start worrying. Set it to the number
    where you'd reorder — not zero, because by zero it's too late.
  </Accordion>

  <Accordion title="Draft or live">
    Draft means hidden, from the moment you save. A half-finished product won't
    appear in your shop by accident, and won't get lost either.

    Scheduling is separate. A publish date on a live product controls *when* it
    turns up.
  </Accordion>

  <Accordion title="Alt text">
    Every image gets its own, additional ones included. It's what a screen reader
    says out loud and what image search reads. Keep it under 125 characters —
    assistive tech cuts off around there.

    Describe what's in the photo, not that it's a photo. "Charcoal hoodie, front,
    on a hanger" — not "product image 1".
  </Accordion>

  <Accordion title="Search listing">
    A title and description for Google and for link previews on Facebook and X,
    all from one place.

    Leave them blank and your product name and description get used, which is
    fine. Fill them in for the products you actually want found.
  </Accordion>

  <Accordion title="Weight — physical only">
    In grams, and you need it for live carrier rates. Without it a product either
    quotes badly or stops the whole cart being quotable.
  </Accordion>

  <Accordion title="Ships from — physical only">
    Only appears once you've got two or more locations. Anything unassigned
    ships from your default.
  </Accordion>
</AccordionGroup>

## Variants

Name the options; the combinations get worked out for you.

Add a group — Size, Colour, Material — then type its values. Every combination
turns up as a row you can price and count stock against.

Call a group Colour (or Color, Colourway, Shade, Finish) and you get **colour
chips** instead of plain text, with common colour names filled in for you.

<Steps>
  <Step title="Add an option">
    Name it, type its values. "Small, Medium, Large".
  </Step>

  <Step title="Add another if you need one">
    Colour, Material, Length. Each one multiplies the combinations.
  </Step>

  <Step title="Price the rows">
    Leave a price blank and that combination sells at the product's own price,
    which is what you want for most of them.
  </Step>
</Steps>

Rows are matched by their options, not their position — so adding "Red" to a
colour group doesn't shift every price down a row. Each combination keeps the
price and stock you typed against it.

**Apply to all** sets a price or stock count across every row at once.

There's a ceiling of 250 combinations. Go past it and nothing changes at all —
the editor stops and tells you, instead of quietly trimming the list. A trimmed
list looks exactly like a shorter one, and you'd lose the prices you'd already
typed without noticing.

## Copying a product

**Duplicate** opens a fresh product form filled in from an existing one, asking
first what to bring across.

It asks because guessing gets it wrong half the time: someone making the same
shirt in another colour wants the options and the price but not the photos, and
someone making a seasonal variant wants the opposite.

Nothing's written until you save, and the copy arrives as a draft.

Three things never come across:

* **Digital files.** Two products sharing a file would mean deleting it from one deletes it from the other. Upload them again.
* **The catalogue number** and **the URL**, which belong to one product for its whole life.

## What catches people out

<AccordionGroup>
  <Accordion title="A physical product with no weight">
    Carrier rates need it. Imported catalogues frequently arrive without weights.
  </Accordion>

  <Accordion title="Replacing a digital file that's already sold">
    Existing customers keep the file they bought — orders remember the exact file.
    New orders get the new one. → [Digital products](/stashed/catalogue/digital-products)
  </Accordion>

  <Accordion title="Renaming a product that gets traffic">
    Add a redirect. Google and anyone who linked to you won't find the new URL on
    their own.
  </Accordion>

  <Accordion title="Uploading files then abandoning the form">
    Files move into your shop's storage when you **save**, not when you upload. An
    abandoned draft leaves them behind.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Import a shop" icon="download" href="/stashed/catalogue/import">
    Bring a Shopify or Etsy catalogue across.
  </Card>

  <Card title="Digital products" icon="file-arrow-down" href="/stashed/catalogue/digital-products">
    Downloads, and bundling one with a physical product.
  </Card>

  <Card title="Collections" icon="folder-open" href="/stashed/catalogue/collections">
    Grouping products for your navigation.
  </Card>

  <Card title="API" icon="code" href="/api/store/products">
    Create and update products in code.
  </Card>
</CardGroup>
