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

# Storyous: menu & products

> Sync your Storyous menu into VEXiON and set which products earn and redeem loyalty points.

With Storyous, you set your loyalty rules **on products inside VEXiON**. First you sync the menu from Storyous, then you decide which products earn and redeem points.

> [!NOTE]
>
> **Names, prices, and categories come from Storyous** and are read-only in VEXiON. In VEXiON you only set the **loyalty** part (whether a product earns points, how many, and any redemption).

## Syncing the menu

After connecting (see [Connecting and setup](https://vexioncards.mintlify.site/knowledge-base/storyous-setup.md)), pull your products in. For each connected place, click **Sync Menus**.

```mermaid theme={null}
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E5F6FF','primaryBorderColor':'#36C6FA','primaryTextColor':'#1F1E1F','lineColor':'#36C6FA','fontFamily':'Manrope, sans-serif'}}}%%
flowchart TD
    A[Click Sync Menus] --> B[VEXiON pulls the menu from Storyous]
    B --> C[New products are added]:::vexion
    B --> D[Existing products update<br/>name, price, category]:::vexion
    C --> E[Your loyalty settings are kept]:::vexion
    D --> E
    classDef vexion fill:#36C6FA,color:#fff,stroke:#2BA8D9;
```

| Data | Source | Editable in VEXiON |
| - | - | :-: |
| Product name | Storyous | ❌ |
| Price | Storyous | ❌ |
| Category | Storyous | ❌ |
| Loyalty settings | VEXiON | ✅ |

> [!NOTE]
>
> **Re-syncing is safe.** When you sync again, product names, prices, and categories are refreshed from Storyous, but the **loyalty settings you have already set are preserved**. New products arrive with **Loyalty: Yes** and every number at **0** until you set them, so a freshly synced menu earns nothing until you fill it in.

> [!WARNING]
>
> **Removing a product in Storyous does not disable it in VEXiON.** If you delete a product from your Storyous menu, its loyalty settings stay in the VEXiON product table, so it would still earn or redeem points if it reappeared. To retire a product from the loyalty program, turn its **Loyalty** off in the product table yourself.

> [!TIP]
>
> Sync after your first connection, whenever you change your menu in Storyous, and roughly once a week to stay current.

![The place chip with its Sync Menus button above the Products table, populated with product names, categories, prices and loyalty columns.](https://mintcdn.com/vexioncards/5-v6TFdxrGzbH76d/images/storyous-sync-menu.png?fit=max\&auto=format\&n=5-v6TFdxrGzbH76d\&q=85\&s=dd1861d4432edcc833237a16de1880bb)

Syncing a place's menu from Storyous

## The product table

After syncing, the **Products** table (headed with the place's name) lists every product. The columns adapt to the card type you enabled:

| Column | Meaning |
| - | - |
| Product | Product name (from Storyous) |
| Category | Category (from Storyous) |
| Price | Selling price (from Storyous) |
| Loyalty | Whether the product is in the loyalty program (Yes / No) |
| Earn Stamps / Earn Points | How many stamps or points the product earns |
| Redeem Stamps / Redeem Points | How many stamps or points redeem a reward (Stamp and Product Rewards only) |
| Discount | The percentage off when redeemed (Stamp and Product Rewards only) |
| Actions | The edit (pencil) control |

> [!NOTE]
>
> **The column headings follow your card type.** With **Stamp cards** they read *Earn Stamps* and *Redeem Stamps*; with **Reward Cards** they read *Earn Points* and *Redeem Points*. Switching the card type in the integration settings renames them immediately.

> [!NOTE]
>
> In **Credit Cashback** mode only **Earn Points** shows, because points convert to a flat euro credit, there is nothing to "redeem" per product. In **Stamp** and **Product Rewards** modes you also get **Redeem** and **Discount**.

> [!WARNING]
>
> **A redeemable product needs both Redeem and Discount set.** On **Stamp cards**, a product with **Redeem** only is never offered at the till, with no error and no hint that anything is missing. With **Reward Cards** in **Product Rewards** mode, a product with **Redeem** above 0 and **Discount 0** is offered as "0% off" and still costs the customer the points if the cashier leaves it on. **Discount** is the percentage the redemption takes off, so a free product needs **Discount: 100**. Set both, or leave both at 0.

![The Products table with columns Product, Category, Price, Loyalty, Earn Stamps, Redeem Stamps, Discount and Actions, every row showing Loyalty Yes and zero values after a fresh sync.](https://mintcdn.com/vexioncards/5-v6TFdxrGzbH76d/images/storyous-product-table.png?fit=max\&auto=format\&n=5-v6TFdxrGzbH76d\&q=85\&s=caa73aa0f5545caaebc2c1ab9d1c4b56)

The synced product table with loyalty columns

### Finding products

Above the table:

* **Search** by product name.
* **All Categories** filters by category.
* **All Products** filters by loyalty status (all / enabled / disabled).
* **Reset Filters** clears them.
* **Show N per page** (10, 20, 50, 100) and page navigation for large menus.

### Editing a product

Click the **pencil** on a row to edit it inline. The row turns into fields: a **Loyalty** checkbox and a number box for each of **Earn**, **Redeem**, and **Discount**. Click the green **save** icon to keep the change, or the red **cross** to discard it. A saved row confirms with *"Product updated successfully"*.

![A product row in edit mode with the Loyalty checkbox ticked and editable number fields for Earn Stamps, Redeem Stamps and Discount, beside the save and cancel icons.](https://mintcdn.com/vexioncards/5-v6TFdxrGzbH76d/images/storyous-product-edit.png?fit=max\&auto=format\&n=5-v6TFdxrGzbH76d\&q=85\&s=eb5871418cac052994f84e5fff0cb171)

Editing a product's loyalty values inline

## Bulk editing with import and export

For a large menu, editing every product by hand is slow. Export the products to a file, set the loyalty columns in a spreadsheet, and import them back.

> [!WARNING]
>
> **Export and import are per place.** Both work on the place whose table you are looking at, and a row is matched by `productId` **within that place only**. If you run several places, export and import each one separately. A file exported from one place and imported into another matches nothing and changes nothing, even though the import still reports a product count.

### The recommended workflow

**1. Sync the menu**

Pull the latest products from Storyous.

**2. Export**

Click **Export Excel** or **CSV** to download all products with their current loyalty settings.

**3. Edit in a spreadsheet**

Set the loyalty columns for your products (details below).

**4. Import**

Click **Import**, drop your file, check the preview, and confirm.

### The file columns

The export contains one row per product. You only edit the **loyalty** columns:

| Column | Edit? | Meaning |
| - | :-: | - |
| `productId` | ❌ | Product ID, used to match products. **Do not change it.** |
| `productName` | ❌ | Name (for your reference) |
| `price` | ❌ | Price (for your reference) |
| `loyaltyEnabled` | ✅ | `true` or `false`, whether the product is in the program |
| `earnPoints` | ✅ | Points/stamps earned |
| `redeemPoints` | ✅ | Points/stamps to redeem a reward |
| `discount` | ✅ | Percentage off on redemption (0 to 100) |

> [!NOTE]
>
> For **Reward cards**, `earnPoints` and `redeemPoints` may be **decimals** (for example `2.5`, `10.75`). For **Stamp cards**, whole numbers are recommended so customers see clean stamp counts (the system accepts decimals, but they make little sense for stamps).

### What the import dialog shows

Clicking **Import** opens **Import Products from Excel or CSV**. Before you pick a file it lists the rules:

* Export your menu first using *Export Excel*, then edit the loyalty columns and import back.
* Editable columns: `loyaltyEnabled`, `earnPoints`, `redeemPoints`, `discount`.
* Stamp cards: use whole numbers only (1, 2, 3...) for `earnPoints` and `redeemPoints`. With reward cards, decimals are supported.
* Do not modify `productId` or the other columns, only loyalty settings are updated.

Then drop your **.xlsx** or **UTF-8 CSV** file on the zone.

![The Import Products from Excel or CSV dialog listing the import instructions and the editable columns, above the drag and drop zone.](https://mintcdn.com/vexioncards/5-v6TFdxrGzbH76d/images/storyous-import-preview.png?fit=max\&auto=format\&n=5-v6TFdxrGzbH76d\&q=85\&s=61e86f7e8d844128cdf3525259812eba)

The import preview before confirming

### The import summary

After you upload, a **Confirm Import** step appears before anything is saved. It names the file and shows:

| Shown | Meaning |
| - | - |
| Total products in file | How many rows your file contains |
| Products to update | How many of them will be written |

with the reminder *"This will update your product loyalty settings. Products with errors will be skipped."* The button itself carries the count, for example **CONFIRM IMPORT (134 PRODUCTS)**. Nothing is written until you press it.

Only the loyalty columns are updated. Product names and prices are never changed by an import.

![The Confirm Import dialog naming the uploaded file, with an import summary showing the total products in the file and the products to update, above the Confirm Import button.](https://mintcdn.com/vexioncards/OoBUFxdiv70F8-H-/images/storyous-import-confirm.png?fit=max\&auto=format\&n=OoBUFxdiv70F8-H-\&q=85\&s=838304f00c22442085d98dd985379e47)

The Confirm Import step, before anything is written

Afterwards an **Import Results** banner reports how many products were imported and modified, and the table refreshes with the new values.

> [!NOTE]
>
> **"Imported" counts rows read, not rows changed.** It is the number of valid rows in your file. **Modified** is what actually changed in the table. Rows whose `productId` is not in this place's menu are counted as not found and quietly do nothing, so a file that matches nothing still reports a healthy-looking imported count. If the two numbers are far apart, check you exported from the same place.

![The green Import Results banner reporting 134 products imported and modified, above the refreshed product table showing the new earn values.](https://mintcdn.com/vexioncards/OoBUFxdiv70F8-H-/images/storyous-import-results.png?fit=max\&auto=format\&n=OoBUFxdiv70F8-H-\&q=85\&s=72ef1fb39a712dd2234faef426565a6c)

The result after a confirmed import

> [!WARNING]
>
> A row whose `productId` does not exist in your synced menu is skipped. `discount` must be between 0 and 100. Keep the `productId` column exactly as exported.

> [!WARNING]
>
> **Three import behaviours worth knowing:**
>
> * **Always use positive numbers.** `earnPoints` and `redeemPoints` are counts: how many stamps a product gives, and how many it takes to redeem. A negative is not a meaningful value, so the importer does not accept one, and a row containing `-2` is written as `0` rather than rejected. If a product comes back earning nothing after an import, check that column for a stray minus.
> * **`discount` is rounded down to a whole percent.** `12.9` becomes `12`.
> * **Decimals in `earnPoints` and `redeemPoints` are always accepted** and stored to two decimal places, even on a stamp card. The "whole numbers only" line in the dialog is guidance, not a rule the import enforces, so a decimal you import on a stamp card stays stored as a decimal. At the till, the stamps earned on a sale are rounded down to a whole number. Use whole numbers if you want clean stamp counts.

## What to set next

How you fill in `earnPoints`, `redeemPoints`, and `discount` depends on your card type. See [Card types and point setup](https://vexioncards.mintlify.site/knowledge-base/storyous-card-types.md) for worked examples of each.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.