Lightspeed R-Series WooCommerce integration: Setup & sync guide

This page covers setup and usage for Lightspeed Retail R-Series. If you’re on X-Series, see X-Series setup and usage →. For installation steps, see the overview page →


Connect to Lightspeed R-Series

↑ Back to top
  1. Go to Lightspeed > Connection.
  2. Select R-Series from the series dropdown.
  3. Click Connect to Lightspeed R-Series.
  4. Log into Lightspeed when redirected and click Authorize Application.
  5. Confirm your site when the WooCommerce API connector prompts you.
  6. Once complete, a success message and your store name appear on the Connection page.
WooCommerce Lightspeed POS connection settings page
Lightspeed Authorization Screen
WooCommerce API Connector
Lightspeed authorization success

The Lightspeed employee account used to authorize must have inventory privileges.

To verify the connection is working, go to Lightspeed > Product Importer and click Search Lightspeed. If products appear, you’re connected.


Enable stock management

↑ Back to top

Go to WooCommerce > Settings > Products > Inventory and enable Enable stock management. This allows WooCommerce to adjust inventory automatically as orders are placed, refunded, or cancelled — and lets the plugin know when to trigger sync events back to Lightspeed.


Settings

↑ Back to top

Store settings

↑ Back to top

Primary inventory store

If your Lightspeed account has multiple locations, you must select one as the primary inventory store. The plugin reads inventory from this store and syncs inventory values back to it.

Go to Lightspeed > Settings > Store Settings, tick the store you want as primary, and save.

WooCommerce does not support multiple inventory locations natively. Only your primary store’s inventory is synced.

Report errors

Enabling this sends plugin errors to the development team. No personal data is collected. Errors are purged within 60 days.


Woo product sync settings

↑ Back to top

Product status on import

Sets the default WooCommerce status when a product is first imported from Lightspeed. Options: Draft (default), Published, or Private.

Variation products inherit status from their parent. If the parent is already published, new variations are published regardless of this setting.

SKU strategy

Choose which Lightspeed SKU field to use when importing:

OptionBehavior
Custom SKUUses the custom SKU field in Lightspeed
Manufacturer’s SKUUses the manufacturer SKU field
System SKUUses Lightspeed’s internal system ID (always unique)
Plugin DefaultTries Custom SKU first, then Manufacturer’s SKU, then System SKU

If the selected field is empty in Lightspeed, the SKU comes in empty in WooCommerce. If you’re seeing duplicate SKU errors, System SKU resolves them since system IDs are always unique.

Image compression

Images are downloaded from Lightspeed via Cloudinary. Options: low, better (eco), or best. Plugin default uses eco — smaller files, slightly lower visual quality. Images larger than 2MB or over 2000px in either dimension may cause WordPress image processing to time out.

Set empty sale price on zero

When enabled, if a Lightspeed product’s sale price is $0.00, the WooCommerce sale price is set to empty rather than zero.


Selective sync for WooCommerce products

↑ Back to top

The first import pulls all product properties from Lightspeed. After that, you can limit which properties get updated on each sync — useful if you want to manage fields like descriptions or images directly in WooCommerce without Lightspeed overwriting them.

PropertyNotes
NameLightspeed’s “description” field maps to the WooCommerce product title
SKUFollows your SKU strategy setting
Regular priceThe “Default” price in Lightspeed
Sale priceRequires a “Sale” price level in Lightspeed (see FAQ)
Stock quantityThe “In Stock” value under the Details tab in Lightspeed
ImagesAll Lightspeed images download to WooCommerce; the first becomes the featured image
AttributesFor Matrix products, converts to WooCommerce product attribute taxonomy terms when enabled
TagsNew tags are added; existing tags are not removed

Prune deleted variations: When enabled, clicking Manual Update via Lightspeed on a product automatically removes any variations that have been deleted from the Matrix in Lightspeed.

Ignore archived products: When enabled, archived Lightspeed products are excluded from the import table. Archiving a product in Lightspeed sets its WooCommerce inventory to 0.


Selective sync for Lightspeed products

↑ Back to top

