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

# Product store data

> The Product Store-Level dataset allows you to provide product information at store, market, or sales-channel level.

The **Product Store-Level** dataset allows you to provide product information at store, market, or sales-channel level.

This dataset is required if:

* You operate multiple physical stores
* You sell across different markets (countries)
* You manage multiple sales channels (Online / Marketplace / Wholesale)
* Prices, costs, tax rates, or stock differ per store

Each row represents:

> **One product in one specific store (or market / channel)**

***

## When to use store-level data

Use this dataset if:

* Prices vary by store
* Unit cost differs by warehouse or region
* Stock is managed per store
* Tax rates vary by country
* Some products are active in certain stores only

If all stores share identical product data, you may use only the Products dataset.

***

## Data schema

| Field Name             | Required | Type     | Format                    | Description                                                                | Alternative Names                                           | Example     |
| :--------------------- | :------- | :------- | :------------------------ | :------------------------------------------------------------------------- | :---------------------------------------------------------- | :---------- |
| `item_id`              | ✅ Yes    | string   | Text                      | Unique SKU-level identifier (must match `item_id` in the Products dataset) | itemId, sku\_id                                             | SKU-1001    |
| `store_id`             | ✅ Yes    | string   | Text                      | Store / market / sales channel identifier                                  | storeId, store\_code, market\_id, channel\_id, location\_id | FI-HELSINKI |
| `price`                | ✅ Yes    | float    | Dot separator             | Current selling price                                                      | selling\_price, current\_price                              | 119.99      |
| `unit_cost`            | ⬜ No     | float    | Dot separator             | Cost per unit                                                              | cost, purchase\_cost, landed\_cost                          | 75          |
| `status`               | ⬜ No     | string   | Text                      | Product status in this store (active / discontinued / out\_of\_stock)      | availability\_status, lifecycle\_status                     | active      |
| `stock`                | ⬜ No     | float    | Numeric                   | Available inventory units                                                  | inventory, stock\_qty, quantity\_available                  | 42          |
| `regular_price`        | ⬜ No     | float    | Dot separator             | Non-discounted base price                                                  | list\_price, base\_price                                    | 129.99      |
| `tax_rate`             | ⬜ No     | float    | Percentage (0–1 or 0–100) | VAT or sales tax rate                                                      | vat, vat\_rate, tax                                         | 24          |
| `currency`             | ⬜ No     | string   | ISO 4217                  | Currency code                                                              | currency\_code                                              | EUR         |
| `price_effective_date` | ⬜ No     | datetime | YYYY-MM-DD                | Date when price becomes effective                                          | effective\_from, valid\_from                                | 2026-02-01  |

You may include additional attributes as separate columns.

***

## Matching logic

* `item_id` must match the Products dataset
* `store_id` must match a store defined in [Stores management](/stores/manage-stores)

Matching can be configured using:

* Exact match
* Composite keys (item\_id + store\_id)
* Custom identifiers

***

## Load by CSV or by API

Store-level data can be loaded two ways:

* **CSV / XLSX upload** - via the Datasets page, following the format requirements below.
* **Public API** - push product-store records programmatically, one record per product-store combination. The upsert key is `(item_id, store_id)`; payloads that omit `store_id` remain product-level and behave as before. See the [API changelog](/api-reference/changelog) for details.

***

## Price interpretation logic

Retailgrid applies the following logic:

* If `regular_price` exists and `price` \< `regular_price` → product is considered on promotion
* Margin is calculated as:

  ```
  Margin = price - unit_cost
  Margin % = (price - unit_cost) / price
  ```
* If `tax_rate` is provided, gross/net calculations are supported

***

## Store / market / channel flexibility

`store_id` can represent:

* Physical store
* Country
* Warehouse
* Online shop
* Marketplace (Amazon, Zalando, etc.)
* B2B vs B2C channel

Retailgrid treats this as a **location dimension**.

***

## Currency handling

If multiple stores use different currencies:

* Currency must be provided
* FX conversion rules must be configured

Recommended:\
Keep price and cost in the same currency per row.

***

## Time handling

This dataset is typically a **current snapshot**, not time-series.

If `price_effective_date` is provided:

* Future price simulations become possible
* Scheduled price changes can be modeled

***

## Data format requirements

Supported formats:

* CSV (recommended)
* XLSX

Encoding:

* UTF-8
* Dot (.) as decimal separator

Rules:

* One row = one product × one store
* Do not duplicate identical product-store combinations
* Use consistent store\_id formatting

***

## Validation rules

Upload will fail if:

* `item_id` is missing
* `store_id` is missing
* `price` is missing or non-numeric
* Matching with Products dataset fails

***

## Example row

| item\_id | store\_id   | price  | unit\_cost | status | stock | regular\_price | tax\_rate | currency | price\_effective\_date |
| :------- | :---------- | :----- | :--------- | :----- | :---- | :------------- | :-------- | :------- | :--------------------- |
| SKU-1001 | FI-HELSINKI | 119.99 | 75         | active | 42    | 129.99         | 24        | EUR      | 2026-02-01             |

***

## How Retailgrid uses store-level data

This dataset powers:

### Margin analysis per store

* Store-level profitability
* Margin leakage detection

### Local price optimization

* Dynamic pricing by store
* Market-based pricing

### Assortment strategy

* Store-specific availability
* Stock-based pricing decisions

### Promotion strategy

* Local promo activation
* Regional discount benchmarking

***

## Advanced recommendations

For best results:

* Always provide `unit_cost` for margin optimization
* Keep store identifiers consistent
* Provide stock for AI-driven replenishment signals
* Include tax\_rate for cross-country operations

***

## Related

* [Manage stores](/stores/manage-stores)
* [Product and SKU-Store grid views](/grids/sku-store-view)
* [Datasets](/data-requirements/datasets)
