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
| Method | How it runs | Best for |
|---|---|---|
| Manual upload | Drag a file into the admin (CSV, TSV, Excel .xlsx/.xls, or Apple Numbers) | One-off loads, first contact with a new supplier feed |
| FTP / FTPS | On-demand or scheduled fetch from a supplier server | Suppliers who host a feed file you pull |
| Google Sheets | Reads a published-to-web sheet, manual or scheduled | Feeds a supplier or team maintains in a spreadsheet |
| Vendor SFTP push | The vendor uploads to Foundry-hosted sftp.foundryims.com | Suppliers who prefer to push; no server for you to run — see Vendor SFTP feeds |
| API pull | Scheduled GET against a supplier’s JSON or CSV endpoint | Suppliers with a product API and no file feed — see API sources |
| Shopify as a supplier | Pulls products from a vendor’s Shopify store | Dropship vendors who run on Shopify — see Shopify as a supplier |
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:
- Rows land as ChannelSkus with no variant link.
- Link an unmapped SKU to an existing variant, or promote one or more into a new product/variant.
- 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 name —
brand: "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 field | Typical column names |
|---|---|
channelSku | sku, Item Number, product_sku |
inventoryQuantity | qty, Qty Available, stock |
cost | cost, wholesale, dealer_cost |
price | price, MSRP, retail |
map | map, MAP |
upc / gtin / mpn | upc, ean, barcode, mfg_part |
brand | brand, manufacturer, Vendor |
title | title, name, description |
imageUrl | image, Variant Image |
option1Name / option1Value | Option1 Name / Option1 Value |
groupKey | Handle (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.
API sources
When a supplier offers an HTTP endpoint instead of a file, an API import source pulls it on the same schedules as FTP. Foundry fetches, flattens the response into rows, and hands those rows to the normal column-mapping pipeline — so once the pull is configured, mapping and linking work exactly as for a CSV.
Today an API source is configured through the Partner API rather than an admin form: POST /channels/:channelId/import-configs with sourceType: "API", an apiConfig, and the secret as apiSecret (stored encrypted, never returned). The source then appears on the Sources page with an API badge, runs on its schedule, and shows in the source’s import history like any other.
apiConfig fields:
url— the endpoint (GET only) andformat:jsonorcsv.recordPath— dot path to the array of records in a JSON response (data.products);explodePathturns a nested array (variants) into one row per element, with the parent’s fields repeated.headers— any fixed request headers.auth.type—none,bearer,header(+headerName),basic(+username), orquery(+paramName). The secret itself is always the separateapiSecret.pagination.type—none,page(pageParam,limitParam,limit),cursor(cursorParam,cursorPath), orlink(follows the response’s next link).maxPagescaps a run (default 200).
Nested JSON is flattened to dotted column names (price.amount), which is what you map from. POST /channels/:channelId/import-configs/api-preview with the same config returns the detected columns and the first 20 rows — use it to get the paths right before scheduling. Requests are capped at 60 seconds and 100 MB, and private-network addresses are refused.
Shopify as a supplier
A vendor who runs a Shopify store can be a source without exporting anything. On the source, open Import → Shopify: enter the Shop domain plus either an admin access token or a Client ID / Client secret pair, and Save connection. Then Pull now, or Add schedule (hourly, daily, or weekly).
Each pull reads the store’s products and writes one supplier SKU per variant — SKU, title, description, vendor as brand, barcode as UPC/GTIN, price and compare-at price, quantity, images, and options. Cost is included when the connection is allowed to read inventory items and the source’s pull settings include cost. Rows land unmapped like any other feed; mapping rules link them.
Two things to know: saving the connection doesn’t pull by itself — run Pull now — and a Shopify pull runs in-process rather than as an import job, so it shows a last-run time on the source rather than a row in the job list.
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.
After every pull from a platform source, Foundry also reconciles presence: SKUs that were in the store last time but not this time are marked Removed, and ones the store reports as unpublished are Hidden — see Core concepts.
Related
- Vendor SFTP feeds — let suppliers push files to a Foundry-hosted SFTP account.
- Core concepts — the ChannelSku → variant model imports feed into.
- The Catalog management guide walks the admin UI for imports, linking, and promotion step by step.