Controls which WooCommerce changes sync back to Lightspeed. This applies globally to all linked products. Changes that trigger a sync back:

  • Saving a product in the WooCommerce admin
  • Bulk product updates
  • Stock changes after checkout, refund, or cancellation

Product Importer

↑ Back to top

Go to Lightspeed > Product Importer. This is the staging area for your Lightspeed catalog — products must be loaded here before they can be imported into WooCommerce.

Import categories before importing products if you plan to use Lightspeed categories.

Step 1: load products into the importer

↑ Back to top

Search for specific products

  1. Click Search Lightspeed.
  2. Search for Single or Matrix products by name, SKU, or other fields.
  3. Tick the products you want and click Apply.
The “Search Lightspeed” modal lets you search in real time

Bulk load all products

  1. Click Load Products from Lightspeed.
  2. A progress indicator shows while all products load.
  3. Do not close the browser tab until complete — if you do, you’ll need to start over.
Bulk load all products into the importer

Step 2: import and link with WooCommerce

↑ Back to top

With products in the importer table:

ActionWhat it does
Import & Link with WooImports into WooCommerce, publishes it, and establishes an active sync link
RemoveRemoves from the importer table only — does not delete from Lightspeed or WooCommerce

To bulk import, use the checkboxes and Bulk Actions > Import & Link with Woo > Apply.

Once imported, the available actions change:

ActionWhat it does
EditOpens the WooCommerce product editor
Update via LightspeedManually pulls the latest data from Lightspeed and updates the product
WooCommerce Lightspeed POS import page with products loaded
Products loaded into the importer, ready to import and link

To remove a product from the importer table, delete it from WooCommerce and empty the trash first.


Matrix (variable) products

↑ Back to top

In Lightspeed, Matrix products are equivalent to WooCommerce variable products. They display with a stacked appearance in the importer and show “-” for SKU and inventory columns. Import them the same way as single products.

On import, WooCommerce creates:

  • Featured image and image gallery
  • Product title
  • Variation attributes and values
  • Variation products with: variation image, SKU, stock quantity, regular price, and sale price (if a “Sale” price level is configured in Lightspeed)

After import, inventory changes on any variation push to Lightspeed. The scheduled sync job picks up Lightspeed changes and updates variations on the configured interval.

A variation’s stock status is automatically set to “In stock” when inventory is greater than zero.

Merging products in Lightspeed isn’t supported. Delete the associated WooCommerce products and re-import the merged result.


Categories

↑ Back to top

Go to Lightspeed > Settings > Categories to import your Lightspeed category hierarchy into WooCommerce in one step.

Category import is a one-time operation. Categories and tags are applied to products on import, but are not removed from WooCommerce if you delete them in Lightspeed. To update categories, use Delete Category Cache to clear stored categories and re-import — this does not affect categories already applied to products or the WooCommerce category table.

Sibling subcategories (sharing the same parent) must have unique names. WordPress requires unique URL slugs; Lightspeed does not have this restriction.

When importing a product that has Lightspeed categories assigned, the plugin removes the “Uncategorized” WooCommerce category from that product. Products with no category in Lightspeed stay under “Uncategorized” — WooCommerce requires at least one category per product.


Background sync jobs

↑ Back to top

The plugin runs three background jobs via WooCommerce’s Action Scheduler:

JobDefaultWhat it does
Lightspeed product changesConfigurableDetects product changes in Lightspeed (inventory, SKU, pricing, images) and updates WooCommerce
New Lightspeed productsConfigurableFinds newly created products and optionally imports them
Lightspeed attribute setsConfigurableFinds new product attribute sets and creates them under Products > Attributes

Each job can be enabled/disabled independently and set to intervals from 5 seconds to 1 hour.

Lightspeed uses a leaky bucket rate limit. Setting sync intervals too short can cause rejected requests. If you see 429 errors, increase your sync interval.

Action after auto-loading new products — when the new products job is enabled, choose what happens when a new product is detected:

  • Loaded into Product Importer — staged for review, not imported yet
  • Imported, but not linked — added to WooCommerce but not actively syncing
  • Imported and linked — added to WooCommerce and actively syncing

