<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Obteohub</title>
    <description>The latest articles on DEV Community by Obteohub (@obteohub).</description>
    <link>https://dev.to/obteohub</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F905863%2F3a0ea720-4d17-4597-aa1c-11a9d6fc4c23.jpeg</url>
      <title>DEV Community: Obteohub</title>
      <link>https://dev.to/obteohub</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/obteohub"/>
    <language>en</language>
    <item>
      <title>How We Standardized WooCommerce Product Imports with a Folder-Based Schema</title>
      <dc:creator>Obteohub</dc:creator>
      <pubDate>Tue, 22 Sep 2026 06:41:31 +0000</pubDate>
      <link>https://dev.to/obteohub/how-we-standardized-woocommerce-product-imports-with-a-folder-based-schema-ojn</link>
      <guid>https://dev.to/obteohub/how-we-standardized-woocommerce-product-imports-with-a-folder-based-schema-ojn</guid>
      <description>&lt;p&gt;When product catalogs grow, importing products into WooCommerce becomes less about uploading data and more about controlling data quality. We kept running into the same problems:&lt;/p&gt;

&lt;p&gt;Product names stored separately from descriptions; images arriving with inconsistent filenames; attributes structured differently across products&lt;br&gt;
Variations missing required values; categories that did not match the existing catalog; brand, collection, product line, and location data being handled inconsistently&lt;/p&gt;

&lt;p&gt;So we created a predictable product package. The result is the Shopwice WooCommerce Product Import Schema, which we have now released publicly on GitHub.&lt;/p&gt;

&lt;p&gt;The basic idea&lt;/p&gt;

&lt;p&gt;Each product is represented as a folder containing all the data required to validate and import it.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;variable-product/&lt;br&gt;
  Example Smartphone/&lt;br&gt;
    product.json&lt;br&gt;
    attributes.json&lt;br&gt;
    variations.json&lt;br&gt;
    brand.txt&lt;br&gt;
    collection.txt&lt;br&gt;
    product-line.txt&lt;br&gt;
    location.txt&lt;br&gt;
    short.txt&lt;br&gt;
    long.txt&lt;br&gt;
    images/&lt;br&gt;
      01.jpg&lt;br&gt;
      02.jpg&lt;br&gt;
      03.jpg&lt;/p&gt;

&lt;p&gt;Instead of passing one large spreadsheet around, the importer receives a complete product package. That package can then be validated before anything is written to WooCommerce.&lt;/p&gt;

&lt;p&gt;Simple and variable products&lt;/p&gt;

&lt;p&gt;The schema supports both simple and variable products. A simple product may only require:&lt;/p&gt;

&lt;p&gt;product.json&lt;br&gt;
attributes.json&lt;br&gt;
brand.txt&lt;br&gt;
short.txt&lt;br&gt;
long.txt&lt;br&gt;
images/&lt;/p&gt;

&lt;p&gt;A variable product additionally includes:&lt;/p&gt;

&lt;p&gt;variations.json&lt;/p&gt;

