Products fields, filters and limits
This page lists every product field, filter, sortable column, limit and validation rule.
বাংলায়: এখানে পণ্যের সব ফিল্ড, ফিল্টার, সাজানোর উপায়, সীমা এবং যাচাইয়ের নিয়ম দেখানো হয়েছে।
Where to find it: Sidebar › Products › All products list
Product fields and edit rules
| Field | Type | Max length | Rule | Shown on list |
|---|---|---|---|---|
| Title | Text | — | Required; at least 1 character. Error: "Give the product a name." | Yes (left, main) |
| Description | Rich text | — | Optional; shown on your store. | No |
| SKU | Text | 24 characters | Auto-filled from title until you edit it. Must be unique. Error: "SKU "X" already exists. Please use a unique SKU." | Yes (sub-line on list) |
| Status | Dropdown: Active, Draft, Archived | — | Active by default. On edit, Archived appears only if the product is already archived or you archived it. | Yes (colored pill) |
| Price | Currency ৳ | — | Required; must be ≥ 0. Error: "Price must be non-negative" (create) or "Price cannot be negative" (edit). | Yes (right) |
| Compare-at price | Currency ৳ | — | Optional; must be ≥ 0 if set. Error: "Compare at price cannot be negative". Shows as a percentage discount when above the price. | No |
| Cost per item | Currency ৳ | — | Optional; must be ≥ 0 if set. Error: "Cost price cannot be negative". Used to calculate margin. | No |
| Category | Select | — | Optional; single choice from your catalog. Must create categories under Catalog first. | Yes (list) |
| Product type | Text with suggestions | — | Optional; free text. Suggestions come from other products. | No |
| Vendor | Text with suggestions | — | Optional; free text. Suggestions come from other products. | No |
| Tags | Chips | 8 tags max | Optional; up to 8 tags per product. Case-insensitive deduplication. | Filterable |
| Weight | Number | — | Optional; in kilograms (kg). Used for courier charges. | No |
| Barcode | Text | — | Optional; ISBN, UPC, GTIN or your own barcode. Not validated — any text accepted. | No |
| Page title (SEO) | Text | 70 characters | Optional; defaults to product title. Character counter shown in editor. Shown on Google search results. | No |
| Meta description (SEO) | Text | 160 characters | Optional; defaults to first 160 characters of description. Counter shown in editor. Shown on Google search results. | No |
| URL slug | Text (auto) | — | Generated once from the title at create time; never changes on rename. "Made from the title when the product is created." | No |
Variants and options
- Options per product: up to 3 (Size, Color, Material, Style)
- Variants per product: unlimited
- Variant SKU: auto-generated as
{base-sku}-{option-parts}or manually edited. Max 24 chars. - Option presets: Size → S M L XL XXL (and aliases like "Small", "Extra large"); Color → Black/White/Navy/Grey/Beige/Maroon/Olive; Material → Cotton/Linen/Polyester/Wool/Denim
- SKU size codes: XS, S, M, L, XL, XXL, XXXL mapped from names like "extra small", "med", "x large"
List columns
| Column | Shows | Sortable | Hideable | Default |
|---|---|---|---|---|
| Checkbox | Row selection | — | No | Yes |
| Product | Thumbnail (or grey icon); name; "Show variants" / "Hide variants" chevron; sub-line "N variant(s)" or SKU or "No SKU" | Yes | No | Yes |
| Status | Colored pill: Active (green), Draft (amber), Archived (grey) | Yes | No | Yes |
| Inventory | "N in stock"; "N in stock for M variants"; red "Out of stock" (≤0); "at N locations" when multi-location | Yes | No | Yes |
| Category | Category name or "(Uncategorized)" | No | No | Yes |
| Price | ৳ amount with no decimals; variant parents show "৳min – ৳max" range | Yes | No | Yes |
| Type | Product type text | No | Yes | No |
| Vendor | Vendor text | No | Yes | No |
| Source | "Omnikyo" (manual) or "Shopify" | No | Yes | No |
| Updated | Relative time ("2 hours ago") | Yes | Yes | No |
Note: Type, Vendor, Source and Updated are defined as hideable but no column toggle is currently shown on this page.
Filters and URL parameters
| Filter | URL param | Values | Note |
|---|---|---|---|
| Search | q | Text | Matches product name, SKU or description (case-insensitive substring). Debounced 300 ms. |
| Status | status | all active draft archived | Multiple statuses can be selected (one value at a time in URL, the UI shows a pills row). |
| Stock | stock | in low out | In stock > 0; Low stock 1–5; Out of stock ≤ 0. For variant parents, sums all variant stock. |
| Category | cat | Category ID or none | Single choice. "Uncategorized" (none) and an actual category are mutually exclusive. |
| Product type | type | Text (facet value) | One or more types (derived from up to 5,000 products, cached 60 s). |
| Vendor | vendor | Text (facet value) | One or more vendors (derived from up to 5,000 products). |
| Tags | tags | Comma-separated list | Multiple tags — a product must have all selected tags to match (AND logic). |
| Source | source | manual shopify | Manual (created in Omnikyo) or Shopify (synced). |
| No photo | photo=none | — | Checks image_url IS NULL. |
| No category | cat=none | — | Uncategorized products. |
| Facets (Type, Vendor) | — | — | Lazy-loaded on first filter popover open, cached 60 s, sourced from up to 5,000 top-level products. |
Filter reset: The filter popover footer has a Reset button to clear all selections.
Deep links: All filter state is preserved in the URL (q, status, cat, source, type, vendor, mode, stock, photo, tags, sort, dir, page, size).
Sort options
| Column | URL param | Directions |
|---|---|---|
| Product name (default) | sort=name | Ascending (A–Z) / Descending (Z–A) |
| Price | sort=price | Ascending / Descending |
| Stock quantity (Inventory column) | sort=stock_quantity | Ascending / Descending |
| Status | sort=status | Ascending / Descending |
| Created | sort=created_at | Ascending / Descending |
| Updated | sort=updated_at | Ascending / Descending |
| SKU | sort=sku | Ascending / Descending |
Direction URL parameter: dir=asc (default) or dir=desc.
Pagination
| Setting | Value |
|---|---|
| Default page size | 20 rows |
| Available sizes | 10, 20, 50, 100 |
| Server-side | Yes; pagination state stored in sessionStorage["products-page-pagination-v2"] |
| Return logic | Returning from the product editor lands on the same page (page number is remembered). If the page no longer exists (filters changed), you land on the last valid page. |
Constants and limits
| Limit | Value |
|---|---|
| SKU max length | 24 characters |
| SEO title | 70 characters |
| SEO meta description | 160 characters |
| Photo alt text | 200 characters |
| Tags per product | 8 maximum |
| Options per product | 3 maximum |
| Photo upload size | 20 MB each |
| Accepted photo types | JPEG, PNG, WebP, GIF, SVG, AVIF |
| Search debounce | 300 milliseconds |
| Facets scan limit | Up to 5,000 top-level products |
| Facets cache | 60 seconds |
| Photo undo window | 6 seconds |
| Complementary products | Up to 50 per product (gated feature) |
Validation error messages
Exact error messages shown on save (from server validation):
| Field | Error condition | Message |
|---|---|---|
| Name | Empty | "Name is required" |
| Price | Not a number | "Price must be non-negative" (create) / "Price cannot be negative" (edit) |
| Compare-at price | Not a number or < 0 | "Compare at price must be non-negative" / "Compare at price cannot be negative" |
| Cost price | Not a number or < 0 | "Cost price cannot be negative" |
| Stock quantity | Not an integer or < 0 | "Stock cannot be negative" |
| Status | Invalid enum | active / draft / archived |
| Photo URL | Not valid URL | "Must be a valid URL" |
Stock-related fields
Stock on a product varies by location setup:
Single location (or no locations set):
- Stock on hand (simple products): integer ≥ 0; required at create, optional on edit.
- Per-variant stock: integer ≥ 0; default from parent, then copied when variants are created.
- On hand by location (simple multi-location): one editable row per active location, plus read-only rows for inactive locations still holding stock. Must be whole numbers; validation error: "{location}: enter a whole number of 0 or more."
Multi-location:
- Individual per-location stock rows are edited on the Inventory page, not in the product editor.
- The editor's variant stock becomes read-only and shows a breakdown popover on click.
- Starting/new products show "Save the product first; then set stock per location" (disabled field).
Stock visibility:
- List: Shows aggregate "N in stock" or "Out of stock" (≤ 0).
- Details modal: Aggregated per location if multi-location; sub-lines show "N on hand · N reserved".
- Never shown on the product editor: Reserved, Damaged, Available — those are inventory-only.
Other ways people ask this
- পণ্যের সীমা
- কত ভেরিয়েন্ট হতে পারে
- SKU খোলাফল কিভাবে
- field validation error
- ফিল্ড সর্টিং
- এসকিইউ ইউনিক হওয়া লাগে
- variant limit
- পেজ সাইজ কিভাবে বদলাই
- filter url parameter
- বারকোড লিমিট
- product slug কি
- option preset কি
- stock per location
Related pages
- Find and filter products — how filters work and deep linking
- SKUs, slugs and barcodes — SKU generation and uniqueness rules
- The product overview panel — what the row-click modal shows
Checked against the product on 2026-10-02.