Operations
Products & cross-channel inventory
One product record owns the master stock level. Channel listings are projections of that record, and CrowPrime's job is to keep the projections truthful without oversell.
On this page
Catalog structure
| Level | Holds | Example |
|---|---|---|
| Product | Title, description, brand, images, cost price, default VAT rate | Ceramic mug |
| Variant | Own SKU, barcode, attributes, own stock level | Ceramic mug / blue / 350ml |
| Listing | Channel, channel item ID, channel price and title override, sync flags | eBay item 1234567890 |
Product
- Holds
- Title, description, brand, images, cost price, default VAT rate
- Example
- Ceramic mug
Variant
- Holds
- Own SKU, barcode, attributes, own stock level
- Example
- Ceramic mug / blue / 350ml
Listing
- Holds
- Channel, channel item ID, channel price and title override, sync flags
- Example
- eBay item 1234567890
Products without variants still have exactly one implicit variant, so every sellable unit always has a SKU. SKUs must be unique inside the organization.
Linking channel listings
- 1
Automatic match on import
Imported listings are matched to existing variants by exact SKU, then by barcode.
- 2
Manual link
Unmatched listings land in the Unlinked tab; pick the correct variant or create a product from the listing.
- 3
Channel SKU aliases
Where a channel enforces a different SKU, add it as an alias so future imports match automatically.
Important
Linking two different physical items to one variant will oversell. Review the Unlinked tab before enabling sync after a large import.
How inventory sync works
- Inbound: importing an order deducts stock once against the master record (guarded so the same order never deducts twice); cancellations and returns restock through their own flows.
- Outbound: after a stock change, an update is pushed to every other linked, sync-enabled channel listing.
- Absolute values: each push carries the current master quantity, so the newest state always wins — an older value can never overwrite a newer one.
- Serialized per listing: pushes for the same listing are queued in order.
- Some channels additionally run periodic reconcile sweeps that re-check channel-side quantities against the master record.
Effective quantity formula
pushed_quantity = max(
0,
on_hand - safety_buffer
)Stock is deducted at order import (not at shipping), so on_hand already reflects unshipped sales. The safety buffer (default 1 for dropshipping organizations) holds back units to absorb sync latency.
Buffers, thresholds and bundles
| Setting | Scope | Purpose |
|---|---|---|
| Safety buffer | Organization, channel or variant | Holds back units to absorb sync latency or offline sales |
| Low-stock threshold | Variant | Drives the dashboard alert and report flag |
| Max listed quantity | Listing | Caps how much is exposed on a channel |
| Bundle components | Product | Availability is derived from the scarcest component |
| Sync enabled | Listing | Turn a single listing off without unlinking it |
Safety buffer
- Scope
- Organization, channel or variant
- Purpose
- Holds back units to absorb sync latency or offline sales
Low-stock threshold
- Scope
- Variant
- Purpose
- Drives the dashboard alert and report flag
Max listed quantity
- Scope
- Listing
- Purpose
- Caps how much is exposed on a channel
Bundle components
- Scope
- Product
- Purpose
- Availability is derived from the scarcest component
Sync enabled
- Scope
- Listing
- Purpose
- Turn a single listing off without unlinking it
Bulk editing and import
- Filter the product list, select rows and apply a bulk action: set stock, adjust stock by delta, change price, set VAT rate, enable or disable sync.
- CSV import creates and updates products by SKU; a dry-run preview reports the rows that would change before anything is written.
- Export produces the same column set, so export → edit → import is a supported round trip.
sku,title,variant,on_hand,cost_price,price,vat_rate,barcode
MUG-BLU-350,Ceramic mug,Blue / 350ml,42,4.20,14.90,19,4006381333931
MUG-RED-350,Ceramic mug,Red / 350ml,17,4.20,14.90,19,4006381333948Conflicts and failures
| Situation | CrowPrime behavior |
|---|---|
| Two channels sell the last unit simultaneously | Both orders are imported; the second is flagged as oversold in Needs attention so you can refund or restock |
| Quantity edited directly on the marketplace | CrowPrime re-asserts the master value on the next stock event or reconcile sweep; the master record is authoritative |
| Channel rejects a push | Retried with backoff; after repeated failure the listing is flagged with the channel error message |
| Variant unlinked while a push is queued | The queued push is discarded |
Two channels sell the last unit simultaneously
- CrowPrime behavior
- Both orders are imported; the second is flagged as oversold in Needs attention so you can refund or restock
Quantity edited directly on the marketplace
- CrowPrime behavior
- CrowPrime re-asserts the master value on the next stock event or reconcile sweep; the master record is authoritative
Channel rejects a push
- CrowPrime behavior
- Retried with backoff; after repeated failure the listing is flagged with the channel error message
Variant unlinked while a push is queued
- CrowPrime behavior
- The queued push is discarded