WooCommerce inventory management with Google Sheets sync guide

Manage WooCommerce Stock from Google Sheets: The Ultimate Sync Guide

Managing WooCommerce inventory gets complicated fast. Once you’re past a few dozen products, updating stock levels one by one in the WordPress admin is painfully slow. Google Sheets offers a familiar spreadsheet interface where you can bulk edit stock quantities, prices, and product data — then sync everything back to WooCommerce automatically.

This guide covers three proven methods to connect Google Sheets with WooCommerce inventory: dedicated plugins for non-developers, the WooCommerce REST API for full control, and CSV import/export as a reliable fallback.

Why Use Google Sheets for WooCommerce Inventory?

Before diving into the how, here’s why store owners increasingly manage inventory through spreadsheets instead of the WooCommerce dashboard:

  • Bulk editing — Update hundreds of stock quantities in minutes instead of clicking through individual product pages
  • Team collaboration — Warehouse staff, suppliers, and store managers can all access and update a shared sheet in real-time
  • Formulas and automation — Use Google Sheets formulas to calculate reorder points, track trends, and set alerts when stock runs low
  • Audit trail — Google Sheets automatically tracks edit history, showing who changed what and when
  • Multi-channel sync — If you sell on multiple platforms (WooCommerce + Amazon + Etsy), a central spreadsheet can be the single source of truth

Method 1: Plugin-Based Sync (Easiest)

For store owners who want a working solution without touching code, several WordPress plugins handle the WooCommerce-to-Google Sheets connection. If you’re exploring other WooCommerce data import and export plugins, we’ve covered the full landscape separately. Here are the most reliable options for inventory sync in 2026.

FlexStock — Stock Sync with Google Sheets

FlexStock is the most popular free option. It provides bidirectional sync between WooCommerce and Google Sheets, meaning changes in either direction are reflected automatically.

Setup steps:

  1. Install and activate FlexStock from Plugins → Add New
  2. Go to FlexStock → Settings
  3. Click Connect Google Account and authorize access to Google Sheets
  4. Select an existing spreadsheet or create a new one
  5. Map WooCommerce fields (SKU, stock quantity, price, product name) to spreadsheet columns
  6. Set the sync interval (every 5 minutes, hourly, or manual)
  7. Click Sync Now to populate your sheet with current inventory data

Best for: Stores under 500 products that need simple stock quantity syncing. The free version covers basic inventory sync. The pro version adds variable product support, custom fields, and webhook-triggered sync.

Product Sync Master Sheet

Product Sync Master Sheet takes a broader approach, syncing not just stock but full product data including descriptions, images, categories, and attributes. It’s useful if you manage your entire product catalog in Google Sheets.

Best for: Stores that treat Google Sheets as their product information management (PIM) system, where the spreadsheet is the master and WooCommerce is the storefront.

Google Sheet Connector for WooCommerce

The official Google Sheet Connector from the WooCommerce Marketplace provides two-way sync with scheduled updates, status-based filtering, and custom field mapping. It’s a premium plugin ($79/year) but comes with dedicated support from the WooCommerce team.

Best for: Established stores that want an officially supported solution with reliable updates and compatibility guarantees.

Plugin Comparison

FeatureFlexStock (Free)Product Sync MasterGoogle Sheet Connector
PriceFree / $49 ProFree / $39 Pro$79/year
Bidirectional syncYesYesYes
Variable productsPro onlyYesYes
Scheduled syncYesYesYes
Custom field mappingPro onlyLimitedYes
Max products (practical)~500~1,000~2,000

Method 2: WooCommerce REST API + Google Apps Script (Most Flexible)

For stores that need full control, reliability at scale, or custom sync logic, the API approach is superior. You write a Google Apps Script that calls the WooCommerce REST API to read and update inventory data. No plugin needed, no performance overhead on your WordPress site.

Step 1: Generate WooCommerce API Keys

  1. In WordPress, go to WooCommerce → Settings → Advanced → REST API
  2. Click Add Key
  3. Set Description to “Google Sheets Inventory Sync”
  4. Set Permissions to Read/Write
  5. Click Generate API Key
  6. Copy the Consumer Key and Consumer Secret — you won’t see the secret again

Step 2: Create the Google Apps Script

Open your Google Sheet, go to Extensions → Apps Script, and paste this code:

// Configuration
const CONFIG = {
  STORE_URL: 'https://yourstore.com',
  CONSUMER_KEY: 'ck_your_key_here',
  CONSUMER_SECRET: 'cs_your_secret_here',
  SHEET_NAME: 'Inventory'
};

