{"id":325373,"date":"2026-06-20T10:55:20","date_gmt":"2026-06-20T10:55:20","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/catalogsync\/"},"modified":"2026-08-07T01:28:57","modified_gmt":"2026-08-07T01:28:57","slug":"informedio-catalog-sync","status":"publish","type":"plugin","link":"https:\/\/mlt.wordpress.org\/plugins\/informedio-catalog-sync\/","author":23514378,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.13.0","stable_tag":"2.13.0","tested":"7.0.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Informedio Catalog Sync for WooCommerce","header_author":"Informedio","header_description":"Modular Data Architecture for automated product syncing and vendor catalog ingestion.","assets_banners_color":"a68282","last_updated":"2026-08-07 01:28:57","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.informedio.com\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":229,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.1.4":{"tag":"2.1.4","author":"wilcoxllc22","date":"2026-06-20 11:18:31"},"2.13.0":{"tag":"2.13.0","author":"wilcoxllc22","date":"2026-08-07 01:28:57"},"2.2.0":{"tag":"2.2.0","author":"wilcoxllc22","date":"2026-07-03 01:25:15"}},"upgrade_notice":{"2.13.0":"<p>After deploying: go to Catalog Sync \u2192 Tools \u2192 Database and click Update All to add the new repeat_count and last_seen_at columns to the logs table, and to seed the SanMar inventory endpoint. Inventory sync is now live for both S&amp;S Activewear and SanMar \u2014 visit Schedule to set your preferred interval or click Run Now to test immediately.<\/p>","2.4.0":"<p>After deploying: go to Catalog Sync \u2192 Add Products \u2192 Tools and click Run All to add the new SOAP credential columns to the vendors table. Enter your SanMar.com credentials on the Vendors tab under &quot;Web Services API.&quot; Re-run the Update step on any existing SanMar products so they get tagged with the vendor key meta the inventory executor needs. Port 8080 outbound may need to be whitelisted on shared hosting for the SOAP API calls.<\/p>","2.3.0":"<p>After deploying: go to Catalog Sync \u2192 Add Products \u2192 Tools and click Run All to add the new catalog_sync_interval and inventory_sync_interval columns to the vendors table. No data loss \u2014 dbDelta only adds columns. Automated scheduling requires an active Pro Developer or Agency license; manual sync is unaffected either way. Note the &quot;Import Console&quot; submenu is now labeled &quot;Add Products&quot; \u2014 same page, same URL, label only.<\/p>","2.2.0":"<p>After deploying: go to Catalog Sync \u2192 Tools and click Run All to add new join columns to vendor_endpoints and re-seed endpoint configurations. No data loss \u2014 dbDelta only adds columns. Existing S&amp;S filter profiles, mappings, and products are unaffected.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3605325,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3605325,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3604287,"resolution":"1544x500","location":"assets","locale":"","width":1044,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3604301,"resolution":"772x250","location":"assets","locale":"","width":2172,"height":724}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.1.4","2.13.0","2.2.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Import dashboard \u2014 the whole workflow in one place","2":"Filter builder \u2014 pick which brands and products to include","3":"Field mapper \u2014 line up supplier data with WooCommerce fields","4":"Sync progress \u2014 watch products come in as they process"}},"plugin_section":[],"plugin_tags":[39071,152463,21735,51032,286],"plugin_category":[45],"plugin_contributors":[268068],"plugin_business_model":[],"class_list":["post-325373","plugin","type-plugin","status-publish","hentry","plugin_tags-dropshipping","plugin_tags-inventory-sync","plugin_tags-product-import","plugin_tags-wholesale","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-wilcoxllc22","plugin_committers-wilcoxllc22"],"banners":{"banner":"https:\/\/ps.w.org\/informedio-catalog-sync\/assets\/banner-772x250.png?rev=3604301","banner_2x":"https:\/\/ps.w.org\/informedio-catalog-sync\/assets\/banner-1544x500.png?rev=3604287","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/informedio-catalog-sync\/assets\/icon-128x128.png?rev=3605325","icon_2x":"https:\/\/ps.w.org\/informedio-catalog-sync\/assets\/icon-256x256.png?rev=3605325","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Catalog Sync connects your WooCommerce store to wholesale vendor catalogs and keeps your products up to date \u2014 automatically.<\/p>\n\n<p>Point it at a vendor, download their catalog, pick what you want to sell, map the fields to WooCommerce, and hit sync. Products appear in your store as fully built variable products with images, sizes, colors, brands, and pricing. No CSV imports, no copy-paste, no manual data entry.<\/p>\n\n<p><strong>How it works:<\/strong><\/p>\n\n<ol>\n<li><strong>Connect<\/strong> \u2014 install a vendor, add your credentials, and test the connection from the Vendors page<\/li>\n<li><strong>Download<\/strong> \u2014 pull the latest catalog data from the vendor<\/li>\n<li><strong>Import<\/strong> \u2014 stage the raw data into organized tables<\/li>\n<li><strong>Filter<\/strong> \u2014 choose which brands, categories, or products to include<\/li>\n<li><strong>Map<\/strong> \u2014 assign vendor fields to WooCommerce product fields<\/li>\n<li><strong>Update<\/strong> \u2014 sync everything into WooCommerce as live products<\/li>\n<\/ol>\n\n<p>Each step runs independently from a single admin console. You control what gets imported, how fields are mapped, and when products sync.<\/p>\n\n<p><strong>Built for real catalogs:<\/strong><\/p>\n\n<ul>\n<li>Works with large supplier catalogs \u2014 100,000+ products, no timeouts or memory errors<\/li>\n<li>Creates WooCommerce variable products with color and size as selectable attributes<\/li>\n<li>Downloads and attaches product images, color-specific variation photos, and brand logos<\/li>\n<li>Preserves your manual edits \u2014 sync never overwrites categories you've assigned by hand<\/li>\n<li>Re-sync anytime \u2014 updates existing products instead of creating duplicates<\/li>\n<\/ul>\n\n<p><strong>Who is this for?<\/strong><\/p>\n\n<p>Built for shops selling wholesale apparel and promotional products. Uniform stores, team-wear shops, promotional product distributors, and print-on-demand businesses working with wholesale suppliers like S&amp;S Activewear and SanMar. If you spend hours a month copy-pasting product data from supplier spreadsheets into WooCommerce, this plugin replaces that entire workflow.<\/p>\n\n<p><strong>Free vs Pro:<\/strong><\/p>\n\n<p>The free plugin includes the full sync engine with S&amp;S Activewear \u2014 connect, download, filter, map, and sync products with no restrictions and no license required.<\/p>\n\n<p><a href=\"https:\/\/informedio.com\">Catalog Sync Pro<\/a> unlocks additional vendors (SanMar and more), automated background syncing on independent catalog and inventory schedules via Action Scheduler, and priority support. Pro licenses start at $99\/year with a 15-day free trial.<\/p>\n\n<h3>License<\/h3>\n\n<p>This plugin is licensed under the GPLv2 or later.<\/p>\n\n<h3>Credits<\/h3>\n\n<p>Developed by Informedio.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the WordPress Plugins menu<\/li>\n<li>Navigate to <strong>Catalog Sync \u2192 Vendors<\/strong> to install and configure your vendor connections<\/li>\n<li>Enter your vendor credentials, test the connection, and save<\/li>\n<li>Navigate to <strong>Catalog Sync \u2192 Add Products<\/strong> and walk through the tabs: Download \u2192 Import \u2192 Filter \u2192 Map \u2192 Update<\/li>\n<li>Pro users: visit <strong>Catalog Sync \u2192 Schedule<\/strong> to set up automated catalog and inventory sync intervals per vendor<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20replace%20woocommerce%20csv%20imports%3F\"><h3>Does this replace WooCommerce CSV imports?<\/h3><\/dt>\n<dd><p>Yes. Instead of exporting supplier data to CSV and importing it into WooCommerce, this plugin connects directly to the supplier and pulls products in automatically. No spreadsheets, no manual uploads.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20support%20large%20vendor%20catalogs%3F\"><h3>Does the plugin support large vendor catalogs?<\/h3><\/dt>\n<dd><p>Yes. The system uses stream-to-disk downloads, batch processing, and staged imports to handle catalogs with 100K+ SKUs.<\/p><\/dd>\n<dt id=\"does%20it%20support%20multiple%20vendors%3F\"><h3>Does it support multiple vendors?<\/h3><\/dt>\n<dd><p>Yes. The free plugin includes S&amp;S Activewear. Pro adds SanMar, with more suppliers on the roadmap.<\/p><\/dd>\n<dt id=\"can%20sync%20run%20automatically%3F\"><h3>Can sync run automatically?<\/h3><\/dt>\n<dd><p>Yes, on Pro. Each vendor gets two independent schedules \u2014 catalog (styles, images, descriptions, pricing) and inventory (stock only) \u2014 since inventory data changes far more often than catalog data. A scheduled catalog sync runs the complete pipeline: download, import, filter, map, and update. Inventory sync is lightweight \u2014 it queries the vendor API for current stock quantities and updates existing WooCommerce variations directly, without re-downloading or rebuilding the catalog. Both run automatically via Action Scheduler. You can also trigger an inventory sync manually from the Schedule page at any time. Manual sync from the Update tab always works regardless of license or schedule configuration.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20support%20woocommerce%20variations%3F\"><h3>Does the plugin support WooCommerce variations?<\/h3><\/dt>\n<dd><p>Yes. Products are grouped into variable products with color and size as variation attributes. Each SKU maps to one variation with the correct image.<\/p><\/dd>\n<dt id=\"will%20sync%20overwrite%20my%20manual%20product%20edits%3F\"><h3>Will sync overwrite my manual product edits?<\/h3><\/dt>\n<dd><p>Categories you assign manually are preserved on existing products. Sync only assigns categories when a product has none. Product names, descriptions, and prices follow the mapping profile.<\/p><\/dd>\n<dt id=\"does%20it%20support%20brand%20logos%3F\"><h3>Does it support brand logos?<\/h3><\/dt>\n<dd><p>Yes. Brand logos from the vendor catalog are attached to WooCommerce brand taxonomy terms automatically during sync.<\/p><\/dd>\n<dt id=\"what%20vendor%20formats%20are%20supported%3F\"><h3>What vendor formats are supported?<\/h3><\/dt>\n<dd><p>The plugin supports REST API (JSON) and SFTP\/CSV vendor connections through its module system. Each vendor module declares its own transport, endpoints, and data format.<\/p><\/dd>\n<dt id=\"is%20s%26s%20activewear%20really%20free%3F\"><h3>Is S&amp;S Activewear really free?<\/h3><\/dt>\n<dd><p>Yes. S&amp;S Activewear works fully with no license, no time limit, and no feature restrictions. Download, filter, map, sync, images, variations \u2014 everything works.<\/p><\/dd>\n<dt id=\"what%20does%20pro%20add%3F\"><h3>What does Pro add?<\/h3><\/dt>\n<dd><p>Pro unlocks additional vendors (SanMar is the first, with more planned), automated background syncing via Action Scheduler, and priority support. Free trial included.<\/p><\/dd>\n<dt id=\"how%20does%20licensing%20work%3F\"><h3>How does licensing work?<\/h3><\/dt>\n<dd><p>Purchase a Pro license at informedio.com. Enter your license key on the Catalog Sync Dashboard in your WordPress admin. The plugin validates it against our server and unlocks premium features. Licenses are cached locally and re-checked weekly.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.13.0<\/h4>\n\n<p>Inventory sync, log maturity, and vendor neutrality<\/p>\n\n<p>Inventory sync<\/p>\n\n<ul>\n<li>New: S&amp;S Activewear inventory executor \u2014 updates WooCommerce variation stock quantities via the REST API inventory endpoint, batching styles in a single request per sync<\/li>\n<li>New: SanMar inventory executor now records runs in sync_runs \u2014 inventory freshness, vendor health, and sync success rate on the dashboard are now accurate<\/li>\n<li>New: Manual \"Run now\" button on the Schedule page \u2014 trigger an inventory sync for any vendor without waiting for the next scheduled run<\/li>\n<li>New: 2-hour and 4-hour inventory sync intervals added to the scheduler<\/li>\n<li>Changed: SanMar WSDL URL moved from a hardcoded PHP literal into manifest.json \u2014 the executor reads it from the database like every other endpoint<\/li>\n<li>Changed: SanMar endpoint seeder now loops all manifest endpoints instead of reading only the first one<\/li>\n<\/ul>\n\n<p>Logging<\/p>\n\n<ul>\n<li>New: Log deduplication \u2014 consecutive identical messages for the same vendor increment a repeat count instead of inserting duplicate rows, keeping the log readable during persistent conditions<\/li>\n<li>New: Auto-escalation \u2014 a condition repeating 24+ times promotes from INFO to WARNING; 72+ times promotes to ERROR<\/li>\n<li>New: Repeat count badge (\u00d7N) displayed on log entries in the Tools &gt; Logs tab<\/li>\n<li>Changed: Vendor display names shown throughout the UI \u2014 logs, dashboard, and filter dropdowns show \"S&amp;S Activewear\" and \"SanMar\" instead of raw vendor keys<\/li>\n<li>Changed: Staging import log entries (CS-ST-001, CS-ST-002) now write in production instead of requiring debug mode<\/li>\n<\/ul>\n\n<p>Reliability<\/p>\n\n<ul>\n<li>New: Orphaned sync run cleanup \u2014 runs stuck in \"running\" status for 2+ hours are automatically marked \"abandoned\" during daily maintenance<\/li>\n<li>New: sync_runs retention pruning \u2014 old run history rows are deleted on the same daily schedule as log pruning<\/li>\n<li>Changed: sync_runs recorder (start_sync_run \/ finish_sync_run) is now public and sync_type-aware, used by both catalog and inventory pipelines through a single canonical writer<\/li>\n<li>Changed: Inventory sync status derived from actual outcome (complete \/ partial \/ failed) instead of being hardcoded to \"complete\"<\/li>\n<\/ul>\n\n<p>Vendor neutrality<\/p>\n\n<ul>\n<li>Fixed: Core staging executor no longer calls S&amp;S-specific functions by name \u2014 vendor-neutral utilities replace all six hardcoded call sites<\/li>\n<li>Fixed: 12 default-to-'ss' fallbacks removed from AJAX handlers, helpers, and UI \u2014 missing vendor key now returns an error or empty result instead of silently operating on S&amp;S data<\/li>\n<li>Fixed: is_free_vendor() consolidated to a single implementation in the license class \u2014 two diverged copies removed<\/li>\n<li>Fixed: Vendor identity lookup in both setup files now matches on vendor_key only (prepared statement) instead of also matching on the user-editable vendor_name column<\/li>\n<li>Fixed: file_type column name corrected in S&amp;S endpoint seeder \u2014 was writing to nonexistent file_format column, silently dropping the value<\/li>\n<li>Fixed: Dashboard vendor display name resolver reads from the vendors table with static caching instead of a hardcoded array<\/li>\n<li>Fixed: Dashboard vendor health avatar color uses clean vendor_key comparison instead of substring matching against the display label<\/li>\n<\/ul>\n\n<h4>2.12.0<\/h4>\n\n<p>Extension points for add-ons<\/p>\n\n<ul>\n<li>New: <code>catalogsync_after_catalog_build<\/code> action \u2014 fires after a successful catalog rebuild, allowing add-ons to post-process catalog rows (e.g., AI enrichment, translation, category mapping) before the executor pushes them to WooCommerce<\/li>\n<li>New: <code>catalogsync_dashboard_after_mid_row<\/code> action \u2014 fires between the mid row (chart + vendor health) and the bottom row (activity log + scheduled actions) on the dashboard, allowing add-ons to inject their own cards using the existing .cs-dash-card visual language<\/li>\n<li>Documentation: both hooks are documented via inline doc-blocks describing the contract, parameters, and stability guarantees for future add-on developers<\/li>\n<\/ul>\n\n<h4>2.11.0<\/h4>\n\n<p>Keyword indexing, guided imports, and clearer mapping<\/p>\n\n<ul>\n<li>New: Keyword index \u2014 comma-delimited columns (e.g. KEYWORDS) are parsed into individual terms after each import, so the Field Explorer shows real keywords like \"scrub\" or \"medical\" with accurate row counts instead of the raw cell<\/li>\n<li>New: Click-to-use in the Field Explorer now creates a filter rule automatically when none exists for that field, instead of only adding to an existing rule<\/li>\n<li>New: Replace-existing-data option on each Import card \u2014 clears that vendor's staging data before importing so re-downloading the same brand doesn't stack duplicate rows. Per-card, so importing a second brand with the option unchecked keeps the first brand's rows.<\/li>\n<li>New: Plain-language image field descriptions on the Map tab \u2014 each gallery image column now shows what it is (e.g. \"Worn by model, front \u2014 changes per color\" vs \"Main style photo \u2014 same for all colors\")<\/li>\n<li>New: Resizable preview panel on the Map tab \u2014 drag the divider to widen or shrink the live preview<\/li>\n<li>Fixed: Variation color images now attach correctly \u2014 the \"Variation Color Image\" role was restored to the Map tab and its save\/compile path, so per-color images map to each variation again (regression from v2.6.0)<\/li>\n<li>Fixed: Field Explorer values with surrounding quotes are now stripped before building the filter clause, so exact-match filters work as expected<\/li>\n<li>Fixed: Map tab JavaScript now cache-busts on version change, so UI updates load without a manual hard refresh<\/li>\n<\/ul>\n\n<h4>2.10.0<\/h4>\n\n<p>Field Explorer &amp; file structure overhaul<\/p>\n\n<ul>\n<li>New: Field Explorer panel on the Filter tab \u2014 select any field to see all distinct values with row counts, sorted by frequency or alphabetically<\/li>\n<li>New: Click-to-use \u2014 click any value in the Field Explorer to insert it into the active filter rule<\/li>\n<li>New: Search within field values for fast lookup in high-cardinality columns (e.g., COLOR_NAME, KEYWORDS)<\/li>\n<li>New: Browse Fields chip bar \u2014 explore any staging column without adding a rule first<\/li>\n<li>New: Resizable filter\/explorer panels \u2014 drag handle between the rule builder and Field Explorer to adjust column widths<\/li>\n<li>New: Field explore AJAX endpoint (catalogsync_filter_field_explore) returning grouped distinct values with counts<\/li>\n<li>Fixed: Saving SOAP credentials no longer wipes SFTP password and vice versa \u2014 blank password fields on update are now treated as \"unchanged\"<\/li>\n<li>Changed: Plugin file structure reorganized \u2014 classes to includes\/classes\/, tab templates to includes\/tabs\/, standalone AJAX handlers consolidated into includes\/ajax\/<\/li>\n<li>Changed: Filter JS version string now uses CATALOGSYNC_VERSION constant for automatic cache-busting on every release<\/li>\n<\/ul>\n\n<h4>2.9.0<\/h4>\n\n<p>Enhanced logging<\/p>\n\n<ul>\n<li>New: Structured error code system (CS-XX-NNN) across all log entries \u2014 every message carries a unique, greppable code for fast diagnosis<\/li>\n<li>New: Human-readable log messages \u2014 store admins can understand what happened without reading source code<\/li>\n<li>New: ERROR-CODES.md internal reference mapping all 72 error codes to their component, severity, and message<\/li>\n<li>Changed: Removed table names, filesystem paths, function names, hook names, and DB error strings from all log output and AJAX error responses<\/li>\n<li>Changed: Diagnostic context (vendor, endpoint, HTTP code, byte counts, row counts) preserved in structured JSON context column<\/li>\n<li>Changed: catalogsync_log_sync_summary rewritten with CS-UP-001 through CS-UP-101 codes and human-readable labels<\/li>\n<li>Changed: SFTP transport fail\/log methods no longer expose host:port in context \u2014 uses component tagging instead<\/li>\n<li>Changed: Download handler AJAX error responses no longer include internal table names or temp file paths<\/li>\n<li>Changed: flush_error_log source tags use generic component names instead of filenames<\/li>\n<li>Files touched: 20 files across ajax handlers, executors, transport, scheduler, tools, vendor setup, and debug-helpers<\/li>\n<\/ul>\n\n<h4>2.8.0<\/h4>\n\n<p>Dashboard<\/p>\n\n<ul>\n<li>New: KPI-driven operational dashboard replacing the pipeline wizard layout<\/li>\n<li>Five live KPI tiles: catalog coverage, inventory freshness, sync success rate, avg sync duration, in-stock rate \u2014 each with trend badges and graceful degradation when sync history is not yet available<\/li>\n<li>Vendor health cards with per-vendor metrics (catalog rows, last catalog sync, last inventory sync) and color-coded status bars<\/li>\n<li>Sync volume chart showing products created vs updated per day over 14 days<\/li>\n<li>Activity log displaying last 7 sync runs with status, row counts, and relative timestamps<\/li>\n<li>Scheduled actions panel with countdown timers, pulled live from Action Scheduler<\/li>\n<li>Contextual alert bar surfaces stale inventory or missing sync data automatically<\/li>\n<li>Dashboard data layer split into dedicated includes\/dashboard-kpis.php \u2014 all SQL queries isolated from the template for maintainability<\/li>\n<li>Dashboard styles split into dedicated assets\/catalogsync-dashboard.css scoped to .cs-dash<\/li>\n<li>All KPI functions are schema-defensive: check table and column existence via information_schema before querying, return nulls when data is unavailable<\/li>\n<\/ul>\n\n<h4>2.7.0<\/h4>\n\n<p>Tools page<\/p>\n\n<ul>\n<li>New: Logs tab \u2014 DB-backed log viewer with card-row layout, level\/vendor\/component filtering, sort (newest\/oldest\/errors first), relative timestamps, click-to-expand context JSON, per-row and bulk copy\/email actions<\/li>\n<li>New: Per-component schema version tracking on the Database tab \u2014 installed vs current version comparison with status badges, auto-migration triggered by schema file changes independent of the plugin version<\/li>\n<li>Settings tab Save button now functional \u2014 persists logging and performance configuration via AJAX<\/li>\n<\/ul>\n\n<p>Logging and diagnostics<\/p>\n\n<ul>\n<li>Download handler fully instrumented \u2014 all success and failure paths now log with vendor context, curl exit codes, URLs, and stderr<\/li>\n<li>Timestamps stored in WordPress local timezone instead of UTC<\/li>\n<li>Log retention pruning uses WordPress local time<\/li>\n<\/ul>\n\n<p>Vendor credentials<\/p>\n\n<ul>\n<li>Credential resolution simplified to canonical column reads (user_name, api_key) \u2014 removed fragile six-deep fallback chain that could silently fail on empty-string columns<\/li>\n<li>Vendor Setup save button disabled by default until test connection succeeds, preventing accidental credential wipes<\/li>\n<\/ul>\n\n<p>S&amp;S Activewear<\/p>\n\n<ul>\n<li>Fixed: inventory endpoint missing remote_url in manifest.json, causing download failures<\/li>\n<\/ul>\n\n<h4>2.5.0<\/h4>\n\n<p>Vendor management<\/p>\n\n<ul>\n<li>New: Vendors submenu \u2014 vendor management is now a standalone admin page with card-based layout, separate from the Add Products pipeline<\/li>\n<li>Each vendor gets a detail page with stats, credential forms, and connection log \u2014 replacing the old inline config card<\/li>\n<li>Vendors tab removed from Add Products; default tab is now Download<\/li>\n<li>\"Manage vendors\" button in the Add Products top bar links to the new Vendors submenu<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<p>Inventory sync<\/p>\n\n<ul>\n<li>New: SanMar inventory executor \u2014 updates WooCommerce variation stock quantities via the PromoStandards Inventory V2.0.0 SOAP API, querying only styles already in your store<\/li>\n<li>Scheduled inventory sync jobs now dispatch to vendor-specific executors via a keyed action hook, keeping the shared scheduler vendor-neutral<\/li>\n<li>Products created by catalog sync now carry _catalogsync_vendor_key postmeta so the inventory executor can identify which products belong to which vendor<\/li>\n<\/ul>\n\n<p>Vendor credentials<\/p>\n\n<ul>\n<li>Added SOAP API credential fields (Customer Number, Web Services Username, Web Services Password) to the Vendor Setup form for FTP-type vendors<\/li>\n<li>Three new columns on the vendors table: soap_customer_number, soap_username, soap_password<\/li>\n<li>SOAP credentials are separate from SFTP credentials per SanMar's integration guide<\/li>\n<\/ul>\n\n<p>Admin UI<\/p>\n\n<ul>\n<li>Download and Import tabs now use a compact two-column tile grid instead of full-width stacked cards<\/li>\n<li>Removed progress bars and log boxes from Download and Import tiles \u2014 status feedback is now an inline text label per tile<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<p>Scheduling<\/p>\n\n<ul>\n<li>New Schedule submenu \u2014 automated catalog and inventory sync on independent per-vendor intervals, gated to Pro Developer and Agency tiers<\/li>\n<li>Scheduled catalog sync now runs the complete pipeline (download, import, filter, map, update) instead of only the final sync step, so automated runs pull fresh vendor data rather than re-syncing stale staging data<\/li>\n<li>Download logic for FTP and API vendors extracted into reusable functions shared by both manual and scheduled sync<\/li>\n<li>Inventory-only scheduling can be configured and will fire on schedule, but its lightweight executor has not shipped yet in this release<\/li>\n<\/ul>\n\n<p>Admin UI<\/p>\n\n<ul>\n<li>Renamed \"Import Console\" submenu to \"Add Products\"<\/li>\n<\/ul>\n\n<p>For the full changelog, see <a href=\"changelog.txt\">changelog.txt<\/a>.<\/p>","raw_excerpt":"Sync wholesale supplier catalogs into WooCommerce automatically. Works with S&amp;S Activewear (free) and SanMar (Pro). Products, inventory, prices, a &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/325373","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=325373"}],"author":[{"embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wilcoxllc22"}],"wp:attachment":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=325373"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=325373"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=325373"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=325373"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=325373"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=325373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}