> ## Documentation Index
> Fetch the complete documentation index at: https://docs.seminode.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Reference Data

> Upload internal data tables for cost matching, margin analysis, and faster quoting.

## Overview

**[Reference Data <Icon icon="arrow-up-right" />](https://app.seminode.com/reference)** lets you upload your internal tables — cost files, part masters, contact lists, program assignments — so Seminode can match them against incoming quotes and enrich your workflows automatically.

This is what turns a supplier's price into a decision. Once a cost file is in place, every quote that arrives on a matching part shows your cost, your margin, and the internal context (program, site, owner) beside the supplier's number — without anyone looking it up.

***

## Uploading Data

<Steps>
  <Step title="Upload the file">
    Click **Upload Data** and select a `.csv`, `.xlsx`, or `.xls` file — or drop it on the upload area. Seminode parses it and reports the row and column counts back to you.
  </Step>

  <Step title="Configure">
    Work through the configuration wizard described below, then click **Create Table**.
  </Step>
</Steps>

Once published, the table appears in your reference data list and starts participating in matching.

<Tip>
  Uploads are processed in the background. If you close the dialog mid-way, click **Recent Uploads** — beside **Upload Data** — to reopen an upload that's still waiting to be configured. Rows marked **Ready to Review** are the ones you can resume.
</Tip>

***

## Configuring a Table

Configuration is a short wizard with up to three steps:

1. **Saved Mappings** — reuse a configuration from an existing table
2. **Column Types** — tell Seminode what each column means
3. **Match Groups** — advanced control over how rows match listings

The **Saved Mappings** step only appears when you have an existing table whose configuration fits this file, and you can skip straight to manual setup with **Configure Manually**. The **Match Groups** step is optional — most tables never need it.

### Column Types

For each column in your file, pick a **Column Type**. Anything you leave as **None** is stored but plays no special role.

| Column Type         | What it does                                               |
| ------------------- | ---------------------------------------------------------- |
| **Display**         | Shown alongside the listing in your inbox                  |
| **Unit Cost**       | Feeds margin and variance calculations                     |
| **Contact**         | Who to ask about this material                             |
| **Program**         | Your internal program or team name for the material        |
| **Site Code**       | Location code of the material                              |
| **Internal Number** | Your company-specific part number                          |
| **Region**          | Geographic region or area                                  |
| **Commodity**       | Commodity or material category                             |
| **Material Number** | Manufacturer part number, used to cross-reference listings |
| **Manufacturer**    | Manufacturer name, used to cross-reference listings        |
| **Quantity**        | Prefills quantity on listings created from a row           |

Most types accept a single column — assigning **Site Code** to a second column moves it. **Display** and **Unit Cost** are the exceptions: mark as many as you need.

### Key Columns

**Key Columns** are the columns that uniquely identify a row in your file. Seminode prefills them from your identity columns — **Internal Number**, **Site Code**, and **Material Number** — and builds the matching rules from them automatically, so a correctly typed file needs no further setup.

Adjust the selection if your data keys on something different. You must select at least one key column before the table can be created.

<Note>
  If you need something more precise than "all key columns must match", use **Match Groups**. Within a group, *every* mapped column must match; between groups, *any* group matching is enough. Manual match groups replace the automatic rules built from your key columns.
</Note>

### Cost Columns

You can mark several columns as **Unit Cost** — a standard cost, a last-paid cost, and a contract cost, for example. When you do, pick one as the **Default Unit Cost Column**. That default is what drives margin calculations everywhere a matched listing appears.

The default is a starting point, not a commitment. In the inbox, each line shows chips for every available cost, and picking a different one and confirming it re-bases the margin for that line. That choice **persists on the thread**, so a line quoted against contract cost stays that way as new quotes arrive.

### Quantity Autofill

Mark a column as **Quantity** and Seminode prefills it as the quantity when you create listings from a row.

You can also add an optional **Autofill Formula** to transform the value first. Write `x` for the mapped column's value and combine it with `+`, `-`, `*`, `/`, and parentheses — for example `(x / 12) * 1.5` to turn an annual usage figure into a buy quantity with buffer. The result is rounded up to a whole unit, and is always editable before you publish.

### Display Columns

Marking columns as **Display** controls what your team sees beside a matched listing in the inbox.

<Warning>
  Display is all-or-nothing: as soon as **any** column is marked for display, only the marked columns appear. If you mark one column and expect to still see the rest, you'll find they've disappeared — mark every column you want visible.
</Warning>

### Saved Mappings

When you re-upload a refreshed version of a file, the **Saved Mappings** step offers the configuration you used on the previous table. Click **Apply** and the new table is created with the same column types, key columns, cost defaults, and display settings.

If the file's columns have changed since that mapping was built, Seminode marks the mapping **Incompatible** and lists the missing columns instead of applying it. This is deliberate: a half-applied mapping would silently match on the wrong fields, so you're asked to configure the changed file rather than inherit a broken setup.

***

## Managing Tables

The main view lists every reference table with its name, row count, key columns, and status. Click **View** to browse a table's records with search and filters.

The row <Icon icon="ellipsis" /> menu offers:

* **View Mapping** — a read-only summary of how the table is configured
* **Edit Mappings** — change column types, key columns, cost defaults, display columns, or enable/disable the table
* **Delete** — permanently remove the table and its records

After editing mappings, the table briefly re-indexes while its search and filters rebuild.

### When Multiple Tables Match

Several tables can enrich the same listing — a cost file and a part master, for instance. If two tables supply a column with the **same name**, the value from the **most recently uploaded** table wins.

<Warning>
  Re-uploading a file creates a **new** table; it does not replace the old one. The previous table stays enabled and keeps participating in matching. Delete or disable superseded tables so stale costs can't surface on new quotes.
</Warning>

<Note>
  Deleting a table changes what future matches return, but values already published on existing quote threads stay as they were. Re-confirm a cost on the thread if you need it recalculated against your current data.
</Note>

***

## Create Listings & Send RFQs

Reference records can be turned straight into a request for quote — no re-upload or separate list required. From the **[Listings](/tools/listings)** page, click **Create Listing** and use the **Quick add** tab, or select rows inside a table and click **Create Listing**.

<Steps>
  <Step title="Select records">
    Search your reference tables and select the records you want. Selection locks to a single table — clear your selection to pick from a different one.
  </Step>

  <Step title="Set the type">
    Choose a **Type** (Supply or Demand) and a **Subtype**. Both are required before you can continue.
  </Step>

  <Step title="Choose private fields">
    Review the **Private Columns** section. Identity fields such as your internal number and site code default to private, while the manufacturer part number stays public so partners can actually quote it. Toggle any field between **Private** and **Reference**. See [Public & Private Fields](/public-private-fields).
  </Step>

  <Step title="Adjust each line">
    Each record becomes a listing card with **Material No**, **Manufacturer**, **Qty**, and **Unit Price**. Quantity is prefilled from your quantity mapping and formula, and everything stays editable. Add an optional per-line message.

    Expand **Add details & attributes** to set **Condition**, **Description**, **Date Code**, **Packaging**, **Country of Origin**, **ECCN**, **Lot No**, **Currency**, **MOQ**, **MPQ**, **Qty On Hand**, **NCNR**, and **Full Label**, plus any custom attributes your team needs.
  </Step>

  <Step title="Add to basket">
    Click **Add to basket**. Lines land in your **[RFQ basket <Icon icon="arrow-up-right" />](https://app.seminode.com/quote-request/basket)**, assigned to whoever added them. Open the basket to reassign lines to a teammate, then **[send the RFQ](/tools/listings#send-rfqs)**.
  </Step>
</Steps>

***

## Data Matching

Matching happens automatically wherever listings and reference data meet — as quotes arrive in your inbox, and in the **[listings upload flow](/tools/upload-tools)**. There's no separate "run matching" step.

Seminode matches each listing against your enabled tables on the identity columns you designated — **Internal Number**, **Site Code**, **Material Number**, and **Manufacturer** — enriching it with your costs, contacts, program, and other mapped fields.

## Header Mappings

**[Header Mappings <Icon icon="arrow-up-right" />](https://app.seminode.com/settings/header-mappings)** relabel Seminode's internal field names (for example, **Internal Number**) to your company's own nomenclature, applied across the app and in quote exports. See [Settings](/settings/settings#integrations) for details.
