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.
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.
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.
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.
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.
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·DescriptionBase Price→ PRODUCT.PRICE.SELLING ·Image→ PRODUCT.IMAGESActive+Hidden→ PRODUCT.STATUS ·Quantity→ PRODUCT.INVENTORYTags→ 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.SELLINGProduct Description*/Product Long Description→ PRODUCT.DESCRIPTION (HTML cleaned)Product Image Url/Image Url→ PRODUCT.IMAGESCategory Name*/Category Name English→ PRODUCT.CATEGORYSKU→ 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 IDgroups 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.
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
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, , ,"
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
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”.
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.
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.
Convert DeliverLogic Menu to Hyperzod Format
The RDS MIID / Base Price / Option Group model, step-by-step conversion and what to check for garlic bread and pizza examples.
Read guideHyperzod CSV Template Explained
The PRODUCT.* and OPTION*.VARIANTS structure — why prices are deltas, how option groups stack, and what Hyperzod requires.
Read guideRestaurant Menu CSV Guide
How menu choices (sizes, crusts, sauces, toppings) become Hyperzod option groups with required/multiple rules.
Read guideReady 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