AgentSkillsCN

ce-orders

Commerce Engine 的订单管理——创建订单、列表与详情展示、物流跟踪、支付状态查询、订单取消与退款处理。

SKILL.md
--- frontmatter
name: ce-orders
description: Commerce Engine order management - create orders, list/detail, shipment tracking, payment status, cancellation, and refunds.
license: MIT
allowed-tools: Bash
metadata:
  author: commercengine
  version: "1.0.0"

Order Management

Prerequisite: Order creation requires a cart with items and addresses. See cart-checkout/.

Quick Reference

TaskSDK Method
Create ordersdk.order.createOrder({ cart_id, payment_method? })
List orderssdk.order.listOrders({ page, limit })
Get order detailsdk.order.getOrderDetails({ order_number })
Get shipmentssdk.order.listOrderShipments({ order_number })
Get paymentssdk.order.listOrderPayments({ order_number })
Payment statussdk.order.getPaymentStatus(orderNumber) — takes a string
Retry paymentsdk.order.retryOrderPayment({ order_number }, { payment_method })
Cancel ordersdk.order.cancelOrder({ order_number }, { cancellation_reason, refund_mode })
Get refundssdk.order.listOrderRefunds({ order_number })

Note: Returns are managed by the brand admin (Admin Portal), not the storefront. Customers can cancel within the cancellation window (is_cancellation_allowed); the admin then decides whether to schedule a return shipment or issue a direct refund. The default behavior is to refund if cancelled within the window. Return/replacement request APIs for storefront are under development.

Decision Tree

code
User Request
    │
    ├─ "Place order" / "Checkout"
    │   └─ sdk.order.createOrder() → handle payment_info
    │       → See cart-checkout/ for full checkout flow
    │
    ├─ "My orders" / "Order history"
    │   └─ sdk.order.listOrders({ page, limit })
    │
    ├─ "Order detail" / "Order #123"
    │   └─ sdk.order.getOrderDetails({ order_number })
    │
    ├─ "Track shipment"
    │   └─ sdk.order.listOrderShipments({ order_number })
    │       → tracking_url, awb_no, status, eta_delivery
    │
    ├─ "Payment failed" / "Retry"
    │   ├─ Check → sdk.order.getPaymentStatus(orderNumber)
    │   └─ Retry → sdk.order.retryOrderPayment({ order_number }, { payment_method })
    │
    └─ "Cancel order"
        ├─ Check is_cancellation_allowed first
        └─ sdk.order.cancelOrder({ order_number }, { ... })

Order Statuses

StatusDescription
draftOrder created, awaiting payment
confirmedPayment successful, order confirmed
processingBeing prepared for shipment
shippedIn transit
deliveredDelivered to customer
cancelledOrder cancelled

Payment Statuses

StatusDescriptionAction
pendingPayment not yet processedPoll again after delay
successPayment successfulShow confirmation
failedPayment failedCheck is_retry_available

Key Patterns

Create Order from Cart

See cart-checkout/references/payment-patterns.md § "Building Payment Payloads" for all payment_method shapes.

typescript
const { data: order, error } = await sdk.order.createOrder({
  cart_id: cartId,
  payment_method: {
    payment_provider_slug: "juspay",
    integration_type: "hyper-checkout",
    gateway_reference_id: gatewayRefId,
    return_url: "https://yoursite.com/order/confirm",
    action: "paymentPage",
  },
});

if (order.payment_required) {
  // Use payment_info to redirect or handle payment flow
}

List Orders with Filters

typescript
const { data, error } = await sdk.order.listOrders({
  page: 1,
  limit: 10,
  sort_by: JSON.stringify({ order_date: "desc" }),
});

// data.orders → OrderList[] (summary view)
// data.pagination → { total_records, total_pages, next_page }

Poll Payment Status

typescript
async function pollPaymentStatus(orderNumber: string) {
  // Note: getPaymentStatus takes a string, not an object
  const { data, error } = await sdk.order.getPaymentStatus(orderNumber);

  if (data.status === "pending") {
    setTimeout(() => pollPaymentStatus(orderNumber), 3000);
    return;
  }

  if (data.status === "success") {
    showConfirmation(orderNumber);
  } else if (data.is_retry_available) {
    showRetryOption(orderNumber);
  } else {
    showPaymentFailed();
  }
}

Cancel Order

typescript
// First check if cancellation is allowed
const { data: order } = await sdk.order.getOrderDetails({
  order_number: orderNumber,
});

if (order.is_cancellation_allowed) {
  const { data, error } = await sdk.order.cancelOrder(
    { order_number: orderNumber },
    {
      cancellation_reason: "Changed my mind",
      refund_mode: "original_payment_mode",
      feedback: "Optional feedback",
    }
  );
}

Shipment Tracking

typescript
const { data, error } = await sdk.order.listOrderShipments({
  order_number: orderNumber,
});

data.shipments.forEach((shipment) => {
  console.log(shipment.status);        // "shipped", "delivered", etc.
  console.log(shipment.tracking_url);  // Courier tracking link
  console.log(shipment.awb_no);        // Air waybill number
  console.log(shipment.eta_delivery);  // Estimated delivery date
});

Common Pitfalls

LevelIssueSolution
CRITICALCreating order without addressCart must have billing/shipping addresses set before createOrder()
HIGHNot polling payment statusAfter gateway redirect, always poll getPaymentStatus()
HIGHShowing cancel button when not allowedCheck is_cancellation_allowed from order detail first
MEDIUMNot handling multiple shipmentsOne order can have multiple shipments — iterate data.shipments
MEDIUMMissing return_urlMust provide return_url for payment gateway callback
MEDIUMBuilding a returns flow on storefrontReturns are admin-managed. Storefront supports cancellation only (cancelOrder). Show order/refund status, not a "Request Return" form.
LOWNot filtering orders by statusUse status[] query param to show relevant orders per tab

See Also

  • cart-checkout/ - Cart management and checkout flow
  • webhooks/ - Real-time order status updates via webhooks

Documentation