When auto-loading Matrix products, the parent product is only detected if it already has at least one variation. A Matrix parent with no variations won’t appear in the New Products job.

Go to Tools > Scheduled Actions to view and manually run pending jobs. Filter by “wclsi” to see only Lightspeed jobs.

WooCommerce Lightspeed POS Action Scheduler Jobs
Lightspeed Action Scheduler jobs under Tools > Scheduled Actions

Manual sync

↑ Back to top

Trigger a manual product sync in two ways:

  1. Product Importer: click Update via Lightspeed in the product row.
  2. Product editor: click Manual Update via Lightspeed in the Lightspeed Settings metabox in the sidebar.

When syncs trigger

↑ Back to top

Inventory and product data sync between Lightspeed and WooCommerce in three ways:

  • Background polling — the background sync jobs run on a configurable interval and detect changes in Lightspeed automatically.
  • Product save — saving a WooCommerce product triggers a sync for that item immediately.
  • Before checkout — the plugin checks current inventory in Lightspeed immediately before an order is placed. If stock is zero, or if the quantity ordered exceeds what’s available in Lightspeed, the order is blocked and the customer sees an out of stock error.

Relinking a product

↑ Back to top

If a WooCommerce product loses its link to Lightspeed, click Relink with Lightspeed in the Lightspeed Settings metabox on the product edit page. The plugin first checks the import table, then falls back to an API search by SKU to re-establish the link.

Relinking WooCommerce and Lightspeed products

Sending a WooCommerce product to Lightspeed

↑ Back to top

If a product exists in WooCommerce but not in Lightspeed, click Create this product in Lightspeed in the Lightspeed Settings metabox on the product edit page. This sends SKU, images, inventory, and pricing to Lightspeed once. After that, Lightspeed becomes the source of truth.

Lightspeed’s API supports a maximum of 3 attributes for Matrix items. Syncing a variable product with more than 3 attributes returns an error. Bulk sending from WooCommerce to Lightspeed is not supported.


Clear all loaded products

↑ Back to top

Lightspeed > Product Importer > Clear All Loaded Products removes all product data from the plugin’s database tables and destroys all sync relationships. It does not delete products from WooCommerce or Lightspeed.

Back up your database before using this. All sync relationships will be lost.


Troubleshooting

↑ Back to top

Cannot connect to Lightspeed

↑ Back to top

Make sure the Lightspeed employee account used to authorize the connection has inventory privileges.


Products are not syncing

↑ Back to top

If the sync was previously working, try changing the sync interval, saving, then reverting — this can unstick the process.


Getting 429 “Rate Limit Exceeded” errors

↑ Back to top

The plugin reschedules failed requests via Action Scheduler and retries up to 20 times before surfacing the error. Save the affected product again to trigger a fresh sync attempt.


Matrix products not syncing correctly

↑ Back to top

Confirm the product is a Matrix in Lightspeed, not a simple product with options. Check that all matrix items have Custom SKUs in Lightspeed. The parent product must be imported first — variations populate after. If variations appear as individual products instead of grouped, archive them in Lightspeed, delete both the WooCommerce products and the import table records, then re-load.


A product is linked but not updating

↑ Back to top

This typically happens when a product is archived in Lightspeed and a new product is created to replace it. The plugin tracks products by internal ID, so it continues syncing to the archived version.

Fix option 1: Delete the WooCommerce product and its import record, reload products, and import the new product.

Fix option 2 (Custom SKU): Add an _archived suffix to the archived product’s Custom SKU in Lightspeed (e.g., SKU1234_ARCHIVED), delete its record from the import table in WooCommerce, then click Relink with Lightspeed on the product. The plugin searches by SKU and links to the new product.


PHP fatal error: Call to a member function set_status() on null

↑ Back to top

A product was originally loaded as a single item in Lightspeed but has since been merged into a Matrix. The plugin can no longer find it because the itemMatrixId changed from 0 to a non-zero value. Find the product via logs or your database and delete it from the Lightspeed import table.


E_ERROR related to Matrix attribute terms

↑ Back to top

A Lightspeed Matrix attribute term name conflicts with a WordPress reserved term. Go to Lightspeed > Inventory > Matrix Attribute Sets, find the conflicting term, and rename it. See the WordPress reserved terms list for the full reference.


