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 installin 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_GroundUPS,FedEx_2DayFEX). 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
- Upload the plugin files to
/wp-content/plugins/weship-acs-sync-for-woocommerce, or install through the WordPress plugins screen. - If you plan to use the Print Jobs feature, run
composer installinside 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. - Activate the plugin through the ‘Plugins’ screen.
- 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.
- 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.
- Give the inbound webhook URLs shown on the settings page to your Advatix onboarding contact.
FAQ-e
-
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.
-
WooCommerce has no native order tags, so Weship tags are stored in the
_weship_acs_sync_tagsorder meta (editable in the order sidebar) or supplied via theweship_acs_sync_order_tagsfilter. -
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/fpdiandsetasign/fpdfComposer packages, which aren’t bundled with the plugin. Runcomposer installinside 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.
ContributorsTranslate “WSE ACS Sync for WooCommerce” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by 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 viawp_localize_script()instead of being echoed into inline<script>tags. No functional or visual change.
2.0.5
- Dropped the abandoned
setasign/fpdi-fpdfmeta-package in favor of depending directly onsetasign/fpdi(^2.6) andsetasign/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. Runcomposer updatein the plugin directory if you already havevendor/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_orderevent 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.