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

# Import and export prices

> Update pricebook prices in bulk by exporting your existing data, editing the CSV, and reimporting it.

Prices in Qwoty are created automatically — every time a pricebook is set up, all relevant products receive a price entry. Your job is to fill in the values, not to create the entries from scratch.

```mermaid theme={null}
flowchart LR
  A["Pricebook created"] -->|"Qwoty auto-generates"| B["1 price entry per\nproduct × billing period\npricing_model = None"]
  B --> C["Export CSV\n(id already exists\nfor every row)"]
  C --> D["Edit in spreadsheet\nSet pricing_model\n& amounts"]
  D --> E["Reimport"]
  E --> F["Prices live ✓"]
  F -->|"Need to update"| C
```

When you create a pricebook, Qwoty automatically generates one price entry per product and per billing period — all set to `None`. Those entries already have an `id`. The export-then-reimport flow is therefore the same whether you are configuring prices for the first time or updating existing ones.

The standard workflow is: **export your existing prices → edit the CSV → reimport it**. The `id` column is the only key Qwoty uses to match rows; all other fields are updated in place.

<Note>
  You must have the **Admin** role to access Import & Export. Pricebooks must already exist before you can configure their prices.
</Note>

## Access

Navigate to **Settings → Import & Export**, then select the **Prices** section.

The page has two panels: **Import** (upload a CSV) and **Export** (download your current data).

## Update prices

<Steps>
  <Step title="Export your current prices">
    In the **Export** panel, choose what to download:

    * **All data** — every price across all pricebooks
    * **Filter by pricebook** — one pricebook at a time
    * **Filter by catalog** — all prices for products in a given catalog

    Click **Export CSV**. The file contains one row per price, with the `id` column pre-filled for every existing entry.
  </Step>

  <Step title="Edit the CSV">
    Open the file in your spreadsheet editor and fill in or update the pricing columns. The following columns are read-only context — they identify what each row represents and must not be changed:

    * `id`, `product_api_name`, `pricebook_api_name`, `currency_code`, `type`, `period_unit`, `period`

    The columns you configure are: `pricing_model`, `amount`, `percent`, `cost`, `floor_price`, `vat_code`, `engagement_type`, `period_duration_month`, `pay_as_you_go`, `identifiers[*]`, and tier columns.

    Rows with an empty `pricing_model` (or `None`) are placeholder prices waiting to be configured. Set the model and the relevant amount columns for those rows.

    <Warning>
      Do not add new rows. Prices are created automatically when pricebooks are set up — rows not present in the export do not correspond to any existing price and will be rejected on import.
    </Warning>
  </Step>

  <Step title="Reimport the file">
    In the **Import** panel, click **Upload File** and drop your edited CSV.

    The import wizard runs in four steps: **Upload → Mapping → Confirm → Result**. Review the mapping screen before confirming to make sure columns are matched correctly.

    <Check>
      Once the import completes, your prices are live in the corresponding pricebooks. Open a pricebook to verify the changes.
    </Check>
  </Step>
</Steps>

## The six pricing models

Each row declares its model in the `pricing_model` column. The required columns depend on the model.

| Model              | Use it for                                                           |
| ------------------ | -------------------------------------------------------------------- |
| `Flat`             | One fixed amount — the most common case                              |
| `Cost based`       | Selling price computed as a multiplier on the product's defined cost |
| `Percent`          | A percentage of a reference value, calculated at quote time          |
| `Graduated Tiered` | Each tier applies progressively to volumes within that tier          |
| `Volume Tiered`    | The entire quantity is priced at the tier matching the total         |
| `None`             | Placeholder — the price is filled in manually at quote time          |

<Warning>
  `pricing_model` values are case-sensitive. Use exactly: `Flat`, `Cost based` (with a space), `Percent`, `Graduated Tiered`, `Volume Tiered`, `None`. Any other casing is rejected.
</Warning>

## CSV columns reference

