Skip to main content

Dataset and field reference

This is the exhaustive field catalog for all seven syncable datasets. For each dataset you get the Airtable column, the SKU.io value behind it, the Airtable cell type, and whether an edit in Airtable writes back into SKU.io. For the safety reasoning behind the inbound whitelists, see Inbound safety and the field whitelist.

How to read these tables

  • Airtable field — the column label SKU.io provisions in your base and shows in the mapping-grid field picker.
  • SKU.io source — the underlying SKU.io attribute (a dot path like brand.name reads through a relation).
  • Cell type — the Airtable field type: text, number, currency, datetime, checkbox, or attachment.
  • Inbound-writable? — whether editing that column in Airtable can change SKU.io. Yes means the field is on the dataset's inbound whitelist; No (outbound-only) means SKU.io pushes it out but ignores any edit; No (read-only) / No (computed) are pushed but never accepted back; Key is the merge column and is never writable.

Only three datasets accept any inbound writes at all — Products, Sales Orders, and Suppliers. The other four (Inventory Levels, Sales Order Lines, Purchase Orders, PO Lines) are outbound-only: SKU.io writes them to Airtable and never reads edits back.

Every dataset's first field is the synthetic SKU.io ID (sku_io_id) key. SKU.io upserts rows by matching this column, so it must stay unique per record — do not edit it in Airtable.

Datetimes are in UTC

Every datetime column — Order Date, Updated At, Purchase Order Date, and the rest — is written to Airtable in UTC, as an ISO-8601 timestamp. The SKU.io UI displays date-times in your application timezone, so the same value will read differently in Airtable. Account for the offset when you build date filters, grouped views, or dashboards in your base.

Datasets at a glance

DatasetTwo-way?Merge keyDelete behaviorAuto-create?
ProductsYesProduct SKU (falls back to primary key)Soft-delete (has Archived)Yes (opt-in)
Inventory LevelsNo (outbound-only)Composite product_id:warehouse_idHard-deleteNo
Sales OrdersYessales_order_numberSoft-delete (has Archived)No
Sales Order LinesNo (outbound-only)Line primary keyHard-deleteNo
Purchase OrdersNo (outbound-only)purchase_order_numberSoft-delete (has Archived)No
PO LinesNo (outbound-only)Line primary keyHard-deleteNo
SuppliersYesNumeric supplier database idSoft-delete (has Archived)No

Two-way datasets accept edits back only for the narrow field sets listed under each dataset below. Everything else is outbound-only.

Products

The richest dataset, and the one with the widest inbound whitelist. The merge key (sku_io_id) is the product SKU, not the database id — if a product has no SKU, SKU.io falls back to the primary key.

Airtable fieldSKU.io sourceCell typeInbound-writable?
SKU.io IDsku_io_id (product SKU)textKey
NamenametextYes
BarcodebarcodetextYes
MPNmpntextYes
HTS Codehts_codetextYes
TypetypetextNo (outbound-only)
WeightweightnumberYes
Weight Unitweight_unittextNo (outbound-only)
LengthlengthnumberYes
WidthwidthnumberYes
HeightheightnumberYes
Average Costaverage_costcurrencyNo (read-only)
Unit Costunit_costcurrencyYes
PricepricecurrencyNo (outbound-only)
Brandbrand.nametextYes
ImagesimagesattachmentNo (outbound-only)
Gross Margin %gross_margin_pctnumberNo (computed)
On Handon_handnumberNo (computed)
Units Sold (90d)units_sold_90dnumberNo (computed)
Days of Coverdays_of_covernumberNo (computed)
Sell-through % (90d)sell_through_pctnumberNo (computed)
Archivedis_archivedcheckboxNo (outbound-only)
Updated Atupdated_atdatetimeNo (outbound-only)

Inbound-only relations (no outbound column): two more fields — tags and category — accept inbound writes but have no catalog column that SKU.io pushes outbound. You map them explicitly to Airtable columns of your choosing. Their inbound behavior is described in the Notes below.

Products is the only dataset with relation-backed inbound writes. Every field marked Yes above is written verbatim through the product repository, except brand, and the two relation-only fields (tags, category) behave as described below. Everything else — inventory, average_cost, pricing, the computed metrics, type, weight_unit, is_archived, and updated_at — is ignored inbound.

