Product states: Active, Draft, Archived, and Delete
Last updated: April 2026
Every product in Techfleet Sync lives in exactly one of three states. Choose the one that matches where the product is in its lifecycle — Shopify merchants will feel right at home.
The three states
- Active — visible in your buyer catalog, synced to every connected sales channel (Shopify, Facebook Shops, Google Merchant Center), and counted in dashboards and search.
- Draft — hidden from buyers and NOT pushed to channels. Use for work-in-progress product pages, seasonal items you're not ready to sell, or anything you're still editing.
- Archived — hidden from buyers and paused on channels. Used for retired products and historical records. Sync automatically flips Shopify / FB / GMC to archived when you archive here.
The Active / Draft / Archived / All tabs
The Inventory page has four scope tabs above your product list:
- Active (default) — only live products
- Draft — only WIP products
- Archived — only archived products
- All — everything together for audit or search
Publish a draft
Open a product in the Draft tab and click Publish in the header, or use the row action in the list. The product flips to Active immediately and appears in your buyer catalog + syncs to channels on the next tick.
Unpublish an active product (to draft)
Switch an active product back to Draft with Unpublish. The product disappears from the buyer catalog right away and channel sync pauses. No data is lost — prices, stock, images, layers, and order history all stay intact.
Archive a product
- Open the product or find its row in the list
- Click Archive (header button on the detail page, or row action in the list)
- The product drops from the Active tab and appears in Archived
- Shopify / Facebook / Google Merchant Center get the archive push on the same transaction — you don't have to remember to do it twice
Restore an archived product
In the Archived tab, click Unarchive on the row or open the detail page and click Unarchive in the header. The product returns to Active and channels are re-notified.
Automatic archiving on out-of-stock
Turn this on if you want products to disappear automatically when stock drops to 0.
- Go to Settings → General → Product processing
- Check "Automatically archive out-of-stock products"
- Save
With auto-archive on, a product flips to Archived the moment stock hits 0. Restocking does NOT auto-unarchive — you manually unarchive when ready so a quick blip in stock doesn't re-list a product you intended to retire.
Delete a product (permanent, guarded)
Delete is for products that never should have existed: duplicates, test rows, accidental entries. It's permanent and can't be undone. To protect your accounting and buyer history, the delete is refused with an error if the product has any orders referencing it — archive it instead in that case.
- Eligible: products with zero order-item references
- Blocked (use Archive): any product that has ever been ordered
- Shopify-synced products get the archive push on delete too (via the adapter's endListing call)
Merchants doing real volume: prefer Archive. Every sold product should stay in your database for tax, return-window tracking, and future customer support — even products you discontinued months ago. Archive keeps the inventory view clean without losing that history.
Shopify round-trip behaviour
When a merchant archives a product in Shopify admin, Shopify fires a products/update webhook with status=archived. We map that to our Archived state so the two stay in sync. Same for Draft. ACTIVE maps to Active. Archive and status edits both work from either side.
API
- POST /api/products/:id/archive — archive any product
- POST /api/products/:id/unarchive — restore to active
- POST /api/products/:id/publish — draft → active
- POST /api/products/:id/unpublish — active → draft
- GET /api/products?status=active|draft|archived|all — scoped list
- DELETE /api/products/:id — refuses with 409 if the product has order history
All lifecycle endpoints are idempotent and safe to retry. Archive and unarchive both return { success, status, archivedAt }.
Was this article helpful?