> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.omegatheme.com/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Import/export offers

Use **Import/Export Campaigns** to bulk create discount campaigns in Pareto by uploading a CSV file. Each offer type has its own template, so you can quickly create One Discount, Buy X Get Y, Bundle, or Order discount campaigns without manual setup.

Export your offers to a CSV file, edit them in a spreadsheet, then re-import the file to bulk-edit your offers in one go.

## In this article
* [When to export offers](#2-when-to-export-offers)
* [How to export offers](#2-how-to-export-offers)
* [Choosing an offer type to export](#2-choosing-an-offer-type-to-export)
* [Edit and re-import to bulk-update offers](#2-edit-and-re-import-to-bulk-update-offers)
* [Step 1: Choose the import type](#2-step-1-choose-the-import-type)
* [Step 2: Download the correct CSV template](#2-step-2-download-the-correct-csv-template)
* [Step 3: Fill in the CSV](#2-step-3-fill-in-the-csv)
* [Step 4: Upload the CSV file](#2-step-4-upload-the-csv-file)
* [Step 5: Review and confirm import](#2-step-5-review-and-confirm-import)
* [Step 6: Activate imported campaigns](#2-step-6-activate-imported-campaigns)
* [One Discount template](#2-one-discount-template)
* [Buy X Get Y template](#2-buy-x-get-y-template)
* [Bundle template](#2-bundle-template)
* [Order discount template](#2-order-discount-template)
* [Import limits and supported offer types](#2-import-limits-and-supported-offer-types)
* [FAQ](#2-faq)
* [Troubleshooting](#2-troubleshooting)
* [Best practices](#2-best-practices)

## When to export offers

Exporting is the first step for bulk-editing your offers. Instead of opening and updating each campaign one by one, you can export your offers to a CSV file, make your changes in a spreadsheet, and re-import the file to apply them all at once. Exporting is also useful for keeping a backup before making changes or for reviewing your offer setup in a spreadsheet.

## How to export offers

1. From the Pareto app, open the **Offers** page.
2. In the top-right corner, click **Export**.
3. In the **Export offers** window, open the offer type dropdown and select the type of offer you want to export.
4. Under **Export as**, keep **Plain CSV file** selected.
5. Click **Export**. Your CSV file will download to your computer.

![Export offers window showing the offer type dropdown with One discount selected and Plain CSV file chosen as the export format](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/anh-man-hinh-2026-09-08-luc-11_1r0np57.png)

## Choosing an offer type to export

Each export includes one offer type at a time, so check which offer type your target rule belongs to before choosing what to export. Open the dropdown in the **Export offers** window and choose from:

* **One discount**: a single discount applied to selected products (most of your quantity breaks offer should be this type).
* **Buy X get Y**: buy-X-get-Y campaigns, including free gifts and cross-sell offers.
* **Order discounts**: order-level discounts based on cart value or quantity.
* **Product bundles**: bundle and bought-together offers.
* **Quantity breaks**: legacy tiered and quantity-based volume discounts.

To export more than one type, repeat the export for each type you need.

## Edit and re-import to bulk-update offers
Exporting and re-importing is the fastest way to update many offers at once.

1. **Export** the offer type you want to update, following the steps above.
2. Open the downloaded CSV file in Excel, Google Sheets, or any spreadsheet tool.
3. Edit the values you want to change, such as discount amounts, quantity tiers, or offer names.
4. Save the file, keeping it in CSV format.
5. Back on the **Offers** page, click ${color}[#1972f5](**Import**) and upload your edited file.

Your changes apply to all the offers in the file in one step. Keep the column structure and headers of the exported file unchanged so Pareto can match your edits to the correct offers when you re-import.


## Step 1: Choose the import type

1. Open **Pareto - Quantity Breaks** in your Shopify admin
2. Go to **Offers**
3. Click **Import**
4. In **Select the type of import you would like to perform**, choose the offer type that matches your campaign

![Import campaigns dialog in Pareto showing the import type dropdown set to One discount for multiple savings, a Download sample CSV link, an Add files upload area, and Upload and preview button](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/screenshot-at-jun-25-15-15-42_11hjdm1.png)

You can import the following offer types, each with its own CSV template:

* **One discount for multiple savings**: one primary discount that can stack a free gift, a cross-sell discount, free shipping, and an order-level discount.
* **Buy X Get Y**: reward shoppers with discounted or free items when they buy qualifying products or spend an amount.
* **Bundles**: group products into a fixed bundle, a single combined bundle product, or add-on offers.
* **Order discount**: order-level discounts based on amount, quantity, or weight, with optional free shipping or free gift.

> Choose the import type that matches your campaign structure. The CSV template format is different for each type.

## Step 2: Download the correct CSV template

1. Click **Download sample CSV** for the selected import type
2. Open the file using Google Sheets, Excel, or Numbers
3. Do not rename or remove any column headers

> Each template has a comment row under the header that explains every column. Keep that row for reference while editing, then delete it before you import. Invalid or missing columns will cause import errors.

## Step 3: Fill in the CSV

These rules apply to every template:

* **One campaign per block.** The first row of a campaign carries the campaign-level fields (name, type, customer targeting). Leave `campaign_name` empty on the rows directly below to add more tiers, products, or gifts to that same campaign.
* `campaign_name` is required on the first row of each campaign.
* `display_name` is optional and is read from the first row only. Leave it empty to reuse the campaign name.
* Enter IDs as numbers, comma separated. For variant fields, a non-numeric value is matched to a variant by **SKU**.
* `customer_tag` is required when `customer_assign` is `1` or `3`.
* Do not leave required fields empty and do not add extra columns.

After filling the template, continue to the field reference for your offer type below, then upload the file.

## Step 4: Upload the CSV file

1. Return to the **Import campaigns** screen
2. Click **Add files** and select your CSV file
3. Click **Upload and preview**

## Step 5: Review and confirm import

1. Review detected campaigns and rules
2. Fix any validation errors shown
3. Click **Confirm import**

## Step 6: Activate imported campaigns

1. Imported campaigns are created as **Inactive**
2. Open each campaign to review settings
3. Click **Activate** when ready

## One Discount template

Use `template_one_discount.csv` for a single primary discount on selected products. You can layer a free gift, a cross-sell discount, free shipping, and an order-level discount on the same campaign, and add quantity tiers by adding rows.

### Fields

| Column | Description |
| ---- |
| `campaign_name` | Unique campaign name. Required on the first row. Leave empty on continuation rows to add more tiers. |
| `display_name` | Storefront display name (optional, first row only). |
| `product_assign` | `0` All products, `1` Specific variants (`variant_ids`), `2` Specific collections (`collection_ids`), `3` Specific products (`product_ids`). |
| `customer_assign` | `0` All visitors, `1` Logged-in with tag, `2` Logged-in, `3` Without tag, `4` D2C (exclude B2B), `5` B2B. |
| `customer_tag` | Customer tag. Required when `customer_assign` is `1` or `3`. |
| `selected_countries` | Target country codes, comma separated. |
| `all_product_rule` | How the condition is counted: `all_product`, `each_product`, `each_variant`, `each_collection`. |
| `title_tier` | Tier title label (optional). Supports the `{{min_value}}` placeholder. |
| `buy_from` | Minimum quantity to buy (required). |
| `discount_value` | Discount amount (number only). |
| `discount_unit` | `default`, `percent`, `price`, or `fixed`. |
| `badge` | Badge text shown on storefront (optional). |
| `free_gift_products` | Free gift, format `variant_or_sku:quantity` (example `7346871500886:2`). |
| `cross_products` | Cross-sell items, format `variant_or_sku:min:max` (example `7346870354006:1:5`). |
| `cross_discount_value` | Cross-sell discount amount. |
| `cross_discount_unit` | `percent`, `price`, or `fixed`. |
| `free_shipping_option` | `no_free_shipping`, `all_country`, or `selected_country`. |
| `free_shipping_countries` | Country codes for free shipping (comma separated). |
| `order_discount_value` | Order-level discount amount. |
| `order_discount_unit` | `percent`, `price`, or `fixed`. |
| `product_ids` / `collection_ids` / `variant_ids` | IDs based on `product_assign`. |

### Example

* **Buy 6+ Get Free Gifts**: `product_assign=3`, `buy_from=6`, `discount_value=10`, `discount_unit=percent`, `free_gift_products=7346871500886:2`.
* **Tiered campaign**: put the first tier on the campaign row (`buy_from=2`, `discount_value=10`), then add a second row with `campaign_name` empty and `buy_from=5`, `discount_value=15`.

## Buy X Get Y template

Use `template_buyxgety.csv` to reward shoppers when they buy qualifying items or reach a spend amount. Add more tiers by adding rows with `campaign_name` empty.

### Fields

| Column | Description |
| ---- |
| `campaign_name` | Required on the first row. Empty continuation rows add more tiers. |
| `display_name` | Storefront display name (optional, first row only). |
| `campaign_type` | `buy_x_get_y_quantity` (count of Buy X items) or `buy_x_get_y_amount` (spend amount). First row only. |
| `product_assign` | Buy X target: `0` all, `1` variants, `2` collections, `3` products. First row only. |
| `product_ids` / `collection_ids` / `variant_ids` | Buy X IDs based on `product_assign`. |
| `customer_assign` | Customer eligibility (`0` to `5`, same values as other templates). First row only. |
| `customer_tag` | Required when `customer_assign` is `1` or `3`. |
| `selected_countries` | Country codes, comma separated. |
| `buy_from` | Tier threshold: quantity of Buy X items, or spend amount. |
| `buy_to` | Tier upper bound. Empty or `0` for no upper bound. |
| `discount_unit` | Discount applied to Get Y: `free`, `percent`, `price`, or `fixed`. |
| `discount_value` | Discount amount. Empty or `0` when `discount_unit=free`. |
| `get_quantity` | Number of Get Y items the customer receives. |
| `get_y_type` | `different` (Y differs from X), `least_expensive` (cheapest qualifying item), or `same_as_x`. |
| `get_source` | Where Get Y comes from: `any`, `collections`, or `products`. |
| `get_ids` | Variant or SKU IDs when `get_source=products`, collection IDs when `get_source=collections`, empty for `any`. |
| `multiples` | `1` to apply the reward per each multiple of `buy_from`, else `0`. |

### Example

* **Buy 2 Get 1 Free**: `campaign_type=buy_x_get_y_quantity`, `product_assign=3`, `product_ids=111`, `buy_from=2`, `discount_unit=free`, `get_quantity=1`, `get_y_type=different`, `get_source=products`, `get_ids=222`. Add a second row (`campaign_name` empty) with `buy_from=4`, `get_quantity=2` for a higher tier.
* **Spend 100 Get Accessory 25% Off**: `campaign_type=buy_x_get_y_amount`, `buy_from=100`, `discount_unit=percent`, `discount_value=25`, `get_source=collections`, `get_ids=444`.

## Bundle template

Use `template_bundle.csv` to create bundles. Set `campaign_type` on the first row, then list one product per row. Continuation rows (with `campaign_name` empty) add more products to the bundle above.

### Fields

| Column | Description |
| ---- |
| `campaign_name` | Required on the first row. Empty continuation rows add more products to the bundle above. |
| `display_name` | Storefront display name (optional, first row only). |
| `campaign_type` | `bundle` (multi-product, fixed quantity each), `bundle_single` (combine selected products into one bundle product), or `add_ons` (add-on products using min/max). First row only. |
| `customer_assign` | Customer eligibility (`0` to `5`). First row only. |
| `customer_tag` | Required when `customer_assign` is `1` or `3`. |
| `selected_countries` | Country codes, comma separated. |
| `discount_unit` | `percent` (% off), `price` (amount off), or `fixed` (final price of the whole bundle). First row only. |
| `discount_value` | Discount amount. Meaning depends on `discount_unit`. |
| `bundle_title` | Bundle title shown to customers. Required when `campaign_type=bundle_single`. |
| `bundle_option_name` | Bundle option or group name. Required when `bundle_single`; defaults to `Bundle Package`. |
| `bundle_description` | Bundle description shown to customers. Required when `bundle_single`. |
| `main_product_ids` | `add_ons` only: the main products that get add-ons. Leave empty for `bundle` and `bundle_single`. |
| `product_id` | Shopify product ID. One product per row; add more on continuation rows. |
| `quantity` | Quantity of this product in the bundle. Used for `bundle` and `bundle_single` (ignored for `add_ons`). |
| `min` | Minimum quantity (`add_ons` only). |
| `max` | Maximum quantity, `0` for no limit (`add_ons` only). |
| `variant_ids` | Specific variant IDs or SKUs. Leave empty to include all variants of the product. |

### Example

* **Starter Combo** (`bundle`): first row `discount_unit=percent`, `discount_value=15`, `product_id=7001`, `quantity=1`, `variant_ids=8001`. Second row with `campaign_name` empty, `product_id=7002`, `quantity=2`.
* **Value Pack** (`bundle_single`): `discount_unit=fixed`, `discount_value=99`, `bundle_title=Value Pack`, `bundle_option_name=Choose your set`, plus a product row per item.
* **Add Warranty** (`add_ons`): `discount_unit=percent`, `discount_value=10`, `main_product_ids=7001,7002`, then add-on rows with `product_id`, `min`, and `max`.

## Order discount template

Use `template_order.csv` for order-level discounts based on amount, quantity, or weight. Add tiers or gifts on continuation rows with `campaign_name` empty.

### Fields

| Column | Description |
| ---- |
| `campaign_name` | Required on the first row. Empty continuation rows add tiers or gifts. |
| `display_name` | Storefront display name (optional, first row only). |
| `campaign_type` | `quantity`, `amount`, or `weight`. First row only. |
| `product_assign` | Buy scope: `0` any items from the online store, `2` any items from specific collections (`collection_ids`). First row only. |
| `collection_ids` | Collection IDs, comma separated. Use when `product_assign=2`. |
| `customer_assign` | Customer eligibility (`0` to `5`). First row only. |
| `customer_tag` | Required when `customer_assign` is `1` or `3`. |
| `selected_countries` | Country codes, comma separated. |
| `buy_from` | Tier threshold (order total, quantity, or weight, depending on `campaign_type`). |
| `buy_to` | Tier upper bound. Empty or `0` for no upper bound. |
| `discount_value` | Discount amount. Leave empty for `free_shipping` or `free_gift`. |
| `discount_unit` | `percent`, `price`, `free_shipping`, or `free_gift`. |
| `max_discount` | Maximum discount cap (only applies when `multiples=1`). |
| `multiples` | `1` to apply the discount per each multiple of `buy_from`, else `0`. |
| `free_gift_mode` | `all` (give all listed gifts) or `choose` (customer picks one). Only when `discount_unit=free_gift`. |
| `free_gift_variant_id` | Variant ID or SKU of the gift. Add more gifts on continuation rows. |
| `free_gift_quantity` | Quantity of this gift variant. |
| `exclude_variant_ids` | Variant IDs or SKUs to exclude (first row only). Requires `exclude_type`. |
| `exclude_type` | `condition_only` (excluded items do not count toward the trigger but still get the discount) or `condition_and_discount` (excluded items neither count nor get the discount). |

### Example

* **Spend & Save** (`amount`): first row `buy_from=50`, `discount_value=5`, `discount_unit=percent`, `max_discount=20`. Second row with `campaign_name` empty, `buy_from=100`, `discount_value=10`.
* **Free Ship Over 150**: `buy_from=150`, `discount_unit=free_shipping` (leave `discount_value` empty).
* **Spend 200 Get Gift**: `buy_from=200`, `discount_unit=free_gift`, `free_gift_mode=choose`, then one row per gift variant.

## Import limits and supported offer types

* Maximum **1,000 rules per file**
* Supported via CSV: **One Discount**, **Buy X Get Y**, **Bundles**, and **Order discount**

If you need to:

* Import an offer type not listed above
* Import **more than 1,000 rules at once**
* Migrate a large number of campaigns from another app

👉 **Please contact support**. Our team can help with assisted imports or custom migrations.

## FAQ

### Can I import more than 1,000 rules at once?

No. Each import supports up to **1,000 rules per file**.
For larger imports, contact support for assistance.

### Can I mix offer types in one file?

No. Each CSV file uses the template for a single offer type. Import each type with its own file.

### Will imported campaigns be active automatically?

No. All imported campaigns are created as **Inactive** so you can review them safely before activation.

### Can I leave the app while importing?

No. Please keep the app open until the import completes successfully.

### What happens if I import overlapping campaigns?

Imported campaigns do not override existing active campaigns.
If multiple campaigns target the same products, Shopify discount combination rules apply.

## Troubleshooting

### Import fails or stops unexpectedly

* Make sure the app remains open during import
* Check that the CSV file is under the 1,000-rule limit
* Retry the import with a smaller batch
* Make sure the product information is correct

### Campaign imported but discount does not apply

* Confirm the campaign status is **Active**
* Verify products, variants, or collections still exist
* Check for conflicting discounts in checkout

### CSV upload shows validation errors

* Ensure required fields are not empty
* Confirm IDs are numeric and comma separated, and that SKUs match existing variants
* Make sure each campaign has its campaign-level fields on the first row
* Make sure product assignment matches the correct ID column

### Tiers, gifts, or bundle products look incorrect

* Check that continuation rows have `campaign_name` empty so they attach to the campaign above
* Review `buy_from`, `buy_to`, and `multiples` values
* Confirm `discount_unit` and discount values are valid for the offer type

## Best practices

* Import campaigns in small batches
* Test a single campaign before activating the rest
* Avoid overlapping discounts on the same products
* Keep CSV backups of successful imports