Notes:

  • unit_cost is the only writable cost. average_cost is read-only and price is outbound-only, so SKU.io never lets Airtable overwrite either — both are hard-excluded from inbound writes.
  • Brand is advertised outbound as the dotted path brand.name, but inbound normalizes it to the bare relation brand for diffing and applying. An inbound brand write matches an existing brand by name, or creates one if it does not exist (first-or-create by name).
  • Tags syncs the full tag set. It accepts an array or a comma-separated string; values are trimmed, de-duplicated, sorted, and comma-joined for stable diffing.
  • Category attaches an existing category by exact name only. Categories form a path-based tree, so SKU.io never creates one — an unknown name is silently skipped.
  • Unmatched Airtable rows can auto-create a product when the mapping opts in: SKU.io creates a new product with sku set to the merge key and type = standard, then applies the scalar and relation fields. A merge key that collides with an existing SKU raises a unique-constraint error rather than overwriting the existing product.

Inventory Levels

Outbound-only — inventory is never writable from Airtable. Each row is a per-product, per-warehouse stock level. The merge key is a composite of product_id and warehouse_id (joined as product_id:warehouse_id), not a single id.

Airtable fieldSKU.io sourceCell typeInbound-writable?
SKU.io IDsku_io_id (product_id:warehouse_id)textKey
SKUproduct.skutextNo (outbound-only)
Warehousewarehouse.nametextNo (outbound-only)
Availableinventory_availablenumberNo (outbound-only)
On Handinventory_totalnumberNo (outbound-only)
Allocatedinventory_allocatednumberNo (outbound-only)
Avg Costinventory_avg_costcurrencyNo (outbound-only)
Updated Atupdated_atdatetimeNo (outbound-only)

This is a hard-delete dataset: it has no Archived column, so a removed level is deleted from Airtable rather than flagged. If a mapping's delete mode is set to flag, SKU.io coerces it to delete for this dataset. The On Hand column here is per-warehouse inventory_total — distinct from the product-level On Hand metric on the Products dataset, which aggregates stock across warehouses.

Sales Orders

Inbound-capable, but only descriptive customer metadata flows back — never the statuses or dates that drive the fulfillment and financial state machine. The merge key is the sales_order_number, not the database id.

Airtable fieldSKU.io sourceCell typeInbound-writable?
SKU.io IDsku_io_id (sales_order_number)textKey
Order Statusorder_statustextNo (outbound-only)
Fulfillment Statusfulfillment_statustextNo (outbound-only)
Payment Statuspayment_statustextNo (outbound-only)
Order Dateorder_datedatetimeNo (outbound-only)
Customer Namecustomer_nametextYes (PII)
Customer Emailcustomer_emailtextYes (PII)
Customer Companycustomer_companytextYes (PII)
Customer Phonecustomer_phonetextYes (PII)
Customer POcustomer_po_numbertextYes
Customer Memomemo_for_customertextYes
Archivedis_archivedcheckboxNo (outbound-only)
Updated Atupdated_atdatetimeNo (outbound-only)

Notes:

  • Editing a status or order_date column in Airtable is a no-op. Those fields are excluded from the inbound whitelist and never mutate the order.
  • No auto-create. An unmatched Airtable row is queued for review — SKU.io never conjures a sales order from a spreadsheet row. Writes match an order by sales_order_number.
  • Only the six descriptive customer fields write back (the ones marked Yes above: customer_name, customer_email, customer_company, customer_phone, customer_po_number, memo_for_customer). order_status, fulfillment_status, payment_status, order_date, and tracking are deliberately excluded — they drive the fulfillment and financial state machine, so an Airtable edit to any of them is ignored inbound.
  • The four Customer fields are flagged PII in the field picker (see PII-flagged fields).

Sales Order Lines

Outbound-only. Each row is a single line on a sales order. The merge key defaults to the line's database primary key.

Airtable fieldSKU.io sourceCell typeInbound-writable?
SKU.io IDsku_io_id (line primary key)textKey
Order NumbersalesOrder.sales_order_numbertextNo (outbound-only)
SKUproduct.skutextNo (outbound-only)
QuantityquantitynumberNo (outbound-only)
PriceamountcurrencyNo (outbound-only)
Updated Atupdated_atdatetimeNo (outbound-only)

This is a hard-delete dataset — it has no Archived column, so a removed line is deleted from Airtable, never flagged.

Purchase Orders

Outbound-only. The merge key is the purchase_order_number.

