Product mapping import and export
Mapping offers one at a time is fine for a handful. For a few hundred, use the round trip: export the catalogue → edit the SKU.io SKU column in a spreadsheet → upload the same file back.
Both buttons are at the top right of the Products tab: Import Mappings and Export.
The export headings and the importer's expected headings are the same strings. An exported file can be edited and uploaded back without renaming a single column — no template juggling.
Export
Getting the file
Click Export on the Products tab. If the catalogue is empty, the button is disabled and the tooltip reads: "There are no offers to export yet — run a catalogue sync first."
The dialog asks for two things:
| Choice | Options |
|---|---|
| Format | xlsx (default) or csv |
| Scope | Which rows to include — see the table below |
| Scope | What you get |
|---|---|
| Filtered (default) | Every row matching the filters and search currently applied to the table — across all pages, not just the visible one. |
| Current page | Exactly the rows visible on screen. |
| Selected | Only the rows you ticked. |
| All | The entire catalogue. This scope deliberately clears your filters — "all" means all, not "all that matched". |
The file downloads immediately as veracore-products-<timestamp>.xlsx (or .csv). The catalogue is small enough that the export streams back synchronously — there is no queued job to wait on, and nothing lands in the job tray.
Columns
The sheet is named VeraCore Products. The export mirrors the columns you have visible on the table, so hide Owner with the column selector and it will not be in the file:
| Heading | Source | Notes |
|---|---|---|
| Item | The VeraCore offer ID | The match key. Always included. |
| Title | Offer title at VeraCore | |
| SKU.io SKU | The mapped product's SKU | The only editable column. Always included. Blank when unmapped. |
| Mapping | Mapping state | One of Mapped, Mapped (manual), Needs review, Unmapped. |
| Owner | VeraCore owner ID | Which client account owns the offer at your 3PL. |
| UOM | Unit of measure | |
| Status | Offer status at VeraCore | |
| Last Synced | Timestamp | Converted to your account timezone. |
Those two are re-added server-side no matter what you hide. Without them the file could not be uploaded back, so a column preference can never quietly produce a broken round trip.
Five further columns exist in the export but are not table columns, so they only appear when the export endpoint is called directly without a columns parameter (in which case you get all thirteen):
| Heading | Source |
|---|---|
| SKU.io Product | The mapped product's name |
| Product Type | VeraCore product type |
| Multi-Product Offer | Yes / No — whether the offer bundles several products |
| BOM Products | How many products the offer contains |
| Lot Tracked | Yes / No |
Import
What it does — and does not do
The importer only moves the mapping. It changes which SKU.io product sits behind an offer, and nothing else.
- It never creates an offer. The catalogue belongs to VeraCore and arrives through the product sync, so an Item the sync has not seen is an error, not an insert.
- It never changes an offer's title, status, or any other VeraCore field.
- It never clears a mapping. See the blank-cell rule below.
The file
Only two columns are required. Everything else in an exported sheet is ignored.
| Column heading | Required | Type | What it means |
|---|---|---|---|
| Item | Yes | Text | The VeraCore offer ID. The match key — matched case-insensitively against the mirrored catalogue. |
| SKU.io SKU | Yes | Text | The SKU of the SKU.io product this offer should map to. Matched case-insensitively. |
A blank template with those two headers is downloadable from step 1 of the import dialog. Its sample row is:
| Item | SKU.io SKU |
|---|---|
VC-1001 | SHAKER-BLK |
An exported file and a downloaded template are interchangeable inputs — the headers are identical.
The match key and update behaviour
Rows are matched on Item. Every row is an update to an existing offer:
| Situation | Result |
|---|---|
| Offer was unmapped, row names a valid SKU | Mapped — counted as created |
| Offer was mapped, row names a different valid SKU | Re-pointed — counted as updated |
| Offer was mapped, row names the same SKU | Skipped, with the warning "Already mapped to this SKU.io product — nothing will change." |
| SKU.io SKU is blank | Skipped — the offer is left exactly as it is |
| Both columns blank | Skipped as a trailing spreadsheet row |
This is the single most important rule in the file format. Export 556 rows, edit three, upload it back — the other 553 blanks are left alone, not wiped. Clearing a mapping stays a deliberate act: unmap the offer from its row in the table.
Mappings applied by import are recorded as manual matches, which is why they are never overwritten by the automatic matcher on a later catalogue sync.
The four steps
The import dialog walks through Upload → Map Columns → Validate → Import.
Validate is a full dry run: every row is checked against the live catalogue and your product list, and you see the exact counts and per-row errors before anything is written. Nothing changes until you confirm on the last step.
Import is partial, not all-or-nothing: valid rows are applied and invalid rows are reported. Fix the reported rows and upload again — re-running a file that is already applied is safe, because unchanged rows are skipped.
Validation messages
Each of these appears against the offending row in the Validate step.
| Message | Cause | Fix |
|---|---|---|
| Item is required. | The Item cell is blank but the row has a SKU. | Fill in the VeraCore item ID, or blank the whole row. |
Item 'X' is not in this integration's catalogue. Run a catalogue sync first. | The offer ID is not mirrored in SKU.io. | Run a catalogue sync, then re-upload. If it still fails, the item does not exist at VeraCore under this connection. |
Item 'X' appears more than once in this file. | Duplicate offer rows. | Keep one row per offer. |
SKU.io SKU 'X' was not found. | No SKU.io product has that SKU. | Correct the SKU, or create the product first. |
SKU.io SKU 'X' appears more than once in this file — a product can back only one VeraCore item. | Two rows point different offers at the same product. | Decide which offer owns it. |
SKU.io SKU 'X' is already mapped to VeraCore item 'Y'. Unmap that item first. | The product is already claimed by another offer. | Unmap offer Y from the table, then re-upload. |
And one warning, which does not block the import:
| Message | Meaning |
|---|---|
| Already mapped to this SKU.io product — nothing will change. | A no-op row. It is shown rather than hidden so the preview counts add up. |
A SKU.io product can back only one VeraCore offer per connection. That constraint is what most of the error list above is protecting. The claim check runs against a snapshot taken before the file is applied, so in the rare case where an earlier row in the same file takes a product first, the later row is reported as an error during the import step rather than at validation.
The recommended workflow
- On the Products tab, filter to Unmapped (or Needs Review).
- Export with scope Filtered — you get only the rows that need work.
- Fill in the SKU.io SKU column in your spreadsheet. Leave rows you are unsure about blank.
- Import Mappings, upload the same file, and read the Validate step carefully.
- Confirm. The table reloads with the new mappings in place.
The in-app hint on step 1 says the same thing:
Export the table, edit the SKU.io SKU column, and upload it back — the headers already line up. Rows are matched on Item, and a row with a blank SKU.io SKU is left exactly as it is. To remove a mapping, unmap the offer from its row in the table. For a handful of items, the blank template below has the same two headers.
For the one-at-a-time path, see Map an offer to a product. For how the automatic matcher fills these in for you, see How offers are matched to products.