Title: WSE ACS Sync for WooCommerce
Author: advatix
Published: <strong>September 29, 2026</strong>
Last modified: September 29, 2026

---

Search plugins

![](https://s.w.org/plugins/geopattern-icon/advatix-order-sync-acs-woocommerce.svg)

# WSE ACS Sync for WooCommerce

 By [advatix](https://profiles.wordpress.org/advatix/)

[Download](https://downloads.wordpress.org/plugin/advatix-order-sync-acs-woocommerce.2.0.8.zip)

 * [Details](https://wordpress.org/plugins/advatix-order-sync-acs-woocommerce/#description)
 * [Reviews](https://wordpress.org/plugins/advatix-order-sync-acs-woocommerce/#reviews)
 *  [Installation](https://wordpress.org/plugins/advatix-order-sync-acs-woocommerce/#installation)
 * [Development](https://wordpress.org/plugins/advatix-order-sync-acs-woocommerce/#developers)

 [Support](https://wordpress.org/support/plugin/advatix-order-sync-acs-woocommerce/)

## Description

WSE ACS Sync for WooCommerce connects your WooCommerce store to the Advatix Order
Management System (ACS) so orders flow to your fulfillment operation automatically
and shipment updates flow back to your store.

**Store to ACS**

 * Orders are sent to ACS when they reach the Processing status (not configurable).
 * Cancelled WooCommerce orders are cancelled in ACS.
 * Optional tag filter: only sync orders carrying a required tag.
 * Weship tags on an order drive fulfillment options: `IcePack`, `shipdate-YYYYMMDD`,`
   customerdob-YYYYMMDD`, `insurance-<amount>`, subscription plan tags, and ship-
   method tags — see the static reference tables below.
 * Optional order delay: queue orders and let the retry scheduler send them, on 
   a configurable interval (5, 10, 15, 20, 25, 30, 45 or 60 minutes).
 * Automatic retry of failed syncs (up to 5 attempts) plus a manual “Sync Order”/“
   Cancel Order” action on the plugin’s Orders page.
 * Orders are automatically (re)sent to ACS when their shipping/billing address,
   Weship tags, or line items are edited while still Processing — including orders
   that already failed all 5 attempts, since the edit may be exactly what fixes 
   it. Nothing is resent if the edit didn’t actually change what would be sent.
 * Optional ACS 800 Program (CCP) mode: routes orders through the CCP order feed
   instead, which returns a shipping label and packing slip URL for each order.
 * Saving the Settings tab verifies your Base URL / API Key / Account ID against
   ACS and registers (or updates) this store’s channel there. A failed verification
   discards the save and shows an error instead of silently storing unverified credentials.

**Orders and Print Jobs pages**

The plugin adds a top-level “WSE ACS Sync for WooCommerce” admin menu (not nested
under WooCommerce) with dedicated Orders and Print Jobs pages:

 * Orders: search, sort and paginate orders, see sync/cancel status and weather 
   hold at a glance, view the raw API log for any order, manually sync or cancel
   an order, and open the shipping label / packing slip / tracking link when the
   800 Program returned one.
 * Print Jobs: select orders on the Orders page and create a bulk “Print Shipping
   Labels” or “Print Packing Slips” job, which merges the individual PDFs into a
   single downloadable file (requires `composer install` in the plugin directory—
   see Installation).

**Settings page tabs**

 * Settings: API connection, tag filter, order delay, retry scheduler and 800 Program(
   CCP) configuration.
 * Ship Methods: static reference table of order tag  ACS ship method codes (e.g.`
   UPS_Ground`  `UPS`, `FedEx_2Day`  `FEX`). Not configurable.
 * Order / CCP Tags: static reference tables of the fulfillment and 800 Program 
   order tags (ice pack, customer DOB, insurance, subscription plan, product type,
   etc). Not configurable.
 * Inbound Webhooks: the REST URLs to give to your Advatix onboarding contact.
 * Logs: recent outbound/inbound API activity.

**ACS to Store**

Secure REST endpoints (authenticated with your API key and account ID) receive updates
from ACS:

 * Shipment/status updates: order is marked completed and the carrier, tracking 
   number and tracking URL are stored on the order and shared with the customer 
   as an order note.
 * Inventory updates: stock levels are reset by SKU.
 * Weather hold notifications: recorded on the order with an order note.
 * Paginated product list (`GET /products`): lets ACS pull your catalog using the
   same ApiKey/AccountId headers, instead of separate WooCommerce REST API keys.

**For developers**

 * `weship_acs_sync_order_payload` — filter the outbound (standard feed) order payload.
 * `weship_acs_sync_ccp_order_payload` — filter the outbound 800 Program (CCP) order
   payload.
 * `weship_acs_sync_ccp_order_item` — filter a single CCP order line item (product
   type, alcohol %, bottle size, weight).
 * `weship_acs_sync_order_tags` — supply order tags programmatically.
 * `weship_acs_sync_find_order` — resolve custom order numbers (e.g. sequential 
   order number plugins).

This plugin communicates with the ACS API service configured in the plugin settings.
Order, customer and product data required for fulfillment (names, addresses, emails,
phone numbers, SKUs, quantities, prices) is transmitted to that service. See Advatix’s
privacy policy at https://xpdel.com/privacy-policy.html.

## Installation

 1. Upload the plugin files to `/wp-content/plugins/weship-acs-sync-for-woocommerce`,
    or install through the WordPress plugins screen.
 2. If you plan to use the Print Jobs feature, run `composer install` inside the plugin
    directory to fetch the PDF-merge libraries (setasign/fpdi and setasign/fpdf). This
    is optional — the rest of the plugin works without it.
 3. Activate the plugin through the ‘Plugins’ screen.
 4. Go to the “WSE ACS Sync for WooCommerce” admin menu and enter your ACS Base URL,
    API Key and Account/Client ID. These must already be live/valid — saving verifies
    them against ACS and registers this store’s channel there, and the save is rejected
    if verification fails.
 5. If your account uses the 800 Program (CCP), enable it under “800 Program (CCP)”
    in Settings and fill in the Client Code and Client Facility Code.
 6. Give the inbound webhook URLs shown on the settings page to your Advatix onboarding
    contact.

## FAQ

### Does this plugin require WooCommerce?

Yes. WooCommerce 6.0 or newer must be installed and active.

### Is HPOS (High-Performance Order Storage) supported?

Yes, the plugin declares HPOS compatibility and works with both legacy and HPOS 
order storage.

### Where do order tags come from?

WooCommerce has no native order tags, so Weship tags are stored in the `_weship_acs_sync_tags`
order meta (editable in the order sidebar) or supplied via the `weship_acs_sync_order_tags`
filter.

### What data is sent to ACS?

Only what is needed to fulfill the order: recipient and billing name/address/email/
phone, order number, items (SKU, quantity, price), shipping notes and Weship tags.

### What is the 800 Program (CCP)?

It’s an alternate ACS order feed (`/order/v2/process_order`) used by some accounts
instead of the standard order feed. Unlike the standard feed, its response can include
a shipping label and packing slip URL for the order, which the Orders and Print 
Jobs pages can then use.

### Why does Print Jobs say the PDF merge library is missing?

The Print Jobs feature merges PDFs with the `setasign/fpdi` and `setasign/fpdf` 
Composer packages, which aren’t bundled with the plugin. Run `composer install` 
inside the plugin directory to install them.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“WSE ACS Sync for WooCommerce” is open source software. The following people have
contributed to this plugin.

Contributors

 *   [ advatix ](https://profiles.wordpress.org/advatix/)

[Translate “WSE ACS Sync for WooCommerce” into your language.](https://translate.wordpress.org/projects/wp-plugins/advatix-order-sync-acs-woocommerce)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/advatix-order-sync-acs-woocommerce/),
check out the [SVN repository](https://plugins.svn.wordpress.org/advatix-order-sync-acs-woocommerce/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/advatix-order-sync-acs-woocommerce/)
by [RSS](https://plugins.trac.wordpress.org/log/advatix-order-sync-acs-woocommerce/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 2.0.8

 * Renamed the plugin from “Weship ACS Sync for WooCommerce” to “WSE ACS Sync for
   WooCommerce” (display name only). The plugin folder/slug, text domain, class 
   prefixes, function/constant prefixes, option keys, database tables, and REST 
   namespace are unchanged, consistent with the 2.0.4 rename.

#### 2.0.6

 * Moved every admin-screen `<script>`/`<style>` block out of inline PHP output 
   and into properly registered/enqueued files (`wp_enqueue_script()`/`wp_enqueue_style()`,`
   admin_enqueue_scripts`), each loaded only on the specific admin screen that needs
   it. Dynamic values (the AJAX nonce, admin-ajax URL, and translatable strings 
   on the Orders page) are passed via `wp_localize_script()` instead of being echoed
   into inline `<script>` tags. No functional or visual change.

#### 2.0.5

 * Dropped the abandoned `setasign/fpdi-fpdf` meta-package in favor of depending
   directly on `setasign/fpdi` (^2.6) and `setasign/fpdf` (^1.9), which it merely
   bundled together. No functional change — the same FPDI/FPDF classes are used 
   for the Print Jobs PDF merge, just without a discontinued middleman package. 
   Run `composer update` in the plugin directory if you already have `vendor/` installed.
 * Updated “Tested up to” to WordPress 7.0.

#### 2.0.4

 * Renamed the plugin from “Weship Woocommerce – ACS Sync” to “Weship ACS Sync for
   WooCommerce” to comply with WordPress.org’s plugin guidelines and Automattic’s
   WooCommerce trademark policy, which prohibit fusing the WooCommerce mark into
   a product’s own brand name (the required pattern is “[Product Name] for WooCommerce”).
   The plugin folder/slug, text domain, class prefixes, option keys, database tables,
   and REST namespace are unchanged.
 * Replaced the readme’s link to the Advatix marketing homepage with a direct link
   to Advatix’s actual privacy policy (https://xpdel.com/privacy-policy.html).

#### 2.0.3

 * Fixed: an order skipped for a tag-driven reason (CCP enabled with no valid CCP
   tag, or the required-tag filter not matched) never retried even after the order
   was edited to add the correct tag — maybe_resync_on_update() treated every “skipped”
   status as permanently frozen, alongside the genuinely permanent “No Fulfillment
   Required” (virtual/downloadable order) skip. It now re-evaluates the same eligibility
   rules maybe_sync_order() uses whenever a previously-skipped order is saved again,
   and proceeds with the send (or queues it, if Order Delay is on) the moment it’s
   no longer skip-eligible — while orders that are still skipped for a genuinely
   permanent reason correctly stay that way.

#### 2.0.2

 * Fixed: on stores using WooCommerce’s High-Performance Order Storage (HPOS), the
   Orders page’s CCP-tag filter, weather-hold filter and meta-based column sorting(
   Customer/Sync Status/Weather Hold) all queried the legacy wp_posts/wp_postmeta
   tables directly via get_posts()/get_post_meta() — under HPOS, orders live in 
   wp_wc_orders/wp_wc_orders_meta instead, so those queries always returned zero
   rows. In practice this meant a CCP-enabled store on HPOS would never show ANY
   order in the Orders list, no matter how validly tagged, and sorting by those 
   columns would hide every order too. Fixed by routing meta-based order lookups
   through wc_get_orders() with ‘meta_query’ (supported natively by WooCommerce’s
   OrdersTableQuery under HPOS) instead of get_posts(), with the previous get_posts()
   behaviour kept for stores still on the legacy posts-based storage.

#### 2.0.1

 * Fixed: 800 Program (CCP) settings (enabled, ship-only mode, email/label/packing-
   slip flags, client facility code) were silently discarded whenever they were 
   configured on the very first Settings save — sanitize() force-reset them to off/
   empty before the connection was even verified in that same request. This also
   meant the CCP fields never reached ACS’s addChannel request on the first save(
   build_channel_payload() only includes isRateEnabled/isEmailEnabled/isLabelEnabled/
   isPackingSlipEnabled/facilityCode when ccp_enabled is ‘yes’). The existing “discard
   the whole save if the ACS connection can’t be verified” safeguard already covers
   bad credentials, so CCP can now be configured in the same save as the initial
   API connection.

#### 2.0.0

 * Renamed the plugin from “Advatix OMS – Weship” to “Weship Woocommerce – ACS Sync”—
   new folder/slug (`weship-woocommerce-acs-sync`), class prefix (`Weship_ACS_Sync_`),
   option/meta key prefix (`weship_acs_sync_` / `_weship_acs_sync_`), database tables,
   and REST namespace (`weship-acs-sync/v1` — inbound webhook URLs change, update
   them with your ACS onboarding contact).
 * Existing settings, per-order sync/tag/tracking/weather-hold meta, and the logs/
   print-jobs tables are migrated automatically to the new names the first time 
   this version runs — no data is lost, but the site’s active plugin list will show
   this as a new plugin that needs activating (the old one will show as missing/
   inactive since its folder is gone).

#### 1.8.0

 * Fixed: the Sync Status column always showed “Pending” regardless of the actual
   outcome, even for a manual sync, an order update, or a fresh order. Root cause:
   sync_order()/queue_order()/cancel_order() call $order->save(), which fires woocommerce_update_order—
   the same hook the update-resync feature listens on. That nested call re-fetched
   the order and could see a not-yet-consistent status/hash, read it as “changed”,
   and immediately overwrite the status just set (usually back to “pending”), on
   every single sync/cancel. Fixed with a re-entrancy guard so that hook no longer
   fires while we’re already writing our own result.

#### 1.7.0

 * Fixed: the retry scheduler’s recurring WP-Cron event could go missing (e.g. if
   it was never scheduled, or was cleared) and nothing re-created it, leaving Order
   Delay’s queue stuck in “Pending” forever. The plugin now checks on every load
   and re-schedules it if missing.

#### 1.6.0

 * Fixed: Order Delay was being bypassed. Both the initial sync and the update-resync
   path now correctly queue the order (status “Pending”) instead of sending immediately
   when Order Delay is enabled — the request goes out on the next retry scheduler
   run instead.
 * Queuing an order under Order Delay now writes a log entry (event create_order/
   ccp_save_order, status “queued”, with the payload that will be sent) — visible
   in the Logs tab and the Orders page “View Logs” modal before the scheduler actually
   sends it.
 * Removed the “ACS” column from the WooCommerce Orders list — use the Orders page
   under the Weship Woocommerce – ACS Sync admin menu instead.
 * Removed the “Sync to ACS now” button from the order edit screen’s meta box — 
   sync/cancel/logs are now only on the plugin’s own Orders page.
 * Added a “Show/Hide last response” toggle in the order edit screen’s meta box 
   for the sync message and attempt count, instead of always showing them.

#### 1.5.0

 * Added a “Weship Woocommerce – ACS Sync” tab on the product edit screen (and the
   same 4 fields per variation) for Product Type, CCP Product Type, Alcohol % and
   Bottle Size — the 4 values sent per line item in the 800 Program order feed. 
   Previously these required adding raw custom fields by hand.
 * A blank field on a variation now falls back to the parent product’s value.

#### 1.4.0

 * Orders are now re-sent to ACS (same endpoint as the initial sync) whenever their
   address, Weship tags, or line items change while still Processing — for synced,
   pending AND failed orders (including ones that exhausted all 5 attempts), since
   the edit may be exactly what fixes it. Detected via a hash of the last-attempted
   outbound payload, so unrelated order saves (including our own) don’t trigger 
   redundant resends. Logged as a distinct `update_order` event when resyncing an
   already-synced order, and a failed update resync no longer flips an already-synced
   order back to pending/failed.

#### 1.3.0

 * Added a paginated products endpoint (`GET /wp-json/weship-acs-sync/v1/products`),
   authenticated with the same ApiKey/AccountId headers as the other inbound endpoints—
   no separate WooCommerce REST API keys needed. Supports page, per_page (max 100),
   search, status and sku query params.
 * Listed the new endpoint on the Inbound Webhooks tab alongside the existing webhook
   URLs.
 * Added a collapsible sample cURL command for each Inbound Webhooks row (Account
   ID is real, API key is a placeholder).
 * Updated the “Order status / tracking” and “Inventory update” sample payloads 
   to the real ACS request shapes.
 * Order status / tracking now records a separate tracking entry and order note 
   per shipped box (subOrdersList item), so multi-box shipments show multiple trackings
   on the order instead of just the last one.

#### 1.2.0

 * The log table now records the URL called (or REST route hit, for inbound webhooks)
   alongside the existing request/response bodies.
 * The Logs tab and the Orders page “View Logs” modal now show the URL and a “View”
   link to inspect the full request/response bodies (pretty-printed JSON) for every
   entry.
 * Existing installs pick up the new “url” log column automatically on the next 
   page load, no reactivation needed.
 * Removed the “Sync on order status” display row from Settings (orders always sync
   on Processing; this was already not configurable).
 * The Order Tag input is now hidden until “Fulfillment Tags Configuration” is checked.
 * The 800 Program (CCP) is never enabled on the very first-ever settings save, 
   even if its checkboxes were submitted checked — it must be turned on in a deliberate
   follow-up save once the base connection is confirmed working.
 * Fixed: the channel registration’s “channelName” field used the Account/Client
   ID instead of the WordPress site title.
 * Fixed: the Logs tab’s request/response detail view showed “[object Object]” instead
   of the JSON body — jQuery’s `.data()` was auto-parsing the JSON-looking data 
   attribute into an object; now read via `.attr()` instead.

#### 1.1.0

 * Added a dedicated top-level admin menu, no longer nested under WooCommerce.
 * Added an Orders page: search, sort, paginate, view logs, manual sync/cancel, 
   shipping label / packing slip / tracking links.
 * Added a Print Jobs page and bulk PDF merge for shipping labels and packing slips.
 * Added optional ACS 800 Program (CCP) order flow with its own settings section.
 * Split the Settings page into tabs: Settings, Ship Methods, Order / CCP Tags, 
   Inbound Webhooks, Logs.
 * Ship-method tags and order/CCP tags are now static reference tables, not DB-configurable.
 * Removed the “sync on order status” option — orders always sync on Processing.
 * The retry/order-delay interval is now configurable (5–60 minutes) instead of 
   a fixed 5 minutes, and takes effect immediately on save.
 * Saving Settings now verifies your API credentials and registers/updates this 
   store’s channel with ACS. If that verification fails, the save is discarded and
   an error is shown — fix your credentials and save again.
 * Added the remaining CCP account fields: Email/Label/Packing-slip enabled toggles.
 * Reorganized the Settings form fields and grouping for clarity.
 * Channel Name is no longer a field — it’s always the WordPress site title. Channel
   Key was removed — the Account/Client ID is used as the channel identifier.

#### 1.0.0

 * Initial release: order sync, cancellation, retry scheduler, tag-driven fulfillment
   options, inbound shipment/tracking, inventory and weather-hold webhooks, order
   screen integration and logs.

## Meta

 *  Version **2.0.8**
 *  Last updated **1 day ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 5.8 or higher **
 *  Tested up to **7.0.6**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [fulfillment](https://wordpress.org/plugins/tags/fulfillment/)[OMS](https://wordpress.org/plugins/tags/oms/)
   [order management](https://wordpress.org/plugins/tags/order-management/)[shipping](https://wordpress.org/plugins/tags/shipping/)
   [woocommerce](https://wordpress.org/plugins/tags/woocommerce/)
 *  [Advanced View](https://wordpress.org/plugins/advatix-order-sync-acs-woocommerce/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/advatix-order-sync-acs-woocommerce/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/advatix-order-sync-acs-woocommerce/reviews/)

## Contributors

 *   [ advatix ](https://profiles.wordpress.org/advatix/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/advatix-order-sync-acs-woocommerce/)