Skip to content

Virtual materials

A virtual materialVirtual MaterialA material tracked entirely inside Assemblified — not a Shopify variant. Useful for shop-floor consumables (glue, packaging, labour units) where you need quantity tracking but don't want a Shopify product on your storefront. Read more → is a raw material with no Shopify variant. Inventory is tracked entirely in Assemblified — no Shopify product, no Shopify inventory, no Shopify webhook traffic.

Virtual materials show up in the same component picker as Shopify-linked materials, and they’re consumed identically when a BOM fires — except no Shopify Admin API call happens.

  • When to use a virtual material
  • Creating one
  • Adjusting stock
  • How they behave at execution time
  • Limitations and gotchas

Pick virtual when:

  • Consumables. Tape, glue, screws, packaging — items you don’t want cluttering your Shopify catalog.
  • Trace components. Tiny per-assembly quantities where setting up a Shopify product is overkill.
  • Non-Shopify suppliers. You buy from a vendor that doesn’t sit in Shopify, but you still want to track depletion.
  • Internal-only items. Materials that should never appear in any storefront, even hidden.

Pick Shopify-linked when:

  • You also sell the material standalone.
  • You want Shopify’s location and inventory features (Shopify Plus features, location transfers, etc).
  • An integration outside Assemblified manages the inventory (Shopify is the lingua franca).
  1. Go to Raw MaterialsVirtual tab.
  2. Click “New virtual material”.
  3. Fill in:
    • Name (required) — what operators will see.
    • SKU (optional) — operator-defined, not bound to Shopify.
    • Unit — display unit (pcs, kg, m, L, etc.). 15 are seeded by default; add your own under Settings → Units.
    • Unit cost (optional but recommended) — for cost accounting in BOMs.
    • Vendor (optional) — supplier name.
    • Specifications — free-form notes.
  4. Save. The material is created with isVirtual=1 and synthetic IDs (no Shopify references).
  5. Set initial stock — go to the detail page and use the inventory adjustment to record what you have on hand.

The virtual material is now usable in any BOM or sub-assembly.

Virtual material stock lives in virtual_inventory_levels (per-location). You adjust it from:

  • The detail page — inline adjustment widget. Per-location.
  • The inventory adjustment dialog on the list page — quick adjusts for a single material.
  • Programmatically via the API — useful for custom workflows or batch imports.

Adjustments write the delta and update the cached inventoryQuantity aggregate atomically. They also write a row to the adjustment-history audit trail.

When a BOM contains a virtual material:

  1. Material expansion treats the virtual material identically to Shopify-linked — same emission of a MaterialRequirementEntry with quantity, location, etc.
  2. The Shopify sync step filters out virtual materials. They’re not included in the Shopify inventory call.
  3. Virtual material updates are written separately to Assemblified’s internal inventory.
  4. The execution log’s calculatedChanges[] array still records the virtual decrement — it’s part of the same audit trail.

End result: from the customer’s perspective, no difference. From the Shopify-side, no inventory decrement happens for the virtual material — there’s no Shopify variant to decrement.

Virtual materials support multi-location storage natively in virtual_inventory_levels. Each location has its own row with available and committed columns.

In practice, most stores use virtual materials at the default location only. The UI for adjusting per-location virtual stock is rudimentary compared to Shopify-linked materials, where Shopify’s own admin handles much of it. If you need granular per-location virtual inventory, expect to use the API or SQL adjustment tools.

  • No INVENTORY_ITEMS_UPDATE webhook. Since virtual materials don’t exist in Shopify, the external-change recompute (which runs for Shopify materials when stock is manually adjusted) doesn’t trigger for them. If you adjust virtual stock outside the Assemblified UI (e.g., via SQL), trigger a recompute manually via Synchronize with Raw Materials.
  • No standalone sale. A virtual material can’t be sold to customers — it has no Shopify product. To sell it, create a Shopify product and link the variant as a standard raw material.
  • Cost accounting is operator-managed. No Shopify-side cost sync. Set unitCost correctly when creating, and update it when prices change.
  • Negative stock is clamped. Virtual materials can’t go below zero on consumption (Assemblified clamps at zero). Compare with Shopify materials, where Shopify’s own rules apply.
  • Synthetic IDs. The variantId and inventoryItemId for virtual materials are synthetic UUIDs. They don’t collide with real Shopify GIDs but they’re not searchable in the Shopify admin.