| Column                    | Required       | Type    | Description                                                                                                                                                 |
| ------------------------- | -------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                      | ✱              | UUID    | Price ID — the only key used on import. Never change this value.                                                                                            |
| `product_api_name`        | —              | Text    | Read-only context. The API name of the associated product.                                                                                                  |
| `pricebook_api_name`      | —              | Text    | Read-only context. The API name of the associated pricebook.                                                                                                |
| `currency_code`           | —              | Text    | Read-only context. ISO 4217 code (`EUR`, `USD`, `GBP`…).                                                                                                    |
| `type`                    | —              | Enum    | Read-only context. `one-time` or `recurring`.                                                                                                               |
| `period_unit`             | —              | Enum    | Read-only context. Billing period unit (`day`, `week`, `month`, `year`).                                                                                    |
| `period`                  | —              | Number  | Read-only context. Number of period units per cycle (`1` = monthly, `3` = quarterly).                                                                       |
| `pricing_model`           | ✱              | Enum    | `Flat`, `Cost based`, `Percent`, `Graduated Tiered`, `Volume Tiered`, `None`.                                                                               |
| `vat_code`                | —              | Text    | VAT identifier in `vat_<country>_<rate>` format (e.g. `vat_fr_200` = France 20%). Leave empty for no default VAT.                                           |
| `floor_price`             | —              | Number  | Minimum allowed price (guardrail when discounts are applied).                                                                                               |
| `amount`                  | ✱ if `Flat`    | Number  | The fixed price per unit.                                                                                                                                   |
| `percent`                 | ✱ if `Percent` | Number  | The percentage value (`8.95` = 8.95%).                                                                                                                      |
| `percent[multiplier]`     | —              | Number  | Optional multiplier on the percent calculation.                                                                                                             |
| `percent[perimeter]`      | —              | Text    | Scope the percentage applies to (e.g. `product`).                                                                                                           |
| `percent[externals_id]`   | —              | UUID    | Reference ID for the percent target.                                                                                                                        |
| `cost`                    | —              | Number  | For `Flat`: internal cost reference used for margin reporting. For `Cost based`: the multiplier applied to the product's cost to compute the selling price. |
| `pay_as_you_go`           | —              | Boolean | `true` for usage-based billing where the amount is computed at consumption time.                                                                            |
| `engagement_type`         | —              | Enum    | `forever` (open-ended) or `fixed` (commitment period).                                                                                                      |
| `period_duration_month`   | —              | Number  | Commitment duration in months. Required when `engagement_type` is `fixed`.                                                                                  |
| `identifiers[erp]`        | —              | Text    | External ERP reference for this price.                                                                                                                      |
| `identifiers[crm]`        | —              | Text    | External CRM reference for this price.                                                                                                                      |
| `identifiers[accounting]` | —              | Text    | External accounting reference for this price.                                                                                                               |
| `tiers[starting_unit][N]` | ✱ if tiered    | Number  | Lower bound of tier N (inclusive). N is 0-based: `[0]`, `[1]`, `[2]`…                                                                                       |
| `tiers[ending_unit][N]`   | —              | Number  | Upper bound of tier N (inclusive). Leave empty for "no upper limit".                                                                                        |
| `tiers[price][N]`         | ✱ if tiered    | Number  | Per-unit price for tier N.                                                                                                                                  |
| `tiers[flat_fee][N]`      | —              | Number  | Optional flat fee added on top of tier N (`Graduated Tiered` only).                                                                                         |

<Info>
  Tier indexes are 0-based: the first tier is `tiers[starting_unit][0]`, the second is `tiers[starting_unit][1]`, and so on.
</Info>

## Examples by pricing model

### Flat one-time

A fixed amount per unit, with an internal cost reference for margin reporting:

```csv theme={null}
id,currency_code,type,pricing_model,vat_code,floor_price,amount,cost
a3b97966-...,EUR,one-time,Flat,vat_fr_200,13900,14900,8700
```

### Flat recurring (monthly, open-ended)

A fixed monthly fee with no commitment period:

```csv theme={null}
id,currency_code,type,pricing_model,vat_code,amount,period_unit,period,engagement_type
bf56bdd5-...,EUR,recurring,Flat,vat_fr_200,0,month,1,forever
```

### Flat recurring (annual, fixed commitment)

An annual price with a 12-month commitment:

```csv theme={null}
id,currency_code,type,pricing_model,vat_code,amount,period_unit,period,engagement_type,period_duration_month
d1b65444-...,EUR,recurring,Flat,vat_fr_200,1100,year,1,fixed,12
```

### Cost based

Selling price is computed as the product's defined cost × the multiplier in `cost`. A `floor_price` sets the minimum:

