{"id":74127,"plugin_id":"plugin_asdk_app_6ac087af1074819190936c23e8a440b8","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-31T06:10:34.208Z","digest":"357ca668c8c77f42e7fa765cd63af6b1ca95ab58cc63defcbae27b4ee6e376ea","against":null,"payload":{"description":"Run a Zid store's order fulfillment with its courier, fulfillment center or own drivers. Use for daily batches to preparing or ready, prep lists and waybills, tracking numbers and delivered updates, and reconciling a courier or fulfillment-center report against Zid orders, including cash on delivery.","included_files":[{"relative_path":"references/carriers.md","size_in_bytes":5220}],"name":"order-fulfillment","skill_md_contents":"---\nname: order-fulfillment\ndescription: Run a Zid store's order fulfillment with its courier, fulfillment center or own drivers. Use for daily batches to preparing or ready, prep lists and waybills, tracking numbers and delivered updates, and reconciling a courier or fulfillment-center report against Zid orders, including cash on delivery.\n---\n\n# Order fulfillment\n\nMoves orders through fulfillment and keeps Zid's order statuses in line with what\nthe courier or fulfillment center reports.\n\n## Ground rules\n\n- The merchant's explicit instructions take precedence over this skill.\n- Batches: show the full change list (a table when it covers more than a few\n  orders) and apply it after the merchant agrees. When a manage tool answers\n  `confirmation_required`, compare its plan with what the merchant approved: if\n  they match, repeat the call with its `plan_id`; if not, show the plan and ask again.\n- After writing, read the orders back and report what changed, what was skipped\n  and what failed, with the reason.\n- On a `429` answer, wait the seconds it names, then continue one call at a time.\n- Courier credentials (API keys, passwords, tokens) stay in the courier's portal\n  or the merchant's automation tool; when a step needs one, tell the merchant\n  where to enter it.\n- Refunds, payment status changes and shipment cancellations are done in the Zid dashboard.\n\n## Order statuses\n\n`new` → `preparing` → `ready` → `indelivery` → `delivered`. `cancelled` ends an\norder before delivery. Stores can add custom statuses\n(`zid_orders.list_custom_statuses`); bulk changes accept their codes.\n\n## 1. Scope the run\n\nSettle these before reading:\n\n- **Orders**: statuses, date range, payment status and shipping method.\n- **Carrier**: Zid Ship, a courier or fulfillment center with its own Zid app,\n  or the merchant's drivers. `zid_account.list_installed_apps` shows the apps.\n- **Who moves statuses**: look the carrier up in\n  [references/carriers.md](references/carriers.md). Where the carrier's own\n  connection moves statuses and adds tracking, this run reads and reconciles,\n  so the two writers stay out of each other's way.\n- **Pickup location**: `zid_inventory.list_locations`.\n\nDone when you can state the filter, the carrier, who moves statuses, and the location.\n\n## 2. Read the orders\n\n`zid_orders.list_orders` with `status`, `dateFrom` and `dateTo` (YYYY-MM-DD),\n`paymentStatus` and `perPage` 100, every page. For items and addresses call\n`zid_orders.get_order`; for the warehouse that fulfils each line call\n`zid_orders.get_fulfillment_inventories`.\n\nPrepaid orders ship once paid; cash-on-delivery orders are collected at the\ndoor. Put any other order (unpaid prepaid, missing address) on hold with the reason.\n\n## 3. Move a batch\n\n- **What `ready` sets off**: with Zid Ship, moving an order to `ready` sends the\n  request to the courier and issues the waybill; Zid Ship runs on the store's\n  wallet balance, so check it covers the batch. Some couriers' apps also book a\n  pickup at `ready`. Say this in the change list before the merchant approves a\n  move to `ready`.\n- **Many orders**: `zid_orders_manage.bulk_set_order_status` with `orderIds` (up\n  to 500) and `status`. Moving to `ready` can need `inventoryAddressId` (the\n  pickup location) and `packagesCount` (1 to 99); add them when the call asks.\n  It returns a `batchId`: read each order's result with\n  `zid_orders.get_bulk_action_status` and report failures one by one. Where bulk\n  changes are not available for the store, use\n  `zid_orders_manage.update_order_status` per order.\n- **Shipped with tracking**: `zid_orders_manage.update_order_status` with\n  `orderId`, `orderStatus` `indelivery`, `trackingNumber`, `trackingUrl`, and\n  `waybillUrl` when the merchant has one.\n- **Delivered**: the same action with `orderStatus` `delivered`.\n- **Notes for the team**: `zid_orders_manage.add_order_comment` (1 to 255\n  characters); a batch label: `zid_orders_manage.add_order_tag`.\n\nCancel or return an order only when the merchant asks for that specific order.\n\n## 4. Prep lists and waybills\n\n- **Prep list emailed by Zid**: `zid_orders_manage.export_prep_list` with\n  `statuses`, `dateFrom` and `dateTo`. It covers every order matching the\n  filters.\n- **Prep list in chat**: from step 2, one row per SKU with the total quantity,\n  then the lines of each order.\n- **Waybills**: `zid_shipping.get_waybills` with up to 100 `orderIds`, for any\n  carrier (`includeInvoice` true adds the invoice). Where bulk printing is not\n  available, call it once per order.\n\n## 5. Reconcile with the carrier\n\n1. Get the carrier's view: the report the merchant uploads (where to export it:\n   [references/carriers.md](references/carriers.md)), or for Zid Ship\n   `zid_shipping.list_shipments` (`dateFrom` and `dateTo` together, `pageSize`\n   up to 100; filter codes from `zid_shipping.list_shipment_filters`),\n   `zid_shipping.track_shipment` by `orderId`, and the cash couriers collected in\n   `zid_shipping.list_cod_collected`.\n2. Find the report's order-number and tracking-number columns by matching their\n   values against the Zid orders, not by the header names, and map its statuses\n   with the status map in [references/carriers.md](references/carriers.md).\n3. Match each shipment to an order by order number, then by tracking number.\n4. Put every order in scope in exactly one class:\n   - matched: statuses agree;\n   - not booked: in Zid, missing from the carrier;\n   - unknown: with the carrier, missing from Zid;\n   - behind: the carrier is further along than Zid (for example delivered while Zid shows `indelivery`);\n   - exception: the carrier reports a failed delivery, return, refusal, damage or loss;\n   - cash mismatch: collected amount differs from the order total in the same currency;\n   - stuck: no carrier update for longer than the merchant's limit (default 3 days).\n5. Offer the status updates for the behind class as one batch (step 3). Leave\n   exception orders at their last true status and list them for the merchant;\n   offer a custom status when the store has one for returns or failed deliveries.\n\nDone when every order in scope sits in one class and the counts add up to the total.\n\n## Output\n\n- **Batch**: counts per status before and after, then failures with the reason.\n- **Reconciliation**: a table of order, tracking number, Zid status, carrier\n  status, expected cash, collected cash and class, followed by the counts per\n  class.\n\nTo run this every day without a chat, use the `zid-ops` skill for a scheduled\njob, or the `zid-api` skill to build an app that reacts to order events.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}