Order Agent
Order status, modifications, and customer service automation.
Overview
The Order Agent handles post-purchase customer interactions: order status inquiries, modifications, cancellations, and return processing. It provides a conversational interface for order management.
Capabilities
ORDER AGENT CAPABILITIES ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ENDPOINTS: GET /orders/:id Get order details GET /orders List customer orders POST /orders/:id/cancel Cancel order POST /orders/:id/modify Modify order POST /orders/:id/return Initiate return FEATURES: ✓ Order lookup Real-time order status ✓ Order history Full purchase history ✓ Modifications Address changes, item updates ✓ Cancellations Pre-shipment cancellation ✓ Returns Return initiation and tracking ✓ Refunds Automatic refund processing INTEGRATIONS: • Firestore (order state) • Stripe (refund processing) • Fulfillment Agent (status coordination) • CRM (customer history)
Order Status
Handle order status queries with full tracking information:
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Order Agent handling order status queries @OnACPEvent('order_status')async handleOrderStatus(orderId: string, context: BuyerContext) { const order = await this.orders.get(orderId); // Verify customer owns this order if (order.customer_id !== context.customer_id) { return { status: 'error', error: 'order_not_found' }; } return { order_id: order.id, status: order.status, status_display: this.formatStatus(order.status), items: order.items.map(item => ({ name: item.name, quantity: item.quantity, price: item.price, status: item.fulfillment_status, })), shipping: { address: order.shipping_address, method: order.shipping_method, tracking_number: order.tracking_number, carrier: order.carrier, estimated_delivery: order.estimated_delivery, current_location: await this.getTrackingLocation(order.tracking_number), }, timeline: [ { event: 'Order placed', date: order.created_at }, { event: 'Payment confirmed', date: order.payment_confirmed_at }, { event: 'Shipped', date: order.shipped_at }, { event: 'Out for delivery', date: order.out_for_delivery_at }, ].filter(e => e.date), actions_available: this.getAvailableActions(order), };} // Get available actions based on order stategetAvailableActions(order: Order): string[] { const actions = []; if (order.status === 'pending' || order.status === 'processing') { actions.push('cancel', 'modify_address'); } if (order.status === 'shipped') { actions.push('track'); } if (order.status === 'delivered') { const daysSinceDelivery = this.daysSince(order.delivered_at); if (daysSinceDelivery <= 30) { actions.push('return', 'exchange'); } } return actions;}Order Modifications
Process order changes, cancellations, and refunds:
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Handling order modifications @OnACPEvent('modify_order')async handleModifyOrder( orderId: string, modification: OrderModification, context: BuyerContext) { const order = await this.orders.get(orderId); // Check if modification is allowed if (!this.canModify(order)) { return { status: 'error', error: 'cannot_modify', reason: `Order cannot be modified. Status: ${order.status}`, }; } switch (modification.type) { case 'address_change': return await this.updateShippingAddress(order, modification.new_address); case 'cancel_item': return await this.cancelItem(order, modification.item_id); case 'add_item': return await this.addItem(order, modification.product_id, modification.quantity); case 'full_cancel': return await this.cancelOrder(order, modification.reason); default: return { status: 'error', error: 'unknown_modification' }; }} // Cancel order with refundasync cancelOrder(order: Order, reason: string) { // Check cancellation eligibility if (order.status === 'shipped') { return { status: 'error', error: 'already_shipped', message: 'Order has already shipped. Please initiate a return instead.', return_link: `/orders/${order.id}/return`, }; } // Process refund const refund = await this.stripe.refunds.create({ payment_intent: order.payment_intent_id, reason: 'requested_by_customer', }); // Update order status await this.orders.update(order.id, { status: 'cancelled', cancelled_at: new Date().toISOString(), cancellation_reason: reason, refund_id: refund.id, }); // Restore inventory await this.restoreInventory(order.items); // Notify customer await this.sendCancellationEmail(order); return { status: 'cancelled', refund_amount: refund.amount / 100, refund_status: refund.status, message: 'Your order has been cancelled and refund initiated.', };}Configuration
yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# order-agent-config.yamlname: order-agenttype: orderversion: "1.0" # Order modification rulesmodifications: address_change: allowed_statuses: [pending, processing] deadline_before_ship: 2h item_cancellation: allowed_statuses: [pending, processing] partial_cancel_allowed: true full_cancellation: allowed_statuses: [pending, processing, awaiting_fulfillment] refund_method: original_payment # Return policyreturns: window_days: 30 conditions: - "Item must be unused and in original packaging" - "Electronics must include all accessories" free_return_shipping: true restocking_fee: enabled: false percentage: 0 # Auto-approve conditions auto_approve: enabled: true conditions: - "customer.tier in ['gold', 'platinum']" - "order.total < 100" - "reason in ['wrong_size', 'changed_mind']" # Refund settingsrefunds: auto_process: true processing_days: 3-5 methods: - original_payment - store_credit # Notificationsnotifications: order_confirmed: true shipped: true out_for_delivery: true delivered: true cancelled: true refund_processed: trueSee Ads Agent for promotional content generation.