# Import & migration — 3.4.5

Open **Yatoon Menu → Import & migration** as a WordPress administrator. This is available in Free and Pro. The existing menu-tools CSV importer remains available.

## What is imported

- **Menu:** new, hidden dishes, category, price, description, public image URL, stock, order limit and supported option groups. Review every dish before listing it. Existing dishes are never overwritten. The latest menu addition can use Menu tools’ guarded undo; the deduplication record remains, so reimporting the same source ID does not silently recreate an undone dish.
- **Historical orders:** private read-only records with source IDs, UTC order time, customer contact, order items, original currency, totals/components and source status. Source payment status is explicitly unverified. They do not enter live order lists, kitchen, payments, stock, receipts, notifications, loyalty or live sales reports.
- **Customers:** private contact records, not WordPress accounts. Passwords, roles, saved cards, login credentials and marketing permissions are not migrated. Account linking/reordering from imported history is not provided.

History and contact records can be viewed and downloaded as reference JSON at the bottom of the page. The reference archive retains source/store identity and is not a directly restorable import format. Convert its `record` objects to universal records to move them to another store. WordPress personal-data export/erasure includes imported records indexed by email; erasure keeps an anonymous financial/deduplication tombstone.

## Source support

| Source | Menu | Historical orders and customers |
| --- | --- | --- |
| Universal CSV / JSON | Mapped columns or canonical records; options JSON supported | Mapped CSV or canonical JSON; private archives |
| Yatoon | `yatoon-menu-backup-v1` JSON dishes, prices, options and base dish-text translations | Universal format; not live order/account restoration |
| WooCommerce / Orderable / WPCafe | WooCommerce product CSV. Export variable parents and variations together. Variations become separate priced dishes. | Export from the source’s reporting/customer tool and map its CSV columns. No built-in WooCommerce order exporter is assumed. |
| RestroPress | Native food-item CSV including variable prices and all named add-on price/limit/required columns | Native payment/customer CSV common headings are recognized; confirm column mappings before importing. |
| GloriaFood | Original Fetch Menu JSON file, or read-only Fetch Menu connection | Export Orders and Clients/Customers separately from Reports / Lists / List View, save CSV UTF-8 and match columns. No historical API sync. |

Orderable/WPCafe compatibility uses their WooCommerce product data, not proprietary add-on extension backups. Unsupported WooCommerce add-on metadata is blocked rather than discarded. Convert it into the options JSON format. WooCommerce sale prices/schedules are not copied; regular prices are used. Only the first category/image is used when multiple values are exported.

RestroPress examples: variable prices `Small: 8 | Large: 10`; add-on prices `Sauce: Mild=0, Hot=1`; maximum `Sauce=>1`; required `Sauce=>yes`. Keep the matching Add-ons, Add-on Prices, Max Add-ons and Add-ons Required columns. Localized native add-on headings, ambiguous labels, variable add-on prices and default selections require conversion/review. Local attachment IDs cannot identify images on the new site.

## Safe workflow

1. Export one store and one data type at a time. Use stable source IDs and a permanent source-store identifier, for example `gloria-main-street`. Use the same source and store identifier for every batch from that store. Changing either creates a separate identity namespace.
2. Upload a **UTF-8 CSV or JSON**, up to **5 MB and 500 records** (after variation/size expansion). CSV supports comma, semicolon or tab, with 2–100 unique header columns. Convert XLS/XLSX to CSV UTF-8. Split larger exports into files and keep parent/variation sets together.
3. Choose source currency, decimal separator, date format and source timezone. Amounts have no currency symbols or grouping separators. The menu currency must match Yatoon; historical orders retain their source currencies. No exchange-rate conversion is performed.
4. Match columns and review names, IDs, dates, prices, tax, fees and options. Every error blocks the entire batch. Export one historical order per row; combine its items into the `items` field instead of repeating its source ID for separate lines. Currency-labelled headings such as `Amount ($)`, `Tax ($)` and `Tips ($)` are recognized, but verify all mappings.
5. Explicitly confirm. Repeated source IDs are skipped; changed source records are reported as conflicts and kept without overwriting local records. Rows without menu IDs use category/name identity; provide stable IDs to avoid duplicate dishes when names change. Customer fallback identity uses email or phone.
6. Review hidden dishes in Menu Items and list them explicitly. Add/review service restrictions, hours, tags/allergens, nutrition, option defaults, translated option labels, reusable templates, category visibility and images separately. The importer does not copy an entire restaurant configuration.

Previews are private to the uploading administrator and expire after one hour. A new upload replaces that administrator’s prior draft. All batch writes require transactional InnoDB storage for the archive, menu and WordPress options tables; failures roll back additions. Independent administrator permissions and nonces protect mutations/downloads. No uploaded PHP or serialized objects are executed. Public image URLs are stored; images are not downloaded.

## GloriaFood

Create a Fetch Menu integration in GloriaFood under **Others → 3rd party integrations → Enabled integrations**, then enter that key on the migration page with GloriaFood/Menu selected. The key is used only for the fixed HTTPS menu request and is not saved in the preview. Fetch Menu does not return historical customer/order exports or usable dish photos.

Sizes become separate dishes. The default interpretation adds the size amount to the item base price: base 7 + small 0 = 7; base 7 + large 2 = 9. Choose “Size amount is the full price” only when that matches your export. Review every resulting price against the source menu. Category/item/size option groups are combined, with more specific IDs taking precedence. Choice minimums above one and repeated option quantities are blocked because they cannot be faithfully represented. A required group and its maximum count are retained when supported.

Implementation was checked against GloriaFood’s published Fetch Menu fixture and RestroPress export source plus synthetic CSV examples. A live GloriaFood account/API connection and every proprietary report/export extension have not been tested. Actual report headings vary; manual mapping is available.

Official references: [GloriaFood Fetch Menu](https://github.com/GlobalFood/integration_docs/blob/master/fetch_menu/README.md), [GloriaFood reporting](https://www.gloriafood.com/press/new-product-release-reporting-module), [WooCommerce product CSV](https://woocommerce.com/document/product-csv-importer-exporter/), [RestroPress](https://wordpress.org/plugins/restropress/).

## Universal JSON

```json
{"kind":"menu","currency":"USD","records":[{"external_id":"dish-1","name":"Noodles","category":"Mains","price":"12.50","stock_qty":-1,"max_per_order":10,"modifiers":[{"name":"Sauce","required":true,"max":1,"options":[{"name":"Mild","price":"0"},{"name":"Hot","price":"1.00"}]}]}]}
```

Orders require `external_id` (or `order_number`), `created_at` and `total`. Contacts require a source ID, email or phone. Other supported fields appear in the downloadable CSV templates. Dates use exact ISO strings such as `2026-10-22 14:30:00`, `2026-10-22T14:30:00+00:00` or `2026-10-22T14:30:00Z`; select day/month or month/day explicitly for slash dates. Unzoned dates use the selected source timezone and are archived in UTC. Option prices use a decimal point even when the outer CSV uses decimal commas.

## Desktop columns and pickup wording

**Settings → Appearance → Desktop dishes per row** now supports 1, up to 2/3/4, or automatic columns. Large-screen menus follow the selected maximum and reduce columns when the content area is narrow; phones use one column. Existing layout values remain valid.

Turning off **Allow pickup on future dates** excludes tomorrow and later, while still permitting a time later today. **Accept advance orders outside pickup / online hours** separately controls accepting those orders before opening or after the online order window. Same-day availability now says “Order today / Pickup later today,” and its next-pickup label uses “Today” in the restaurant timezone.