&lt;p&gt;The variation file defines combinations such as storage, colour, size, or other variation attributes.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "variations": [&lt;br&gt;
    {&lt;br&gt;
      "attributes": {&lt;br&gt;
        "Storage": "128GB",&lt;br&gt;
        "Colour": "Black"&lt;br&gt;
      },&lt;br&gt;
      "sku": "EXAMPLE-128-BLK"&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
      "attributes": {&lt;br&gt;
        "Storage": "256GB",&lt;br&gt;
        "Colour": "Black"&lt;br&gt;
      },&lt;br&gt;
      "sku": "EXAMPLE-256-BLK"&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
}&lt;br&gt;
Validate before importing&lt;/p&gt;

&lt;p&gt;One of the most important design decisions is that validation happens before the product reaches WooCommerce. The flow looks roughly like this:&lt;/p&gt;

&lt;p&gt;Product package&lt;br&gt;
      ↓&lt;br&gt;
Schema validation&lt;br&gt;
      ↓&lt;br&gt;
Attribute validation&lt;br&gt;
      ↓&lt;br&gt;
Taxonomy validation&lt;br&gt;
      ↓&lt;br&gt;
Category matching&lt;br&gt;
      ↓&lt;br&gt;
API&lt;br&gt;
      ↓&lt;br&gt;
WooCommerce&lt;/p&gt;

&lt;p&gt;This prevents malformed or incomplete product data from entering the catalog. Do not silently create categories. One rule we deliberately enforce is that missing categories should not automatically be created by the importer.&lt;/p&gt;

&lt;p&gt;If a submitted product references:&lt;/p&gt;

&lt;p&gt;Smart Home &amp;gt; Video Doorbells&lt;/p&gt;

&lt;p&gt;and that category does not exist in the catalog, the import should fail with something similar to:&lt;/p&gt;

&lt;p&gt;CATEGORY_NOT_FOUND&lt;/p&gt;

&lt;p&gt;The missing category can then be reviewed and created deliberately before the import is retried.&lt;/p&gt;

&lt;p&gt;This helps prevent duplicate or poorly structured categories from slowly damaging the catalog taxonomy.&lt;/p&gt;

&lt;p&gt;Attribute validation&lt;/p&gt;

&lt;p&gt;The same principle applies to product attributes.&lt;/p&gt;

&lt;p&gt;Before creating a variable product, the importer should verify that:&lt;/p&gt;

&lt;p&gt;the attribute exists&lt;br&gt;
the value is valid&lt;br&gt;
the attribute is allowed for variations&lt;br&gt;
variation combinations reference valid values&lt;br&gt;
duplicate values are removed&lt;br&gt;
empty values are rejected&lt;/p&gt;

&lt;p&gt;A product with invalid variation data should never be partially imported.&lt;/p&gt;

&lt;p&gt;Why use separate files?&lt;/p&gt;

&lt;p&gt;We considered putting everything into a single JSON document. That can work, but separating some parts of the product package has practical benefits. Descriptions remain easy to edit. Images remain normal files.&lt;/p&gt;

&lt;p&gt;Large variation structures stay separate from the core product metadata. Non-technical catalog staff can also work with parts of the package without having to edit one huge JSON file.&lt;/p&gt;

&lt;p&gt;Taxonomy data&lt;/p&gt;

&lt;p&gt;The structure can also include separate values for:&lt;/p&gt;

&lt;p&gt;brand.txt&lt;br&gt;
collection.txt&lt;br&gt;
product-line.txt&lt;br&gt;
location.txt&lt;/p&gt;

&lt;p&gt;These are treated independently from the product category. This matters because a brand, product collection, product line, and catalog category represent different relationships. Mixing all of them into the category tree eventually makes large catalogs difficult to manage.&lt;/p&gt;

&lt;p&gt;Why we open-sourced it&lt;/p&gt;

&lt;p&gt;This schema came out of work on the catalog infrastructure behind Shopwice. We realized the underlying problem is not unique to one marketplace. Any WooCommerce store handling large numbers of products can run into similar problems with inconsistent product data, variation structures, taxonomy mapping, and bulk imports. So we decided to publish the specification and examples publicly.&lt;/p&gt;

&lt;p&gt;The project currently includes:&lt;/p&gt;

&lt;p&gt;simple product examples&lt;br&gt;
variable product examples&lt;br&gt;
JSON schemas&lt;br&gt;
attribute structures&lt;br&gt;
variation structures&lt;br&gt;
taxonomy guidance&lt;br&gt;
image organization rules&lt;br&gt;
validation documentation&lt;br&gt;
category matching guidance&lt;/p&gt;

&lt;p&gt;We have also opened issues for improvements including stricter attribute validation, image validation, category matching, and API validation examples.&lt;/p&gt;

&lt;p&gt;Repository&lt;/p&gt;

&lt;p&gt;The first public release is available on GitHub: Shopwice WooCommerce Product Import Schema&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Obteohub" rel="noopener noreferrer"&gt;
        Obteohub
      &lt;/a&gt; / &lt;a href="https://github.com/Obteohub/shopwice-woocommerce-product-import-schema" rel="noopener noreferrer"&gt;
        shopwice-woocommerce-product-import-schema
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Open product-data schema for importing simple and variable WooCommerce products using structured folders, JSON, attributes, variations, taxonomy data, descriptions, and images. Built for the Shopwice Import platform.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;WooCommerce Product Import Schema&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An open, folder-based specification for preparing and validating e-commerce product data before importing it into WooCommerce.&lt;/p&gt;
&lt;p&gt;This repository provides a practical structure for &lt;strong&gt;simple products&lt;/strong&gt;, &lt;strong&gt;variable products&lt;/strong&gt;, &lt;strong&gt;attributes&lt;/strong&gt;, &lt;strong&gt;variations&lt;/strong&gt;, &lt;strong&gt;brands&lt;/strong&gt;, &lt;strong&gt;product collections&lt;/strong&gt;, &lt;strong&gt;product lines&lt;/strong&gt;, &lt;strong&gt;product locations&lt;/strong&gt;, &lt;strong&gt;descriptions&lt;/strong&gt;, &lt;strong&gt;images&lt;/strong&gt;, and &lt;strong&gt;category validation&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This specification was developed as part of the Shopwice product import infrastructure. The import platform is available at import.shopwice.com.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this project exists&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Large WooCommerce catalogs become difficult to maintain when product information arrives in inconsistent spreadsheets, folders, image sets, supplier documents, and free-form descriptions.&lt;/p&gt;
&lt;p&gt;This project treats each product as a self-contained package. An importer can validate the package first, map its taxonomy against an existing catalog, and only then send the product to WooCommerce through the appropriate API or middleware layer.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;ZIP or root folder
      |
      v
Product-type folders
      |
      v
One&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Obteohub/shopwice-woocommerce-product-import-schema" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The project is currently at v1.0.0.&lt;/p&gt;

&lt;p&gt;We developed the schema as part of the product infrastructure behind &lt;a href="https://shopwice.com" rel="noopener noreferrer"&gt;Shopwice&lt;/a&gt;. If you work with large WooCommerce catalogs, product feeds, headless commerce, or marketplace infrastructure, we welcome feedback and contributions.&lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>woocommerce</category>
      <category>wordpress</category>
    </item>
  </channel>
</rss>
