OptionfierOptionfier

Import file reference

This is the field-by-field reference for Optionfier's import/export format: every Excel column, its JSON equivalent, accepted values, and what happens when you leave a cell blank. It assumes you've already read Importing and Exporting on the main docs page. If you're just backing up or moving your configuration between shops, start there instead.

Excel columns and JSON fields hold the same data; only the naming convention differs (column title vs. camelCase field). Leave an optional cell blank (or omit the field from JSON) to skip it:

"Required" means the field must be present on create rows; required fields on MERGE updates still fall back to the matched row's existing value if the file leaves them blank.

File-level Fields (JSON only)

Excel carries this information implicitly (shop and timestamp come from the workbook metadata on export). JSON has it as top-level fields.

JSON fieldAccepted valuesDefaultNotes
version1N/ASchema version. Always 1 today.
exportedAtISO 8601 timestampN/AWhen the file was exported. Informational.
shopDomainyour-store.myshopify.comN/ASource shop. Informational: the importer writes into the current session's shop regardless.
surfaceoptions, inventory-only, bundles, build-a-boxrequiredWhich kind of option set the file holds. Every group in the file must belong to this surface, or the whole file is rejected. A MERGE group whose ID or handle matches an existing group under a different surface is also rejected. A NEW group is never matched against existing groups, but its handle must still be unused in your shop. The file's surface fills in the discriminator a group omits: inventoryEngine: INVENTORY_ONLY on an inventory-only file, kind: BUNDLE on a bundles file, boxMode: true on a build-a-box file.
groupsarray of option sets[]The root option-set array.

Excel doesn't have a surface field: the surface is the name of the sheet holding the data. Options exports write the Options sheet; inventory syncs write Inventory Only; bundles write the Bundles, Variants and Option Fields sheets described in Bundles workbook. Build-a-Box has no Excel form yet: it exports and imports as JSON only. The Inventory Only sheet also drops several columns that either don't apply to that engine or never reach the storefront on it: Inventory Engine, Set Label On Product, Set Label On Cart, Treat As Line Item Property, Show Component Pricing, Show Component Pricing Always, Derive Parent Inventory, and Option Price Override.

Option set fields

Each option-set row starts a new option set.