// Pull current inventory from WooCommerce
function pullInventory() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName(CONFIG.SHEET_NAME);
  
  // Clear existing data (keep headers)
  if (sheet.getLastRow() > 1) {
    sheet.getRange(2, 1, sheet.getLastRow() - 1, 5).clearContent();
  }
  
  let page = 1;
  let allProducts = [];
  
  // Paginate through all products
  while (true) {
    const url = `${CONFIG.STORE_URL}/wp-json/wc/v3/products?per_page=100&page=${page}`;
    const options = {
      method: 'GET',
      headers: {
        'Authorization': 'Basic ' + 
          Utilities.base64Encode(
            CONFIG.CONSUMER_KEY + ':' + CONFIG.CONSUMER_SECRET
          )
      }
    };
    
    const response = UrlFetchApp.fetch(url, options);
    const products = JSON.parse(response.getContentText());
    
    if (products.length === 0) break;
    allProducts = allProducts.concat(products);
    page++;
  }
  
  // Write to sheet
  const data = allProducts.map(p => [
    p.id, p.sku, p.name, p.stock_quantity, p.price
  ]);
  
  if (data.length > 0) {
    sheet.getRange(2, 1, data.length, 5).setValues(data);
  }
  
  SpreadsheetApp.getUi().alert(
    `Pulled ${data.length} products from WooCommerce`
  );
}

// Push updated stock quantities to WooCommerce
function pushInventory() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName(CONFIG.SHEET_NAME);
  const data = sheet.getDataRange().getValues();
  let updated = 0;
  
  // Skip header row
  for (let i = 1; i < data.length; i++) {
    const [productId, sku, name, stockQty, price] = data[i];
    
    if (!productId) continue;
    
    const url = `${CONFIG.STORE_URL}/wp-json/wc/v3/products/${productId}`;
    const options = {
      method: 'PUT',
      headers: {
        'Authorization': 'Basic ' + 
          Utilities.base64Encode(
            CONFIG.CONSUMER_KEY + ':' + CONFIG.CONSUMER_SECRET
          ),
        'Content-Type': 'application/json'
      },
      payload: JSON.stringify({
        stock_quantity: parseInt(stockQty),
        manage_stock: true
      })
    };
    
    UrlFetchApp.fetch(url, options);
    updated++;
  }
  
  SpreadsheetApp.getUi().alert(
    `Updated ${updated} products in WooCommerce`
  );
}

Step 3: Set Up Your Sheet Headers

Create a sheet named “Inventory” with these column headers in row 1:

ABCDE
Product IDSKUProduct NameStock QuantityPrice

Step 4: Run and Automate

  • Manual sync: Run pullInventory() to fetch current data, edit quantities in the sheet, then run pushInventory() to update WooCommerce
  • Automated sync: In Apps Script, go to Triggers → Add Trigger and set pullInventory to run on a schedule (hourly or daily)
  • One-way push: If Google Sheets is your master, schedule pushInventory to run every hour

Best for: Stores with 500+ products, custom sync requirements, or multi-channel inventory management. The API approach has no product limit and runs entirely in Google’s infrastructure — zero load on your WordPress server.

Handling Variable Products

Variable products require fetching variations separately. Add this function to handle them:

function pullVariations(productId) {
  const url = `${CONFIG.STORE_URL}/wp-json/wc/v3/products/${productId}/variations?per_page=100`;
  const options = {
    method: 'GET',
    headers: {
      'Authorization': 'Basic ' + 
        Utilities.base64Encode(
          CONFIG.CONSUMER_KEY + ':' + CONFIG.CONSUMER_SECRET
        )
    }
  };
  
  const response = UrlFetchApp.fetch(url, options);
  return JSON.parse(response.getContentText());
}

Call pullVariations() for each product where type === 'variable' and write each variation as its own row in the spreadsheet with the parent product ID for reference.

Method 3: CSV Import/Export (Most Reliable)

Sometimes the simplest approach is the most reliable. WooCommerce’s built-in CSV importer handles bulk stock updates without any plugins or API setup.

Export → Edit → Re-Import Workflow

  1. Go to Products → All Products
  2. Click Export at the top
  3. Select columns to export (at minimum: ID, SKU, Stock, Price)
  4. Click Generate CSV
  5. Open the CSV in Google Sheets
  6. Edit stock quantities, prices, or any other fields
  7. Download as CSV
  8. Go back to Products → All Products → Import
  9. Upload the modified CSV
  10. Map columns and check Update existing products
  11. Run the import

