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

# Importing Data

> Bring your products and ingredients into Digital Florists using spreadsheets.

Digital Florists imports product and ingredient data from spreadsheets so you can set up your shop, add a seasonal range, or move from another system in bulk.

<Info>
  **This page covers features gated by Admin-tier permissions** — typically Settings access. Admins have these by default; your administrator can adjust who has them in [Settings > Team](/settings/team).
</Info>

Ingredient imports support event work. Product imports and shop migrations are included with Orders.

## What you can import

| What                    | Where to find it                      | Best for                                          |
| ----------------------- | ------------------------------------- | ------------------------------------------------- |
| **Products**            | Settings > Products > Import Products | Adding or updating your product catalogue in bulk |
| **Ingredients**         | Events > Ingredients > Import CSV     | Adding or updating your ingredient library        |
| **From another system** | Settings > Advanced > Data Migration  | Moving from Shopify, Strelitzia, or FloristPro    |

Before importing products, make sure your **categories**, **tax rates**, and **occasions** are set up. The importer matches these by name and rejects rows that reference values that don't exist.

***

## Importing products

The product import is a step-by-step wizard. Nothing is saved until you review the changes and confirm.

<Steps>
  <Step title="Choose what you want to do">
    Go to **Settings** > **Products** and click **Import Products**. You'll see three options:

    * **Add new products** — you're creating products from scratch using a spreadsheet
    * **Update existing products** — you want to change prices, descriptions, or other details on products you already have
    * **Prepare an existing export** — you have a product file from another platform (like Shopify) that needs converting first
  </Step>

  <Step title="Download a template">
    For new products, pick **Blank Template** or **Worked Example** (sample data included). To update existing products, click **Export Products For Update** for a spreadsheet pre-filled with your current catalogue. You can filter by category if you only want to update part of your range.
  </Step>

  <Step title="Fill in your spreadsheet">
    Open the template in Excel, Google Sheets, or Numbers. See the [column reference](#product-import-columns) below for what each column means.

    **The key concept:** each row in the spreadsheet is one **variant** (size), not one product. If a product comes in three sizes, you need three rows, one per size. See [understanding variants](#understanding-variants) below for a worked example.
  </Step>

  <Step title="Upload and preview">
    Back on the import page, drag your file onto the upload area (or click to browse). The file must be a **.csv** or **.xlsx** file, no larger than **10 MB**.

    Click **Preview Changes**. Digital Florists reads your file and shows what will happen: which products are new, which are being updated, and what's changing. Nothing is saved yet.
  </Step>

  <Step title="Review and confirm">
    Check the summary at the top: how many products, how many are new, how many variants, and any warnings.

    Below the summary you'll see a detailed list of every change, grouped by product. For updates, it shows the current value and the new value side by side so you can spot anything unexpected.

    When you're happy, tick the confirmation checkbox and click **Import Products**.
  </Step>
</Steps>

<Tip>
  **First time?** Download the Worked Example in step 2. It shows you how to format a product with multiple sizes, categories, and pricing. Delete the sample rows and replace them with your own data.
</Tip>

### Understanding variants

This is the most important concept to get right. In Digital Florists, a **product** is the thing your customer sees (e.g., "Red Rose Hand-Tied"), and a **variant** is a specific size or version of it (e.g., Standard at £35, Large at £50).

**Each row in your spreadsheet is one variant, not one product.**

Here's what a product with three sizes looks like in your CSV:

| Product Code | Product Name       | Categories         | Variant Name | Price | Cost Price |
| ------------ | ------------------ | ------------------ | ------------ | ----- | ---------- |
| ROSE-HT      | Red Rose Hand-Tied | Bouquets, Birthday | Standard     | 35.00 | 12.00      |
| ROSE-HT      | Red Rose Hand-Tied | Bouquets, Birthday | Large        | 50.00 | 18.00      |
| ROSE-HT      | Red Rose Hand-Tied | Bouquets, Birthday | Luxury       | 75.00 | 25.00      |

Notice that all three rows share the **same Product Code** (`ROSE-HT`). That's how Digital Florists knows they're sizes of one product, not three separate products.

And here's a product that only comes in one size:

| Product Code | Product Name  | Categories | Variant Name | Price | Cost Price |
| ------------ | ------------- | ---------- | ------------ | ----- | ---------- |
| CHOC-BOX     | Chocolate Box | Add-ons    | Standard     | 12.00 | 6.00       |

<Info>
  **What stays the same across rows:** Product Code, Product Name, Categories, Description, Occasions, and other product-level details must be identical on every row that belongs to the same product. If they differ, the import will show a warning.

  **What changes per row:** Variant Name, Price, Cost Price, Stock, Barcode, Tax Rate, and variant images can be different on each row, that's the whole point of variants.
</Info>

### What happens after you import

* Your products are created or updated immediately
* If your spreadsheet included image URLs (in the Attachment column), those images are downloaded in the background. You'll see a message saying how many are being processed
* Go to **Products** to see your updated catalogue

<Warning>
  After importing, you'll need to **reset the product cache** on your POS for the new products to appear at the till. Go to the POS, tap the **cog icon**, and select **Reset Product Cache**.
</Warning>

### Product import columns

Here's every column you can use. Only the ones marked **required** need a value for new products. Everything else is optional.

<Info>
  The column order in your spreadsheet doesn't matter. Columns are matched by name, not position. You can rearrange, add, or remove optional columns however you like.
</Info>

#### Adding new products

| Column                          | Required?              | What it does                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| ------------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Product Code**                | Yes (header required)  | A unique code for the product (like a SKU). If you don't have codes, you can use the product name. When multiple rows share the same Product Code, they become variants of the same product.                                                                                                                                                                                                                                                                                                                                                                  |
| **Product Name**                | Yes (for new products) | The name customers see, like "Red Rose Hand-Tied".                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| **Categories**                  | Yes (for new products) | Which categories the product belongs to. The **first category listed is the primary category** used for filtering and display. Add more with commas (e.g., `Bouquets, Birthday`). For subcategories, use `>` (e.g., `Flowers > Roses`). Maximum 5 categories. If a category doesn't exist yet, it's created automatically. **Important:** you can only assign products to the most specific (deepest) category in a tree. For example, if "Add-ons" has subcategories like "Chocolates" and "Candles", use `Add-ons > Chocolates` rather than just `Add-ons`. |
| **Variant Name**                | Yes (for new variants) | The size or version name, like "Standard", "Large", or "Luxury". If the product only has one size, use "Standard" or "Base".                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| **Price**                       | No (defaults to 0)     | The retail price including tax.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| **Cost Price**                  | No (defaults to 0)     | What you pay for it. Useful for margin reporting.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| **Tax Rate**                    | Yes (for new variants) | The tax rate to apply. Enter the name of a tax rate you've already set up (e.g., "Standard" or "Reduced"). If you have a default tax rate configured in Settings, you can leave this blank.                                                                                                                                                                                                                                                                                                                                                                   |
| **Barcode**                     | No (auto-generated)    | A barcode for POS scanning. If your product already has a barcode, enter it here. For bespoke items or anything without one, leave it blank and one is generated for you.                                                                                                                                                                                                                                                                                                                                                                                     |
| **Description**                 | No                     | A product description. You can use basic formatting like bold and bullet points.                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| **Occasions**                   | No                     | Tag the product with occasions like Birthday, Romance, or Sympathy. Separate multiple occasions with commas. These must match occasion names you've already set up.                                                                                                                                                                                                                                                                                                                                                                                           |
| **Visible**                     | No                     | `Yes` or `No`. Whether the product appears to staff. Defaults to `Yes`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| **Age Verification**            | No                     | `Yes` or `No`. Turn on for items like champagne where your driver needs to check ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| **Designer**                    | No                     | A designer name.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| **Brand**                       | No                     | A brand name.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| **Stock**                       | No                     | How many you have in stock. Defaults to 0.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| **Stock Control**               | No                     | `Yes` or `No`. Whether Digital Florists tracks stock for this variant. Defaults to `No`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| **Product Kind**                | No                     | Enter `gift_card` to mark the product as a gift card, or `standard` for a normal product. For updates, leave the cell blank to keep the current value or enter `__CLEAR__` to reset it to standard. The kind cannot change once the product has been sold.                                                                                                                                                                                                                                                                                                    |
| **Attachment**                  | No                     | A web link (URL) to the **product** image (shared across all variants). Downloaded automatically in the background.                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| **Attachment Alt Text**         | No                     | Descriptive text for the product image.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| **Variant Attachment**          | No                     | A web link to a **variant-specific** image. Use this when different sizes have different photos. This is a separate column from Attachment: Attachment is the product image, Variant Attachment is for the individual size.                                                                                                                                                                                                                                                                                                                                   |
| **Variant Attachment Alt Text** | No                     | Descriptive text for the variant image.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |

#### For updates only

These columns appear when you export your existing products for updating:

| Column                 | Required?         | What it does                                                                                        |
| ---------------------- | ----------------- | --------------------------------------------------------------------------------------------------- |
| **Match Product Code** | Yes (for updates) | Identifies which existing product to update. Filled in automatically when you export your products. |
| **Match Barcode**      | Yes (for updates) | Identifies which existing variant to update. Also filled in automatically on export.                |

<Warning>
  When updating existing products, **blank cells keep the current value**. If you want to clear a field (like removing a description), type `__CLEAR__` in that cell. Get this wrong and a half-filled spreadsheet won't wipe the missing fields the way you might expect.
</Warning>

#### Grouping variants without a product code

If your products don't have codes and you want multiple rows to become variants of the same product, use the **Product Group** column. Give all the rows for one product the same group name (anything you like, "My Bouquet", "Group A", etc.) and Digital Florists links them together.

### Avoiding barcode problems in Excel

<Warning>
  Excel can corrupt long barcodes. It converts them to scientific notation (e.g., `5012345678901` becomes `5.01235E+12`), or treats values starting with `+` or `=` as formulas. Use the **Export Products For Update** XLSX file when updating, or format the barcode column as **Text** in Excel before pasting. Google Sheets handles this without the workaround.
</Warning>

### Limits

* Maximum **10,000 rows** per file
* Maximum **10 MB** file size
* **.csv** and **.xlsx** (Excel) files are accepted

***

## Importing ingredients

If you have a long list of stems, sundries, or materials to add to your ingredient library, you can import them from a spreadsheet instead of adding them one by one.

<Steps>
  <Step title="Open the import">
    Go to **Events** > **Ingredients** to open your Ingredient Library, then click **Import CSV**.
  </Step>

  <Step title="Download a template">
    On the screen that opens, choose one of the template types and click **Download template**:

    * **Empty** — just the column headers
    * **Sample** — headers with two example rows
    * **My ingredients** — pre-filled with your existing ingredients (useful if you want to update prices in bulk). You can filter by category if you only want to export a subset.
  </Step>

  <Step title="Fill in your spreadsheet">
    The only column you must fill in is **Name**. Everything else is optional. See the [ingredient columns](#ingredient-import-columns) below for details.
  </Step>

  <Step title="Try a dry run first">
    Upload your file and tick the **Dry run** checkbox before clicking **Import**. This shows you what would happen (how many ingredients would be created, updated, or skipped) without saving anything. It's a safe way to check your file is correct.
  </Step>

  <Step title="Import for real">
    Once you're happy with the dry run summary, untick the dry run checkbox and click **Import** again to save the changes.
  </Step>
</Steps>

<Tip>
  Ingredients are matched by **name and category**. If you import an ingredient called "Red Naomi Rose" in the "Roses" category and you already have one with that exact name in that category, it updates the existing one rather than creating a duplicate.
</Tip>

### Ingredient import columns

| Column             | Required? | What it does                                                                                                                       |
| ------------------ | --------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| **Name**           | Yes       | The ingredient name (e.g., "Red Naomi Rose", "Eucalyptus", "Cellophane"). Rows with no name are skipped.                           |
| **Category**       | No        | Which category to file it under (e.g., "Roses", "Foliage", "Sundries"). If the category doesn't exist, it's created automatically. |
| **Cost**           | No        | What you pay for it (net price).                                                                                                   |
| **Price**          | No        | What you charge for it (net price). If left blank but Cost and Markup are provided, the price is calculated automatically.         |
| **Markup**         | No        | A multiplier for calculating price from cost. For example, `1.6` means the price is 1.6 times the cost.                            |
| **Colours**        | No        | Comma-separated colours, like `blush, ivory` or `red, white`.                                                                      |
| **Attachment**     | No        | A web link (URL) to an image of the ingredient. Downloaded automatically in the background.                                        |
| **Is Hire**        | No        | `Yes` or `No`. Whether this is a hire item (like a vase or urn) rather than a consumable.                                          |
| **Stock Quantity** | No        | How many you have. Only used for hire items.                                                                                       |
| **Enforce Stock**  | No        | `Yes` or `No`. Whether to enforce stock limits. Defaults to `Yes`.                                                                 |
| **Archived**       | No        | `Yes` or `No`. Set to `Yes` to archive an ingredient.                                                                              |

**Accepted file types:** CSV, TXT, or XLSX (Excel).

<Info>
  Unrecognised columns are safely ignored. Column names are also flexible with spacing and capitalisation (e.g., "stock quantity", "Stock\_Quantity", and "STOCK QUANTITY" all work).
</Info>

### How price calculation works

You don't have to fill in both Cost and Price. If you provide a **Cost** and a **Markup** but leave **Price** blank, Digital Florists calculates the price for you. For example:

* Cost: £0.50, Markup: 1.8 = Price: £0.90
* Cost: £1.20, Markup: 2.0 = Price: £2.40

If you're updating an existing ingredient and it already has a markup saved, that saved markup is used to calculate the new price from your updated cost.

***

## Migrating from another system

If you're moving to Digital Florists from another platform, the **Data Migration** tool converts your existing data into a format you can import.

Go to **Settings** > **Advanced** > **Data Migration**.

### Supported platforms

<AccordionGroup>
  <Accordion title="Shopify">
    Export your products from Shopify as a CSV file, then upload it here. Your file is converted from Shopify's column format into the Digital Florists product import format.

    You can choose whether to include unpublished/inactive products.

    Once converted, download the resulting file and upload it through the [product import wizard](#importing-products).
  </Accordion>

  <Accordion title="Strelitzia">
    Two options are available:

    * **Products** — converts your Strelitzia product export into the Digital Florists format. Download the result and import it via the product import wizard.
    * **Customers** — imports your Strelitzia customer list directly. Customer records are deduplicated and tidied during the import.
  </Accordion>

  <Accordion title="FloristPro">
    Upload your FloristPro product export (usually a file called something like `designs.xlsx` or `designs.csv`). It's converted into the Digital Florists format. Download the result and import it via the product import wizard.

    Accepts CSV or Excel (XLS/XLSX) files.
  </Accordion>
</AccordionGroup>

<Tip>
  For Shopify and FloristPro, the migration tool produces a converted CSV file that you then upload through the normal product import wizard. You still get the full preview and review step before anything is saved.
</Tip>

***

## Importing from Florist Toolbox

If you use **Florist Toolbox** to design your arrangements, you can paste a Toolbox code directly into Digital Florists to import a product's ingredients, labour, and pricing.

<Steps>
  <Step title="Copy the export code from Toolbox">
    In Florist Toolbox, copy the export code for your arrangement.
  </Step>

  <Step title="Open the product in Digital Florists">
    Go to the product you want to update, or create a new one.
  </Step>

  <Step title="Open the Toolbox import">
    On a new product, click **Import full product from Florist Toolbox**. To pull ingredients into an existing variant, use **Import ingredients only** on the variant editor.
  </Step>

  <Step title="Paste the code and import">
    Paste the code and click **Import**.
  </Step>

  <Step title="Review ingredient matches">
    Ingredient names are matched to your ingredient library. Any ingredients that aren't in your library yet are created automatically.
  </Step>

  <Step title="Confirm">
    Review the matched ingredients and pricing, then click **Confirm import**.
  </Step>
</Steps>

***

## Common questions

<AccordionGroup>
  <Accordion title="Can I update existing products by importing?">
    Yes. Use the **Update existing products** option in the product import wizard. Export your current products first, make changes in the spreadsheet, then re-upload. The Match columns identify the right products to update.
  </Accordion>

  <Accordion title="What happens if my import has errors?">
    Your file is checked before anything is saved. If there are problems (missing required fields, invalid data, duplicate barcodes), you'll see a clear error message telling you which row has the issue and what's wrong. Fix the errors in your spreadsheet and try again.
  </Accordion>

  <Accordion title="Can I import Excel (.xlsx) files?">
    Yes. Both **products** and **ingredients** accept XLSX files as well as CSV. When updating existing products, use the XLSX export directly. It preserves barcodes correctly without the formatting issues that CSV files can have in Excel.
  </Accordion>

  <Accordion title="Will importing overwrite my existing data?">
    For products: only fields with values in your spreadsheet are updated. Blank cells keep the current value. To explicitly clear a field, enter `__CLEAR__` in that cell. For ingredients: matching is done by name and category. Existing ingredients are updated, new ones are created.
  </Accordion>

  <Accordion title="Is there a row limit?">
    Product imports are limited to 10,000 rows per file. If you have more, split your file into batches. Ingredient imports have no hard row limit but are still subject to the usual upload size limit.
  </Accordion>

  <Accordion title="What if I import the wrong file?">
    For **products**, you are shown a full preview of every change before anything is saved. If the import fails part-way through, no partial changes are kept.

    For **ingredients**, changes are saved as they're processed, so tick the **dry run** checkbox first to preview what will happen before committing.
  </Accordion>

  <Accordion title="I'm getting an error about a category containing subcategories">
    Products can only be assigned to the most specific (deepest) category in a tree. If "Add-ons" has subcategories like "Chocolates" and "Candles", you need to use `Add-ons > Chocolates` in the Categories column rather than just `Add-ons`. Use the full path with `>` to point to the right subcategory.
  </Accordion>
</AccordionGroup>

## What's next?

<Columns cols={2}>
  <Card title="Products" href="/storefront/products">
    Manage your product catalogue after importing.
  </Card>

  <Card title="Ingredients" href="/events/ingredients">
    View your ingredient library.
  </Card>

  <Card title="Inventory" href="/storefront/inventory">
    Track stock levels and manage your ingredients.
  </Card>

  <Card title="Reports" href="/analytics/reports">
    Download your data as spreadsheets.
  </Card>
</Columns>