cURL error 6 or cURL error 28 — could not resolve api.merchantos.com

↑ Back to top

These errors indicate a networking or DNS issue on your server — not a plugin problem. Your server cannot reach Lightspeed’s API endpoint. Contact your hosting provider and provide the full error message from wclsi-errors.log. They can diagnose DNS resolution failures, firewall rules, or outbound connection blocks.


Lightspeed API 400 error: Cannot set attribute on an Item with ItemAttributeSet

↑ Back to top

Full error: “Cannot set attribute1 on an Item with ItemAttributeSet type Size” (or similar). This is a known Lightspeed API bug that occurs when the number of attributes on a Matrix product has been reduced. For example, a Matrix previously had 3 attributes and now has 2 — Lightspeed’s API continues to expect the original attribute count. There is no workaround on the plugin side. Contact Lightspeed support and reference this as a known API bug with Matrix attribute reduction.


Lightspeed is slow or not responding

↑ Back to top

If syncs are timing out or API calls are consistently slow, check whether Lightspeed is experiencing an outage before investigating the plugin:


FAQ

↑ Back to top

How is pricing synced?

↑ Back to top

Lightspeed’s “Default” price maps to WooCommerce’s Regular Price. To enable sale price sync, you need a pricing level named exactly “Sale” in Lightspeed. To set it up:

  1. In Lightspeed, go to Settings > Pricing Levels.
  2. Click New Pricing Level.
  3. Name it exactly Sale (case-sensitive).
  4. Save and activate the pricing level.

If this level doesn’t exist, you’ll see a 404 Unknown PriceLevel error in the logs. When you activate the Sale pricing level, Lightspeed pre-fills all Sale values with the Default price — on the next sync, WooCommerce sale prices will be overwritten with those values. This won’t trigger a WooCommerce sale automatically, but any manually-set WooCommerce sale prices will be replaced.

Do WooCommerce orders sync to Lightspeed?

↑ Back to top

Yes. Order sync creates a corresponding sale record in Lightspeed when an order is placed in WooCommerce.

Can I selectively import products by category?

↑ Back to top

Yes. Load all products into the importer, filter by category, and use Bulk Actions to import that group.

What’s the maximum sync throughput?

↑ Back to top

The auto-sync handles up to 100 changes every 5 seconds. For bulk edits larger than that, break them into batches of 95 or fewer.


Developer reference

↑ Back to top

WP-CLI commands

↑ Back to top
# View pending sync jobs
wp action-scheduler list --status=pending --group=wclsi

# Run pending jobs manually
wp action-scheduler run --group=wclsi

# View failed jobs
wp action-scheduler list --status=failed --group=wclsi

Action Scheduler job hooks

↑ Back to top
HookWhat it does
wclsi_pollChecks for product changes in Lightspeed (inventory, SKU, pricing, images)
check_for_new_ls_prodsChecks for newly created products in Lightspeed
wclsi_poll_ls_attribute_setsChecks for new product attribute sets

Database tables

↑ Back to top

The plugin installs these tables on activation:

TablePurpose
wp_wclsi_itemsCore product data and sync state
wp_wclsi_item_attribute_setsProduct attribute set data
wp_wclsi_item_categoriesCategory data
wp_wclsi_item_imagesImage data
wp_wclsi_item_pricesPrice data
wp_wclsi_item_shopsStore/location data

Key columns in wp_wclsi_items:

ColumnDescription
item_idLightspeed’s internal item ID
wc_prod_idWooCommerce post ID (NULL if not imported)
wclsi_import_dateDate/time of initial import
wclsi_last_sync_dateDate/time of last sync
wclsi_is_synced1 = active sync link; NULL = not linked

Find all products loaded but not yet imported:

SELECT * FROM wp_wclsi_items WHERE wc_prod_id IS NULL;

The “Last updated” timestamp in the importer table reflects Lightspeed’s own timestamp, not your local server time.

Related Products

Use conditional logic to restrict the shipping and payment options available on your store.

Offer your existing products on subscription, with this powerful add-on for WooCommerce Subscriptions.