Docs navigation
Home / Docs / Importing data

Importing data

Get supplier and catalog data into Foundry via CSV upload, FTP/FTPS, Google Sheets, or vendor SFTP push — with column mapping and scheduling.

Foundry pulls inventory and catalog data from your suppliers through inbound channels (sources). Every import method lands rows as ChannelSkus that you then link or promote into your catalog, and they all share one column-mapping model.

Import methods

MethodHow it runsBest for
Manual uploadDrag a file into the admin (CSV, TSV, Excel .xlsx/.xls, or Apple Numbers)One-off loads, first contact with a new supplier feed
FTP / FTPSOn-demand or scheduled fetch from a supplier serverSuppliers who host a feed file you pull
Google SheetsReads a published-to-web sheet, manual or scheduledFeeds a supplier or team maintains in a spreadsheet
Vendor SFTP pushThe vendor uploads to Foundry-hosted sftp.foundryims.comSuppliers who prefer to push; no server for you to run — see Vendor SFTP feeds

Supported pull protocols: FTP (plain, port 21), FTPS explicit (AUTH TLS, 21), FTPS implicit (990 — used by suppliers like Keystone), and SFTP (22). Google Sheets reads the published CSV export.

How an import runs

Imports process asynchronously. A manual upload or scheduled pull creates an import job; the file is parsed and each row is upserted as a ChannelSku on the target channel. Large files are chunked automatically, so a multi-hundred-thousand-row feed streams through in batches rather than timing out. The admin shows live progress (rows processed, created, updated, skipped) and a summary when the job finishes.

Newly imported rows are unmapped until you connect them to your catalog:

  1. Rows land as ChannelSkus with no variant link.
  2. Link an unmapped SKU to an existing variant, or promote one or more into a new product/variant.
  3. Once linked, every subsequent import keeps that variant’s cost and supplier quantity current.

Mapping rules can automate step 2 — active rules for a channel run against newly-imported SKUs to auto-link them. When an import completes, Foundry fires the import.completed webhook rather than thousands of per-row events, so external integrations get one signal to re-read.

Column mapping

A mapping tells Foundry which column in the file feeds which field. It’s a set of field → source pairs, where the source can be:

  • A column namebrand: "Manufacturer"
  • A fixed default for every row — brand: "__default:Acme"
  • A formula over other columns (basic arithmetic) — cost: "__formula:{Retail} * 0.85"

Two metadata markers handle awkward files: __delimiter__ for non-comma files (tab, pipe), and __headerRow__ to skip decorative rows above the real header.

Commonly mapped fields:

Foundry fieldTypical column names
channelSkusku, Item Number, product_sku
inventoryQuantityqty, Qty Available, stock
costcost, wholesale, dealer_cost
priceprice, MSRP, retail
mapmap, MAP
upc / gtin / mpnupc, ean, barcode, mfg_part
brandbrand, manufacturer, Vendor
titletitle, name, description
imageUrlimage, Variant Image
option1Name / option1ValueOption1 Name / Option1 Value
groupKeyHandle (for Shopify exports)

Match your mapping to the file’s real headers. The single most common import failure is a mapping that points at columns the file doesn’t contain — it completes with zero rows matched. Foundry surfaces a “matched 0 rows” warning when this happens; if you see it, open the mapping and compare its SKU column against the file’s actual header row.

Spreadsheet quirks handled for you

  • Excel/Numbers files are converted to CSV, and Excel’s ="..." force-as-text cells are stripped, on every path (browser and server).
  • Stray quote characters (inch marks like 19") are tolerated.
  • Shopify exports put product-level fields (Title, Vendor, Handle) only on each product’s first row; Foundry detects the format and carries them forward to the variant rows.

Scheduling

FTP/FTPS and Google Sheets feeds can run on an hourly, daily, or weekly schedule. Foundry checks the remote file’s modification time and skips the import when the file hasn’t changed, so a scheduled feed only does work when there’s new data.