Managing Transfer Orders
How to edit, confirm, cancel, and complete transfer orders after creation.
Editing a Transfer
All fields are editable while the transfer is in draft status.
Once confirmed, only reference and notes can be edited. If the
transfer has already been synced to Shopify (i.e. it has a Shopify ID),
changes to reference or notes are automatically pushed to Shopify as a
TRANSFER_EDIT mutation.
Completed and cancelled transfers are fully read-only.
Status Progression
Draft → Confirmed (Confirm)
Confirmation has four backend guards that must all pass:
| Guard | What happens if it fails |
|---|---|
| Status must be draft | Error thrown |
| Both source and destination locations must be set | Error thrown; shopifySyncError written to the transfer record |
| At least one non-cancelled line item must exist | Error thrown; shopifySyncError written |
syncTransferOrderToShopify must be true (for Shopify sync) | Sync skipped, SKIPPED log created — transfer still confirmed |
When confirmed successfully:
- Transfer status changes to confirmed
- All active line items status changes to confirmed
- If Shopify sync is enabled: a
TRANSFER_CREATEsync log is created and thesyncTransferToShopifybackground action is enqueued to create the transfer in Shopify's Inventory Transfer API - If Shopify sync is disabled: no Shopify action is taken
Note: unlike purchase orders, confirming a transfer does not trigger supply plan regeneration.
Confirmed → In Transit (automatic)
The transfer status changes from confirmed to in_transit automatically when the first shipment is created. This is a backend operation — no manual action is required. All confirmed line items are also transitioned to in_transit at the same time.
Mark Complete
Available when the transfer is confirmed or in_transit and at least one active shipment exists.
What happens on completion:
- Each line item's
quantityOrderedis reconciled to actual received: set toquantityAccepted + quantityDefectacross all active shipment items for that line item - All line items have
quantityPendingset to 0 - All line items are set to status completed
- Transfer status is set to completed
- Completed transfers are fully read-only
Important: unlike purchase orders, completing a transfer does not trigger supply plan regeneration. Supply plan metrics for affected inventory levels will update on their next scheduled regeneration cycle.
Cancelling a Transfer
Backend rules:
| Condition | Result |
|---|---|
Status is in_transit, completed, or cancelled | Blocked — error thrown |
Status is confirmed + has a shopifyId + sync enabled + any shipment is announced or received | Blocked — error thrown |
Status is draft | Always allowed |
Status is confirmed without Shopify sync, or confirmed with sync but no shipments yet | Allowed |
What happens on cancellation:
- Transfer status is set to cancelled
- All line items are set to status cancelled
- If the transfer has a
shopifyIdandsyncTransferOrderToShopifyis true: aTRANSFER_CANCELmutation is enqueued to cancel the transfer in Shopify's Inventory Transfer API
Quantity Tracking
The Transfer Orders detail page shows these aggregate quantities across all shipments:
| Field | Meaning |
|---|---|
| Ordered | quantityOrderedComputed — total across all line items |
| Announced | quantityAnnouncedComputed — total announced in shipments |
| Delivered | quantityDeliveredComputed — total physically delivered |
| Accepted | quantityAcceptedComputed — total accepted (passed inspection) |
| Defect | quantityDefectComputed — total failed inspection |
| Fill rate | fillRateComputed — accepted ÷ ordered as a percentage |
| Next arrival | nextArrivalComputed — earliest ETA across open shipments |
| Delayed delivery days | delayedDeliveryDaysComputed — days past confirmed delivery date |