```csv theme={null}
id,currency_code,type,pricing_model,vat_code,floor_price,cost
dcc190c5-...,EUR,one-time,Cost based,vat_fr_200,10,2
```

### Percent

A percentage of a reference product's price, calculated at quote time:

```csv theme={null}
id,currency_code,type,pricing_model,vat_code,percent,percent[perimeter],percent[externals_id],period_unit,period,engagement_type
5a68792e-...,EUR,recurring,Percent,vat_fr_200,8.95,product,b150e52a-...,month,1,forever
```

### Graduated tiered

The first 10 units at €49, everything above at €39:

```csv theme={null}
id,currency_code,type,pricing_model,vat_code,period_unit,period,tiers[starting_unit][0],tiers[ending_unit][0],tiers[price][0],tiers[flat_fee][0],tiers[starting_unit][1],tiers[ending_unit][1],tiers[price][1],tiers[flat_fee][1]
ac06fe31-...,EUR,recurring,Graduated Tiered,vat_fr_200,month,1,1,10,49,0,11,,39,0
```

For 15 units: `10 × €49 + 5 × €39 = €685`.

### Volume tiered

The entire quantity is priced at the tier matching the total volume:

```csv theme={null}
id,currency_code,type,pricing_model,vat_code,tiers[starting_unit][0],tiers[ending_unit][0],tiers[price][0],tiers[flat_fee][0],tiers[starting_unit][1],tiers[ending_unit][1],tiers[price][1],tiers[flat_fee][1]
...,EUR,one-time,Volume Tiered,vat_fr_200,1,100,6.00,0,101,,5.00,0
```

For 150 units: `150 × €5.00 = €750` (everything at the tier matching 150).

### None (placeholder)

The product appears in the pricebook but has no configured price. Sales reps fill in the amount manually on each quote:

```csv theme={null}
id,currency_code,type,pricing_model,vat_code
5f7efcbd-...,EUR,one-time,None,vat_fr_200
```

## Troubleshooting

<AccordionGroup>
  <Accordion title="Import failed: unknown pricing_model">
    `pricing_model` is case-sensitive. Use exactly: `Flat`, `Cost based` (with a space), `Percent`, `Graduated Tiered`, `Volume Tiered`, `None`. Lowercase variants or underscores (`cost_based`) are rejected.
  </Accordion>

  <Accordion title="Import failed: id not recognized">
    The `id` column must contain a UUID that exists in your workspace. Only rows from an export of your own workspace are valid. Do not copy IDs from another workspace or create new ones manually.
  </Accordion>

  <Accordion title="Tiers are imported in the wrong order">
    Qwoty orders tiers by `tiers[starting_unit][N]` value, not by index position. Make sure `tiers[starting_unit][0]` is the smallest value. Overlapping ranges trigger a validation error.
  </Accordion>

  <Accordion title="vat_code is rejected">
    Use the `vat_<country>_<rate>` format, all lowercase, with the rate as a number without a decimal point: `vat_fr_200` for 20%, `vat_fr_055` for 5.5%, `vat_de_190` for 19%. Leave the cell empty when no VAT applies.
  </Accordion>

  <Accordion title="Fixed-term price shows no commitment duration">
    When `engagement_type` is `fixed`, you must also fill in `period_duration_month` with the number of months (e.g. `12` for a 12-month commitment). Leaving it empty with `engagement_type = fixed` causes the field to be ignored.
  </Accordion>

  <Accordion title="Percent price is applied with unexpected results">
    The `percent` column takes a number, not a fraction: `8.95` means 8.95%, not 0.0895. Combine with `floor_price` to set a minimum charge.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Pricing types reference" icon="book-open" href="/user-guide/catalog/reference/pricing-types">
    Conceptual deep-dive on each pricing model and when to use it.
  </Card>

  <Card title="Create a pricebook" icon="tag" href="/user-guide/catalog/how-tos/create-pricebook">
    Set up the pricebook before exporting its prices to configure.
  </Card>

  <Card title="Import products" icon="box" href="/user-guide/data-migration/how-tos/import-products">
    Products must exist before their prices can be configured.
  </Card>

  <Card title="Prepare your CSV" icon="file-spreadsheet" href="/user-guide/data-migration/how-tos/prepare-csv-files">
    Universal formatting rules for all Qwoty imports.
  </Card>
</CardGroup>