XLSX ColumnJSON fieldAccepted valuesDefault on createNotes
Group Handlehandlekebab-case slug, unique per shoprequiredThe anchor for MERGE matching. Handles are unique per shop.
CommandcommandMERGE, NEW, or blankMERGECase-insensitive. Any unknown value is treated as MERGE.
Group Namenameany textthe handle, if blankMerchant-facing display name.
Product IDproductIdShopify product GID (e.g. gid://shopify/Product/123)N/AConnects the option set to a product. The importer prefers GID over handle when both are set.
Product HandleproductHandleShopify product handle (e.g. custom-tshirt)N/ACross-store portability: used as a fallback when the GID doesn't resolve in this shop.
Product IDsproductIdsShopify product GIDsN/AExport only, for an option set that applies to several products. It replaces Product ID. In Excel the list starts on the option set's first row, one product per row; in JSON it is comma-separated. Importing a product list comes in a later version: the row imports with a warning, MERGE keeps the option set's current products, and a new option set is created disabled.
Product HandlesproductHandlesShopify product handlesN/AThe handles of the same products, in the same order. A product with no stored handle is left out, so the two lists only line up row by row when every product has a handle.
Group Enabledenabledtrue, falsetruefalse imports the option set as draft (won't render on the storefront).
Group Positionpositionnumber1.0Display order on the main admin list.
Inventory EngineinventoryEngineNATIVE_BUNDLES, INVENTORY_ONLYNATIVE_BUNDLESThe legacy value LINE_ITEM_PROPERTIES is still accepted so older files import: it is converted to NATIVE_BUNDLES with every option set in the group set to Text on order. INVENTORY_ONLY belongs in an inventory-only JSON file, where it is the default and the only accepted value; in an options file it is a surface mismatch and the file is rejected. The Inventory Only sheet has no such column. See How Options Appear, and Who Tracks Inventory.
Include Parent In BundleincludeParentInBundletrue, falsefalseOnly honoured when Inventory Engine is NATIVE_BUNDLES.
Sold Out Entire GroupsoldOutEntireGrouptrue, falsetrueDisable add-to-cart when any option is fully sold out. A blank cell on a create row gets the database default, true; option sets created in the admin start at false.
Derive Parent InventoryderiveParentInventorytrue, falsefalseWhen enabled, the app derives the bundle parent product's stock level from its components and writes it to Shopify (opt-in).
Options Carrier IdoptionsCarrierIdblank, or parent-lineblankOnly applies to a standard Options group (not Bundles, Build a Box, or Inventory sync). Blank routes answers onto the order's bundle grouping (no separate line; they won't reach packing slips or Order Printer). parent-line puts them on the product's own order line instead.
N/AidOptionfier option-set IDN/AJSON only. Exports include it; the XLSX format intentionally omits it (option sets match by handle).

Option fields

XLSX ColumnJSON fieldAccepted valuesDefault on createNotes
Set IDidOptionfier option IDN/AUsed for MERGE matching within an option set. Blank → create a fresh option.
Set Handlehandlekebab-case slug, unique within the option setrequiredReferenced by visibility conditions in other options.
Set Commandcommandany stringN/AReserved for future use. Option-level commands are not read today; the option set's Command cascades to all children.
Set Label On CartlabelOnCartany textN/ARequired for NATIVE_BUNDLES and LINE_ITEM_PROPERTIES. INVENTORY_ONLY options can omit it.
Set Label On ProductlabelOnProductany textthe labelOnCartOptional override for the storefront display.
Set Enabledenabledtrue, falsetrueDisable an option without deleting it.
Set Positionpositionnumber1.0Order within the parent option set.
Set Requiredrequiredtrue, falsefalseWhen true, customers must fill in this field to add to cart.
Display On FrontenddisplayOptionsOnFrontendtrue, falsetrueWhen false, the option is hidden on the storefront.
Treat As Line Item PropertytreatAsLineItemPropertytrue, falsefalseThe Appears as setting: true is Text on order (the option shows as text on the parent line), false is Bundle items. Only honoured when Inventory Engine is NATIVE_BUNDLES. An INVENTORY_ONLY option set is always Text on order whatever this column says.
Collect Color ValuecollectColorValuetrue, falsefalseFor color-swatch sets: when true, the cart records the color's hex value next to the label (e.g. Medium (#8D6944)). Default records only the label.
Dropdown StyledropdownStylefancy, nativefancyOnly applies to Selectable options rendered as a dropdown. fancy is Optionfier's own styled dropdown; native is the browser's plain <select>.
Variant Image SizevariantImageSizesm, md, lg, or blankblank (off)Thumbnail next to each choice. On a Fancy dropdown sm is the default 20px row and larger values grow the open list; a Native dropdown ignores this column.
Variant Image PositionvariantImagePositionleading, trailingleadingWhich side of the choice label the variant thumbnail renders on.
Show Detail CardshowDetailCardtrue, falsefalseApplies to any dropdown, Fancy or Native, with a linked variant. Shows the selected variant's card below the dropdown.
Detail Card Image SizedetailCardImageSizesm, md, lgmdImage size in the selected variant's card. Only used when Show Detail Card is true.
Show Component PricingshowComponentPricingtrue, falsefalseShows the per-choice price next to each choice.
Show Component Pricing AlwaysshowComponentPricingAlwaystrue, falsefalseAlso show prices that equal the parent variant's price.
CSS Class EnabledcssClassEnabledtrue, falsefalseMaster toggle for the custom CSS class.
CSS ClasscssClassCSS class name""Custom class applied on the storefront.
Placeholder EnabledplaceholderEnabledtrue, falsefalseWhen true, the option starts with nothing selected instead of pre-picking the first choice, on every display style. On a dropdown that renders as an empty placeholder row.
Placeholder TextplaceholderTextany textN/AWording for the placeholder row. Only applies to Selectable options rendered as a dropdown.
N/AlowStockNoticeEnabledtrue, falsefalseJSON only, no XLSX column. Shows a "Only X left" notice on choices whose linked variant is running low.
N/AlowStockThresholdnumber or nullnullJSON only, no XLSX column. The stock level that triggers the low-stock notice.
N/AmaxPerLinenumber or nullnullJSON only, no XLSX column. The most units of this product one cart line may hold, whether or not this option's choices are picked; checkout refuses lines over the cap. An out-of-range value is clamped to a usable cap rather than rejecting the whole file.
Visibility Condition JSONvisibilityConditionJSON object or nullnullSee Visibility Condition JSON below.
Quantity By Source JSONquantityBySourceJSON object or nullnullConditional-quantity rule: how many units of the linked variant this option consumes, driven by another option's answer. Same rule shape as visibilityCondition.

Excel round-trips every field above except the three marked JSON only. An Excel export/import of an option set with low-stock notices, a threshold, or a per-line cap silently drops them. Use JSON if you need those fields to survive the round-trip.

Common choice fields

Every choice carries the fields below. The type-specific fields live in Option Config JSON in Excel and at the top level of the option object in JSON (see Option Types and Per-Type Fields next).

XLSX ColumnJSON fieldAccepted valuesDefault on createNotes
Option IDidOptionfier option IDN/AUsed for MERGE matching within a set. Blank → create a fresh option.
Option Typetypesee types table belowrequiredDetermines which per-type fields apply.
Option Variant Product IDvariantProductIdShopify product GID""Connected component product.
Option Variant Product HandlevariantProductHandleShopify product handleN/ADenormalised reference kept in sync by the products/update webhook.
Option Variant IDmatchingVariantIdShopify variant GID""Connected variant under the component product.
Option Price OverridevariantPriceOverridedecimal string (e.g. "12.99")nullCustom price for an option shown as Bundle items. Ignored under LINE_ITEM_PROPERTIES.
Option Quantityquantityinteger ≥ 11How many units of the connected variant this option consumes.
Option Inventory Management EnabledinventoryManagementEnabledtrue, falsefalsePer-option inventory tracking toggle.
Option Config JSON(top-level keys on the option)JSON blob{}XLSX-only; holds per-type fields without a dedicated column.

Option Types and Per-Type Fields

The Option Type value (or JSON type) is one of the following. Per-type fields below live in Option Config JSON in Excel and at the top level of the option object in JSON.

Option Type valueWhat it renders as
SelectableOptionDropdown, radio, pill buttons, or product grid (picked via displayAs)
CheckBoxOptionCheckbox, pill toggle, or switch
TextOptionText input (single- or multi-line)
NumberOptionNumeric input or slider
DateOptionDate picker
TimeOptionTime picker
FileOptionFile upload
ColorOptionPredefined color swatch
ImageSwatchOptionImage swatch
DynamicColorOptionCustomer-chosen hex color
LinkedVariantInventory link (for INVENTORY_ONLY inventory syncs; never shown on the storefront)
StaticContentOptionStructural content (heading, paragraph, divider, or spacer), collects no answer

SelectableOption (dropdown / radio / pill buttons)

XLSX Column / JSON keyAccepted valuesDefaultNotes
Option Value / optionValueany textrequiredThe choice text shown to customers.
Option Display As / displayAsdropdown, radio, buttons, griddropdownRender style. grid is the Product grid: a wrapping grid of image tiles. Keep the same value across every option in a set.
Option Selected By Default / selectedByDefaulttrue, falsefalsePre-select this option on page load. At most one per set.

CheckBoxOption

XLSX Column / JSON keyAccepted valuesDefaultNotes
Option Label / labelany textrequiredThe checkbox label shown to customers.
checkedByDefaulttrue, falserequiredStart checked when the page loads.
displayAscheckbox, buttons, switchcheckboxStandard checkbox, pill-button toggle, or an accessible switch.

TextOption

JSON keyAccepted valuesDefaultNotes
placeholderany textrequiredGrey helper text inside the field.
multiLinetrue, falserequiredSingle-line input vs. textarea.
validationTypenone, email, telephone, urlnonePattern applied to the input.
minLengthinteger ≥ 0 or nullnullMinimum character count.
maxLengthinteger ≥ 1 or nullnullMaximum character count.

NumberOption

JSON keyAccepted valuesDefaultNotes
placeholderany textrequiredGrey helper text inside the field.
minValuenumber or nullrequiredMinimum allowed value.
maxValuenumber or nullrequiredMaximum allowed value.
steppositive number1Increment step.
displayAsinput, sliderinputPlain numeric field, or a range slider using the same min/max/step.

DateOption

JSON keyAccepted valuesDefaultNotes
includeTimetrue, falsefalseCombine with a time picker.
minDateYYYY-MM-DD or nullrequiredFixed lower bound.
maxDateYYYY-MM-DD or nullrequiredFixed upper bound.
minDateRelative{ anchor, offsetDays } or nullnullRelative lower bound.
maxDateRelative{ anchor, offsetDays } or nullnullRelative upper bound.
specificDateRule{ mode, dates } or nullnullmode is "block" or "allow"; dates is an array of YYYY-MM-DD.
dateRangeRule{ mode, ranges } or nullnullranges is an array of { start, end } (each YYYY-MM-DD).
dayOfWeekRule{ mode, days } or nullnulldays is an array of integers 0-6 (0 = Sunday).

Anchors for relative dates: today, startOfMonth, endOfMonth, startOfNextMonth, endOfNextMonth. offsetDays is an integer, positive for future, negative for past.

TimeOption

JSON keyAccepted valuesDefaultNotes
minuteStepinteger 1-6015Minute granularity.
use24Hourtrue, falsefalse24-hour vs. 12-hour display.
minTimeHH:mm or nullrequiredFixed lower bound.
maxTimeHH:mm or nullrequiredFixed upper bound.
specificTimeRule{ mode, times } or nullnulltimes is an array of HH:mm.
timeRangeRule{ mode, ranges } or nullnullranges is an array of { start, end } (each HH:mm).

FileOption

JSON keyAccepted valuesDefaultNotes
acceptedTypesarray of MIME types or extensions (e.g. ["image/*", ".pdf"])requiredFile type restrictions.
maxSizeMBpositive numberrequiredMax per file. Subject to Shopify's 20 MB limit (1 GB for videos).

ColorOption (predefined swatches)

XLSX Column / JSON keyAccepted valuesDefaultNotes
Option Color Name / colorNameany textrequiredDisplay name for the swatch.
Option Color Value / colorValuehex string (e.g. #FF5733)requiredThe swatch color.

ImageSwatchOption

XLSX Column / JSON keyAccepted valuesDefaultNotes
Option Image URL / imageUrlURLrequiredSource image for the swatch.
N/A / optionNameany textrequiredDisplay name for the swatch. JSON only, no XLSX column.

DynamicColorOption (customer-chosen color)

No type-specific fields. Customers enter an arbitrary hex color at runtime.

LinkedVariant (inventory syncs)

JSON keyAccepted valuesDefaultNotes
scopeGLOBAL, PER_VARIANTGLOBALGLOBAL = deduct for every trigger variant; PER_VARIANT = deduct only for the specific trigger variant below.
triggerVariantIdShopify variant GID""Populated when scope is PER_VARIANT.
triggerProductIdShopify product GID""Populated when scope is PER_VARIANT.

LinkedVariant choices also use the common matchingVariantId, variantProductId, variantProductHandle, and quantity fields; those identify the variant being deducted.

StaticContentOption (heading, paragraph, divider, spacer)

JSON keyAccepted valuesDefaultNotes
kindheading, paragraph, divider, spacerrequiredWhich element this renders as.
textany textN/AHeading or paragraph copy. Unused on divider/spacer.
levelh2, h3, h4N/AHeading only. The semantic level rendered on the storefront.
sizesm, md, lgN/ADivider/spacer only. The vertical spacing scale.

Visibility Condition JSON

The Visibility Condition JSON cell (XLSX) or visibilityCondition field (JSON) holds an object with this shape:

{
  "action": "show",
  "logic": "and",
  "rules": [
    {
      "sourceOptionSetId": "set_abcd1234efgh",
      "operator": "equals",
      "value": "Large"
    }
  ]
}
KeyAccepted valuesDefaultNotes
actionshow, hideshowWhether the rule shows or hides this option.
logicand, orandCombiner across multiple rules.
rulesarray of rule objectsrequiredSee rule fields below.

Rule fields:

KeyAccepted valuesDefaultNotes
sourceOptionSetIdanother option's Set ID in the same option setrequiredThe option whose value drives this rule.
operatorequals, not_equalsequalsComparison.
valuestring or nullrequiredThe value to match against. null means "the source has any value" (useful with not_equals for "source is empty").

Bundles workbook

A bundles Excel file has three data sheets. Bundles holds one row per bundle, Variants holds one row per variant you sell, and Option Fields holds the bundle's option fields. The Bundle Handle column links them. Sheet names are matched without regard to case or surrounding spaces.

A component key is how a cell names a component product: its variant's SKU, or its variant ID (gid://shopify/ProductVariant/123). Exports write the SKU, or the variant ID when the variant has no SKU. On import every key is looked up in your store before anything else is checked:

Each component's price is re-read from Shopify on every Excel import, because the workbook has no component price column. A variant with a blank Price totals at today's component prices.

Bundles sheet

MERGE replaces a bundle's whole recipe, variants and bundle settings with what the file says. A blank cell on this sheet means the default below, not "keep what's stored", except for Bundle Name and Product ID, which follow the usual MERGE rules.

XLSX ColumnAccepted valuesDefaultNotes
Bundle Handlekebab-case slug, unique per shoprequiredLinks the three sheets. The anchor for MERGE matching.
CommandMERGE, NEW, or blankMERGEAs on the Options sheet.
Bundle Nameany textthe handle, if blank
Product IDShopify product GIDblankLeave blank on a new bundle; Optionfier creates the Shopify product.
Statuspublished, unlisted, draft, or blankpublishedCase-insensitive.
Option 1 Name … Option 3 Nameany textblankThe bundle's variant options. Fill them left to right; a gap is an error. No names means a fixed bundle with a single variant.
Include Bundle Linetrue, falsefalsePuts the bundle product on the order as its own line.
Bundle Line Priceprice0.00Charged on that line, on top of the components.
Options Carriera component key from this bundle, bundle line, or blankblankWhich line carries option answers. Blank is the order's bundle grouping.
Fee Componentscomma-separated component keysblankMarks those components as fees. A SKU containing a comma can't be listed here; use its variant ID.
Included / <Catalog>TRUE, FALSE, or blankblankOne column per market or B2B catalog. Blank leaves the bundle's place in that catalog as it is, unlike the other columns on this sheet. See Catalog prices and inclusion.

Variants sheet

One row per variant you sell. A combination of option values with no row is imported as not for sale, and re-importing the file keeps it that way. A fixed bundle has exactly one row with the option value cells blank.

XLSX ColumnAccepted valuesNotes
Bundle Handlea handle from the Bundles sheetrequired
Option 1 Value … Option 3 Valueany textOne per option name on the Bundles row. Each combination appears once.
Variant IDShopify variant GIDWritten by export. Leave blank when authoring by hand.
Variant SKUany textThe bundle variant's own SKU.
PricepriceBlank charges the sum of the components.
Compare At Priceprice
Price / <Catalog> (<CUR>), Compare At Price / <Catalog> (<CUR>)price, remove, or blankOptional pair per market or B2B catalog. See Catalog prices and inclusion.
Component 1, Component 1 Qty, Component 2, …a component key, then a whole numberAdd as many pairs as the widest row needs. A component a row doesn't list has quantity 0 on that variant.

A component's quantity on the first row that lists it is its default quantity. A component at quantity 0 on every row isn't written by export, so it drops out of the bundle on re-import.

Catalog prices and inclusion

Add a column per market or B2B catalog to set a bundle's price there or choose which catalogs it appears in. The column names carry the catalog's title as it appears in Shopify. Titles match ignoring case and extra spaces.

Option Fields sheet

A bundle's option fields: engraving, gift wrap and the like. The columns are Bundle Handle followed by exactly the option and choice columns of the Options sheet (Option fields, Common choice fields), and the same values apply. The group-level columns (Group Handle, Command and the rest) aren't on this sheet; the Bundles sheet carries those. The sheet is optional. Leave it out or leave a bundle's rows off it and that bundle's existing option fields are kept on MERGE. An option field you do list replaces its stored choices with the file's rows, as on the Options sheet.

Fields Excluded from Export

A handful of DB fields are deliberately stripped during export and ignored on import. Including them in a hand-authored file has no effect: