
Order Fulfillment Workflow
- 93 installs
- 41 repo stars
- Updated March 13, 2026
- finsilabs/awesome-ecommerce-skills
Streamline the warehouse with digital pick-pack-ship workflows, barcode scanning for accuracy, and automatic packing-slip generation.
About
Builds digital pick-pack-ship fulfillment workflows with barcode scanning and automatic packing-slip generation. A developer or ops team uses it to speed up warehouse processing and reduce picking errors.
- Digital pick-pack-ship workflow with barcode scanning
- Automatic packing-slip generation
Order Fulfillment Workflow by the numbers
- 93 all-time installs (skills.sh)
- Ranked #837 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill order-fulfillment-workflowAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 93 |
|---|---|
| repo stars | ★ 41 |
| Last updated | March 13, 2026 |
| Repository | finsilabs/awesome-ecommerce-skills ↗ |
What it does
Streamline the warehouse with digital pick-pack-ship workflows, barcode scanning for accuracy, and automatic packing-slip generation.
Files
Order Fulfillment Workflow
Overview
A fulfillment workflow takes a paid order from "awaiting fulfillment" through picking, packing, and shipping — with barcode verification to prevent mis-ships and packing slip generation for each shipment. For most merchants, purpose-built apps handle this more reliably and cheaply than custom software. Custom development only makes sense for high-volume operations with unique warehouse workflows.
When to Use This Skill
- When building internal warehouse tooling to replace manual spreadsheet-based picking processes
- When setting up a new fulfillment operation and need a structured workflow from day one
- When integrating with a third-party logistics (3PL) provider that requires a standardized order feed
- When adding pick verification to reduce mis-ships and customer complaints
- When you need to support both single-order picking and batch picking for efficiency
Core Instructions
Step 1: Determine your platform and choose the right fulfillment tool
| Platform | Recommended Tool | Why |
|---|---|---|
| Shopify | ShipStation, Shopify Fulfillment Network (SFN), or Pirate Ship | ShipStation handles pick lists, packing slips, and multi-carrier label printing in one tool; SFN fully outsources fulfillment |
| WooCommerce | ShipStation (WooCommerce plugin), WooCommerce Shipping + Packing Slips by WooCommerce | ShipStation's WooCommerce plugin syncs orders automatically; the built-in packing slip extension handles document generation |
| BigCommerce | ShipStation, ShipBob, or Easyship | ShipStation and ShipBob both have native BigCommerce integrations; Easyship offers rate shopping across carriers |
| Custom / Headless | Build a fulfillment state machine + integrate Shippo or EasyPost for labels | Use Shippo/EasyPost for carrier-agnostic label creation; build the pick-pack-ship workflow around them |
Step 2: Set up your fulfillment tool
Shopify
Option A: ShipStation (recommended for 50+ orders/day)
1. Install ShipStation from the Shopify App Store 2. ShipStation automatically pulls all "unfulfilled" Shopify orders 3. Set up Automation Rules in ShipStation (Automation → Automation Rules) to assign carriers, services, and presets based on order weight, destination, or product type 4. Pick list: In ShipStation, go to Orders → select multiple orders → Print → Pick List. ShipStation generates a consolidated pick list sorted by your warehouse layout 5. Packing slips: Select orders → Print → Packing Slip. Customize the packing slip template in Account Settings → Printing → Document Templates 6. Label printing: ShipStation prints labels to a thermal label printer (Zebra, DYMO) via their desktop app — one scan per order creates and prints the label 7. After printing labels, ShipStation automatically marks orders as fulfilled in Shopify and sends tracking emails to customers
Option B: Shopify Fulfillment Network (SFN) — fully outsourced
1. Go to Settings → Shipping and delivery → Shopify Fulfillment Network 2. SFN handles all pick, pack, and ship operations — you ship your inventory to their warehouse and they fulfill orders automatically 3. No warehouse management needed on your end; SFN tracks inventory and fulfills orders same-day or next-day
Option C: Shopify's built-in fulfillment (for low volume)
1. Go to Orders → [Order] → Fulfill items 2. Enter the tracking number manually or purchase a label via Shopify Shipping 3. Shopify generates basic packing slips: Orders → Print → Packing slip
WooCommerce
Using ShipStation: 1. Install the ShipStation for WooCommerce plugin (free on WordPress.org) 2. In ShipStation, go to Account Settings → Stores and connect your WooCommerce store 3. Unfulfilled WooCommerce orders sync to ShipStation automatically 4. Use ShipStation for pick lists, packing slips, and label printing (same workflow as Shopify above) 5. When a label is printed, ShipStation pushes the tracking number back to WooCommerce and marks the order as "Completed"
WooCommerce-only (lower volume): 1. Install WooCommerce PDF Invoices & Packing Slips (free, WordPress.org) for PDF packing slips 2. Go to WooCommerce → Orders, select pending orders, and from the Bulk Actions dropdown choose "Generate packing slips" 3. For pick lists: the Smart Manager for WooCommerce plugin or ATUM Inventory Management generate pick lists directly from WooCommerce
BigCommerce
Using ShipStation: 1. Connect ShipStation via the BigCommerce App Marketplace 2. ShipStation syncs all open BigCommerce orders automatically 3. Use the same ShipStation workflow for pick lists, packing slips, and label printing
Using ShipBob (outsourced fulfillment): 1. Connect ShipBob from the BigCommerce App Marketplace 2. Ship your inventory to ShipBob warehouses; they fulfill all orders automatically 3. ShipBob updates BigCommerce order status and tracking in real time
Step 3: Configure pick list generation and warehouse workflow
A good pick list groups items by warehouse location (bin/shelf) to minimize picker travel time. Most shipping apps support this.
ShipStation pick list settings: 1. Go to Account Settings → Printing → Pick List 2. Configure grouping: by SKU (for batch picking) or by order (for single-order picking) 3. Enable "Show bin location" if you've entered bin locations on products (ShipStation → Products → edit product) 4. For barcode scanning: ShipStation has a Scan to Verify feature — enable it in Account Settings → Features. Scanners verify item barcodes before printing the label, preventing wrong-item fulfillment
For 3PL integration:
- Most 3PLs (ShipBob, Whiplash, Flexport) accept orders via EDI, SFTP CSV, or REST API
- In Shopify: install the 3PL's app or use a webhook to push orders to their system
- In WooCommerce: use a WooCommerce webhook (WooCommerce → Settings → Advanced → Webhooks) to push order data to the 3PL
Step 4: Set up carrier label creation
Shopify
- Shopify Shipping (built-in): purchase labels directly in Shopify admin from USPS, UPS, DHL, and Canada Post at discounted rates
- ShipStation: connects to all major carriers; negotiates rates based on your volume — often cheaper than Shopify Shipping for high-volume operations
- EasyShip: available on Shopify App Store; rate shops across 250+ carriers including international options
WooCommerce
- WooCommerce Shipping (built-in, powered by WooCommerce.com): USPS and DHL Express labels directly in the WooCommerce admin
- ShipStation plugin: connects to all major carriers from within ShipStation
- Easyship plugin: multi-carrier rate shopping directly in WooCommerce checkout and admin
BigCommerce
- ShipStation: rate shops all major carriers
- Easyship: native BigCommerce integration with 250+ carriers
Custom / Headless
import Shippo from 'shippo';
const shippo = Shippo(process.env.SHIPPO_API_KEY);
// Create a shipping label for a fulfilled order
async function createShippingLabel(params: {
warehouseName: string;
warehouseAddress: Address;
customerAddress: Address;
packageWeightOz: number;
packageDimensions: { lengthIn: number; widthIn: number; heightIn: number };
preferredService?: string;
}): Promise<{ trackingNumber: string; labelUrl: string }> {
const shipment = await shippo.shipment.create({
address_from: {
name: params.warehouseName,
street1: params.warehouseAddress.street1,
city: params.warehouseAddress.city,
state: params.warehouseAddress.state,
zip: params.warehouseAddress.zip,
country: 'US',
},
address_to: {
name: params.customerAddress.name,
street1: params.customerAddress.street1,
city: params.customerAddress.city,
state: params.customerAddress.state,
zip: params.customerAddress.zip,
country: params.customerAddress.country,
email: params.customerAddress.email,
},
parcels: [{
length: params.packageDimensions.lengthIn.toString(),
width: params.packageDimensions.widthIn.toString(),
height: params.packageDimensions.heightIn.toString(),
distance_unit: 'in',
weight: params.packageWeightOz.toString(),
mass_unit: 'oz',
}],
async: false,
});
const rate = params.preferredService
? shipment.rates.find(r => r.servicelevel.token === params.preferredService)
: shipment.rates.sort((a, b) => parseFloat(a.amount) - parseFloat(b.amount))[0];
const transaction = await shippo.transaction.create({
rate: rate.object_id,
label_file_type: 'PDF',
});
return {
trackingNumber: transaction.tracking_number,
labelUrl: transaction.label_url,
};
}Best Practices
- Use a shipping app (ShipStation or equivalent) before building custom warehouse tooling — ShipStation costs $9–$159/month depending on volume and handles pick lists, packing slips, label printing, and carrier rate shopping; this is almost always cheaper and faster than custom development
- Sort pick lists by bin location — routing pickers through the warehouse in aisle/shelf order reduces picking time by 15–25%
- Send tracking numbers immediately after label creation — not when the carrier scans the package; customers who get tracking numbers sooner submit fewer "where is my order" tickets
- Verify scans at pick time — ShipStation's Scan to Verify and similar features prevent wrong-item shipments; enable this as a required step, not optional
- Print labels in batches at end of day — for sub-100 orders/day, batching label printing improves printer efficiency; for 100+ orders/day, print labels as orders are packed
Common Pitfalls
| Problem | Solution |
|---|---|
| Order ships with wrong item | Enable barcode scan verification in ShipStation or your WMS before allowing label printing; do not allow manual override without manager approval |
| Tracking number not sent to customer | Ensure your shipping app is configured to automatically mark orders as fulfilled in your platform and trigger the platform's shipping confirmation email |
| 3PL receives wrong quantities in the order feed | Validate the webhook payload format against the 3PL's spec; test with a handful of orders before enabling for all |
| Fulfillment status drifts out of sync with carrier tracking | Use ShipStation's or EasyPost's tracking webhooks to update order status automatically when packages are scanned by the carrier |
Related Skills
- @shipment-tracking
- @returns-management
- @order-management-system
- @international-shipping
- @dropshipping-integration
{
"context": "Tests whether the agent uses the Shippo SDK correctly for carrier label creation, including proper SDK initialization, synchronous shipment creation, correct unit specification for package dimensions, rate selection by service level token, PDF label format, storing only the label URL (not binary), transitioning to the correct post-label status, and triggering customer notification at the right moment.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Uses Shippo SDK",
"max_score": 10,
"description": "shipping-label.ts imports and uses the 'shippo' package (e.g. import Shippo from 'shippo' or require('shippo')), not a generic HTTP client or a different carrier SDK"
},
{
"name": "Shippo initialized with API key",
"max_score": 8,
"description": "Shippo client is initialized with process.env.SHIPPO_API_KEY (not a hardcoded string)"
},
{
"name": "async: false on shipment create",
"max_score": 10,
"description": "The shippo.shipment.create() call includes async: false so rates are returned synchronously in the same response"
},
{
"name": "Dimensions in inches",
"max_score": 8,
"description": "Parcel dimensions are specified with distance_unit: 'in' (inches), not 'cm' or 'mm'"
},
{
"name": "Weight in ounces",
"max_score": 8,
"description": "Parcel weight is specified with mass_unit: 'oz' (ounces), not 'lb', 'g', or 'kg'"
},
{
"name": "Rate selected by servicelevel.token",
"max_score": 10,
"description": "Rate selection uses r.servicelevel.token === order.shipping_service (or equivalent) to match the order's preferred service level"
},
{
"name": "Rate fallback to rates[0]",
"max_score": 7,
"description": "If no rate matches the order's shipping_service, the code falls back to rates[0] rather than throwing an error"
},
{
"name": "Label file type is PDF",
"max_score": 7,
"description": "shippo.transaction.create() is called with label_file_type: 'PDF'"
},
{
"name": "Stores label URL not binary",
"max_score": 10,
"description": "The code stores transaction.label_url (the URL string) in the database, not the raw label bytes or a downloaded file"
},
{
"name": "Stores tracking_number and carrier",
"max_score": 8,
"description": "The fulfillment record is updated with both tracking_number (from transaction.tracking_number) and carrier (from rate.provider)"
},
{
"name": "Transitions to label_created",
"max_score": 7,
"description": "After label creation, the fulfillment status is updated to 'label_created', not 'shipped' or any other status"
},
{
"name": "Tracking notification at label_created",
"max_score": 7,
"description": "Customer tracking notification is sent/triggered at 'label_created' status (immediately after label creation), not at a later 'shipped' or carrier-scan event"
}
]
}
Shipping Label Creation and Carrier Integration
Problem/Feature Description
A growing direct-to-consumer brand ships roughly 500 packages per day from a single warehouse in Austin, TX. Their current process requires warehouse staff to log into a carrier portal, manually enter package dimensions, and copy-paste tracking numbers into the order system — a painful 3-minute-per-order process that often introduces errors. Customers also complain about not receiving tracking notifications until a day after their order ships.
The engineering team wants to automate label generation: as soon as a packed order is ready to ship, the system should call the carrier API, retrieve the right shipping rate, purchase a label, and immediately send the customer a tracking notification. The company uses multiple carriers (USPS, UPS, FedEx) and already stores the preferred service level on each order. The team wants to keep the database lean, so large label images should not be stored directly in the database.
Your task is to implement the shipping label creation module in TypeScript and write a brief architecture note explaining your approach.
Output Specification
Implement the following:
1. `shipping-label.ts` — Exports:
- A
createShippingLabel(fulfillmentId: string): Promise<string>function that creates a carrier label and returns the label URL - Any helper types or constants needed
2. `notify-customer.ts` — Exports:
- A
sendTrackingNotification(orderId: string, trackingNumber: string, carrier: string): Promise<void>stub function (implementation can be a console.log or placeholder, but the function signature and call site must be correct)
3. `label-architecture.md` — A short note (200–400 words) covering:
- Which carrier API/SDK you chose and why
- How the rate selection works when multiple rates are returned
- What gets persisted to the database and what does not
- When the customer tracking notification is triggered
Assume a db object is available globally. Package credentials should come from environment variables. Install any npm packages needed.
Input Files
The following context file shows the relevant data model. Extract it before beginning.
=============== FILE: inputs/fulfillment-schema.ts =============== export interface Fulfillment { id: string; order_id: string; status: string; picker_id?: string; tracking_number?: string; carrier?: string; label_url?: string; package_length_in: number; package_width_in: number; package_height_in: number; package_weight_oz: number; created_at: Date; updated_at: Date; }
export interface Order { id: string; order_number: string; customer_id: string; customer_email: string; shipping_service: string; // carrier service level token, e.g. "usps_priority", "ups_ground" shipping_address: { first_name: string; last_name: string; line1: string; city: string; state: string; zip: string; country: string; }; created_at: Date; }
// Environment variables available at runtime: // process.env.SHIPPO_API_KEY // process.env.WAREHOUSE_NAME // process.env.WAREHOUSE_ADDRESS // process.env.WAREHOUSE_CITY // process.env.WAREHOUSE_STATE // process.env.WAREHOUSE_ZIP
{
"context": "Tests whether the agent designs the fulfillment state machine with the correct set of statuses and transitions, wraps transitions in an atomic database transaction with an event audit log, implements barcode scan verification that checks both identifier types and quantity, records every scan, enforces full-pick verification before advancing status, and exposes the correct HTTP endpoint with appropriate error codes.",
"type": "weighted_checklist",
"checklist": [
{
"name": "All 9 fulfillment statuses",
"max_score": 10,
"description": "FulfillmentStatus type includes all of: 'awaiting_fulfillment', 'pick_pending', 'picking', 'picked', 'packing', 'packed', 'label_created', 'shipped', 'delivered'"
},
{
"name": "Correct valid transitions",
"max_score": 10,
"description": "VALID_TRANSITIONS (or equivalent) encodes the correct progression: awaiting_fulfillment→pick_pending, pick_pending→picking, picking→[picked,pick_pending], picked→packing, packing→packed, packed→label_created, label_created→shipped, shipped→delivered, delivered→[]"
},
{
"name": "Transition uses DB transaction",
"max_score": 10,
"description": "transitionFulfillment wraps the status update AND event insertion in a single database transaction (db.transaction or equivalent), so both writes are atomic"
},
{
"name": "Fulfillment event audit record",
"max_score": 10,
"description": "Each status transition inserts a record into a fulfillmentEvents (or equivalent) table/collection containing from_status, to_status, actor_id, and a timestamp"
},
{
"name": "Scan accepts barcode OR SKU",
"max_score": 10,
"description": "verifyPickScan accepts the scan as valid if the scanned value matches EITHER the product's barcode field OR the product's sku field — not just one of them"
},
{
"name": "Scan checks quantity match",
"max_score": 8,
"description": "verifyPickScan returns an error (not success) when pickedQuantity does not exactly match the expected line quantity"
},
{
"name": "Scan recorded in verification log",
"max_score": 10,
"description": "After a successful scan, a record is inserted into a pickVerifications (or equivalent) table with at minimum: fulfillment_id, order_line_id, scanned_barcode, picked_quantity, and a timestamp"
},
{
"name": "No manual scan override",
"max_score": 8,
"description": "No code path allows bypassing or overriding the barcode scan result — there is no flag or parameter to force-pass a failed scan"
},
{
"name": "Full-pick enforcement",
"max_score": 10,
"description": "markOrderFullyPicked (or equivalent) throws an error / refuses to advance to 'picked' unless the count of verified pick records equals the count of order lines"
},
{
"name": "HTTP scan endpoint method and path",
"max_score": 7,
"description": "A POST route at /api/fulfillment/:fulfillmentId/scan (or equivalent) is defined for the mobile scanner"
},
{
"name": "422 on failed scan",
"max_score": 7,
"description": "The scan endpoint returns HTTP 422 (Unprocessable Entity) when scan verification fails, not 400 or 500"
}
]
}
Warehouse Picking System — State Management and Scan Verification
Problem/Feature Description
A mid-sized e-commerce company is replacing its spreadsheet-based warehouse operations with a proper fulfillment system. The company processes around 200 orders per day and has had repeated problems with pickers grabbing the wrong items or skipping lines in an order, resulting in angry customers and costly re-ships. They also have no audit trail when disputes arise.
The engineering team has decided to build a TypeScript-based warehouse management backend. Your job is to implement the core picking module: a fulfillment status system and a barcode scan verification API that warehouse staff will use on their mobile scanners. The module must track every state change and every scan in the database so that operations managers can investigate any fulfillment dispute.
Output Specification
Implement the following in TypeScript source files in the current directory:
1. `fulfillment-state.ts` — A module that exports:
- A
FulfillmentStatustype (or enum) covering all stages of the fulfillment lifecycle from initial receipt through delivery - A
VALID_TRANSITIONSmap or equivalent structure that prevents illegal status jumps - A
transitionFulfillment(fulfillmentId, newStatus, actorId)function that safely updates the status
2. `pick-verification.ts` — A module that exports:
- A
verifyPickScan(fulfillmentId, orderLineId, scannedBarcode, pickedQuantity)function - A
markOrderFullyPicked(fulfillmentId, actorId)function - An Express route handler (or plain function) for the mobile scanner HTTP endpoint
3. `fulfillment-module-plan.md` — A brief design document (300–500 words) describing:
- The status lifecycle you chose and why
- How scan verification works and what checks are performed
- How the audit trail is maintained
- Any concurrency or error-handling considerations
Assume the existence of a db object with collections: db.fulfillments, db.fulfillmentEvents, db.orderLines, db.products, db.pickVerifications. You do not need to implement the database layer itself — stub it as needed.
Input Files
The following context file describes the existing order data schema. Extract it before beginning.
=============== FILE: inputs/order-schema.ts =============== // Existing order data types already in the codebase
export interface Order { id: string; order_number: string; customer_id: string; customer_email: string; shipping_address: { first_name: string; last_name: string; line1: string; city: string; state: string; zip: string; country: string; }; shipping_service: string; // e.g. "usps_priority", "ups_ground" created_at: Date; }
export interface OrderLine { id: string; order_id: string; product_id: string; product_name: string; sku: string; quantity: number; }
export interface Product { id: string; sku: string; name: string; barcode: string; }
export interface Fulfillment { id: string; order_id: string; status: string; picker_id?: string; tracking_number?: string; carrier?: string; label_url?: string; package_length_in?: number; package_width_in?: number; package_height_in?: number; package_weight_oz?: number; created_at: Date; updated_at: Date; }
{
"context": "Tests whether the agent generates pick lists sorted by bin location for efficient warehouse routing, includes all required PickListItem fields, generates batch pick lists correctly consolidated by SKU, and produces server-side PDF packing slips using pdfkit with the correct page format, margins, and required content sections.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Pick list sorted by bin_location",
"max_score": 10,
"description": "generatePickList results are ordered/sorted by the warehouse bin_location field (ascending), not by order ID or product name"
},
{
"name": "PickListItem includes barcode",
"max_score": 8,
"description": "Each pick list item includes a barcode field (the product barcode), not just SKU"
},
{
"name": "PickListItem includes binLocation",
"max_score": 8,
"description": "Each pick list item includes a binLocation (or bin_location) field representing the warehouse shelf location"
},
{
"name": "PickListItem includes all required fields",
"max_score": 8,
"description": "Pick list items include all of: orderLineId, orderId, sku, productName, quantity, binLocation, barcode"
},
{
"name": "Batch pick list aggregates quantity",
"max_score": 10,
"description": "generateBatchPickList uses SUM(quantity) or equivalent to aggregate total quantity per SKU across multiple orders"
},
{
"name": "Batch pick list groups order numbers",
"max_score": 8,
"description": "Batch pick list output includes the associated order numbers for each aggregated row (e.g. via STRING_AGG or joining order numbers)"
},
{
"name": "Uses pdfkit for PDF generation",
"max_score": 10,
"description": "packing-slip.ts imports and uses PDFDocument from the 'pdfkit' package (not puppeteer, html-pdf, jsPDF, or other PDF libraries)"
},
{
"name": "PDF uses LETTER size",
"max_score": 8,
"description": "PDFDocument is instantiated with size: 'LETTER'"
},
{
"name": "PDF uses correct margins",
"max_score": 8,
"description": "PDFDocument margins are set to { top: 50, left: 50, right: 50, bottom: 50 } (all four sides exactly 50)"
},
{
"name": "Packing slip includes Ship To section",
"max_score": 8,
"description": "Packing slip PDF includes a 'Ship To' section with customer name and shipping address (city, state, zip, country)"
},
{
"name": "Packing slip includes SKU per line",
"max_score": 8,
"description": "Each line item in the packing slip PDF includes the product SKU alongside the product name and quantity"
},
{
"name": "generatePackingSlip returns Buffer",
"max_score": 6,
"description": "generatePackingSlip returns a Promise<Buffer> (collects PDF chunks and resolves with Buffer.concat), not a file path or stream"
}
]
}
Warehouse Pick List and Packing Slip Service
Problem/Feature Description
A regional e-commerce fulfillment center handles both single-order and batch-order processing. The warehouse floor spans three aisles (A, B, C) with bin locations like "B2-07-3", and pickers currently receive poorly formatted printouts that send them back and forth across the warehouse. The operations director wants two improvements: first, a smarter pick list generator that groups routes efficiently; second, professionally formatted packing slips that can be printed server-side and physically placed in the box before sealing.
The tech lead has decided the packing slips must be generated on the backend (not in the browser) so they are reproducible and can be re-printed from the archive at any time. The team uses Node.js/TypeScript throughout. Your task is to implement both the pick list query logic and the packing slip generation service.
Output Specification
Implement the following TypeScript source files:
1. `pick-list.ts` — Exports:
- A
generatePickList(orderIds: string[])function that returns pick items for one or more orders - A
generateBatchPickList(orderIds: string[])function suitable for collecting multiple orders in a single warehouse pass
2. `packing-slip.ts` — Exports:
- A
generatePackingSlip(orderId: string): Promise<Buffer>function that produces a PDF document
3. `sample-output/` directory containing:
- `pick-list-sample.json` — A sample pick list output (with at least 3 items, realistic bin locations, realistic SKUs and barcodes)
- `batch-pick-list-sample.json` — A sample batch pick list output consolidating at least 2 orders
The TypeScript files should be complete enough to review the logic. Assume a db object is available globally with the same collections described in the schema below. Install any needed npm packages.
Input Files
The following schema file describes the data model. Extract it before beginning.
=============== FILE: inputs/schema.ts =============== export interface Order { id: string; order_number: string; customer_id: string; customer_email: string; shipping_address: { first_name: string; last_name: string; line1: string; city: string; state: string; zip: string; country: string; }; shipping_service: string; created_at: Date; }
export interface OrderLine { id: string; order_id: string; product_id: string; product_name: string; sku: string; quantity: number; }
export interface Product { id: string; sku: string; name: string; barcode: string; }
export interface WarehouseLocation { id: string; product_id: string; bin_location: string; // e.g. "A3-04-2" }
export interface Customer { id: string; name: string; email: string; }
{
"name": "finsi/order-fulfillment-workflow",
"version": "0.1.0",
"summary": "Pick-pack-ship workflows with barcode scanning and packing slip generation",
"skills": {
"order-fulfillment-workflow": {
"path": "SKILL.md"
}
}
}