All docs

Uploading data

The full reference for file formats, column mapping, and auto-clean.

Tropix Palm reads CSV and XLSX files. This page lists every column we look for, what it does, and how to map your ERP's column names.

Required columns

These four are non-negotiable:

| Field | What it is | |-------|------------| | sku | Stable identifier. We use this to dedupe across uploads. | | description | What the SKU is, free text. | | qty_on_hand | Current on-hand units. Can be negative (= backorder). | | unit_cost | Cost per unit. Used for inventory value, excess value, recovery estimates. |

Plus you need sales history — either total_sales_12m (one column with the trailing 12-month total) or monthly columns (jan_sales through dec_sales). Monthly columns are preferred because they let the forecast pick up seasonality and trend.

Optional columns (use them if you have them)

| Field | What it improves | |-------|------------------| | category | Lets you filter / group; powers category-level recovery rates in markdowns. | | supplier | Powers the supplier scorecards module. | | location | Powers multi-location transfers, location scorecards. | | lead_time_days | Powers safety stock + ROP. Defaults to 30 if missing. | | moq | Powers the MOQ-overbuy flag. Defaults to 1. | | current_rop | We'll show your current value next to ours so you can compare. | | current_safety_stock | Same. | | last_sale_date | Used for deadstock-window detection. | | last_purchase_date | Used for some markdown logic. | | expiration_date, shelf_life_days | Powers the PRO Fresh module. | | case_qty, case_cubic_ft, pallet_qty | Powers the PRO Space module. |

Column mapping

When you upload, Tropix Palm auto-suggests a mapping from your column names to ours using a three-tier match:

  1. Exact field name match (sku, unit_cost)
  2. Exact synonym match (we know Item ID, QOH, Stock On Hand, etc.)
  3. Loose substring match (3+ chars)

You can override any auto-suggestion and ignore columns you don't want mapped. The mapping is saved as a workspace-level template — next upload auto-applies it.

Multi-file upload

Drop multiple files at once. The merge-mode picker asks how to combine them:

  • Combine slices — different headers OK, all rows concatenated. Same SKU+location across files shows up as a duplicate in the auto-clean step.
  • Use newest only — identical headers across files (typically monthly snapshots), use only the latest.

Each row in the merged dataset carries a __source_file tag so you can audit provenance later.

Auto-clean review

Between mapping and validation, the prep step runs and surfaces:

  • Phantom SKUs — catalog rows with zero on-hand AND zero sales (and no monthly sales). Excluded by default. Different from deadstock (which has on-hand > 0).
  • Backorder rows — qty_on_hand < 0. Kept as active reorder candidates.
  • Duplicate SKU + location — merge via sum (default) or keep-first / keep-last.
  • Numeric issues — cells that should be numbers but aren't. The validator will block on these.
  • Required cell defaults — blank qty / cost / total_sales filled with 0 so the validator passes.
  • Whitespace — silently trimmed.

Validation

After auto-clean, the validator catches blocking issues:

  • Blank SKU or description
  • Non-numeric required fields
  • No sales history at all (no total, no monthly)

Warnings (non-blocking) include:

  • Missing lead time, MOQ, category, supplier
  • Negative qty (we keep it; you'll see a count of likely backorders)
  • Qty present but unit cost = 0 (inventory value will be 0)
  • All-zero sales rows (likely deadstock candidates)

File-size limits

Practical limit: ~50,000 rows per file in the browser. Larger uploads will work but may take longer; we're working on a streaming server upload path. Ping us if you need it.