Set up products and SKUs: barcodes, bundles and kits, serial numbers, variants, handling rules, per-channel settings and bulk import of your catalog.
Where to find it: Settings → Management → Products — Open in OTO ↗
The product record is the single most leveraged piece of data in the platform. A barcode typed in once decides whether a picker can scan a box three years later; a weight left blank turns up as an unexpected carrier charge every month until someone fills it in.
Attributes gathered into sets, which appear as their own tab on the product form.
Three buttons sit above it: Add Product, Upload Multiple Products for a bulk import from a template, and Synchronize Products to pull the catalog from your connected sales channels.
Fig. 1 — Every row carries a thumbnail, and Pre order Only and Variants Enabled read as Yes/No chips rather than raw values.
Fig. 2 — Only Product Name, SKU and Price are required. The tab row grows as options are switched on — here Product Variants and Variant Configurations have appeared.
The unique code. Everything else in the platform refers to a product by this.
Barcode
The primary scannable identifier.
Other Barcodes
Additional barcodes, added as a list — see below.
Category · Brand Name
Classification, both searchable. Automation rules can act on either.
Tags
Free labels, added as a list. Useful for the groupings that are not categories.
HS Code
The customs classification, searchable by code or by product type so nobody has to own a tariff schedule. It feeds cross-border paperwork — see HS Code Corrector.
Description · Image
The image is worth filling in: it is what appears on the picking and packing screens, and a photograph is a faster check than a name.
Price and Tax Amount each carry their own currency selector, so a catalog can hold products priced in different currencies rather than forcing one and converting. Pre order Only marks a product that may be ordered before stock exists; orders containing one are held rather than released — see Pre-fulfillment checks.
Length, Width and Height in centimetres, Total Weight in kilograms, and Cubic Meter in cm³ — each with a stepper, and each unit shown in the field so nobody has to guess.
Fig. 3 — Dimensions, the bundle and serial switches, tags, the two kinds of barcode, and the packaging-barcode table once it is enabled.
This is the field people skip and then pay forCarriers charge on whichever is greater, actual or volumetric weight, and they reweigh at their own depot. A catalog with missing dimensions produces shipments quoted at one price and invoiced at another, and the difference only surfaces in invoice reconciliation weeks later. Filling these in once is the cheapest shipping saving available.
Several codes that all mean one unit of this product: a manufacturer’s EAN, a warehouse-applied label, an old code from a previous supplier, a marketplace’s own identifier. All of them scan to the same product, so nothing has to be relabelled and no picker has to know which generation of sticker is on the box.
A different idea, turned on with Enable Packaging Barcodes. The product’s own description: “Allow products to have packaging-specific barcodes with custom quantities per scan (e.g., boxes, cases, pallets).”Switching it on opens a table with three columns, one row per packaging level:
Barcode
The code printed on that packaging.
UOM
What the packaging is: UNIT, BOX, CASE or PALLET.
Units per Scan
How many sellable units one scan of that barcode represents.
Fig. 4 — Four levels, so a product can carry a barcode for the unit, the box, the case and the pallet at once.
One scan, twenty-four unitsA case of twenty-four has its own barcode and its own row, with Units per Scan set to 24. Without this, receiving a pallet means opening cases and scanning singles, or trusting a typed number. With it, the case barcode is twenty-four — the scan carries the quantity.The saving compounds at every touch: goods-in, putaway, counting and transfers all stop being per-unit work on products that arrive by the case. And because all four levels can coexist on one product, the same item can be received by the pallet and picked by the unit without anyone changing a setting.
Turn on Bundle Product and the product becomes a container. A table opens beneath it, one row per component:
Fig. 8 — Two columns and nothing more: which SKU goes in, and how many of it. Each row is confirmed with a tick before it counts.
SKU
The component, chosen from the catalog. Components are ordinary products with their own stock, barcodes and dimensions.
Quantityrequired
How many of that component go into one bundle.
The bundle is sold as one line and handled as its parts. The order shows a gift set; the warehouse picks and packs the items inside it separately, each against its own stock. So a component running out makes the bundle unsellable automatically, without anyone maintaining a second stock figure for the bundle itself.
Quantity is what makes this more than a groupingA bundle containing two of one component and one of another is not a list of three products — it is a recipe. Getting the quantity into the definition means the picker is told to fetch two, the availability calculation knows that a bundle needs two, and a stock of five of that component supports two bundles rather than five.It is the difference between a bundle that stays sellable because nobody did the arithmetic, and one that goes out of stock at the right moment.
Two fields govern it: Serial Number Requirement and Serial Number Type. Requirement is what decides whether an operator is stopped, prompted, or never asked.
Fig. 5 — Three states, and the middle one matters: Not Applicable is an explicit answer, not an empty field.
Required
The serial must be captured. Picking cannot be completed without a valid one.
Optional
The prompt appears; the operator may skip it.
Not Applicable
No prompt at all — this product is not serialized.
Validation runs at both picking and packing. On the pick screen, once an item is picked — scanned or entered by hand — a Serial Number button appears for products whose requirement is set to required or optional. The operator enters or scans the serial, and it is validated immediately: if it does not validate, picking cannot be completed for that order until the correct serial is supplied.
Catching it at the pick, not the packValidating only at packing means a wrong unit has already been walked to the bench before anyone notices, and the picker who fetched it has moved on. Validating at the pick means the correction happens at the shelf, where the right unit is within arm’s reach.It is the same check in both places, so the cost of adding the earlier one is a second per serialized item — against a returns case that costs considerably more than that.
Serial numbers matter wherever a warranty, a recall or a dispute attaches to a specific unit rather than to a SKU: electronics, appliances, anything with a registration.
Product Variants, in the product’s own words, lets you “add different options like size or color.” Switching it on adds two tabs to the form — Product Variants and Variant Configurations — and the catalog list carries a Variants Enabled column so you can see at a glance which products are structured this way.
Fig. 6 — A variant is a name and a list of options. Add Another Variant stacks a second dimension on the first.
Variant Name (English)
The dimension — the placeholder suggests Size, Color.
Variant Name (Arabic)
The same, in Arabic. Captured alongside rather than as a translation step afterwards.
Options
The values along that dimension, added one at a time.
Naming in both languages, at the point of creationA storefront serving Arabic and English readers needs both names for every variant dimension. Capturing them together, on the form that creates the variant, is what stops the second language becoming a migration project later — and it is why the field sits beside the first rather than in a translation screen.
Some categories carry requirements that change what the warehouse is allowed to do with a unit rather than just describing it. Not all of them live on the product record — an expiry date, for instance, is captured on the receipt that brings the stock in.
Requirement
What it governs
Batch and lot management
Units grouped by production run, so a quality problem can be traced to a batch and that batch alone withdrawn — rather than every unit of the SKU.
Expiry dates
Captured per line when stock is received, not on the product record — because shelf life belongs to a delivery rather than to a SKU. See Inbound inventory.
Temperature-controlled goods
Products that must stay within a range. It constrains which carriers and which vehicles may take them; Temperature Control is available as a condition in shipping automation, so the rules can route these orders to carriers equipped for them.
The form’s Sales Channel Sync tab is a table, one row per channel this product is listed on.
Fig. 7 — Each row ties this product to its identity on one channel — and can override how stock is calculated for it.
Sale Channel & ID
The channel, chosen from your connected ones.
Inventory Calculate Method
How availability is worked out for this product on this channel.
Sales Channel Product ID
What the channel calls this product. This is the link that makes sync possible at all.
Channel Category ID · Channel Category Name
Where it sits in the channel’s own taxonomy.
Inventory Sync
Whether this product syncs to this channel.
Two levels of the same controlInventory Calculate Method and Inventory Sync both appear here and on the channel’s own sync settings. The channel setting is the default; the product row is the exception.That is what lets a single line be protected with safety stock on a marketplace that penalizes cancellations, while the rest of the catalog on that same channel sells down to the last unit — or lets one problem SKU be taken out of sync without touching anything else.
When the standard fields do not cover what your business needs to record, Product Attributes adds your own: a name and label, a type, an optional default value, and a flag for whether the attribute appears in imports. Attributes can be gathered into Attribute Groups, and each group becomes its own tab on the product form — so a form stays readable however many fields a category needs.
Bulk, from an Excel template downloaded from the page.
Synchronize Products
Pull the catalog from connected sales channels — the fastest way to start, and the way to keep two systems agreeing.
Bulk uploads are tracked at Settings → Data Center → Data Uploads, which reports what imported and what did not, with the errors named per row. Worth opening after every import rather than assuming a file that uploaded also landed.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"OTO Docs","description":"Product documentation for OTO, the ecommerce operations platform and shipping gateway for merchants in Saudi Arabia, the UAE and Türkiye.","colors":{"primary":"#506EFE","light":"#3D5FFF","dark":"#506EFE"},"logo":{"light":"https://mintcdn.com/oto/50MvmFcOsjmCy_H4/images/docs-logo.png?fit=max\u0026auto=format\u0026n=50MvmFcOsjmCy_H4\u0026q=85\u0026s=e77cede9643d5290bd5ff9ef3cd62084","dark":"https://mintcdn.com/oto/CC-n0HhbZXZkyIOY/images/docs-logo-dark.png?fit=max\u0026auto=format\u0026n=CC-n0HhbZXZkyIOY\u0026q=85\u0026s=0eaa761eda10edc1248ec73a7a464915"},"favicon":{"light":"https://mintcdn.com/oto/jqSnxa8fmU8MbKy9/images/oto-logo-51232.png?fit=max\u0026auto=format\u0026n=jqSnxa8fmU8MbKy9\u0026q=85\u0026s=40c563a4988902b756905551f7dfa08e","dark":"https://mintcdn.com/oto/jqSnxa8fmU8MbKy9/images/oto-logo-51232.png?fit=max\u0026auto=format\u0026n=jqSnxa8fmU8MbKy9\u0026q=85\u0026s=40c563a4988902b756905551f7dfa08e"},"background":{"color":{"light":"#F5F7F9","dark":"#111111"}},"navbar":{"links":[{"href":"https://tryoto.com","label":"Home"},{"href":"https://support.tryoto.com","label":"Help center"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.tryoto.com"}},"seo":{"organization":{"id":"https://tryoto.com/#organization","name":"OTO","url":"https://tryoto.com","logo":"https://docs.tryoto.com/images/oto-logo-51232.png","sameAs":["https://www.linkedin.com/company/tryotocom","https://x.com/tryotocom","https://www.instagram.com/tryotocom","https://www.facebook.com/tryotocom","https://www.youtube.com/@tryotocom"]}},"fonts":{"family":"Ping ARLT Regular","source":"https://storage.googleapis.com/tryoto-public/public/assets/fonts/PingARLT-Regular.woff2","format":"woff2"},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"languages":[{"language":"en","href":""},{"language":"ar","navbar":{"links":[{"href":"https://tryoto.com","label":"الرئيسية"},{"href":"https://support.tryoto.com/ar","label":"مركز المساعدة"}],"primary":{"type":"button","label":"لوحة التحكم","href":"https://app.tryoto.com"}},"href":"ar"},{"language":"tr","navbar":{"links":[{"href":"https://tryoto.com","label":"Anasayfa"},{"href":"https://support.tryoto.com/tr","label":"Yardım Merkezi"}],"primary":{"type":"button","label":"Gösterge Paneli","href":"https://app.tryoto.com"}},"href":"tr"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"oto","hasAudioNarration":false,"actualSubdomain":"oto","customDomains":["docs.tryoto.com"],"gitSource":{"type":"github","owner":"otoglobal","repo":"oto-docs","deployBranch":"master","contentDirectory":"","isPrivate":true,"mountPath":"","label":"","_id":"6ad8ce8fad82cbcc460c882d"},"chroma":{"latestBuiltDeploymentHistoryId":"6addbb84b128bc39b5e5b942","collectionId":"d72dffa9-51ec-43cf-8cd6-cc0c06f5df60","liveDeploymentHistoryId":"6addbb84b128bc39b5e5b942","schemaVersion":"v3"},"feedback":{"thumbs":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6addbb84b128bc39b5e5b942","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"ar","tag":"الأنظمة","count":43},{"language":"en","tag":"Modules","count":43},{"language":"tr","tag":"Modüller","count":43},{"language":"ar","tag":"عمليات الربط","count":8},{"language":"en","tag":"Integrations","count":8},{"language":"tr","tag":"Entegrasyonlar","count":8},{"language":"ar","tag":"المطورون","count":6},{"language":"ar","tag":"البدء","count":6},{"language":"ar","tag":"إشعارات العملاء","count":6},{"language":"ar","tag":"إدارة المخزون","count":6},{"language":"ar","tag":"OMS متعدد القنوات","count":6},{"language":"en","tag":"Developers","count":6},{"language":"en","tag":"Get started","count":6},{"language":"en","tag":"Customer Notification","count":6},{"language":"en","tag":"Inventory Management","count":6},{"language":"en","tag":"Omnichannel OMS","count":6},{"language":"tr","tag":"Geliştiriciler","count":6},{"language":"tr","tag":"Başlarken","count":6},{"language":"tr","tag":"Müşteri Bildirimleri","count":6},{"language":"tr","tag":"Envanter Yönetimi","count":6},{"language":"tr","tag":"Omnichannel OMS","count":6},{"language":"ar","tag":"OTO FLEX","count":5},{"language":"ar","tag":"إدارة الشحن","count":5},{"language":"ar","tag":"إدارة المستودعات","count":5},{"language":"en","tag":"OTO FLEX","count":5},{"language":"en","tag":"Shipping Management","count":5},{"language":"en","tag":"Warehouse Management","count":5},{"language":"tr","tag":"OTO FLEX","count":5},{"language":"tr","tag":"Kargo Yönetimi","count":5},{"language":"tr","tag":"Depo Yönetimi","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"rtl.css","content":":is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #navbar button.lg\\:hidden>div+div,:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#content-area, #page-title, #header, #table-of-contents, #sidebar-content, #mobile-nav, #pagination, #footer),:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) [role=menu]{direction:rtl;text-align:right}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area ul{padding-left:0;padding-right:0}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area ul>li{padding-left:0;padding-right:2rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area ul>li::before{left:auto;right:.5rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area blockquote{border-left:0;border-right:.25rem solid currentColor;padding-left:0;padding-right:1em}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area :is(table, th, td){text-align:right}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area :is(pre, code, .code-block, .code-group, .frame svg, [data-badge]){direction:ltr;unicode-bidi:isolate;text-align:left}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #mobile-nav #localization-select-trigger svg,:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #page-context-menu.ml-auto,:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #pagination [data-component-part=pagination-next]{margin-left:0;margin-right:auto}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #page-context-menu-button{border-radius:0 var(--radius-xl, 0.75rem) var(--radius-xl, 0.75rem) 0;border-left-width:0;border-right-width:1px}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #page-context-menu-button+button{border-radius:var(--radius-xl, 0.75rem) 0 0 var(--radius-xl, 0.75rem)}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #navbar button.lg\\:hidden>div+div svg,:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) [role=menuitem] .font-medium>svg{scale:-1 1}@media (min-width:1024px){:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]):has(#page-context-menu button[aria-expanded=true]) [role=menu][data-align=end]{translate:calc(100% - var(--anchor-width, 0px)) 0;transform-origin:0 -4px}}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area em{unicode-bidi:plaintext}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area :is(h1, h2, h3, h4, h5, h6)>.absolute>a{display:none}@media (min-width:1024px){:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area :is(h1, h2, h3, h4, h5, h6)>.absolute>a{display:flex;margin-left:0;translate:2.5rem 0}}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #sidebar-content>div{padding-right:0;padding-left:2rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) .sidebar-group-header{padding-left:0;padding-right:1rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) :is(a, button)[style*=padding-left]{padding-left:.75rem!important;text-align:right}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) :is(a, button):is([style*=\"padding-left:1rem\"], [style*=\"padding-left: 1rem\"]){padding-right:1rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) :is(a, button):is([style*=\"padding-left:1.75rem\"], [style*=\"padding-left: 1.75rem\"]){padding-right:1.75rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) :is(a, button):is([style*=\"padding-left:2.5rem\"], [style*=\"padding-left: 2.5rem\"]){padding-right:2.5rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) button[aria-expanded]:not([aria-haspopup]) svg{margin-right:0;margin-left:-.125rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) button[aria-expanded=false]:not([aria-haspopup]) svg{scale:-1 1}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #table-of-contents a{padding-left:0;padding-right:calc(var(--toc-padding-left, 0rem) + var(--toc-focus-padding, 0rem))}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #pagination [data-component-part=pagination-prev] svg{rotate:180deg}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #pagination [data-component-part=pagination-next] svg{rotate:none}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) [role=dialog]:has(#topbar-cta-button){direction:rtl;text-align:right}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) [role=dialog]:has(#topbar-cta-button)>button{right:auto;left:.375rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) [role=dialog]:has(#topbar-cta-button) li:first-child>a{padding-left:30px;padding-right:.75rem}@media (min-width:1024px){:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #navbar{direction:rtl}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #topbar-cta-button svg{scale:-1 1}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) div:has(>#sidebar){flex-direction:row-reverse}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-container>div:has(>#content-area){flex-direction:row}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area{padding-left:.25rem;padding-right:5.7rem;margin-left:0;margin-right:-3rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #table-of-contents-layout{padding-left:0;padding-right:2.5rem}}"}],"page":{"pagePath":"modules/inventory-management/product-configuration","slug":"/modules/inventory-management/product-configuration","pageMetadata":{"title":"Product catalog and SKU configuration","sidebarTitle":"Product configuration","description":"Set up products and SKUs: barcodes, bundles and kits, serial numbers, variants, handling rules, per-channel settings and bulk import of your catalog.","href":"/modules/inventory-management/product-configuration"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Set up products and SKUs: barcodes, bundles and kits, serial numbers, variants, handling rules, per-channel settings and bulk import of your catalog.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,em:`em`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Frame,Heading,Info,OptimizedImage,Table,Tip}=_components;if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Where to find it:`}),` Settings → Management → Products — `,_jsx(_components.a,{href:`https://app.tryoto.com/products`,children:`Open in OTO ↗`})]})}),`\n`,_jsx(_components.p,{children:`The product record is the single most leveraged piece of data in the platform. A barcode typed in once decides whether a picker can scan a box three years later; a weight left blank turns up as an unexpected carrier charge every month until someone fills it in.`}),`\n`,_jsx(Heading,{level:`2`,id:`where-the-catalog-lives`,children:`Where the catalog lives`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Settings → Management → Products`}),`, with four tabs:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Products`})}),_jsxs(_components.td,{children:[`The catalog itself. Columns: `,_jsx(`strong`,{children:`Product Name · SKU · HS Code · Barcode · Price · Pre order Only · Variants Enabled`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Categories`})}),_jsxs(_components.td,{children:[`How products are grouped — and therefore how `,_jsx(_components.a,{href:`/modules/shipping-management/shipping-automation`,children:`shipping rules`}),` and `,_jsx(_components.a,{href:`/modules/omnichannel-oms/order-routing`,children:`routing rules`}),` can address them in bulk.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Product Attributes`})}),_jsx(_components.td,{children:`Your own fields, beyond the standard ones.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Attribute Groups`})}),_jsx(_components.td,{children:`Attributes gathered into sets, which appear as their own tab on the product form.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Three buttons sit above it: `,_jsx(_components.strong,{children:`Add Product`}),`, `,_jsx(_components.strong,{children:`Upload Multiple Products`}),` for a bulk import from a template, and `,_jsx(_components.strong,{children:`Synchronize Products`}),` to pull the catalog from your connected sales channels.`]}),`\n`,_jsx(Frame,{caption:`Fig. 1 — Every row carries a thumbnail, and Pre order Only and Variants Enabled read as Yes/No chips rather than raw values.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-11-products.png?fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=fa87906da04ddad0df9e3dd4b33fcc99`,alt:`The Products page`,\"data-og-width\":`1140`,width:`1140`,\"data-og-height\":`511`,height:`511`,\"data-path\":`images/inv-11-products.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-11-products.png?w=280\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=1c6d988742e0fb6bf1590208a8a211c0 280w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-11-products.png?w=560\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=8679ff29774f27761edf5a1af7373ae2 560w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-11-products.png?w=840\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=9e7b80a64ec2e94e6ab29295a5c090ec 840w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-11-products.png?w=1100\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=a2277ba35003268c9517e8992ee41938 1100w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-11-products.png?w=1650\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=dc282a6783dce31a1199df8113c4a543 1650w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-11-products.png?w=2500\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=f3d74d7a4a857d4f2c3b16af49a4e9f1 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`the-product-record`,children:`The product record`}),`\n`,_jsx(Frame,{caption:`Fig. 2 — Only Product Name, SKU and Price are required. The tab row grows as options are switched on — here Product Variants and Variant Configurations have appeared.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-12-add-product-top.png?fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=2008c3832b6a76311fc6cd04e32b63f1`,alt:`The top of the Add Product form`,\"data-og-width\":`1000`,width:`1000`,\"data-og-height\":`470`,height:`470`,\"data-path\":`images/inv-12-add-product-top.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-12-add-product-top.png?w=280\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=16b6663a7760070620a1ee6cf661db33 280w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-12-add-product-top.png?w=560\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=0bfb011b819e8ca3cda162b3f6ad5629 560w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-12-add-product-top.png?w=840\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=f71d8c14465f8303d095291651875667 840w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-12-add-product-top.png?w=1100\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=b4099c88538096ef56d712c996996ee2 1100w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-12-add-product-top.png?w=1650\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=a92c9a68e8bc94e64e806f29df3d9b7e 1650w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-12-add-product-top.png?w=2500\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=db7053107776a46cc85243999cc29b61 2500w`})}),`\n`,_jsx(Heading,{level:`3`,id:`identity`,children:`Identity`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`What it is for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Product Name`})}),_jsx(_components.td,{children:`What a picker, a packer and a customer all see.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`SKU`})}),_jsx(_components.td,{children:`The unique code. Everything else in the platform refers to a product by this.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Barcode`})}),_jsx(_components.td,{children:`The primary scannable identifier.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Other Barcodes`})}),_jsx(_components.td,{children:`Additional barcodes, added as a list — see below.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Category`}),` · `,_jsx(_components.strong,{children:`Brand Name`})]}),_jsx(_components.td,{children:`Classification, both searchable. Automation rules can act on either.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Tags`})}),_jsx(_components.td,{children:`Free labels, added as a list. Useful for the groupings that are not categories.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`HS Code`})}),_jsxs(_components.td,{children:[`The customs classification, searchable `,_jsx(_components.em,{children:`by code or by product type`}),` so nobody has to own a tariff schedule. It feeds cross-border paperwork — see `,_jsx(_components.a,{href:`/modules/omnichannel-oms/prefulfillment`,children:`HS Code Corrector`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Description`}),` · `,_jsx(_components.strong,{children:`Image`})]}),_jsx(_components.td,{children:`The image is worth filling in: it is what appears on the picking and packing screens, and a photograph is a faster check than a name.`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`commercial`,children:`Commercial`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Price`}),` and `,_jsx(_components.strong,{children:`Tax Amount`}),` each carry their own `,_jsx(_components.strong,{children:`currency selector`}),`, so a catalog can hold products priced in different currencies rather than forcing one and converting. `,_jsx(_components.strong,{children:`Pre order Only`}),` marks a product that may be ordered before stock exists; orders containing one are held rather than released — see `,_jsx(_components.a,{href:`/modules/omnichannel-oms/prefulfillment`,children:`Pre-fulfillment checks`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`weight-and-dimensions`,children:`Weight and dimensions`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Length`}),`, `,_jsx(_components.strong,{children:`Width`}),` and `,_jsx(_components.strong,{children:`Height`}),` in centimetres, `,_jsx(_components.strong,{children:`Total Weight`}),` in kilograms, and `,_jsx(_components.strong,{children:`Cubic Meter`}),` in cm³ — each with a stepper, and each unit shown in the field so nobody has to guess.`]}),`\n`,_jsx(Frame,{caption:`Fig. 3 — Dimensions, the bundle and serial switches, tags, the two kinds of barcode, and the packaging-barcode table once it is enabled.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-13-add-product-lower.png?fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=779eea1e7d83cfc35e68e7a40c667d8e`,alt:`The rest of the product form`,\"data-og-width\":`1000`,width:`1000`,\"data-og-height\":`594`,height:`594`,\"data-path\":`images/inv-13-add-product-lower.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-13-add-product-lower.png?w=280\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=4766b57bae7a0c5963b9b8d0dc09e5b7 280w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-13-add-product-lower.png?w=560\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=60311907b97e527e740e205da324fc81 560w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-13-add-product-lower.png?w=840\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=799a3ec0fdc3177d291626e85c1a4bc1 840w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-13-add-product-lower.png?w=1100\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=9e3d55176fa293158beb6ed000f00a43 1100w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-13-add-product-lower.png?w=1650\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=dad2038dee7ac712201bb689655dd5e9 1650w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-13-add-product-lower.png?w=2500\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=c84f121ea8c57a9617f0dc72df035999 2500w`})}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`This is the field people skip and then pay for`})}),_jsxs(_components.p,{children:[`Carriers charge on whichever is greater, actual or volumetric weight, and they reweigh at their own depot. A catalog with missing dimensions produces shipments quoted at one price and invoiced at another, and the difference only surfaces in `,_jsx(_components.a,{href:`/modules/shipping-management/shipping-invoices-reconciliation`,children:`invoice reconciliation`}),` weeks later. Filling these in once is the cheapest shipping saving available.`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`multiple-barcodes-per-sku`,children:`Multiple barcodes per SKU`}),`\n`,_jsx(_components.p,{children:`One product can carry several barcodes, and there are two distinct reasons to want that.`}),`\n`,_jsx(Heading,{level:`3`,id:`other-barcodes`,children:`Other Barcodes`}),`\n`,_jsxs(_components.p,{children:[`Several codes that all mean `,_jsx(_components.em,{children:`one unit of this product`}),`: a manufacturer’s EAN, a warehouse-applied label, an old code from a previous supplier, a marketplace’s own identifier. All of them scan to the same product, so nothing has to be relabelled and no picker has to know which generation of sticker is on the box.`]}),`\n`,_jsx(Heading,{level:`3`,id:`packaging-barcodes`,children:`Packaging Barcodes`}),`\n`,_jsxs(_components.p,{children:[`A different idea, turned on with `,_jsx(_components.strong,{children:`Enable Packaging Barcodes`}),`. The product’s own description: `,_jsx(_components.em,{children:`“Allow products to have packaging-specific barcodes with custom quantities per scan (e.g., boxes, cases, pallets).”`})]}),`\n`,_jsx(_components.p,{children:`Switching it on opens a table with three columns, one row per packaging level:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Barcode`})}),_jsx(_components.td,{children:`The code printed on that packaging.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`UOM`})}),_jsxs(_components.td,{children:[`What the packaging is: `,_jsx(`strong`,{children:`UNIT`}),`, `,_jsx(`strong`,{children:`BOX`}),`, `,_jsx(`strong`,{children:`CASE`}),` or `,_jsx(`strong`,{children:`PALLET`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Units per Scan`})}),_jsx(_components.td,{children:`How many sellable units one scan of that barcode represents.`})]})]})]}),`\n`,_jsx(Frame,{caption:`Fig. 4 — Four levels, so a product can carry a barcode for the unit, the box, the case and the pallet at once.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-14-uom.png?fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=3f25cbde73ddf542ea8a2dd4d60fd17d`,alt:`The packaging-barcode table with the UOM list open`,\"data-og-width\":`1000`,width:`1000`,\"data-og-height\":`304`,height:`304`,\"data-path\":`images/inv-14-uom.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-14-uom.png?w=280\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=3210d2299aa8660a33803c3ba1a0e408 280w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-14-uom.png?w=560\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=f1af08feca03ef2ec4fc16b1fc53f2cf 560w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-14-uom.png?w=840\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=0e6e41b18ac7f8dee9b7183d921ed490 840w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-14-uom.png?w=1100\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=6b55ee4ffd8147bf1a2abc4fb8d5f628 1100w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-14-uom.png?w=1650\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=04d3ed48f1d96e54484bca8c6854bef1 1650w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-14-uom.png?w=2500\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=33647bde1a1bd3372a86cb39e00c3486 2500w`})}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`One scan, twenty-four units`})}),_jsxs(_components.p,{children:[`A case of twenty-four has its own barcode and its own row, with `,_jsx(_components.strong,{children:`Units per Scan`}),` set to 24. Without this, receiving a pallet means opening cases and scanning singles, or trusting a typed number. With it, the case barcode `,_jsx(_components.em,{children:`is`}),` twenty-four — the scan carries the quantity.`]}),_jsx(_components.p,{children:`The saving compounds at every touch: goods-in, putaway, counting and transfers all stop being per-unit work on products that arrive by the case. And because all four levels can coexist on one product, the same item can be received by the pallet and picked by the unit without anyone changing a setting.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`bundles-and-kits`,children:`Bundles and kits`}),`\n`,_jsxs(_components.p,{children:[`Turn on `,_jsx(_components.strong,{children:`Bundle Product`}),` and the product becomes a container. A table opens beneath it, one row per component:`]}),`\n`,_jsx(Frame,{caption:`Fig. 8 — Two columns and nothing more: which SKU goes in, and how many of it. Each row is confirmed with a tick before it counts.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-18-bundle.png?fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=76a88d6e79582f549115f3e39c326c70`,alt:`A bundle and its components`,\"data-og-width\":`1000`,width:`1000`,\"data-og-height\":`569`,height:`569`,\"data-path\":`images/inv-18-bundle.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-18-bundle.png?w=280\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=8db416c1a8f44589c4eab57dd63b8878 280w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-18-bundle.png?w=560\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=90c3e935cb4d37bf8130cef6543ae4be 560w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-18-bundle.png?w=840\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=436009be6464f8aa79770b55e8c575ca 840w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-18-bundle.png?w=1100\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=72793b2e3a3383ad55b4eaf3a88089d2 1100w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-18-bundle.png?w=1650\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=9b3a1d3eb158c85ac3c7996b04da7619 1650w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-18-bundle.png?w=2500\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=c9057138272d3a5d22e54ee1a29750af 2500w`})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`SKU`})}),_jsx(_components.td,{children:`The component, chosen from the catalog. Components are ordinary products with their own stock, barcodes and dimensions.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(`strong`,{children:`Quantity`}),` `,_jsx(`sup`,{children:`required`})]}),_jsx(_components.td,{children:`How many of that component go into one bundle.`})]})]})]}),`\n`,_jsx(_components.p,{children:`The bundle is sold as one line and handled as its parts. The order shows a gift set; the warehouse picks and packs the items inside it separately, each against its own stock. So a component running out makes the bundle unsellable automatically, without anyone maintaining a second stock figure for the bundle itself.`}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Quantity is what makes this more than a grouping`})}),_jsx(_components.p,{children:`A bundle containing two of one component and one of another is not a list of three products — it is a recipe. Getting the quantity into the definition means the picker is told to fetch two, the availability calculation knows that a bundle needs two, and a stock of five of that component supports two bundles rather than five.`}),_jsx(_components.p,{children:`It is the difference between a bundle that stays sellable because nobody did the arithmetic, and one that goes out of stock at the right moment.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`serial-number-tracking`,children:`Serial number tracking`}),`\n`,_jsxs(_components.p,{children:[`Two fields govern it: `,_jsx(_components.strong,{children:`Serial Number Requirement`}),` and `,_jsx(_components.strong,{children:`Serial Number Type`}),`. Requirement is what decides whether an operator is stopped, prompted, or never asked.`]}),`\n`,_jsx(Frame,{caption:`Fig. 5 — Three states, and the middle one matters: Not Applicable is an explicit answer, not an empty field.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-15-serial-req.png?fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=50aa17ec0a2d57b6ede8cdf58efd9fb6`,alt:`The Serial Number Requirement options`,\"data-og-width\":`620`,width:`620`,\"data-og-height\":`199`,height:`199`,\"data-path\":`images/inv-15-serial-req.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-15-serial-req.png?w=280\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=1c086276b4982e5623ac3e46a66755a9 280w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-15-serial-req.png?w=560\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=aaa4e3433766b7968ea6db96dc9218d5 560w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-15-serial-req.png?w=840\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=9ae554ad66964578d836d6af58b15807 840w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-15-serial-req.png?w=1100\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=b7f05de552bc8505664801c3c889f534 1100w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-15-serial-req.png?w=1650\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=0d3884f1ee26f784a6cb5ab00e0bcfa7 1650w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-15-serial-req.png?w=2500\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=23c3eae245ddaa326cf646b2bf59b848 2500w`})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Required`})}),_jsx(_components.td,{children:`The serial must be captured. Picking cannot be completed without a valid one.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Optional`})}),_jsx(_components.td,{children:`The prompt appears; the operator may skip it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Not Applicable`})}),_jsx(_components.td,{children:`No prompt at all — this product is not serialized.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Validation runs at `,_jsx(_components.strong,{children:`both`}),` picking and packing. On the pick screen, once an item is picked — scanned or entered by hand — a `,_jsx(_components.strong,{children:`Serial Number`}),` button appears for products whose requirement is set to required or optional. The operator enters or scans the serial, and it is validated immediately: if it does not validate, picking cannot be completed for that order until the correct serial is supplied.`]}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Catching it at the pick, not the pack`})}),_jsx(_components.p,{children:`Validating only at packing means a wrong unit has already been walked to the bench before anyone notices, and the picker who fetched it has moved on. Validating at the pick means the correction happens at the shelf, where the right unit is within arm’s reach.`}),_jsx(_components.p,{children:`It is the same check in both places, so the cost of adding the earlier one is a second per serialized item — against a returns case that costs considerably more than that.`})]}),`\n`,_jsx(_components.p,{children:`Serial numbers matter wherever a warranty, a recall or a dispute attaches to a specific unit rather than to a SKU: electronics, appliances, anything with a registration.`}),`\n`,_jsx(Heading,{level:`2`,id:`variants`,children:`Variants`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Product Variants`}),`, in the product’s own words, lets you `,_jsx(_components.em,{children:`“add different options like size or color.”`}),` Switching it on adds two tabs to the form — `,_jsx(_components.strong,{children:`Product Variants`}),` and `,_jsx(_components.strong,{children:`Variant Configurations`}),` — and the catalog list carries a `,_jsx(_components.strong,{children:`Variants Enabled`}),` column so you can see at a glance which products are structured this way.`]}),`\n`,_jsx(Frame,{caption:`Fig. 6 — A variant is a name and a list of options. Add Another Variant stacks a second dimension on the first.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-16-variants.png?fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=15f5337fc804b33f50c21ec4083df488`,alt:`The Product Variants tab`,\"data-og-width\":`1000`,width:`1000`,\"data-og-height\":`522`,height:`522`,\"data-path\":`images/inv-16-variants.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-16-variants.png?w=280\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=1cee22772fc9efc5887b5ed05ece8c27 280w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-16-variants.png?w=560\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=7430a9e49c9657d5263f7ee83d3c474e 560w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-16-variants.png?w=840\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=eec3235934e2e2d73be09a5ed273200c 840w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-16-variants.png?w=1100\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=c9099dc1559891bfa03f39c5e14613a1 1100w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-16-variants.png?w=1650\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=49fdcecca8bfbf60603f43f39e485c47 1650w, https://mintcdn.com/oto/ft-bRlLvOnJkbVoC/images/inv-16-variants.png?w=2500\u0026fit=max\u0026auto=format\u0026n=ft-bRlLvOnJkbVoC\u0026q=85\u0026s=5c4ff681ae62ff58a6deceea05bbcb34 2500w`})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Variant Name (English)`})}),_jsxs(_components.td,{children:[`The dimension — the placeholder suggests `,_jsx(`em`,{children:`Size, Color`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Variant Name (Arabic)`})}),_jsx(_components.td,{children:`The same, in Arabic. Captured alongside rather than as a translation step afterwards.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(`strong`,{children:`Options`})}),_jsx(_components.td,{children:`The values along that dimension, added one at a time.`})]})]})]}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Naming in both languages, at the point of creation`})}),_jsx(_components.p,{children:`A storefront serving Arabic and English readers needs both names for every variant dimension. Capturing them together, on the form that creates the variant, is what stops the second language becoming a migration project later — and it is why the field sits beside the first rather than in a translation screen.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`handling-that-depends-on-the-goods`,children:`Handling that depends on the goods`}),`\n`,_jsx(_components.p,{children:`Some categories carry requirements that change what the warehouse is allowed to do with a unit rather than just describing it. Not all of them live on the product record — an expiry date, for instance, is captured on the receipt that brings the stock in.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Requirement`}),_jsx(_components.th,{children:`What it governs`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Batch and lot management`})}),_jsx(_components.td,{children:`Units grouped by production run, so a quality problem can be traced to a batch and that batch alone withdrawn — rather than every unit of the SKU.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Expiry dates`})}),_jsxs(_components.td,{children:[`Captured per line when stock is received, not on the product record — because shelf life belongs to a delivery rather than to a SKU. See `,_jsx(_components.a,{href:`/modules/inventory-management/inbound-inventory`,children:`Inbound inventory`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Temperature-controlled goods`})}),_jsxs(_components.td,{children:[`Products that must stay within a range. It constrains which carriers and which vehicles may take them; `,_jsx(_components.strong,{children:`Temperature Control`}),` is available as a condition in `,_jsx(_components.a,{href:`/modules/shipping-management/shipping-automation`,children:`shipping automation`}),`, so the rules can route these orders to carriers equipped for them.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`per-channel-settings-on-the-product`,children:`Per-channel settings on the product`}),`\n`,_jsxs(_components.p,{children:[`The form’s `,_jsx(_components.strong,{children:`Sales Channel Sync`}),` tab is a table, one row per channel this product is listed on.`]}),`\n`,_jsx(Frame,{caption:`Fig. 7 — Each row ties this product to its identity on one channel — and can override how stock is calculated for it.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-17-channel-sync.png?fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=98049b5a5761ef963640b00da241f1d5`,alt:`The Sales Channel Sync tab`,\"data-og-width\":`1000`,width:`1000`,\"data-og-height\":`403`,height:`403`,\"data-path\":`images/inv-17-channel-sync.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-17-channel-sync.png?w=280\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=e384f4c5622fe1ab4dc6eeb6b4c1face 280w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-17-channel-sync.png?w=560\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=2615d67ac0e93fcf8721c4fbb755c12b 560w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-17-channel-sync.png?w=840\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=ded56e61cf96abdf63830fb2cc478043 840w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-17-channel-sync.png?w=1100\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=045d174f403c803e138156939e797e30 1100w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-17-channel-sync.png?w=1650\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=604eb4883a4092ba0855794cb300fb49 1650w, https://mintcdn.com/oto/YkJay8Y-1RDv8ciw/images/inv-17-channel-sync.png?w=2500\u0026fit=max\u0026auto=format\u0026n=YkJay8Y-1RDv8ciw\u0026q=85\u0026s=7dc817a81aca5827a3617cd7484077b2 2500w`})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Sale Channel \u0026 ID`})}),_jsx(_components.td,{children:`The channel, chosen from your connected ones.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Inventory Calculate Method`})}),_jsxs(_components.td,{children:[`How availability is worked out for `,_jsx(_components.em,{children:`this product on this channel`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Sales Channel Product ID`})}),_jsx(_components.td,{children:`What the channel calls this product. This is the link that makes sync possible at all.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Channel Category ID`}),` · `,_jsx(_components.strong,{children:`Channel Category Name`})]}),_jsx(_components.td,{children:`Where it sits in the channel’s own taxonomy.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Inventory Sync`})}),_jsx(_components.td,{children:`Whether this product syncs to this channel.`})]})]})]}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Two levels of the same control`})}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Inventory Calculate Method`}),` and `,_jsx(_components.strong,{children:`Inventory Sync`}),` both appear here `,_jsx(_components.em,{children:`and`}),` on the channel’s own `,_jsx(_components.a,{href:`/modules/inventory-management/inventory-sync`,children:`sync settings`}),`. The channel setting is the default; the product row is the exception.`]}),_jsx(_components.p,{children:`That is what lets a single line be protected with safety stock on a marketplace that penalizes cancellations, while the rest of the catalog on that same channel sells down to the last unit — or lets one problem SKU be taken out of sync without touching anything else.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`custom-attributes`,children:`Custom attributes`}),`\n`,_jsxs(_components.p,{children:[`When the standard fields do not cover what your business needs to record, `,_jsx(_components.strong,{children:`Product Attributes`}),` adds your own: a name and label, a type, an optional default value, and a flag for whether the attribute appears in imports. Attributes can be gathered into `,_jsx(_components.strong,{children:`Attribute Groups`}),`, and each group becomes its own tab on the product form — so a form stays readable however many fields a category needs.`]}),`\n`,_jsx(Heading,{level:`2`,id:`getting-the-catalog-in`,children:`Getting the catalog in`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Method`}),_jsx(_components.th,{children:`When`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Add Product`})}),_jsx(_components.td,{children:`One product, all fields.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Upload Multiple Products`})}),_jsx(_components.td,{children:`Bulk, from an Excel template downloaded from the page.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Synchronize Products`})}),_jsx(_components.td,{children:`Pull the catalog from connected sales channels — the fastest way to start, and the way to keep two systems agreeing.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Bulk uploads are tracked at `,_jsx(_components.strong,{children:`Settings → Data Center → Data Uploads`}),`, which reports what imported and what did not, with the errors named per row. Worth opening after every import rather than assuming a file that uploaded also landed.`]}),`\n`,_jsx(Heading,{level:`2`,id:`related`,children:`Related`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/modules/inventory-management/inventory-sync`,children:`Inventory sync`}),` — keeping channel catalogs aligned.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/modules/warehouse-management/picking-methods`,children:`Picking methods`}),` — where barcodes and serials are used.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/modules/shipping-management/shipping-invoices-reconciliation`,children:`Invoice reconciliation`}),` — what wrong dimensions cost.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Product catalog and SKU configuration","sidebarTitle":"Product configuration","description":"Set up products and SKUs: barcodes, bundles and kits, serial numbers, variants, handling rules, per-channel settings and bulk import of your catalog.","href":"/modules/inventory-management/product-configuration"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Where the catalog lives","slug":"where-the-catalog-lives","depth":2,"children":[]},{"title":"The product record","slug":"the-product-record","depth":2,"children":[{"title":"Identity","slug":"identity","depth":3,"children":[]},{"title":"Commercial","slug":"commercial","depth":3,"children":[]},{"title":"Weight and dimensions","slug":"weight-and-dimensions","depth":3,"children":[]}]},{"title":"Multiple barcodes per SKU","slug":"multiple-barcodes-per-sku","depth":2,"children":[{"title":"Other Barcodes","slug":"other-barcodes","depth":3,"children":[]},{"title":"Packaging Barcodes","slug":"packaging-barcodes","depth":3,"children":[]}]},{"title":"Bundles and kits","slug":"bundles-and-kits","depth":2,"children":[]},{"title":"Serial number tracking","slug":"serial-number-tracking","depth":2,"children":[]},{"title":"Variants","slug":"variants","depth":2,"children":[]},{"title":"Handling that depends on the goods","slug":"handling-that-depends-on-the-goods","depth":2,"children":[]},{"title":"Per-channel settings on the product","slug":"per-channel-settings-on-the-product","depth":2,"children":[]},{"title":"Custom attributes","slug":"custom-attributes","depth":2,"children":[]},{"title":"Getting the catalog in","slug":"getting-the-catalog-in","depth":2,"children":[]},{"title":"Related","slug":"related","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/oto/5e4908087dc78be6/adsping.js"],"subdomain":"oto","siteName":"OTO Docs","title":"Product catalog and SKU configuration - OTO Docs","relatedPagesConfig":{"enabled":true,"limit":3,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/modules/inventory-management/product-configuration","matchLevel":0},"ar":{"href":"/ar/modules/inventory-management/product-configuration","matchLevel":1},"tr":{"href":"/tr/modules/inventory-management/product-configuration","matchLevel":1}}},"lastModified":"2026-10-22T15:40:13.910Z","originalFileLocation":"modules/inventory-management/product-configuration.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Set up products and SKUs: barcodes, bundles and kits, serial numbers, variants, handling rules, per-channel settings and bulk import of your catalog.\">\u003cmeta data-mint-head name=\"application-name\" content=\"OTO Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/oto/S_K-Ar2SQPcQI6e_/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/oto/S_K-Ar2SQPcQI6e_/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/oto/S_K-Ar2SQPcQI6e_/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/oto/S_K-Ar2SQPcQI6e_/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/oto/S_K-Ar2SQPcQI6e_/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/oto/S_K-Ar2SQPcQI6e_/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/oto/S_K-Ar2SQPcQI6e_/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/oto/S_K-Ar2SQPcQI6e_/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/oto/S_K-Ar2SQPcQI6e_/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Product catalog and SKU configuration - OTO Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Set up products and SKUs: barcodes, bundles and kits, serial numbers, variants, handling rules, per-channel settings and bulk import of your catalog.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"OTO Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.tryoto.com/modules/inventory-management/product-configuration\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://oto.mintlify.app/_mintlify/api/og/v2?division=Inventory+Management\u0026amp;title=Product+catalog+and+SKU+configuration\u0026amp;description=Set+up+products+and+SKUs%3A+barcodes%2C+bundles+and+kits%2C+serial+numbers%2C+variants%2C+handling+rules%2C+per-channel+settings+and+bulk+import+of+your+catalog.\u0026amp;theme=fb0540dacc0ff6c761581805\u0026amp;signature=bd73d16245f4b7643f4023b896afaf2ac81d8c8096ac7ff544223a19a92ffbc6\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Product catalog and SKU configuration - OTO Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Set up products and SKUs: barcodes, bundles and kits, serial numbers, variants, handling rules, per-channel settings and bulk import of your catalog.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://oto.mintlify.app/_mintlify/api/og/v2?division=Inventory+Management\u0026amp;title=Product+catalog+and+SKU+configuration\u0026amp;description=Set+up+products+and+SKUs%3A+barcodes%2C+bundles+and+kits%2C+serial+numbers%2C+variants%2C+handling+rules%2C+per-channel+settings+and+bulk+import+of+your+catalog.\u0026amp;theme=fb0540dacc0ff6c761581805\u0026amp;signature=bd73d16245f4b7643f4023b896afaf2ac81d8c8096ac7ff544223a19a92ffbc6\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/oto/S_K-Ar2SQPcQI6e_/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"OTO Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#506EFE\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.tryoto.com/modules/inventory-management/product-configuration\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/modules/inventory-management/product-configuration.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.tryoto.com/modules/inventory-management/product-configuration\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ar\" href=\"https://docs.tryoto.com/ar/modules/inventory-management/product-configuration\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"tr\" href=\"https://docs.tryoto.com/tr/modules/inventory-management/product-configuration\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.tryoto.com/modules/inventory-management/product-configuration\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://tryoto.com/#organization\",\"name\":\"OTO\",\"url\":\"https://tryoto.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://docs.tryoto.com/images/oto-logo-51232.png\"},\"sameAs\":[\"https://www.linkedin.com/company/tryotocom\",\"https://x.com/tryotocom\",\"https://www.instagram.com/tryotocom\",\"https://www.facebook.com/tryotocom\",\"https://www.youtube.com/@tryotocom\"]},{\"@type\":\"WebSite\",\"@id\":\"https://docs.tryoto.com#website\",\"name\":\"OTO Docs\",\"url\":\"https://docs.tryoto.com\",\"publisher\":{\"@id\":\"https://tryoto.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.tryoto.com/modules/inventory-management/product-configuration#webpage\",\"url\":\"https://docs.tryoto.com/modules/inventory-management/product-configuration\",\"name\":\"Product catalog and SKU configuration\",\"description\":\"Set up products and SKUs: barcodes, bundles and kits, serial numbers, variants, handling rules, per-channel settings and bulk import of your catalog.\",\"dateModified\":\"2026-10-22T15:40:13.910Z\",\"isPartOf\":{\"@id\":\"https://docs.tryoto.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.tryoto.com/modules/inventory-management/product-configuration#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.tryoto.com/modules/inventory-management/product-configuration#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Modules\",\"item\":\"https://docs.tryoto.com/modules/omnichannel-oms/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Inventory Management\",\"item\":\"https://docs.tryoto.com/modules/inventory-management/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Product catalog and SKU configuration\",\"item\":\"https://docs.tryoto.com/modules/inventory-management/product-configuration\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.tryoto.com/modules/inventory-management/product-configuration#article\",\"headline\":\"Product catalog and SKU configuration\",\"name\":\"Product catalog and SKU configuration\",\"description\":\"Set up products and SKUs: barcodes, bundles and kits, serial numbers, variants, handling rules, per-channel settings and bulk import of your catalog.\",\"url\":\"https://docs.tryoto.com/modules/inventory-management/product-configuration\",\"mainEntityOfPage\":{\"@id\":\"https://docs.tryoto.com/modules/inventory-management/product-configuration#webpage\"},\"dateModified\":\"2026-10-22T15:40:13.910Z\",\"publisher\":{\"@id\":\"https://tryoto.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.tryoto.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"OTO Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"OTO Docs","nav":{"global":null,"languages":[{"language":"en","pages":[{"group":"Get started","pages":[{"title":"Ecommerce operations platform and shipping gateway","sidebarTitle":"Home","href":""},{"title":"What is OTO","href":"/get-started/what-is-oto"},{"title":"Core concepts: orders, shipments, stock and hubs","sidebarTitle":"Core concepts","href":"/get-started/core-concepts"},{"title":"Platform architecture","href":"/get-started/architecture"},{"title":"Quick start: ship your first order with OTO","sidebarTitle":"Quick start","href":"/get-started/quickstart"},{"title":"Glossary of OTO terms","sidebarTitle":"Glossary","href":"/get-started/glossary"}]},{"group":"Modules","pages":[{"group":"Omnichannel OMS","pages":[{"title":"Omnichannel OMS","sidebarTitle":"Overview","href":"/modules/omnichannel-oms/overview"},{"title":"Order sync: how orders get into OTO","sidebarTitle":"Order Sync","href":"/modules/omnichannel-oms/order-sync"},{"title":"Order routing across warehouses and stores","sidebarTitle":"Order Routing","href":"/modules/omnichannel-oms/order-routing"},{"title":"Address and data correction","href":"/modules/omnichannel-oms/order-data-correction"},{"title":"Pre-fulfillment checks","href":"/modules/omnichannel-oms/prefulfillment"},{"title":"Order fulfillment in warehouses and stores","sidebarTitle":"Order Fulfillment","href":"/modules/omnichannel-oms/order-fulfillment"}]},{"group":"Sales Channels","pages":[{"title":"Sales Channels","sidebarTitle":"Overview","href":"/modules/sales-channels/overview"},{"title":"Connect and sync a sales channel","sidebarTitle":"Channel sync","href":"/modules/sales-channels/sync"},{"title":"Sync order status and tracking to your store","sidebarTitle":"Status and tracking updates","href":"/modules/sales-channels/updates"},{"title":"Checkout API for live shipping rates","sidebarTitle":"Checkout API","href":"/modules/sales-channels/checkout-api"}]},{"group":"Shipping Management","pages":[{"title":"Shipping Management","sidebarTitle":"Overview","href":"/modules/shipping-management/overview"},{"title":"Carrier integration and configuration","sidebarTitle":"Carrier Integration","href":"/modules/shipping-management/carrier-integration"},{"title":"Create shipments, print labels and track parcels","sidebarTitle":"Shipping \u0026 Tracking","href":"/modules/shipping-management/shipping-and-tracking"},{"title":"Shipping automation and carrier selection rules","sidebarTitle":"Shipping Automation","href":"/modules/shipping-management/shipping-automation"},{"title":"Shipping Invoices Reconciliation","href":"/modules/shipping-management/shipping-invoices-reconciliation"}]},{"group":"Return Management","pages":[{"title":"Return Management","sidebarTitle":"Overview","href":"/modules/return-management/overview"},{"title":"Return portal and customer return requests","sidebarTitle":"Customer returns","href":"/modules/return-management/customer-returns"},{"title":"Receiving and inspecting returns","sidebarTitle":"Returns receiving","href":"/modules/return-management/returns-receiving"},{"title":"Return automation rules","sidebarTitle":"Return automation","href":"/modules/return-management/return-automation"}]},{"group":"Hubs Management","pages":[{"title":"Hubs Management","sidebarTitle":"Overview","href":"/modules/hubs-management/overview"},{"title":"Add and configure warehouses and branches","sidebarTitle":"Hub configuration","href":"/modules/hubs-management/hubs-management"}]},{"group":"Customer Notification","pages":[{"title":"Customer Notification","sidebarTitle":"Overview","href":"/modules/customer-notification/overview"},{"title":"Branded tracking and confirmation pages","sidebarTitle":"Branded pages","href":"/modules/customer-notification/branded-pages"},{"title":"SMS notifications","sidebarTitle":"SMS","href":"/modules/customer-notification/sms"},{"title":"Email notifications","sidebarTitle":"Email","href":"/modules/customer-notification/email"},{"title":"WhatsApp notifications","sidebarTitle":"WhatsApp","href":"/modules/customer-notification/whatsapp"},{"title":"Custom notification workflows","sidebarTitle":"Custom workflows","href":"/modules/customer-notification/custom-workflows"}]},{"group":"Warehouse Management","pages":[{"title":"Warehouse Management","sidebarTitle":"Overview","href":"/modules/warehouse-management/overview"},{"title":"OTO PACK mobile app for warehouse staff","sidebarTitle":"The OTO PACK app","href":"/modules/warehouse-management/ops"},{"title":"Warehouse picking methods and waves","sidebarTitle":"Picking methods","href":"/modules/warehouse-management/picking-methods"},{"title":"Packing and dispatch","href":"/modules/warehouse-management/packing-dispatch"},{"title":"Inbound and putaway","href":"/modules/warehouse-management/inbound-putaway"}]},{"group":"Inventory Management","pages":[{"title":"Inventory Management","sidebarTitle":"Overview","href":"/modules/inventory-management/overview"},{"title":"Inventory tracking","href":"/modules/inventory-management/inventory-tracking"},{"title":"Inbound inventory","href":"/modules/inventory-management/inbound-inventory"},{"title":"Sync inventory to your sales channels","sidebarTitle":"Inventory sync","description":"Push available stock from OTO to every connected sales channel automatically, check that the sync worked, and compare your catalog with each channel.","href":"/modules/inventory-management/inventory-sync"},{"title":"Product catalog and SKU configuration","sidebarTitle":"Product configuration","href":"/modules/inventory-management/product-configuration"},{"title":"Inventory counts in the OTO PACK app","sidebarTitle":"Inventory counts","description":"Count stock bin by bin in the OTO PACK app, run blind counts, record damaged and expired items, and decide what to count and how often.","href":"/modules/inventory-management/inventory-count"}]},{"group":"OTO FLEX","pages":[{"title":"OTO FLEX: delivery with your own drivers","sidebarTitle":"Overview","href":"/modules/oto-flex/overview"},{"title":"Driver and fleet management","sidebarTitle":"Fleet Management","href":"/modules/oto-flex/fleet-management"},{"title":"Delivery planning and driver assignment","sidebarTitle":"Planning","href":"/modules/oto-flex/planning"},{"title":"Driver pickup in OTO FLEX","sidebarTitle":"Pickup","href":"/modules/oto-flex/pickup"},{"title":"Last-mile delivery in OTO FLEX","sidebarTitle":"Delivery","href":"/modules/oto-flex/delivery"}]}]},{"group":"Integrations","pages":[{"title":"Integrations overview","href":"/integrations/overview"},{"title":"Sales channel integrations","sidebarTitle":"Sales channels","href":"/integrations/sales-channels"},{"title":"Marketplace integrations","sidebarTitle":"Marketplaces","href":"/integrations/marketplaces"},{"title":"ERP integrations","sidebarTitle":"ERP systems","href":"/integrations/erp-systems"},{"title":"POS integrations","sidebarTitle":"POS systems","href":"/integrations/pos-systems"},{"title":"Carrier integrations","sidebarTitle":"Carriers","href":"/integrations/carriers"},{"title":"SMS, email and WhatsApp providers","sidebarTitle":"Messaging providers","href":"/integrations/messaging-providers"},{"title":"Webhooks for real-time updates","sidebarTitle":"Webhooks","href":"/integrations/webhooks"}]},{"group":"Developers","pages":[{"title":"OTO API overview","sidebarTitle":"Developers overview","href":"/developers/overview"},{"title":"API authentication","sidebarTitle":"Authentication","href":"/developers/authentication"},{"title":"REST API reference","href":"/developers/rest-api-reference"},{"title":"Webhook events and payloads","sidebarTitle":"Webhook events","href":"/developers/webhook-events"},{"title":"OTO API Postman collection","sidebarTitle":"Postman collection","href":"/developers/postman-collection"},{"title":"API errors and rate limits","sidebarTitle":"Errors \u0026 rate limits","href":"/developers/errors-and-rate-limits"}]},{"group":"Platform","pages":[{"title":"Security \u0026 compliance","href":"/platform/security-and-compliance"},{"title":"Users, roles \u0026 permissions","href":"/platform/users-roles-and-permissions"},{"title":"Localization: languages, currency and time zones","sidebarTitle":"Localization","href":"/platform/localization"},{"title":"Collaboration \u0026 notifications","href":"/platform/collaboration-and-notifications"},{"title":"Platform announcements","sidebarTitle":"Announcements","href":"/platform/announcements"}]},{"group":"Pricing","pages":[{"title":"Plans, pricing and add-ons","sidebarTitle":"Plans \u0026 packaging","href":"/pricing/plans-and-packaging"}]}]},{"language":"ar","navbar":{"links":[{"href":"https://tryoto.com","label":"الرئيسية"},{"href":"https://support.tryoto.com/ar","label":"مركز المساعدة"}],"primary":{"type":"button","label":"لوحة التحكم","href":"https://app.tryoto.com"}},"pages":[{"title":"ar","href":"/ar/modules/inventory-management/product-configuration"}]},{"language":"tr","navbar":{"links":[{"href":"https://tryoto.com","label":"Anasayfa"},{"href":"https://support.tryoto.com/tr","label":"Yardım Merkezi"}],"primary":{"type":"button","label":"Gösterge Paneli","href":"https://app.tryoto.com"}},"pages":[{"title":"tr","href":"/tr/modules/inventory-management/product-configuration"}]}]},"title":"Product catalog and SKU configuration - OTO Docs","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-B0bJ23PC.js","DynamicMarkdown-UGQuxDKp.js","zoom-image-lightbox-B0E5HDf_.js","lightbox-handle-r17bVUz3.js"]}