DeliverLogic → Hyperzod migration

Convert Delivery Logic Menu CSV to Hyperzod

Convert real DeliverLogic exports — the RDS backoffice file (RID / Restaurant / MIID / Base Price / Option Group / Option / Option Price) and the Yelo menu template (Product ID / Product Name* / Product Price* / Addon ID) — into a validated Hyperzod PRODUCT.* import. Deterministic, no hallucinated options, additive prices preserved exactly.

Holds file until you ask — no auto-mutationFree · No signup

Why DeliverLogic CSVs don't import into Hyperzod

DeliverLogic and Hyperzod describe the same menu in opposite shapes. DeliverLogic repeats one product across many rows — every MIID appears once per Option Group / Option member with Base Price on every row and Option Price as an add-on delta. Hyperzod expects one row per product with PRODUCT.* columns and option groups inside OPTION*.VARIANTS. Manual reshaping means collapsing thousands of rows, recalculating deltas and rebuilding required/single vs multiple rules — one misplaced Option Price breaks every variant.

Repeated rows

One MIID spans many rows. Collapse wrong and you duplicate products or lose options.

Delta pricing

Base Price + Option Price is additive. Treat it as a total and every customer price is wrong.

Group rules matter

Sauce = required single; toppings = optional multiple. Min Required / Max Allowed drives it.

How it works

Four deterministic steps — detection is automatic, conversion is intent-gated.

1

Detect format

detectDeliverLogicCSV checks headers. RID+Restaurant+MIID+Product+Base Price+Option Group/Option/Option Price → RDS export. Product Name*+Product Price*+Addon ID/Product ID+Category Name* → Yelo template. Shopify (Handle) and Hyperzod (PRODUCT.*) are explicitly excluded.

2

Group into products

RDS: group by MIID (fallback Category+name). Yelo: group by Category+base name (size word stripped: Margherita Small → Margherita). First row carries product fields; later rows attach members. Blank names are skipped.

3

Build option groups

RDS: each Option Group becomes one Hyperzod option; Min Required ≥1 → required, Max Allowed =1 → single else multiple, leading dot cleaned. Yelo: members with same base become one Size/Options group with deltas over min price; single-member stays flat.

4

Export Hyperzod CSV

Maps to CSVMeta PRODUCT.* and OPTION*.NAME/TYPE/ENABLE_RANGE/RANGE/REQUIRED/VIEW/VARIANTS. Preview in /tool, validate, then export — ready for Hyperzod Admin → Catalogue → Import → CSV Import.

Hold-and-convert: uploading a DeliverLogic file shows “holding without changing it — tell me ‘convert this CSV for Hyperzod’” until you confirm.

Supported data — only real fields

No invented columns. Below are the exact headers read by lib/deliverlogic-convert.ts and the exact Hyperzod output from lib/schema.ts CSVMeta.

RDS backoffice export

Headers in 29453_*.csv

Product-level

  • RID · Restaurant · MIID · Category · Product · Description
  • Base Price → PRODUCT.PRICE.SELLING · Image → PRODUCT.IMAGES
  • Active + Hidden → PRODUCT.STATUS · Quantity → PRODUCT.INVENTORY
  • Tags → PRODUCT.TAGS · External ID (or MIID) → PRODUCT.SKU

Option members (per row)

  • Option Group → OPTION*.NAME (dot stripped; Group ID present in file but not mapped)
  • Min Required → REQUIRED · Max Allowed → TYPE (single if 1 else multiple)
  • Option → variant name · Option ID · Option Price → variant price (delta)
  • Option Cost Floor / Option Cost Default → variant costPrice · Option Image → variant imageUrl

Detected only when RID+Restaurant and MIID+Product+Base Price and Option Group+Option+Option Price all present.

Yelo template

Category + product + addon rows

Product-level (first row per group)

  • Product ID / Item ID · Product Name* / Product Name English → PRODUCT.NAME (size word stripped)
  • Product Price* / Item Price* (min = base) → PRODUCT.PRICE.SELLING
  • Product Description* / Product Long Description → PRODUCT.DESCRIPTION (HTML cleaned)
  • Product Image Url / Image Url → PRODUCT.IMAGES
  • Category Name* / Category Name English → PRODUCT.CATEGORY
  • SKU → PRODUCT.SKU · Search Tags → PRODUCT.TAGS · Is Veg* → tags (veg/non-veg)
  • MRP → PRODUCT.PRICE.COMPARE · Available Quantity / Inventory* → per-variant inventory (only when present)

Addon members

  • Addon ID / Option ID groups variants; size word in name → variant name (Small/Medium/Large/Giant/Regular/Family)
  • Minimum Selection Required → required · Minimum Selection → multiple vs single
  • Blank Addon ID → flat product, never an invented option.

Hyperzod output (CSVMeta)

lib/schema.ts — what you import

Product columns

PRODUCT.ID · PRODUCT.NAME · PRODUCT.DESCRIPTION · PRODUCT.SKU · PRODUCT.PRICE.COMPARE · PRODUCT.MIN.MAX.QUANTITY · PRODUCT.PRICE.SELLING · PRODUCT.PRICE.COST · PRODUCT.TAX_PERCENT · PRODUCT.STATUS · PRODUCT.INVENTORY · PRODUCT.LABELS · PRODUCT.CATEGORY · PRODUCT.TAGS · PRODUCT.IMAGES

Option columns (per group)

NAME · TYPE (single/multiple) · ENABLE_RANGE · RANGE · REQUIRED · VIEW (list/card) · VARIANTS as name,price,costPrice,inventory,description,imageUrl

Price deltas, not totals: PRODUCT.PRICE.SELLING holds the base, each variant stores the additive difference.

Transformation example — RDS garlic bread

Real RDS rows (MIID 583054354) become one Hyperzod product with a delta-priced option group.

Before: RDS rows (shared MIID + Base Price)
RID,Restaurant,MIID,Category,Product,Base Price,Option Group,Min Required,Max Allowed,Option,Option Price
29453,460 Pizza Jan 2024,583054354,Appetizers,Garlic Bread,4.99,whole or half loaf,1,1,1/2 Loaf,0
29453,460 Pizza Jan 2024,583054354,Appetizers,Garlic Bread,4.99,whole or half loaf,1,1,Whole Loaf,3
Both rows share MIID 583054354; Option Price is the delta over Base Price.
After: Hyperzod row (one product, delta pricing)
PRODUCT.NAME,PRODUCT.PRICE.SELLING,PRODUCT.CATEGORY,OPTION1.NAME,OPTION1.TYPE,OPTION1.REQUIRED,OPTION1.VARIANTS
Garlic Bread,4.99,Appetizers,whole or half loaf,single,YES,"1/2 Loaf,0.00,, , ,;Whole Loaf,3.00,3.00, , ,"
1/2 Loaf = 4.99 + 0, Whole Loaf = 4.99 + 3.00 = 7.99. Group is single + required because Min 1 / Max 1.

Second example — 8″ Cheese Pizza (two groups)

Three RDS rows for MIID 583054378 with .sauce (Min 1/Max 1 → required single, 460 Traditional Sauce at 0) and .small (no min/max → optional multiple, Tomato at 0.75, Pepperoni at 1) become one product at 7.99 with two option groups: sauce (single, required) and small (multiple, optional). Pizza with Traditional Sauce + Tomato = 7.99 + 0.75 = 8.74.

Example workflow — pizza menu in 3 steps

Step 1 · Upload

Drop the DeliverLogic export

Upload the 29453_*.csv RDS file or the Yelo template to /tool. Yelo detection handles Product Name*, Product Price*, Addon ID and Category Name*; RDS detection handles RID/MIID/Base Price/Option Group.

The tool reports “Shopify/DeliverLogic CSV detected — holding without changing it”.

Step 2 · Convert on intent

Ask: “Convert this CSV for Hyperzod”

The agent groups rows, builds option groups, applies delta math, carries images and inventory, and shows the conversion report: sourceRows · productsConverted · variantsConverted · optionGroupsBuilt · imagesAttached.

Tip: check one garlic bread (single required) and one pizza with two groups before export.

Step 3 · Review & export

Preview, fix, download

Review in the product grid — variant prices are deltas, not totals. Edit any cell, preview the raw CSV, then download. Import the file at Hyperzod Admin → Catalogue → Import → CSV Import. Re-parse round-trips cleanly via parseCSV(generateCSV(products)).

Built for DeliverLogic menus — 7 conversion behaviors

Dual-format auto-detection

detectDeliverLogicCSV distinguishes RDS (RID/Restaurant + MIID + Base Price + Option Group/Option/Option Price) from Yelo (Product Name*/Price* + Addon ID) and rejects Shopify/PRODUCT.* files.

MIID-accurate grouping

RDS groups by MIID (fallback Category+name), Yelo by Category+base name with size word stripped. Blank product names are skipped and counted as blankRowsSkipped.

Additive price deltas preserved

RDS Option Price and Yelo per-addon deltas (price − base) are stored as Hyperzod variant prices. Customer total = base + delta stays exact; Yelo base = min price across members.

Group rules from Min/Max

Min Required / Max Allowed (RDS) and Minimum Selection Required / Minimum Selection (Yelo) drive REQUIRED and TYPE single/multiple, and option names are cleaned (.sauce → sauce).

SKU & inventory without hallucination

External ID or MIID → SKU, Quantity → PRODUCT.INVENTORY. Per-variant inventory only when Yelo has Available Quantity/Inventory*; RDS leaves it unset so Hyperzod does not enable per-variant stock.

Images, tags & status carried

Image / Option Image → PRODUCT.IMAGES and variant imageUrl (Yelo prefers Medium member image), Tags/Search Tags + Is Veg → labels/tags, Category preserved, Active+Hidden → ACTIVE/INACTIVE.

Flat stays flat — never invented

Rows with blank Addon ID (Yelo) or no Option members (RDS like Potato Skins 8.99) export with zero option groups. Cost Floor/Default → costPrice when present, compare price empty not zero for RDS.

Limitations — what this migration does not do

  • Menu catalog only. Orders, logistics, driver commissions, tax rates, dietary labels, TOD windows and availability schedules in the RDS export are not migrated — only menu structure, prices, options and inventory.
  • No automatic translation. Yelo Product Name Arabic / multi-language variants are not mapped; Product Name English is the source of PRODUCT.NAME.
  • Single-level options. Nested options inside variants are valid in Hyperzod but the DeliverLogic converter builds one level of option groups per product (one group per Option Group / Addon ID collection).
  • RDS compare price is empty. RDS exports have no compare-at price — PRODUCT.PRICE.COMPARE stays undefined (empty column), not zero. Yelo MRP maps when present.
  • RDS per-variant stock stays off. RDS Quantity is product-level; variant inventory is left unset so Hyperzod does not enable the per-variant quantity stepper. Yelo variant inventory is set only when the row has a real Available Quantity/Inventory* value.
  • Styling is not migrated. View is list, enableRange is no and range is [0,0] for migrated groups; adjust VIEW/RANGE in the preview if you need card display or constrained picks.
  • Not affiliated. CSV Pilot is independent and not affiliated with DeliverLogic or Hyperzod. Validate the preview before import — especially Inactive (Active=N/Hidden=Y → inactive) and optional vs required groups.

FAQ

What DeliverLogic CSV formats are supported?

Two real formats from lib/deliverlogic-convert.ts: (1) the RDS backoffice export (29453_*.csv) identified by RID + Restaurant + MIID + Product + Base Price + Option Group/Option/Option Price columns, and (2) the Yelo-style import template with Product ID, Product Name* / Product Name English, Product Price*, Category Name* / Category Name English and Addon ID columns. Detection is via detectDeliverLogicCSV and never matches Shopify (Handle) or Hyperzod (PRODUCT.*) files.

How are prices converted to Hyperzod?

Hyperzod uses additive deltas. For RDS, Base Price becomes PRODUCT.PRICE.SELLING and each Option Price is kept as the variant delta over that base (Whole Loaf +3 on a 4.99 base = customer pays 7.99). For Yelo, the cheapest member price is the base and each Addon ID member's variant price is stored as the delta over it, so exact menu prices are preserved. Yelo MRP maps to PRODUCT.PRICE.COMPARE when present; RDS has no compare price and leaves it empty.

Will flat items get a fake Size option?

No. The converter never invents add-ons. If Addon ID (Yelo) is blank or Option (RDS) is blank, the product stays flat with no option group. A Yelo row with no Addon ID and an RDS MIID with no Option rows both export with zero option groups. Only rows distinguished by Addon ID or Option Group become variants.

How are required vs optional option groups decided?

From the source min/max fields. RDS reads Min Required and Max Allowed per Option Group: Min Required ≥ 1 → REQUIRED YES, Max Allowed = 1 → TYPE single otherwise multiple, and the leading dot is stripped (.sauce → sauce). Yelo reads Minimum Selection Required and Minimum Selection: Required > 0 and Multiple when Minimum Selection > 1 (Size → single, Options → multiple).

What product data is preserved?

RDS: Product → PRODUCT.NAME, Description → PRODUCT.DESCRIPTION, Base Price → PRODUCT.PRICE.SELLING, Image → PRODUCT.IMAGES, Category → PRODUCT.CATEGORY, Tags → PRODUCT.TAGS, Quantity → PRODUCT.INVENTORY, Active/Hidden → PRODUCT.STATUS (Y/N), External ID or MIID → PRODUCT.SKU, and Option Cost Floor/Default → variant costPrice. Yelo: Product Name English → PRODUCT.NAME, descriptions → PRODUCT.DESCRIPTION, Category Name English → PRODUCT.CATEGORY, Product Image Url → PRODUCT.IMAGES, SKU → PRODUCT.SKU, Search Tags → PRODUCT.TAGS, Is Veg* → tags (veg/non-veg), Available Quantity/Inventory* → per-variant inventory only when present, and Addon ID members → option variants.

Do I need to clean or reformat the CSV before upload?

No. Upload the export as-is to /tool. CSV Pilot holds it unchanged until you ask “Convert this CSV for Hyperzod”. Prices may contain $/€/₹ and HTML in descriptions is stripped automatically. Blank rows are skipped and counted as blankRowsSkipped in the conversion report.

Will the converted file import directly into Hyperzod?

Yes. The output uses lib/schema.ts CSVMeta: PRODUCT.ID, PRODUCT.NAME, PRODUCT.DESCRIPTION, PRODUCT.SKU, PRODUCT.PRICE.COMPARE, PRODUCT.MIN.MAX.QUANTITY, PRODUCT.PRICE.SELLING, PRODUCT.PRICE.COST, PRODUCT.TAX_PERCENT, PRODUCT.STATUS, PRODUCT.INVENTORY, PRODUCT.LABELS, PRODUCT.CATEGORY, PRODUCT.TAGS, PRODUCT.IMAGES, plus OPTION*.NAME/TYPE/ENABLE_RANGE/RANGE/REQUIRED/VIEW/VARIANTS with variants as name,price,costPrice,inventory,description,imageUrl. Validate in the preview, then import via Hyperzod Admin → Catalogue → Import → CSV Import.

Related guides

Three guides that go deeper on exactly this migration.

Ready to convert your DeliverLogic menu?

Upload the RDS export or Yelo template to the tool, say “Convert this CSV for Hyperzod”, review the preview and download a validated Hyperzod import — no manual row collapsing.

Free · No signup · Files stay private