Woo Stock Sync from CSV releases
Automatically sync WooCommerce product stock from a CSV URL on a scheduled basis.
by 3AG · github.com/3agapp/woo-stock-sync-from-csv · website
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/3agapp/woo-stock-sync-from-csv/releases/download/v1.4.13/woo-stock-sync-from-csv-1.4.13.zipReadme
=== Woo Stock Sync from CSV === Contributors: 3ag Tags: woocommerce, stock, inventory, csv, sync, automation Requires at least: 5.8 Tested up to: 6.4 Requires PHP: 7.4 WC requires at least: 5.0 WC tested up to: 8.0 Stable tag: 1.4.13 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html
Automatically sync WooCommerce product stock from a CSV URL on a scheduled basis.
== Description ==
Woo Stock Sync from CSV is a premium WordPress plugin that automatically synchronizes your WooCommerce product stock levels from a CSV file hosted at any URL.
Key Features:
- Automatic Sync - Schedule stock updates from every 5 minutes to weekly
- Large Catalog Support - Optimized batch processing for 4000+ products
- Custom Column Mapping - Map any CSV column to SKU and quantity fields
- Auto Delimiter Detection - Supports comma, semicolon, tab, and pipe delimiters
- Missing SKU Actions - Choose what happens when products are not in CSV (ignore, set to 0, or make private)
- Watchdog Cron - Automatic recovery if scheduled sync stops working
- Detailed Logs - Complete history of all sync operations with statistics
- Modern UI - Clean, intuitive admin interface with real-time feedback
- SSL Options - Support for self-signed certificates
- HPOS Compatible - Works with WooCommerce High-Performance Order Storage
Requirements:
- WordPress 5.8 or higher
- WooCommerce 5.0 or higher
- PHP 7.4 or higher
- Valid license key from 3AG
== Installation ==
- Upload the plugin files to
/wp-content/plugins/woo-stock-sync-from-csv - Activate the plugin through the 'Plugins' screen in WordPress
- Go to Stock Sync → License to activate your license key
- Configure your CSV URL and column mappings in Stock Sync → Settings
- Enable scheduled sync or run a manual sync from the Dashboard
== Frequently Asked Questions ==
= What CSV format is supported? =
The plugin supports standard CSV files with headers. Delimiters (comma, semicolon, tab, pipe) are automatically detected.
= How do I get a license key? =
Purchase a license at https://3ag.app/products/woo-stock-sync-from-csv
= Can I sync stock for variable products? =
Yes, the plugin supports both simple products and product variations. Each variation should have its own SKU in the CSV.
= What happens if a product SKU is not found in the CSV? =
You can configure this in Settings. Options include: ignore (keep current stock), set stock to 0, or make the product private (and restore when it returns).
== Changelog ==
= 1.4.13 =
- Fixed: Severe MySQL CPU overload on large stores caused by overlapping stock syncs. The old "is running" guard was a 30-minute transient that expired mid-sync, so every cron tick could launch another full sync on top of one already running, stacking up long-running SKU-lookup queries. Replaced with a real single-run lock (MySQL GET_LOCK, with an atomic wp_options fallback) that spans the entire sync and is shared by the scheduled, manual, and any other entry points. The lock auto-releases if the process dies, so it can never get stuck.
- Added: Wall-clock runtime cap (default 20 minutes, filterable via
wssc_max_runtime) replacingset_time_limit(0), so a single run can no longer execute for hours. A time-capped run logs a warning and finishes the remaining rows on the next run (missing-SKU zero/private actions are skipped on capped runs to avoid acting on an incomplete view). - Performance: The per-batch SKU lookup now resolves SKUs through the indexed
skucolumn of the HPOSwc_product_meta_lookuptable (falling back to the legacy postmeta query only when that table is absent), eliminating the unindexedwp_postmeta.meta_value IN (...)scan and its triple self-join. - Performance: The store-wide
wc_delete_product_transients()cache flush now runs once per sync instead of once per 100-row batch, and thewc_product_meta_lookupexistence check is detected once per request instead of on every product update.
= 1.4.12 =
- Fixed: When the same SKU was used by more than one product (e.g. multilingual duplicates from WPML/Polylang), only one product was updated per sync and the others kept their old stock. Sync now updates every product carrying the SKU, in both the CSV-matched batch path and the "Set missing SKUs to 0" path.
- Changed: Internal —
wssc_privatized_productsnow stores a list of product IDs per SKU. Old single-ID entries are still read for backward compatibility.
= 1.4.11 =
- Added: Debug page (Stock Sync → Debug) showing per-SKU values across the CSV, postmeta, HPOS lookup table, and the WooCommerce product API. Includes per-product "Clear caches" and "Force update to CSV value" actions.
= 1.4.10 =
- Fixed: Sync skipped products when
_stockpostmeta and the HPOSwc_product_meta_lookuptable had drifted out of sync, leaving the admin display unchanged. Sync now compares against both sources and repairs drifted rows automatically.
= 1.4.8 =
- Version bump
= 1.4.7 =
- Fixed: Cron jobs not rescheduled after plugin auto-update (watchdog and sync stopped)
- Fixed: after_install not detecting plugin during auto-updates/bulk updates
- Added: Boot-time cron recovery on every page load as safety net
= 1.1.3 =
- Fixed: JavaScript error when viewing log details (duration.toFixed)
= 1.1.2 =
- Fixed: License now persists when plugin is deactivated/reactivated
- Fixed: License now persists when plugin is updated
- License deactivation only happens when user explicitly clicks "Deactivate License"
= 1.1.1 =
- Added manual "Check for Updates" button in License page
- Added one-click "Update" button when new version available
- Improved update UI with version info display
= 1.2.9 =
- Refactored: DRY - Cron intervals now defined once and shared across plugin
- Refactored: DRY - Stats array defined once via get_default_stats() method
- Fixed: Deprecated current_time('timestamp') replaced with time()
- Fixed: Missing wssc_watchdog_last_check option in uninstall cleanup
- Fixed: sanitize_sql_orderby() now handles false return value safely
- Fixed: Watchdog docblock now correctly says 'hourly' not '4 hours'
- Removed: Unused get_products_by_skus() dead code
- Code quality improvements from senior engineer review
= 1.2.8 =
- Fixed: Cron intervals now registered during activation (prevents scheduling failure)
- Fixed: Scheduled sync properly resumes after deactivate/reactivate cycle
- Fixed: "Next run" now displays correctly after plugin reactivation
- Root cause: Custom cron schedules weren't available during activation hook
= 1.2.7 =
- Fixed: Scheduled sync now resumes immediately after plugin reactivation
- Fixed: "Next run" no longer empty after deactivate/reactivate cycle
= 1.2.6 =
- Fixed: Uninstall.php now correctly cleans up all plugin options and cron hooks
- Fixed: Scheduled sync now has lock to prevent concurrent runs
- Fixed: SQL injection prevention using $wpdb->prepare for table existence checks
- Fixed: Privatized products tracking now cleans up orphaned entries
- Improved: Logs table uses composite index for better query performance
- Security: Enhanced database query safety throughout
= 1.2.5 =
- Fixed: Saving settings no longer resets next scheduled run if within current interval
- Fixed: Next run time now shows "Overdue by X" when scheduled time has passed
- Improved: Smart scheduling - only reschedules when necessary
- Added: Visual indicator (red text) for overdue scheduled syncs
= 1.2.4 =
- Fixed: Catalog visibility now set to 'visible' (Shop and search results) when restoring private products to public
- Note: When making products private, catalog visibility is already set to 'hidden'
= 1.2.3 =
- Fixed: Bug where option value 'private' was compared against 'set_private' - products now correctly restored to publish
= 1.2.2 =
- Fixed: Products now correctly restored to 'publish' status when SKU returns to CSV
- Added: "Restored" stat displayed in log details when private products are made public
- Improved: Log modal now shows Set Private and Restored statistics
= 1.2.1 =
- Fixed: Log timestamps now stored in UTC for consistent timezone conversion
- Fixed: Modal date display now shows correct local time regardless of viewer's timezone
= 1.2.0 =
- Fixed: Negative "ago" times (-3585 sec ago) caused by UTC/local timezone mismatch
- Fixed: Database timestamps now correctly interpreted as UTC
- Fixed: JavaScript handles negative time differences gracefully
- Improved: Times under 5 seconds show "just now" instead of "0 sec ago"
= 1.1.9 =
- Fixed: Incorrect "ago" times (e.g., showing 58 min instead of 2 min)
- Fixed: human_time_diff() now uses proper second parameter
- Added: All timestamps now display in user's local timezone via JavaScript
- Added: Hover tooltip shows full local date/time
= 1.1.8 =
- Performance: Major sync optimization - 10-15x faster for large catalogs
- Performance: Direct SQL updates instead of WC product save loops
- Performance: Batch SKU lookups with stock values in single query
- Performance: Database transactions for faster writes
- Performance: Optimized cache clearing per-batch instead of per-product
= 1.1.7 =
- Added: Auto-updates enabled by default
= 1.1.6 =
- Fixed: Fatal error - maybe_create_table method name mismatch in logs class
= 1.1.5 =
- Changed: Updates now fetched from GitHub Releases instead of 3AG API
- Changed: Updates available to all users (no license required for updates)
- Improved: Changelog pulled from GitHub release notes
- Removed: 3AG Update API dependency
= 1.1.4 =
- Fixed: Stats not resetting between sync runs
- Fixed: Added license validation to test connection and preview
- Fixed: WP_Filesystem initialization in auto-updater
- Fixed: XSS vulnerability in log modal JavaScript
- Fixed: Replaced deprecated current_time('timestamp')
- Added: Rate limiting for manual sync (30 second cooldown)
- Added: Database version handling for future schema upgrades
- Added: Proper uninstall cleanup (options, transients, cron, table)
- Added: Input validation for missing_sku_action setting
- Improved: Centralized domain helper function
- Improved: Code quality and industry standards compliance
= 1.1.0 =
- Added automatic updates via 3AG Update API
- Plugin now checks for updates and notifies in WordPress dashboard
- Seamless one-click updates with valid license
= 1.0.2 =
- Added static download URL for latest release
= 1.0.1 =
- Fixed missing SKU action feature
- Added catalog visibility control when setting products to private
- Improved product restoration when SKU returns in CSV
= 1.0.0 =
- Initial release
- Automatic stock sync from CSV URL
- Scheduled sync with configurable intervals
- Manual sync trigger
- Custom SKU and quantity column mapping
- Auto delimiter detection
- Missing SKU action settings
- Watchdog cron for reliability
- Comprehensive logging system
- Modern admin interface
- License management via 3AG API
- HPOS compatibility
== Upgrade Notice ==
= 1.0.0 = Initial release of Woo Stock Sync from CSV.
Read the full README on GitHub →
Releases
| Tag | Published | Asset | Downloads |
|---|---|---|---|
| v1.4.13 | Jun 13, 2026 | woo-stock-sync-from-csv-1.4.13.zip | 0 |
| v1.4.13 | Jun 13, 2026 | woo-stock-sync-from-csv-latest.zip | 12 |
| v1.4.12 | May 22, 2026 | woo-stock-sync-from-csv-1.4.12.zip | 0 |
| v1.4.12 | May 22, 2026 | woo-stock-sync-from-csv-latest.zip | 7 |
| v1.4.11 | May 22, 2026 | woo-stock-sync-from-csv-latest.zip | 1 |
| v1.4.11 | May 22, 2026 | woo-stock-sync-from-csv-1.4.11.zip | 0 |
| v1.4.10 | May 22, 2026 | woo-stock-sync-from-csv-latest.zip | 1 |
| v1.4.10 | May 22, 2026 | woo-stock-sync-from-csv-1.4.10.zip | 0 |
| v1.4.9 | May 22, 2026 | woo-stock-sync-from-csv-1.4.9.zip | 0 |
| v1.4.9 | May 22, 2026 | woo-stock-sync-from-csv-latest.zip | 1 |
| v1.4.8 | Mar 1, 2026 | woo-stock-sync-from-csv-latest.zip | 26 |
| v1.4.8 | Mar 1, 2026 | woo-stock-sync-from-csv-1.4.8.zip | 2 |
| v1.4.7 | Feb 10, 2026 | woo-stock-sync-from-csv-1.4.7.zip | 3 |
| v1.4.7 | Feb 10, 2026 | woo-stock-sync-from-csv-latest.zip | 44 |
| v1.4.6 | Feb 3, 2026 | woo-stock-sync-from-csv-latest.zip | 19 |
| v1.4.6 | Feb 3, 2026 | woo-stock-sync-from-csv-1.4.6.zip | 4 |
| v1.4.5 | Feb 3, 2026 | woo-stock-sync-from-csv-1.4.5.zip | 0 |
| v1.4.5 | Feb 3, 2026 | woo-stock-sync-from-csv-latest.zip | 0 |
| v1.4.1 | Feb 3, 2026 | woo-stock-sync-from-csv-latest.zip | 2 |
| v1.4.1 | Feb 3, 2026 | woo-stock-sync-from-csv-1.4.1.zip | 1 |
| v1.3.2 | Feb 2, 2026 | woo-stock-sync-from-csv-1.3.2.zip | 0 |
| v1.3.2 | Feb 2, 2026 | woo-stock-sync-from-csv-latest.zip | 3 |
| v1.3.1 | Feb 2, 2026 | woo-stock-sync-from-csv-1.3.1.zip | 0 |
| v1.3.1 | Feb 2, 2026 | woo-stock-sync-from-csv-latest.zip | 1 |
| v1.3.0 | Feb 2, 2026 | woo-stock-sync-from-csv-1.3.0.zip | 0 |