Fulfillment tracks how an order is delivered to the buyer after payment. A fulfillment covers a set of the order's line items and has a type: shipment (physical goods you send), pickup (the buyer collects), delivery (local courier), digital (electronic delivery), or service (work performed). Its status runs from pending and in_progress through completed, canceled, or failed, with type-specific states in between. Create a fulfillment against an order, then advance it with the update, complete, and cancel actions.
Physical fulfillments nest further: a fulfillment holds one or more shipments, each shipment holds packages, and each package holds package items that map back to specific order line items and quantities. Shipments and packages carry carrier, tracking, dimensions, and weight, and expose their own status timelines (for example a package moves created to packed to shipped to in_transit to delivered). Because carriers and fulfillment platforms are often external, shipments and packages accept an external_reference_id and external_system so you can reconcile Flint records against your carrier or 3PL.
Alongside the resources you create and update, this surface exposes read-only fulfillment events, notifications, and status updates (for fulfillments, shipments, and packages) that record the history of each object. Use them to build an audit trail or drive buyer-facing tracking without recomputing state yourself.
Fulfillment is an operation on orders, not a separate ledger. Line-item quantities stay reconciled against the order as fulfillments progress, so order state remains the source of truth for what has shipped and what is still owed.