Airtable fieldSKU.io sourceCell typeInbound-writable?
SKU.io IDsku_io_id (purchase_order_number)textKey
Order Statusorder_statustextNo (outbound-only)
Receipt Statusreceipt_statustextNo (outbound-only)
Total Costtotal_costcurrencyNo (outbound-only)
Total Quantitytotal_quantitynumberNo (outbound-only)
Suppliersupplier.nametextNo (outbound-only)
Order Datepurchase_order_datedatetimeNo (outbound-only)
Archivedis_archivedcheckboxNo (outbound-only)
Updated Atupdated_atdatetimeNo (outbound-only)

Unlike the line datasets, Purchase Orders has an Archived column, so it is a soft-delete dataset: a mapping's flag delete mode works here and marks removed rows as archived rather than deleting them.

PO Lines

Outbound-only. The dataset's display label is PO Lines (its SKU.io identifier is purchase_order_lines). The merge key defaults to the line's database primary key.

Airtable fieldSKU.io sourceCell typeInbound-writable?
SKU.io IDsku_io_id (line primary key)textKey
PO NumberpurchaseOrder.purchase_order_numbertextNo (outbound-only)
SKUproduct.skutextNo (outbound-only)
QuantityquantitynumberNo (outbound-only)
Unit CostamountcurrencyNo (outbound-only)
Updated Atupdated_atdatetimeNo (outbound-only)

This is a hard-delete dataset — no Archived column, so removed lines are deleted from Airtable, never flagged.

Suppliers

Inbound-capable, but only contact and company descriptors flow back. The merge key is the numeric supplier database id.

Airtable fieldSKU.io sourceCell typeInbound-writable?
SKU.io IDsku_io_id (supplier id)textKey
NamenametextYes
Companycompany_nametextYes
Contact Nameprimary_contact_nametextYes (PII)
EmailemailtextYes (PII)
Phonemessaging_phonetextYes (PII)
WebsitewebsitetextYes
Archivedis_archivedcheckboxNo (outbound-only)
Updated Atupdated_atdatetimeNo (outbound-only)

Notes:

  • Operational config is never mutable from Airtable — lead times, PO automation, default warehouses, payment terms, and deposits have no catalog column at all, so they cannot be exported or written back.
  • No auto-create in v1. An unmatched Airtable row is queued for review, never created as a new supplier.
  • Only the six contact/company descriptors write back (the ones marked Yes above: name, company_name, primary_contact_name, email, messaging_phone, website). Operational fields are excluded at the catalog level, not merely at the whitelist — there is no column to write.
  • Because the merge key must be a numeric SKU.io id, a non-numeric value in the key column resolves to no supplier.
  • The three contact fields are flagged PII (see PII-flagged fields).

Computed product metric columns

The Products dataset exposes five live read-only analytics columns. SKU.io recomputes them from live data on every sync and pushes them out, but never accepts them back — they are not on the Products inbound whitelist, so an Airtable edit to any of them is silently ignored. SKU.io only queries these metrics when the column is actually mapped.

Airtable fieldSKU.io sourceHow it is computed
Gross Margin %gross_margin_pct(price − average_cost) / price × 100, rounded to 1 decimal. Null when price is 0.
On Handon_handCurrent on-hand stock aggregated across warehouses.
Units Sold (90d)units_sold_90dFulfilled units over the trailing 90 days.
Days of Coverdays_of_coveron_hand ÷ (units_sold_90d ÷ 90), rounded to 1 decimal. Null when no units sold.
Sell-through % (90d)sell_through_pctunits_sold_90d ÷ (units_sold_90d + on_hand) × 100, rounded to 1 decimal. Null when there is no stock and no sales.

Days of Cover and Sell-through % are null when there are no sales (or no stock and no sales) to divide by. Alongside average_cost, price, images, is_archived, and updated_at, these five metrics are outbound-only decoration — editing them in Airtable has no effect on SKU.io. Note that the Products On Hand metric aggregates stock across warehouses, whereas the On Hand column on Inventory Levels is a single warehouse's inventory_total.

PII-flagged fields

Customer and contact fields — names, emails, phones, and companies — are flagged as PII in the mapping-grid field picker so you knowingly opt in before exporting personal data to Airtable.

DatasetPII fields
Sales OrdersCustomer Name, Customer Email, Customer Company, Customer Phone
SuppliersContact Name, Email, Phone
Last verified: