Proud winners of the 2026 CFIN Foodtech Frontier Awards. Learn more →

Transfer Events

Webhook events for internal transfers

Transfer events are triggered when internal transfers change status.

#TypeScript Interfaces

Copy these interfaces to type your webhook handlers:

/** Base event properties included in all webhook events */
interface BaseEvent {
  /** Unique event identifier (UUID) */
  id: string;
  /** Event type */
  kind: string;
  /** ISO 8601 timestamp */
  time: string;
  /** Transaction identifier for grouping related events */
  transactionId: string;
}
 
/** Transfer status values (same as ShipmentStatus — transfers are shipments) */
type TransferStatus =
  | "onHold"
  | "ready"
  | "pending"
  | "loaded"
  | "shipped"
  | "inTransit"
  | "completed"
  | "canceled";

#transfer.status.changed

Triggered when a transfer's status is updated.

{
  "id": "evt_abc123",
  "kind": "transfer.status.changed",
  "time": "2024-01-15T10:30:00Z",
  "transactionId": "txn_xyz789",
  "transferId": "tfr_456",
  "transferShortId": "TFR-001",
  "previousTransferStatus": "pending",
  "currentTransferStatus": "in_progress"
}

#Status Values

StatusDescription
onHoldTransfer on hold, awaiting action
readyTransfer ready to be loaded
pendingTransfer pending dispatch
loadedTransfer loaded onto transport
shippedTransfer dispatched
inTransitTransfer in transit to destination
completedTransfer completed successfully
canceledTransfer cancelled

#All Transfer Event Types

Union type for handling any transfer event:

type TransferEvent = TransferStatusChangedEvent;
 
// Type guard for transfer events
function isTransferEvent(event: BaseEvent): event is TransferEvent {
  return event.kind.startsWith("transfer.");
}
 
// Example webhook handler
async function handleTransferWebhook(event: TransferEvent) {
  switch (event.kind) {
    case "transfer.status.changed":
      console.log(
        `Transfer ${event.transferShortId} changed from ${event.previousTransferStatus} to ${event.currentTransferStatus}`
      );
 
      if (event.currentTransferStatus === "completed") {
        // Update inventory locations
      } else if (event.currentTransferStatus === "cancelled") {
        // Revert any partial changes
      }
      break;
  }
}