Skip to main content

Orders & fulfillment

Every sale — tasting room, storefront, club, phone — becomes an order, and orders are worked from the Commerce menu: the company-wide list at /admin/orders, the shipping queue at /admin/shipments (subtitle: "Track shipments across orders, and manage notification & carrier health."), and channel routing at /admin/fulfillment-routing. Guests follow their package on a public tracking page at /track/:token — no sign-in needed.

Who can use it

  • View orders and shipmentsorders.read: Managers, Concierges, Ambassadors, and Wine Associates (and Admins).
  • Fulfill lines (reserve, pick, ship, pickup) — orders.fulfill (Managers, Concierges); overriding a pick past inventory needs orders.override_inventory (Managers).
  • Cancel / refund / edit addresses / returnsorders.cancel, orders.refund, orders.edit_address, and the orders.returns.* set: Managers and Admins (Concierges can receive returns).
  • Fulfillment routing — viewing needs locations.read; changing a channel's default location needs locations.update (Managers, Admins).
  • Cart profilescart_profiles.read to view; create/update/delete are Manager and Admin only.

The all-orders list

/admin/orders (Orders) lists every order across channels. Columns: Order #, Channel, Status, Fulfillment, Total, Placed At. Club orders carry a wine-glass Club badge whose tooltip shows the shipment, status, and delivery method.

The Orders admin — every channel in one list, with filters.

The Orders admin — every channel in one list, with filters.

Filter and find:

  • Search — "Order number or customer name".
  • ChannelAll Channels, Club, Tasting Room, Web, Inbound. (Tasting Room is the in-person POS channel; Web is the storefront.)
  • Fulfillment StatusAll Statuses, Fulfilled, Not Fulfilled, No Fulfillment Required.
  • Fulfillment TypeAny Type, Shipping, Pickup, Local Delivery, Carry Out, No Fulfillment Required, Unknown.
  • A Location filter (only with multiple locations), a date-range picker (defaults to the last 30 days), and sorts from Placed (newest) to Total (high to low).

Rows page 25 at a time (Previous / Next). Each row's menu offers View order and Copy order number (toast: "Copied"). Nothing matching? "No orders found""Try adjusting your filters or search term".

The POS Orders page is the day-of view

/orders (POS Orders) is the location-scoped operational twin — tabs for Open Carts, Completed, and Closed Checks, plus an Order Insights drawer. Completed rows link straight into /admin/orders/:id. For building and settling the carts themselves, see Take an order (POS).

The order detail

/admin/orders/:id is the whole order on one page. The header shows the order number, status, channel, and a lock badgeEditable, Locked, or Shipped — with a Why locked? button that lists the lock reasons. POS-born orders also show their originating Check number and the Closed by staff member.

The order detail — items, fulfillment, payment, and the activity timeline.

The order detail — items, fulfillment, payment, and the activity timeline.

  • Items — the line items with quantities and prices.
  • Fulfillment — a per-line worklist: Product, Ordered, Reserved, Picked, Shipped, Picked Up, Actions. The actions (needs orders.fulfill) are Reserve, Release, Pick, Ship, and Pickup; Override Pick (needs orders.override_inventory) picks past the reservation. Ship stays disabled without an address — "Shipping address required".
  • Shipments — the order's shipments with provider, carrier, tracking link, and recent tracking events, plus a View shipment link into /admin/shipments/:id. Request Shipment hands the order to the shipping pipeline — "Shipment Requested", "Shipment has been created and queued for processing."
  • ReturnsCreate Return authorizes a return; Receive records the items back with a condition (Restockable, Damaged, Defective); Link Refund ties the return to a refund. Empty state: "No returns for this order".
  • Activity — the full timeline, filterable by Fulfillment, Lock, Audit, Order, Payment, Return.
  • Addresses — the shipping/billing snapshots with Edit (needs orders.edit_address). Locked and shipped orders resist edits — "Shipped orders cannot be edited" — unless a Manager flips Override Lock and supplies an Override Reason.
  • PaymentAuthorized, Captured, Refunded, and Refundable amounts, plus Issue Refund (needs orders.refund). Stripe-processed orders refund automatically — "This refund will be processed automatically through Stripe." — others are recorded as manual refund requests. The refund history shows each attempt's status (Succeeded, Submitted, Processing, Requested, Failed, Manual Action) with a Cancel action while still pending.
Cancel Order is gated by the lock

Cancel Order (needs orders.cancel) is disabled once the order is shipped, or locked without an override — the button's tooltip reads "Cannot cancel in current lock state". Check Why locked? first.

The shipments queue

/admin/shipments (Shipments) has two tabs — Shipments and Settings & Health. (The old /admin/settings/shipping address redirects to the Settings & Health tab.)

The Shipments queue — status, provider, carrier, and tracking per shipment.

The Shipments queue — status, provider, carrier, and tracking per shipment.

The worklist filters by Status (Submitted, In Transit, Delivered, Exception), Provider (FORT WMS, ShipStation), and a From / To date range, over columns Order, Status, Provider, Carrier, Tracking, Notifications, Last poll, Date. A shipment moves through Created → Submitted → Picking → Packed → Label Created → In Transit → Delivered, with Exception and Canceled as the off-ramps. The tracking cell links to the carrier's own site.

