Upload sales data

Upload sales data brings your POS sales into Rinvy as a CSV file. Rinvy matches each line to a menu item, and you confirm the lines it can't match. Matched sales give you a sales-weighted food cost percentage, a variance report that compares theoretical and actual ingredient use, and history for demand forecasting (Pro).

What the CSV needs to contain

At minimum, each row needs:

  • A date (when the sale happened).
  • An item name (matched against your menu items).
  • A quantity sold.

Most POS exports include extra columns (price, discounts, categories) — Rinvy ignores the ones it doesn't need. The matcher does best-effort header detection; if it can't find the columns, the upload screen lets you map them manually.

If your export puts the date and the time of each sale in two columns, such as Date and Time, map both. Rinvy then uses your business day cutoff: with a 4 AM cutoff, a sale at 1:30 AM on September 27 counts toward September 26. Without a Time column, each sale counts on the date as written.

Exporting from your POS

Use the report below for your POS. Rinvy recognizes these formats on upload and reads the dates, quantities, and totals automatically — you can always fall back to mapping columns by hand if your export looks different.

  • Toast — Reports → Menus → Item details → Export CSV. Pick any date range; a full month works well. Toast's menu reports guide describes Item details as transaction-level data for every menu item ordered in the range, so each row carries its own date.
  • Square — Dashboard → Transactions → pick the date range → Export → Items Detail CSV. This is the per-line-item export that carries a date on every row, so a multi-day range imports in one file. Refunds and item variations (price points) are handled automatically. The summarized Item Sales report (Dashboard → Reports → Item Sales) also works — Rinvy recognizes it too — but it has no per-row date, so export and upload it one day at a time.
  • Clover — Dashboard → Reporting → Item Sales → Export. Clover downloads an Excel (.xlsx) file, so open it in your spreadsheet app and Save As CSV before uploading. Clover's Item Sales report totals each item over the range with no per-row date, so export and upload it one day at a time. In Excel, pick CSV (Comma delimited) under File → Save As. Microsoft's guide notes that only the sheet you have open is saved.

The upload flow

  1. Export a sales report from your POS, daily or weekly.
  2. Go to Sales data and upload the file.

  3. Rinvy parses the rows and attempts to match each line to a menu item by name.
  4. Review any lines flagged UNMATCHED. Rinvy suggests the closest menu items and pre-fills the Map to Menu Item dropdown with its best guess — one tap confirms it, pick another, or create a new menu item if one's genuinely missing.

  5. Confirm the upload. Matched lines write into the daily sales table.

The Sales data review modal: a summary strip reading 2 matched, 1 unmatched, 3 total; two lines (Beef Taco Plate, Beef Taco Combo) with green MATCHED badges; and a Beef Taco Plates line with a red UNMATCHED badge, a "Likely" 97% suggestion of Beef Taco Plate, the Map to Menu Item dropdown pre-filled with it, and Confirm, Skip once, and Always skip buttons

Why did a line come back UNMATCHED?

A line comes back UNMATCHED when its name doesn't match a menu item exactly (ignoring case) and you haven't confirmed a mapping or saved an Always skip rule for that name before. Rinvy never guesses a match on its own, so a wrong guess can't quietly become sales data. Each unmatched line gets a Map to Menu Item dropdown. There, Rinvy suggests the closest menu items — a line like "MARG PIZZA" is offered "Margherita Pizza" to confirm in one tap — but the suggestion is only a hint until you confirm it.

Tip: the matcher remembers your past confirmations. Once you've matched "MARG PIZZA" to "Margherita Pizza" the first time, future uploads with the same string match automatically.

Items you never want to track

Merch, gift cards, and anything else sold through the POS but not tracked in inventory will come back as unmatched on every upload. On an unmatched line, Always skip saves that decision: the item is skipped on this upload, cleared from any other upload still waiting on it, and resolved automatically from then on — so an upload containing only merch and matched dishes never lands in review at all.

Skip once is still there for a one-off you don't want to rule on.

Saved rules live under Always skipped on the Pending Review tab. Stop skipping sends the item back to the review queue on the next upload that contains it; lines already skipped stay skipped.

The Always skipped section on the Pending Review tab, expanded to show a Gift Card rule with a Stop skipping button

What gets stored

Two tables fill from the upload:

  • Sales uploads — the raw uploaded file and its line items, kept for audit.
  • Daily sales — denormalized per-menu-item totals by date. This is what the variance report and the forecaster read from.

Newly landed sales also mark the current demand forecast as Outdated ("New sales data has come in since") — the baselines it reasoned from are now behind. See demand forecasting for regenerating.

How often to upload

Whatever cadence works — daily, weekly, monthly. More frequent uploads mean:

  • The variance report can run on fresher data.
  • The demand forecaster has more recent history to learn from.

Most operators settle on weekly. Daily is fine if you have automated exports.

Common mistakes

Skipping lines you should map

Auto-match is fast but not perfect. Rinvy will not confirm an upload while any line is still unmatched, so you map or skip each one. A skipped line records no sale. If you skip a real menu item to get past review, its sales do not drive variance or forecasts for that dish.

Replacing sales you meant to keep

Rinvy never double-counts a day. If a new upload covers days that an earlier upload already recorded, Rinvy stops and asks Replace existing sales? If you tap Replace, the new file becomes the record for those days. So if yesterday's upload covered Mon–Fri and today's covers Wed–Sun, Wed–Fri now come from today's file. Make sure the new export is complete for every day it covers before you replace.

Inconsistent item names in the POS

If "Margherita" appears as "MARG", "Margherita Pizza", and "Pizza Margherita" across exports, the matcher confirms each variant separately. Pick a canonical name in the POS so each item only needs to be matched once.

Related