Best for: Occasional bulk updates (weekly or monthly), stores without technical resources for API setup, and situations where you need a one-time inventory correction.

The CSV method doesn’t provide real-time sync, but it’s completely free, works with any number of products, and never breaks because it uses WooCommerce’s core import/export functionality.

Which Method Should You Choose?

CriteriaPluginAPICSV
DifficultyEasyIntermediateEasy
Real-time syncNear real-timeConfigurableManual only
Product limit~500-2,000UnlimitedUnlimited
CostFree-$79/yrFreeFree
Server loadMediumNoneDuring import
Variable productsVariesFull supportFull support
Multi-channelNoYesManual

Start with the plugin method if you have under 500 products and want the fastest setup. Move to the API method when you outgrow plugins or need custom sync logic. Use CSV as a fallback or for occasional bulk corrections.

Best Practices for Spreadsheet-Based Inventory Management

Regardless of which sync method you choose, follow these practices to avoid inventory errors:

1. Always Use SKU as the Primary Identifier

Product IDs can change if you migrate or rebuild your store. SKUs are portable and human-readable. If you handle physical products, pairing SKUs with barcode plugins for inventory management makes warehouse workflows even smoother. Ensure every product has a unique SKU before setting up any sync system.

2. Set Up Low Stock Alerts in Google Sheets

Use conditional formatting to highlight cells where stock drops below your reorder threshold. For automated alerts, add this Apps Script function:

function checkLowStock() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('Inventory');
  const data = sheet.getDataRange().getValues();
  const threshold = 5; // Reorder when stock hits 5
  let lowStockItems = [];
  
  for (let i = 1; i < data.length; i++) {
    if (data[i][3] <= threshold && data[i][3] !== '') {
      lowStockItems.push(`${data[i][2]} (SKU: ${data[i][1]}): ${data[i][3]} left`);
    }
  }
  
  if (lowStockItems.length > 0) {
    MailApp.sendEmail(
      '[email protected]',
      'Low Stock Alert',
      'The following items need reordering:\n\n' + lowStockItems.join('\n')
    );
  }
}

Set this to run daily via Apps Script Triggers.

3. Never Edit Simultaneously

If you’re using bidirectional sync, don’t edit stock quantities in both WooCommerce admin and Google Sheets at the same time. Pick one as the master source. Most stores designate Google Sheets as the master for inventory and WooCommerce as the master for orders.

4. Back Up Before Bulk Updates

Before running any bulk stock update, export your current WooCommerce inventory as a CSV backup. If something goes wrong with the sync, you can restore from this backup in minutes.

5. Test with a Small Batch First

Whether using plugins or the API method, always test your sync with 5-10 products first. Verify the stock quantities match in both WooCommerce and Google Sheets before running a full sync across your entire catalog.

Common Issues and Fixes

Stock Counts Don’t Match After Sync

Usually caused by an order being placed between the pull and push operations. The solution: use WooCommerce’s stock_quantity field directly rather than calculating changes, and sync frequently enough that the gap between operations is minimal.

API Returns 401 Unauthorized

Your store must use HTTPS for the REST API with Basic Auth. If you’re on HTTP (development), use the consumer_key and consumer_secret as query parameters instead of the Authorization header.

Google Apps Script Times Out

Apps Script has a 6-minute execution limit. For stores with thousands of products, use the WooCommerce Batch API endpoint (/wp-json/wc/v3/products/batch) to update up to 100 products per request instead of making individual API calls.

When to Consider a Custom Solution

The methods above cover most use cases. But some scenarios need a tailored approach:

  • Multi-warehouse inventory with location-specific stock levels
  • Supplier integration where stock updates come directly from vendor feeds
  • Multi-channel sync across WooCommerce + Amazon + eBay + retail POS
  • Complex pricing rules where inventory levels trigger dynamic pricing changes
  • Real-time webhook-based sync where every WooCommerce order instantly updates Google Sheets

These scenarios typically require custom development — a combination of WooCommerce hooks, REST API integrations, and Google Sheets automation built specifically for your business workflow. If you’re hitting the limits of plugins and basic API scripts, reach out to discuss a custom WooCommerce integration tailored to your store’s specific inventory needs.

Facebook
Twitter
LinkedIn
Pinterest
WhatsApp

Related Posts

Leave a Reply

Your email address will not be published. Required fields are marked *