# Custom Attributes

{% hint style="info" %}
**Quick Answer:** Custom attributes let you store any extra data on a product — including planning constraints like MOQ, lead times, and safety stock. Create an attribute on one product, export your catalog to fill in values for all SKUs via CSV, then re-import with overwrite enabled. Your next replenishment plan uses those per-product values automatically.
{% endhint %}

Custom attributes let you add structured data to your products beyond the standard fields. Use attributes to organize your catalog, filter items on the planning page, and — most importantly — store per-product planning constraints that improve replenishment accuracy.

**Time Required:** 15–30 minutes (depending on catalog size)\
**Difficulty:** Beginner\
**Who can do this:** Admin or Manager role

## How attributes work

{% hint style="warning" %}
**Attributes are account-wide.** When you create an attribute on any product, that attribute becomes available for all products in your Moselle account. You only need to create each attribute once.
{% endhint %}

### Planning attributes (special meaning in Moselle)

These four attributes are recognized by the replenishment engine. Per-product values override the global defaults set when creating a plan — if no value is set on a product, Moselle falls back to the plan-level defaults.

| Attribute                | Attribute name to use  | What it controls                                                                      |
| ------------------------ | ---------------------- | ------------------------------------------------------------------------------------- |
| **MOQ**                  | `moq`                  | Minimum order quantity — Moselle won't recommend ordering fewer units than this value |
| **Transit Lead Time**    | `transit_lead_time`    | Days from order placement to warehouse arrival — shifts reorder timing forward        |
| **Production Lead Time** | `production_lead_time` | Days your supplier needs to manufacture the order before it ships                     |
| **Safety Stock**         | `safety_stock`         | Days of inventory buffer to maintain above your demand forecast                       |

### Other common attributes

| Attribute    | Example values                     | Use case                       |
| ------------ | ---------------------------------- | ------------------------------ |
| Product Line | "Summer 2024", "Core Collection"   | Filter forecasts by collection |
| Product Type | "T-Shirt", "Hoodie", "Accessories" | Group similar items            |
| Material     | "Cotton", "Polyester", "Blend"     | Production planning grouping   |
| Grade        | "A", "B", "C"                      | SKU tier segmentation          |

## Add an attribute to a product

1. Open the item details page for any product
2. Scroll to the **Custom Attributes** section
3. Click **+ Add**
4. In the dropdown, either:
   * Select an existing attribute from the list
   * Type a new attribute name and click **Add New**
5. Enter the value for this product
6. Click **Save**

<figure><img src="/files/Fb3sUYCVp88a97Bl2Crt" alt=""><figcaption><p>Adding a custom attribute to a product</p></figcaption></figure>

{% hint style="info" %}
Once you create a new attribute on one product, it becomes available to assign on any other product in your catalog.
{% endhint %}

## Set up planning attributes across your whole catalog (bulk workflow)

Adding MOQ, lead times, and safety stock one product at a time isn't practical for large catalogs. Use the export → fill → re-import workflow to set values for all your SKUs at once.

### Step 1: Create the attributes on one product

You only need to do this once per attribute — as soon as it exists on one product, it's available account-wide.

1. Open any product in your catalog
2. Scroll to **Custom Attributes** and click **+ Add**
3. Type `moq` and select **Add New**
4. Enter any placeholder value (e.g., `100`) and click **Save**
5. Repeat for each remaining planning attribute:
   * `transit_lead_time`
   * `production_lead_time`
   * `safety_stock`

{% hint style="success" %}
All four attributes are now available for every product. The bulk import in the next steps will populate the actual values — you don't need to visit each product individually.
{% endhint %}

### Step 2: Export your product catalog

Exporting after creating the attributes generates a CSV with your new attribute names as column headers, pre-formatted and ready to fill in.

1. Go to **Catalog** in the left nav
2. Select the **Products** tab
3. Click **Export** (top right)
4. Open the downloaded CSV

You'll see `moq`, `transit_lead_time`, `production_lead_time`, and `safety_stock` as column headers alongside your standard product fields.

### Step 3: Fill in values for your products

Add the appropriate value for each product row in the CSV:

| Attribute              | Example values       | Unit            |
| ---------------------- | -------------------- | --------------- |
| `moq`                  | `100`, `500`, `1000` | Number of units |
| `transit_lead_time`    | `7`, `14`, `21`      | Days            |
| `production_lead_time` | `30`, `45`, `60`     | Days            |
| `safety_stock`         | `14`, `30`, `45`     | Days of cover   |

Leave a cell blank for any product where you want to fall back to the plan-level default for that field.

{% hint style="warning" %}
**Attribute names are case-sensitive.** Do not rename the column headers — they must exactly match the attribute names you created in Step 1.
{% endhint %}

### Step 4: Re-import with overwrite enabled

1. Go to **Catalog > Products > Import**
2. Upload your completed CSV
3. Check **Overwrite Products with Matching SKUs**
4. Click **Import Products**
5. Spot-check a few items after import to confirm values saved correctly

See [Import Items via CSV](/operations/catalog/import-your-items.md) for full import instructions and troubleshooting.

### Step 5: Re-run your replenishment plan

With per-product constraints in place, your next plan will use the individual values you just set.

{% content-ref url="/pages/8QlNv4eTnXy8INtmWeyS" %}
[Create a Replenishment or Allocation Plan](/planning-and-execution/replenishment/create-a-production-plan.md)
{% endcontent-ref %}

When creating or rebuilding the plan, the **Transit Lead Times** and **Safety Stock** fields in plan settings still act as fallbacks for any products without an attribute value set.

## View all attributes in your account

To see every attribute currently defined:

1. Go to any item details page
2. Click **+ Add** under Custom Attributes
3. The dropdown lists all available attributes

## Attributes in forecasting and reports

Attributes appear as filter options on:

* The Planning page forecast views
* Custom reports in Analytics
* Export files when downloading your catalog

Use consistent attribute naming to get the most value from filtering and reporting.

## Attributes and CSV import

{% hint style="danger" %}
**Create attributes in Moselle before importing a CSV that includes them.** The import validates attribute columns against existing attributes in your account. Columns that don't match an existing attribute will cause the upload to fail silently.
{% endhint %}

## Frequently Asked Questions

### What if I only want to set MOQ for some products?

Leave the `moq` cell blank for any products where you want no minimum — Moselle will treat those as having no MOQ constraint.

### Can I update these values later?

Yes. Export your catalog again, update the values in the CSV, and re-import with overwrite. Then rebuild your replenishment plan to apply the changes.

### Do planning attributes affect my forecast?

No — MOQ, lead times, and safety stock are planning constraints only. They influence reorder recommendations in your replenishment plan but do not change your demand forecast.

### What's the difference between transit and production lead time?

**Production lead time** is how long your supplier takes to manufacture the order. **Transit lead time** is how long shipping takes after the order is ready. Moselle factors both into reorder timing.

### Why isn't my attribute column being imported?

Attribute names are case-sensitive and must match exactly. Check for extra spaces, and note that spaces in attribute names become underscores (e.g., "Lead Time" → `lead_time`).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learn.moselle.io/operations/catalog/custom-attributes.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