There are deliberately no manual shipment buttons here — no "create label", "mark shipped", or "assign tracking". A shipment is created from the order detail's Request Shipment (or automatically for club releases), and labels, carriers, tracking numbers, and status updates flow back on their own from the warehouse and carrier feeds.

Each row's View opens /admin/shipments/:id — the status and provider badges, an Open in carrier button, and three tabs: Notifications (each customer email event, with failures marked "— re-fires on the next status change."), Tracking ("Carrier tracking events"), and Audit (with an "Open full Audit log" link).

Settings & Health shows whether "Customer shipping notifications are ON" (or OFF — the switch is environment-level, read-only here), the last-24h notification counts, the carrier poll worker's recency, and the provider health cards. The notification events are Tracking assigned, Shipped, Out for delivery, Delivery attempted, Exception, and Delivered.

Warehouse handoff (FORT WMS / ShipStation)

Which provider ships an order is an integration setting, not a per-order choice: connect and configure FORT at /admin/integrations/fort (map your SKUs at /admin/integrations/fort/products, watch submissions at /admin/integrations/fort/health). If FORT is switched off you'll see "FORT outbound shipping is disabled for this winery (kill switch). Enable it under Integrations → FORT once sandbox validation has passed."

Fulfillment routing — which location fulfills a channel

/admin/fulfillment-routing (Fulfillment Routing"Set the default fulfillment location for each sales channel.") holds one card per channel: Web ("Online store orders"), Club ("Wine club shipments"), Inbound ("Phone and email orders"), and Wholesale ("Wholesale and B2B orders"). Pick a Default Location and Save — the toast confirms, e.g. "Web routing updated".

Fulfillment Routing — a default location per sales channel.

Fulfillment Routing — a default location per sales channel.

Only locations with that channel's fulfillment role qualify — otherwise: "No eligible locations. Assign the web fulfillment role to a location first." (Web additionally requires the location to have shipping or pickup enabled.) Fulfillment roles live on the location's settings under Locations.

That's the whole engine: an order's channel picks the default location you set here, and inventory is drawn from that location. There are no destination- or weight-based rules.

Public tracking for guests

Every shipment gets a private tracking link. When shipping notifications are on, the customer's email includes "Track your shipment:" with their link to /track/:tokenTrack Your Shipment — showing the status badge, Carrier, Tracking Number, Shipped / Delivered dates, an estimated delivery line, a "Track on [carrier] website" link, and the Tracking History timeline. The page needs no account; the link itself is the key. A dead link shows "Tracking Not Found""The tracking information you requested could not be found. Please check the URL and try again."

Cart profiles — what each register can sell

/admin/cart-profiles (Cart Profiles"Configure which product collections are available for sale by location, surface, and channel.") scopes the sellable catalog. A profile maps a Channel (POS (In-Person) or E-Commerce), an optional Location and Surface, to a checklist of Collections; Priority breaks ties ("Lower number = higher priority. Used when multiple profiles match the same context.") and only Active profiles apply.

Create one with Create Profile (e.g. name it "Tasting Room POS"). If the collections list is empty: "No collections found. Create collections in the Storefront admin first." — collections come from Your online storefront. Deleting warns: "This will permanently delete this cart profile and its collection assignments. Existing checks that reference this profile will not be affected."

Reference

ControlWhereWhat it does
View orderOrders row menuOpens the full order detail.
Why locked?Order detail headerLists the reasons an order resists edits.
Reserve / Pick / Ship / PickupFulfillment cardMoves a line through fulfillment (needs orders.fulfill).
Request ShipmentOrder detailCreates the shipment and queues it with the shipping provider.
Issue RefundPayment cardRefunds up to the refundable amount (needs orders.refund).
Create ReturnReturns cardAuthorizes a return; Receive books items back by condition.
Cancel OrderOrder detail headerCancels an unshipped, unlocked order (needs orders.cancel).
Open in carrierShipment detailJumps to the carrier's own tracking page.
Default LocationFulfillment Routing cardWhich location fulfills that channel's orders.
Create ProfileCart ProfilesScopes sellable collections by location, surface, and channel.

Troubleshooting

  • "No orders found" — widen the date range first; it defaults to the last 30 days.
  • Ship is disabled with "Shipping address required" — add the address on the Addresses card, then ship.
  • "Cannot cancel in current lock state" — the order is shipped or locked; open Why locked? for the reasons.
  • "Order lock prevents this change. Check lock reasons." — an address edit raced the lock; use Override Lock with a reason if you must.
  • "No eligible locations. Assign the … fulfillment role to a location first." — give a location that channel's fulfillment role in its location settings, then pick it here.
  • "FORT outbound shipping is disabled for this winery (kill switch)…" — re-enable FORT under Integrations → FORT once it's been validated.
  • A guest's tracking page says "Tracking Not Found" — the link is wrong or stale; resend the tracking URL from the shipment's carrier details.