Changelog

SquareWooSync Pro version history and release notes.

10.4.23

  • Fix: switching an item's Square stock sync from Paused back to Both ways now pulls Square's current count into WooCommerce first. Previously the product save carrying the change queued an ordinary stock push, which could send the website's out-of-date number to Square — the overwrite Paused exists to prevent. If Square cannot be reached at that moment the item stays on Paused and the sync log explains why.

10.4.22

  • New: per-item Square stock sync setting, replacing the "Ignore stock updates from Square" checkbox on the product Inventory panel, each variation's row, and Quick/Bulk Edit. Choose Both ways (default), Ignore Square's updates (the previous checkbox; WooCommerce still sends its stock to Square), or the new Paused, which stops stock syncing in either direction so Square's count is never touched. Previously the only option still sent WooCommerce's frozen number to Square on the next push of the product, overwriting Square-side transfers, deliveries and refund restocks ("re-counted via SWS Pro"). Existing settings carry over unchanged. New squarewoosync_block_stock_push filter.
  • Fix: an item set to ignore Square's stock updates was reported in the sync log as "not linked to a WooCommerce product (retried 3 times)" whenever its stock changed in Square, with three needless retries each time. It is now logged only as skipped.

10.4.21

  • Fix: pausing webhook delivery from Webhooks → Status could be silently undone. Saving the Real-time sync settings card (any field) or installing a plugin update re-enabled forwarding at the relay while the site still showed "Updates are paused". All three paths now go through one switch: the settings card only toggles forwarding when the listening state actually changes, a plugin update leaves a deliberate pause in place, and every path keeps the site's paused flag in step with the relay.
  • New: Webhooks → Status and the Connected sites card now show when delivery was last paused or resumed and from where (status page, settings, setup, plugin update, Square connection), recorded by the relay.

10.4.20

  • Fix: the sync log now records when a WooCommerce stock change is not pushed to Square, and why — real-time sync switched off, the product not linked to a Square item, a Square import or scheduled sync in progress, or the change having come from Square in the first place. Previously these cases were silent, so a website sale that never reached Square left nothing in the log. Each product and reason is recorded once per ten minutes (the settings-off reasons once per six hours) to keep the log readable; new sws_stock_push_skip_log_window filter.
  • Fix: the "Real-time sync: Queued batch" entries written when a stock change is queued for Square were never saved to the sync log, because they were logged after the log had already been flushed for that request. They now appear as intended.

10.4.19

  • Fix: turning on Real-time sync or Keep stock in sync could save only one of the two stock directions while the settings screen showed both enabled, so Square stock changes (POS sales, stock edits) were skipped as "Stock sync not enabled" until the toggle was saved again. Both directions are now saved in a single request.

10.4.18

  • Fix: the Square Register and Square POS apps could crash (or refuse to open) a website order on the Orders screen since 10.4.16. The shipping method name was also being sent as the shipment's "shipping type", which the Square apps cannot display; it is no longer sent. The method name still prints on the order ticket via the shipping note. Orders created on 10.4.16 or 10.4.17 are unaffected going forward but may still not open in the apps; their details remain available from the Transactions screen.

10.4.17

  • Fix: a website order pushed to Square could come straight back as a second WooCommerce order (same Square order id, a "Square Shipping" line and the buyer's Square-profile name) when Square's order.created webhook was processed before the push had finished saving the Square link on the original order. The import now recognises orders this site created, both from a marker set the instant Square returns the new order and from the order's woo_order_id metadata, and skips them. New sws_order_import_pushed_from_this_site filter.
  • Fix: the Apple Pay, Google Pay and Afterpay/Clearpay sheets now follow WooCommerce's "Display prices during cart and checkout" setting. On stores set to "Including tax" the product lines and delivery options are shown tax-inclusive with no separate tax line (a £7.50 delivery no longer appears as £6.25 plus VAT); stores set to "Excluding tax" are unchanged. The total charged is identical either way. New sws_wallet_prices_include_tax filter.
  • Fix: a coupon no longer produces a matching "Adjustment" line in the wallet sheets — product lines are now listed at their pre-coupon price so the Discount line is counted once.

10.4.16

  • New: Square order tickets now show the WooCommerce shipping method the customer chose (e.g. "DHL Next Day Delivery"). It is sent as the fulfillment note (shipping note on shipment orders, delivery note on delivery orders, replacing the generic "Your order will be delivered to your address.") and as the shipment's shipping type. Developers can change or remove the note with the new sws_fulfillment_shipping_note filter.

10.4.15

  • New: choose WooCommerce categories in the import dialog. When "Categories" is ticked, a Categories step lists every Square category the import will touch (just the ones on your selected products, or the whole catalog for Import all) and lets you pick the WooCommerce category each goes into, or leave it to match by name, plus what to do with unmapped ones. No access to Settings is needed, so staff who run imports can do this themselves; the choices apply to that import only. Users who can edit product settings can also tick "Save as the default mapping" to make them the default for scheduled and real-time sync.
  • Fix: the "Decimal stock quantities" setting (and the stock buffer and import batch size) switched itself off after dismissing a finished product import, and could be reset by a stale settings copy. The settings endpoint now merges inventory settings key by key, and clearing an import's progress removes only the progress itself.
  • New: Square text modifiers ("Name to print", "Notes to seller" and the like) now import as a text box on the product page. Before, each one imported as an empty modifier set with nothing to choose, so the customer's text could not be collected. The typed value is shown on the cart, order and emails, and is sent to Square with the order the same way Square Online records it. Square's character limit and "required" flag are honoured.
  • Fix: Orders → Square Orders now shows every order, not just the 500 most recent. The "Not imported" filter and the search box are applied across the whole order history (before, an older not-imported order only appeared once a date range happened to narrow the list to under 500), and "Import all" queues every matching order instead of stopping at 500, continuing in the background on long histories.

10.4.14

  • New: button colour settings for the digital wallets. Square Payments → Digital Wallets now has a Google Pay button colour (default, black or white), an Apple Pay button style (black, white or white with outline) and an Afterpay / Clearpay button colour (black or mint). They apply on the checkout page and to the express checkout buttons; the Elementor widget can still override them per placement and now defaults to the gateway setting.
  • Fix: the Google Pay and Afterpay / Clearpay buttons on the checkout page always rendered black regardless of any setting.

10.4.13

  • Fix: product details set to "Edit in WooCommerce" are no longer overwritten by Square. Sites set up before the Product Details setting existed could still carry the old Square → WooCommerce defaults, so Square catalog updates rewrote the title, description, images, category and metafields, including the Square echo of an edit just pushed from WooCommerce. Any field WooCommerce sends to Square is now never imported back from Square.
  • Fix: an empty description or category list in Square no longer wipes the product's WooCommerce description or categories on import. Developers can restore the old behaviour with the new squarewoosync_import_clear_empty_fields filter.
  • Fix: exporting a product's category to Square now uses the Square category it is mapped to in Category Mapping, instead of matching by name. Before, a WooCommerce category named or nested differently from its Square counterpart was created again in Square on every export.

10.4.12

  • Tweak: AI assistant: long investigations now always end with an answer instead of a step-limit message. The assistant gets more steps to work with, and on its last one it answers from what it has already found rather than stopping with "The assistant needed too many steps" after you had already spent a credit on the question.

10.4.11

  • Fix: refunding an order no longer creates an extra £0 order in WooCommerce. When a refund reaches Square — including one made from WooCommerce — Square records it as a separate "return" order, and the order import was bringing that back in as a new, empty order set to Processing. Return orders are now skipped by the real-time (webhook) import, the bulk order import and log retries. Exchanges, which contain new items as well as returns, still import as normal.

10.4.10

  • Fix: "Only import products from configured location" now also excludes products that are restricted to another location in Square — a warehouse-only item, for example. The filter only looked at the locations an item was explicitly marked absent from, and Square leaves that list empty when an item is instead limited to specific locations, so those products were treated as available everywhere and imported anyway. Applies to both the real-time (webhook) and scheduled imports.

10.4.9

  • Fix: an attribute whose name contains a space ("Roll Size", "Paint Finish") is no longer duplicated on import. The importer looked up existing attributes under the raw Square option name, which never matched WooCommerce's own key for it, so a second copy was created beside the one already on the product and both showed on the storefront. Deleting a copy by hand was undone by the next sync, on every product a bulk import touched.
  • Fix: products already carrying a duplicate pair now lose the copy no variation uses, on the next sync of that product. A copy with variation values behind it is never removed, and a pair where both copies are in use is left alone.
  • Fix: formatted (HTML) descriptions no longer arrive as plain text, whatever the strip-formatting settings say. A bulk import reads the cached Square catalogue, and the per-chunk refresh only updated the image fields — so a catalogue row cached before 10.2.0 (when the rich description was first stored) kept answering with Square's plain-text description for ever. The refresh now updates the item's text as well.
  • New: Category mapping (Settings → Products → Import). Choose which WooCommerce category each Square category imports into, instead of relying on a name match. Square categories you have not mapped can either be matched by name and created as before, or left off the product entirely — so a shop whose category structure differs from Square's stops accumulating a second set of categories. Developers can override the mapping with the new squarewoosync_category_mapping filter.
  • Fix: users with restricted access no longer get a stream of "Your account does not have access to …" errors they cannot dismiss. The dashboard now skips the requests a restricted account is not allowed to make (the Square connection and payment gateway settings), and a permission message from something they did click is shown once rather than on every retry.
  • Fix: "Failed to get locations: didFetch is not defined" no longer appears on the dashboard. The locations list was loading correctly and then hitting an undefined variable on the line meant to stop it re-fetching, which surfaced as an error every time the page loaded.
  • Tweak: a finished import now says so in plain English and offers a "View products in WooCommerce" button beside "Done", instead of leaving a finished progress panel that had to be closed before anything else could happen. Same on the customer import.
  • Tweak: the express checkout buttons (Apple Pay, Google Pay, Afterpay/Clearpay) are now the same height as each other and evenly spaced, on both the block checkout and the classic checkout. Each wallet SDK sizes its own button, so the container now owns the box and the injected button is stretched to fill it. On the block checkout the height follows the Express Payment block's own button-height setting.

10.4.8

  • Fix: the Square inventory table in the plugin (and the Products table built from it) now shows Square's exact stock count, including decimals, whenever a WooCommerce site can only store whole numbers. A 12.55 yd item was cached and displayed as 12 because the count was truncated when it was fetched from Square, before it reached the table. Whole-number truncation now happens only when the quantity is written to WooCommerce, so the Square view always matches Square.

10.4.7

  • Fix: syncing customers no longer strips a user's other roles. A user who was both a Customer and a Shop Manager (or held any role Square knows nothing about) could come out of a customer sync, match or webhook holding only the role mapped from their Square group. Role mapping now only ever adds mapped roles and removes a role it manages when the Square group behind it is gone; every other role is left alone.
  • Fix: importing customers with "set roles from Square groups" turned off no longer changes roles at all, and an import whose Square groups match no mapping no longer resets the user to Customer.
  • Fix: the plugin's "Additional Roles" field on the user profile screen no longer fights a dedicated role manager. It now stands down automatically when User Role Editor, PublishPress Capabilities or Members is active, and it can never remove a role that was granted after the profile form was drawn - which is why a second role ticked in one of those plugins would silently fail to save.
  • New: sws_customer_managed_roles filter (which roles Square group syncing may remove) and sws_additional_roles_ui_enabled filter (show or hide the plugin's own Additional Roles field).
  • New: Delete Unlinked Square Products now lists the items it would delete instead of only counting them - image, name, SKU, price, stock, categories and variations, with a link straight to the item in the Square Dashboard.
  • New: each listed item says why it reads as unlinked - no SKU in Square, never imported, or a WooCommerce product already carries that SKU but was never matched (that one links to the Woo product, since matching it is usually the right fix rather than deleting). Items the tool refuses to delete because they are in fact still linked are now shown and labelled instead of silently disappearing from the count.
  • New: items can be picked individually and deleted with "Delete selected", alongside the existing delete-everything button. The server only ever deletes IDs it has independently verified as unlinked, and refuses the whole request if any selected item is no longer safe.
  • New: Tools → Variation Attribute Check. Lists every variable product whose variations have lost their attribute values — the ones that show as "Any …" on the storefront, sell at the wrong price and cannot be matched back to Square — with a link to each product and, where it can be determined, the attribute a stranded value belongs to. It only reports; nothing in WooCommerce or Square is changed.
  • New: sync log errors now explain themselves. Recognised failures carry a plain-English cause and a suggested fix (including the tool or setting that resolves it) alongside the raw message from Square, on the Sync Activity page and in the exported log.
  • Fix: a Square catalogue update containing a variation with no details no longer stops the whole update. Previously it raised a fatal error inside the background job, so every other product in the same catalogue change was silently skipped.
  • Fix: a refund created in Square by this plugin (from a WooCommerce refund) is now recognised when Square notifies the site about it, instead of being applied a second time and logged as "Invalid refund amount." against an order that was already refunded correctly.
  • Improved: when Square rejects a product because of its categories or images, the log now records the references the plugin actually sent, so a rejection caused by data already in Square can be told apart from one caused by the sync.

10.4.6

  • Fix: variable products could lose their variation attribute values and revert to "Any" on the storefront, showing one price for every option and blocking order sync. When a Square item has no item options defined, the plugin builds a fallback attribute from each variation's name; that invented attribute is no longer applied to products that already have their own variation attributes, and it no longer causes the parent attribute to be pruned.
  • Fix: a fallback attribute name that WordPress reserves (such as "Type") can never be created as a WooCommerce attribute, so every variation built from it ended up with a value WooCommerce could not match. Reserved names are now rejected with a warning in the sync log and in Settings → Products → Advanced Matching, and imports fall back to "Option".
  • Fix: an attribute WooCommerce refuses to create is no longer written onto variations, where it produced values no parent attribute could match.
  • New: products left with variations that have no usable attribute values are now reported as an error in the sync log, so the "Email on errors" alert on the Sync Activity page notifies you instead of the problem surfacing as a wrong-price order.

10.4.5

  • Fix: exporting a product could create a duplicate Square category instead of reusing the existing one, and on stores affected by a pre-9.4.3 version of this bug it compounded on every scheduled sync until a single category existed tens of thousands of times. Categories are now looked up by exact name with one Square search call regardless of catalogue size; a lookup that fails no longer falls back to creating the category (the product syncs without it, a warning is written to the sync log, and it is assigned on the next run); and a category created by one sync worker is remembered so a parallel worker, or Square's eventual consistency, cannot create it again.
  • Improved: the "Fix Duplicate Square Categories" tool now runs in resumable steps and copes with tens of thousands of duplicate categories. It lists and deletes in Square-sized batches, keeps its place if a Square request fails so it can resume rather than start over, shows progress while it runs, and summarises large groups instead of listing every duplicate.

10.4.4

  • New: variations deleted in Square are now detected and disabled on the next sync. Editing an item's option set in the Square dashboard recreates its variations under new IDs; the leftover WooCommerce variations previously kept stale stock, stayed purchasable, and their attribute values caused "Empty or any attribute" export skips on the replacements. Each leftover is now verified against the Square catalog and, once Square confirms it was deleted, set to draft with a sync-log warning — or removed entirely when Square → Woo auto product deletion is enabled. Developers can adjust the behaviour via the new sws_orphan_variation_action and sws_orphan_variation_max_actions filters.
  • Fix: the plugin's autoloader no longer references Carbon/Symfony Translation files that were excluded from the packaged zip. On sites where another plugin (e.g. Google Listings & Ads) loads the same Symfony classes, this produced large volumes of PHP "Failed to open stream" warnings. The unused packages are now excluded at dependency-resolution time, so the shipped autoloader exactly matches the shipped files.
  • Fix: the "earn X points" estimate on product listings and product pages now respects the loyalty program's tax mode. Programs that award points on the pre-tax amount (Square's default) previously showed an estimate computed on the tax-inclusive price, overstating the points a customer would actually earn; the badge, shortcode and variation estimates now match what Square awards.
  • Fix: coupon discounts now reduce loyalty point earning on programs that accrue before tax, matching Square's own calculation. The checkout earning estimate and the locally calculated accrual (split orders, orders with excluded lines, and the custom loyalty method) previously awarded points on the pre-coupon subtotal.

10.4.3

  • Improved: the loyalty Messaging settings now apply everywhere. Custom messages previously only reached some surfaces; they now appear in the classic-checkout loyalty box, the block checkout widget, the product page "earn points" text, the My Account loyalty section and the loyalty shortcodes, and your points terminology (e.g. "stars") is used consistently instead of a hardcoded "points".
  • Fix: several customised messages never displayed because the settings screen saved them under different names than the storefront read (the earn rate, the guest "login to earn" message, and "you need X more points"). A message saved under either name now wins over the default.
  • Improved: more messages are editable under Settings → Loyalty → Messaging — insufficient points, the "Redeemable" badge, the account page balance and tier labels, login prompts, and progress text — and remaining fixed storefront strings are now translatable.

10.4.2

  • New: plugin access is now a real WordPress capability, manage_squaresync_for_woo. Grant or remove it on any role with a role manager such as User Role Editor or Members to control who can use the SquareSync dashboard — it appears in User Role Editor under Custom capabilities → SquareSync for Woo. On update it is granted once to administrators, shop managers and any role that could already reach the plugin, so nobody loses access; after that the capability alone decides, so unticking it locks a role out even if that role has other admin capabilities. The Permissions screen can still narrow what a role sees inside the dashboard.
  • New: sws_base_capability filter to change the capability name the plugin checks.

10.4.1

  • Improved: loyalty point earning now honours your Square program's exclusions on the website. Excluded categories and items, and gift card products, no longer earn points — in the cart and checkout "you will earn" estimates, product page point displays, and the points actually awarded after checkout, with either calculation method. The loyalty settings page now shows the earning conditions applied.
  • Fix: express checkout (Apple Pay / Google Pay) refused every order with "The shipping method you chose is not available for your address" on stores using a dynamic rate provider such as ShipStation, which generates a new rate ID on every quote. The approved shipping method is now re-matched to the same service at the same price when only its ID has changed; a changed price or service still refuses the order, and the wallet-approved total is still enforced.
  • New: sws_loyalty_product_excluded filter to exclude further products from earning points.
  • New: sws_express_shipping_rate_rematch filter to disable express shipping-rate re-matching.

10.4.0

  • Improved: decimal stock quantities are now properly supported end to end, for stores selling by length or weight (fabric by the yard, produce by the kilo). Fractional counts hold their value from Square through to WooCommerce and back, on imports, real-time syncs, the stock buffer, per-location stock and the Stock Checker.
  • Improved: the setting now tells you where it stands. WooCommerce can only store whole numbers unless a decimal-quantities plugin is installed, so the plugin checks for one, keeps running in whole-number mode when it is missing, and says so in wp-admin instead of quietly rounding. In that mode Stock Checker also leaves fractional Square counts alone rather than rounding them away on its scheduled run.
  • Improved: fractional quantities now sync on orders, including orders split across locations, and a measurement unit set on a Square item survives being exported back from WooCommerce. If an item is not sold by a measurement unit in Square, the sync log now says so and what to change, rather than the order failing with an unexplained Square error.
  • Improved: fractional quantities are also honoured at express checkout (Apple Pay / Google Pay), in automatic Square discounts, in the Products table and stock sorting, and the stock buffer can now be fractional.
  • New: squarewoosync_decimal_stock_supported filter, for decimal-quantity integrations the automatic check cannot detect.

10.3.9

  • Fixed: paying with a Square gift card on the block checkout failed with "Error paying order with multiple payments: [ORDER_TOTAL_MISMATCH]" and the order could not be placed. The block checkout stores the applied card differently to the classic checkout, and the Square order total was reconciled against a figure that had the gift card missing from it, so the payments no longer matched the order. Gift card payments now complete on both checkouts.
  • Fixed: on stores where prices exclude tax, a gift card only paid for the items and left the shopper paying the sales tax out of pocket, even when the card had enough balance to cover it. WooCommerce was capping the gift card at the pre-tax value of the basket. A gift card now covers items and tax, up to its balance (shipping is still always paid by the shopper).

10.3.8

  • New: Apple Pay and Google Pay express checkout now shows a full-screen loading indicator from the moment the payment sheet is approved until the order confirmation page loads. Previously the page sat with no visible feedback for the few seconds the order took to create.
  • Fixed: the gift card field on the block cart and block checkout no longer inherits a stray top border and margin from the coupon panel, and its expand arrow now points the right way when the field is open.
  • Fixed: turning the AI assistant off in Settings > Advanced now also stops the chat-style setup assistant appearing. The setup modal, the dashboard setup banner and the Tools > Setup Wizard action ignored the setting and still opened the chat surface, which then could not answer anything because the chat endpoints are disabled with the setting. All three now fall back to the classic step-by-step wizard.

10.3.7

  • Fixed: the sync feed logged an error for every Square customer event, including the ones that worked. The create/match routine never reported its result back to the webhook handler, so the handler always fell through to "Failed to create/match customer" — even when the WordPress user had just been created, or when there was simply nothing to do. Customer syncing itself was never affected; the error rows were false. Successful syncs now log once as a success, and the routine no-ops (a Square customer with no email address, a shopper with no WooCommerce account, and Square events echoing a change that started in WooCommerce) are logged as information instead of errors.
  • Fixed: the success message said a customer "has been created in WordPress" even when an existing user was matched rather than created. Created and matched are now reported separately.
  • Fixed: an error while matching a Square customer to an existing WordPress user was written only to the PHP error log, so the sync feed showed no reason for it. It is now recorded against the Square customer ID.
  • Improved: the warning for a stock change on a Square item that is not linked to a WooCommerce product now names the item and its SKU rather than only the internal Square object ID, and says what to do about it.

10.3.6

  • Fixed: a variation whose image file was missing from the media library was skipped entirely when syncing a product to Square, instead of just losing its image. The sync log said the variation "will sync stock/price/SKU" while the catalog update silently dropped it, so title, price and SKU edits never reached Square — and a variation not yet linked to Square was never created there at all. Missing, oversized and unsupported image files now cost the variation only its image. This most often follows a site migration or a media offload that leaves media library entries pointing at files that are no longer on disk.
  • Fixed: one product that could not be synced no longer abandons every product queued behind it. A failure part-way through a batch stopped the run and marked the whole job for retry, which replayed the same batch and stopped at the same product — so for permanent failures nothing after that product ever synced. Each product is now handled on its own and the batch continues.
  • Fixed: when a WooCommerce attribute value cannot be added to Square, only that variation is skipped rather than the whole sync being abandoned. Square limits an item option to 250 values, and stores with a large attribute (character or design names, for instance) can reach it.
  • Improved: Square option errors now name the product, the attribute and the value, and explain the 250-values-per-option limit and that retrying will not clear it, instead of reporting an internal Square object id.
  • Improved: the pre-sync check on a product's Sync to Square panel now distinguishes a variation that will be skipped from one that will simply sync without its image.

10.3.5

  • New: customers can now see their Square gift card balances on the storefront. The [sws_gift_card_balance] shortcode lists every card an account holds with its live Square balance, and an optional Gift Cards tab in My Account (WooCommerce → Settings → Payments → Square → "Gift Cards in My Account") shows the same list. Cards are found three ways, because Square only knows about the first: cards linked to the customer's Square record, cards they bought on this site, and cards somebody else bought and emailed to their address. Card numbers are masked and revealed on click, and spent or deactivated cards stay listed so a customer can see where a card went. A card the customer bought and emailed to somebody else is not shown — that number belongs to the recipient.
  • New: sws_get_customer_gift_cards() and sws_get_gift_card_balance() template helpers for themes, plus filters over the resolved card list, the rendered markup, the status labels, the cache lifetime, and which of the three sources are searched.
  • Fixed: a Square gift card that covered an order in full was never debited — the order went through on the website, but the card kept its balance and Square recorded the sale as a $0.00 "Website Order" payment with a "Rounding Adjustment (-)" for the card's value. WooCommerce never calls a payment gateway when the total comes to $0.00, so the plugin charges the card as the order syncs; the card details were being cleared off the order moments after checkout, leaving nothing to charge. The card is now charged for the full amount and Square records the sale at its real value. Gift cards that only part-paid an order were not affected.
  • Fixed: with "Split orders by product location" enabled, a redeemed gift card was never charged in Square at all — the entire order was tendered as an external payment, so the card kept its balance and its value was reported as website revenue. Split orders now charge the card and send only the remainder as the external payment, still counting exactly one sale.
  • Fixed: in Settings → Permissions, choosing Hidden for a feature looked exactly like choosing nothing — the selected style was identical to the unselected one, so there was no way to tell which level was actually set. The three levels now read as a traffic light (red Hidden / amber View only / green Full), and a level inherited from the subject's default is shown with a dashed outline instead of being faded out.
  • Fixed: the dashboard Sync Feed no longer breaks the page layout. Square order and refund ids are single unbreakable strings, and one long enough entry pushed the message text and the expander arrows outside the widget. Messages now wrap, in the feed and in the log detail panel.
  • Fixed: an expanded group in the Sync Feed no longer collapses on its own each time the feed refreshes, and the timeline line down the left of the feed now runs unbroken past an expanded group's child entries.

10.3.4

  • Fixed: Afterpay/Clearpay express checkout could not complete — the Clearpay window told buyers to "set the delivery address on the website" and the payment always failed. Afterpay requires each shipping option in its address/option callbacks to carry its own tax and total (a shape Apple Pay/Google Pay reject), so those callbacks now return the Afterpay-specific shape on every surface (express buttons, Blocks checkout, classic checkout) while Apple Pay/Google Pay responses are unchanged.
  • Fixed: on the Blocks checkout, Afterpay/Clearpay now uses the delivery address chosen inside the Afterpay window instead of failing unless the checkout form was already filled in — which made the cart-page button a dead end.
  • Fixed: the shipping method chosen inside the Afterpay window is now applied to the classic-checkout order (it was previously ignored).
  • Fixed: table-rate shipping plugins that emit three-part rate ids (e.g. table_rate:19:21) hid the delivery-date and pickup selectors on the classic checkout and could type those orders as plain shipments in Square fulfilments. Rate matching now compares the method and instance segments, so zone-instance mappings match every row of a table-rate method.
  • Improved: product-page express checkout buttons are now robust against themes that float or flex the Add to cart row (e.g. Shoptimizer/CommerceKit) — the buttons claim their own full-width line instead of being squeezed beside the button and clipped, shrink cleanly in narrow columns, and relocate below the product form when a theme leaves them no room.

10.3.3

  • Fixed: with "Auto product creation" on, a single new Square item could import as two WooCommerce products, both linked to the same Square item. Square sends one catalog webhook per catalog change, so creating an item fires several within seconds, and two background workers could each find no existing product and each create one. Imports of the same Square item are now serialised across workers, and a product created by a losing worker is discarded rather than left behind.
  • Fixed: resolving a duplicate under Tools no longer deletes the item from Square. The copy being removed still carried the Square link, so trashing it triggered "Delete product from Square" against the item the kept copy is linked to.
  • Fixed: when a store already has two products sharing a Square item, every lookup now resolves to the same one instead of whichever the database happened to return first.
  • Improved: the sync log now says when an import created a product rather than updated one, and marks the ones "Auto product creation" produced — previously every inbound product change read "Successfully synced", so a product appearing twice looked identical to a routine update. Two new warnings were added alongside it: one when two workers import the same Square item at once, and one when a store already has several products linked to a single Square item.

10.3.2

  • Security patch. All sites should update.

10.3.1

  • New: pickup date/time selector now works on the classic (shortcode) checkout too — previously only the Blocks checkout offered it, so stores on classic themes had no way to collect a pickup slot at checkout. Uses the same schedule/preparation-time settings and the same Storefront Wording strings, so "Pickup" → "Collection" renames apply to both checkouts.

10.3.0

  • New: Storefront Wording (Settings → Orders → Storefront Wording) — rename the customer-facing text used across the checkout, thank-you page, admin order screen and order emails. Rewrite "Pickup" to "Collection" (or any language), reword the confirmation lines, and add store-specific instructions. Confirmation messages support {date} and {time} placeholders that are replaced with the customer's selection at render time.
  • New: sws_storefront_wording filter for developers to override the resolved wording map (e.g. per-language rewrites without touching the settings UI).

10.2.0

  • New: AI-guided setup — onboarding is now a conversation with the setup assistant. Plain-language questions cover connection, stock, products, customers, payments, orders and discounts; every answer is applied immediately. Typed questions get inline AI answers (only those use credits), and "Re-run setup" / Tools → Setup Wizard now open it (classic wizard still available).
  • New: rich product descriptions — descriptions now sync using Square's formatted (HTML) field in both directions, so bold text, lists and paragraphs survive. On by default; toggle under Settings → Products → Import Settings ("Strip formatting on import" still wins).
  • New: export locations (Settings → Products → Sync Behavior) — choose which Square locations exported products are available at, with an optional toggle that marks trashed products unavailable there (restore brings them back).
  • New: unmanaged "Out of stock" products now export to Square as sold out at your location(s), so the POS can't sell them.
  • New: optional add-to-cart stock refresh (off by default) — pulls a product's live Square stock when it's added to the cart, closing the webhook-latency oversell window.
  • New: gift card reloading — tick "Allow reloading" on a Square Gift Card product and customers can add funds to an existing card by entering its number on the product page; the balance updates in Square.
  • New: product CSV export/import now carries the Square link ("Square linked" + "Square Item ID" columns), and Quick/Bulk Edit can flip "Ignore stock updates from Square" from the Products list.
  • New: GDPR tools — WordPress personal-data export/erase now covers the stored Square customer link.
  • Fixed: re-running setup on an already-configured store marked itself complete immediately, so the wizard could never actually be re-run.
  • Fixed: a stale "not connected" status could persist for up to an hour after reconnecting Square; the cached check now clears when a token is saved.

10.1.0

  • New: Permissions (Settings → Permissions) — decide, per WordPress role or per individual user, which parts of the plugin each account can see and change. Every area has three levels: no access, view only, or full control. Built for agencies and multi-staff stores: give a shop manager stock and orders but not the Square connection, or hand a VA read-only access to everything.
  • New: the permission rules also cover the plugin's controls on WooCommerce's own screens — the Products bulk actions, the sync/export/link boxes on a single product, and the Square Payment box on an order — and every setting is enforced on the server, so a hidden button cannot be worked around.
  • New: product weight now syncs with Square. Under Settings → Metafields, pick the Square custom field that holds weight and it syncs both ways on every product sync — Square value to the WooCommerce weight field on import, WooCommerce weight back to Square on export. Whatever shape the value is in on the Square side is understood and converted to your store's weight unit: "2.5 kg", "1200 g", "3 lbs", "48 oz", a decimal comma or a bare number all work. A variation only sends a weight it has of its own, never the parent's, so nothing gets pinned by accident.
  • New: developer filters for custom attributes — squarewoosync_square_custom_attribute_values (outbound), squarewoosync_custom_attribute_wp_value and squarewoosync_apply_custom_attribute_value (inbound), plus squarewoosync_product_field_attributes to add your own WooCommerce field to the binding list. See the Filters Reference in the docs.

10.0.1

  • Fixed: real-time stock pushes to Square could be silently lost when WP-Cron ran late (low-traffic sites, or hosts running system cron every few minutes) — the pending push expired before cron collected it. Website sales now queue their Square stock update durably during checkout itself, with no cron-timing dependency.
  • New: the AI assistant can now be turned off entirely (Settings → Advanced → AI Assistant) — hides the Assistant page, chat button and intro popup and disables the chat endpoints. Developers can force it off in code with the sws_ai_assistant_enabled filter.
  • Fixed: AI Assistant page — the conversation sidebar could sit partly hidden under the navigation bar when opening the page from a scrolled screen.
  • Improved: Apple Pay now shows first among the digital wallet buttons at checkout, express checkout and the saved-card form.
  • Improved: Square items skipped because "update only" mode is on and no linked WooCommerce product exists are now logged as informational skips instead of errors, so the sync log error feed and error email digest stay reserved for real failures.

10.0.0

  • New: AI Assistant built into the plugin admin — a sparkle button on every page and a dedicated Assistant page. Ask setup and feature questions answered from the documentation, and describe a sync problem in plain words to have it read your own sync logs, debug log, webhook status and settings and explain the likely cause and fix.
  • New: the assistant can make changes for you, after you approve each one on a confirmation card — adjust nearly any sync setting (connection credentials, environment and location are always protected), run a stock check, retry a failed sync, and refresh your saved Square catalog.
  • New: product import and sync by chat — ask to sync a product and pick it from a checklist of matches; the assistant imports new products and updates already-linked ones. It can also find WooCommerce products missing from Square and export your chosen ones back to Square.
  • New: draft support emails — the assistant writes a ready-to-send email pre-filled with your plugin, WordPress and WooCommerce versions, the relevant log excerpts (with secrets removed) and its diagnosis, so support tickets arrive pre-triaged.
  • New: every active Pro subscription includes a monthly allowance of assistant messages, with prepaid credit packs available if you need more. Manage usage and credits from your account.
  • Security and privacy: the assistant runs with your own admin permissions, never sees your Square tokens or licence key, and strips credentials from anything it reads before it leaves your site.

9.15.0

  • New: Sync Activity page (More → Sync Logs) — the full sync log with level and source filters, date range, text search across messages, SKUs and IDs, and expandable entries showing the complete error, stack trace and linked product/order details with copy-to-clipboard. The dashboard Sync Feed now shows the latest 25 events and links through to it.
  • Improved: every sync log entry now says what it was about. Failures name the exact product or order and carry the real underlying error (Square's API response, the exception, the reason) instead of a bare "Product creation/update failed"; successes record what was imported, updated or skipped. Failures that previously vanished without any log entry — including customer sync errors and Square connection token renewal problems — now appear with a clear message.
  • New: Retry button on failed log entries — re-import a failed Square order or product, or re-push an order to Square, straight from the log. Every retry is guarded so it can never duplicate an order or touch stock incorrectly.
  • New: optional error emails — flip "Email on errors" on the Sync Activity page to receive at most one digest per hour when sync errors occur, with the full reasons and a link to the filtered log.
  • New: export the current (filtered) log view as CSV or JSON, and a one-click Support bundle that packages recent logs, the debug-log tail and environment info (secrets removed) to attach to a support ticket.
  • New: "Sync History" button on the product editor's Square Link Status box — every log entry for that product, one click away.
  • Improved: repeated identical errors (e.g. during a Square outage) collapse into a single entry with a counter instead of flooding the feed, and errors are retained longer than routine entries.
  • Fixed: log timestamps now display correctly when your WordPress timezone differs from your browser's.
  • Security: the debug log file moved from the plugin folder to a protected uploads directory — its old location was readable by anyone who guessed its URL and could contain Square API data. The old file is removed automatically on update.
  • Fixed: dashboards behind host-level firewalls / bot protection (e.g. 20i StackProtect, GoDaddy website security) no longer break when the security layer intercepts the plugin's REST API with a verification page. Blocked requests are automatically retried through a compatibility fallback (admin-ajax) with identical security checks, and a notice explains how to have your host allowlist the API for a permanent fix.
  • Fixed: the dashboard "Automatic scheduler" card now lists the data types the scheduled sync will update ("The following data will be synced" was always empty due to a settings key mismatch).

9.14.1

  • Improved: "SKU Matching priority" now syncs stock in BOTH directions. Website sales and stock edits on products without a Square link are pushed to Square by matching the SKU (previously only Square → WooCommerce worked, so website sales could be silently restored by the next Square update). Stock only — resolved once per product then cached; ambiguous or unknown SKUs are skipped and logged, never guessed; no Square catalog items are created or modified.

9.14.0

  • New: "Separate offline (POS) orders" toggle (Settings → Orders → Import) — restructures WooCommerce → Orders for shop managers: status views list and count website orders only, Square offline/EPOS sales move to their own "Offline" view, and "All" moves to the end of the row. The sidebar Processing badge matches. Replaces the "Order source" dropdown while enabled.
  • New: "Strip formatting on import" option (Settings → Products → Import Settings, also in the import dialog) — import the product title and/or description from Square as clean plain text, with HTML tags, entities and stray whitespace removed and paragraph breaks kept. Applies wherever product data comes in: manual imports, scheduled sync and real-time sync, so cleaned products stay clean. Off by default.
  • Developer: new squarewoosync_strip_formatting_value filter to extend or replace the cleaned value, and squarewoosync_strip_formatting_fields to register additional fields for stripping.
  • Fixed: the dashboard webhook banner now shows the same server-classified status as the Webhooks page — no more false "last webhook failed" alerts for in-flight deliveries, stale or cross-site errors on multi-site accounts, or a Resume button that didn't clear every pause layer.
  • New: "Connected sites" manager (Webhooks → Settings) — see every site registered to receive your Square account's webhooks, each with its own delivery health, and remove stale registrations (e.g. an old staging or temp domain). Multi-site delivery is now fully isolated per site: one site failing, resetting or resending never pauses, resets or replays webhooks for the others.
  • New: "Discard held updates" (Webhooks → Controls) — permanently delete this site's queued, blocked and failed webhook backlog instead of replaying it. Ideal after a long outage: discard the stale events, then run a manual sync to catch up.

9.13.1

  • Improved: stock-only syncs (including the real-time "stock on new WooCommerce orders" push) now write inventory counts only — they no longer send a catalog item payload, so a stock change can never create, rename or remove Square variations.
  • New: "Never delete Square variations" setting (Settings → Products → Sync Behavior) — by default, pushing a product to Square mirrors its WooCommerce variation list exactly, which removes Square variations that aren't linked to a WooCommerce variation. Enable this setting on partially-matched catalogs to keep those unmatched Square variations untouched instead. The pre-sync matching dialog reflects whichever mode is active.

9.13.0

  • New: delayed capture (authorize now, capture later) — a "Payment Action" setting on the Square gateway authorizes the card at checkout instead of charging it. The order goes On hold and a Square Payment box on the order screen lets you capture the full amount, capture a partial amount (the rest of the hold is released), or void the authorization. Cancelling the order voids the hold automatically, and an optional "Capture on Completed" toggle captures when you mark the order Completed. Square holds online authorizations for a maximum of 7 days. Orders paying with a gift card, redeeming a loyalty reward, containing a subscription or gift card product, or split across locations continue to charge immediately.
  • New: "Require Card Save" gateway setting — every card used at checkout is stored on the buyer's Square customer profile (guests included, matched by billing email), replacing the optional save checkbox with a clear notice. Saved cards can be charged from the Square Dashboard, Square Invoices, or directly from the WooCommerce order screen.
  • New: charge a customer's saved Square card on file for any unpaid order from the order screen — works for account holders and guest orders alike.
  • Default behaviour is unchanged: payments continue to capture immediately at checkout unless you enable the new settings.

9.12.1

  • New: pickup and delivery details now appear on order emails, so customers keep their collection date/time or delivery date for reference without going back to the site. Both blocks are standard WooCommerce templates and can be restyled or reworded by copying them into your theme (woocommerce/emails/pickup-details.php and woocommerce/emails/delivery-details.php).
  • Fixed: a redeemed loyalty reward was deducted TWICE from the Square order when Point Redeeming was on with the Square redemption method — once by the reward discount Square attaches to the order, and once by the plugin's own "Loyalty Discount" entry in the order it sends — with the shortfall papered over by an untaxed "Rounding Adjustment (+)". Square understated the order's tax by the tax share of the reward and under-reported gross sales; customers were always charged the correct amount. The reward is now deducted exactly once, so no rounding adjustment appears and Square records tax on the true consideration.
  • Fixed: with Point Redeeming switched off, the blocks checkout still offered and applied rewards (the classic checkout correctly hid them) — customers received the discount while their points were never deducted. Rewards are no longer offered or applicable anywhere while redeeming is off, and a reward already sitting in an open basket is dropped when the toggle is switched off mid-session.
  • Fixed: split orders (Split Orders by Product Locations) never recorded the points redemption at all — the customer kept their points while still receiving the discount. The redemption is now recorded against the primary Square order, and a redeeming split order no longer also accrues points for the same purchase.
  • Changed: on tax-inclusive stores, loyalty rewards now reduce the taxable base — the Loyalty Discount is recorded as a net amount plus tax apportioned across the eligible items' tax rates (zero-rated items excluded), so tax is declared on the discounted consideration, as many jurisdictions require for price-reducing discounts (e.g. UK VAT). The customer still receives exactly the promised discount and order totals are unchanged; only the declared tax moves (e.g. a £2.50 reward on a 20% basket now reduces declared VAT by £0.42). Controlled by a new "Rewards reduce the taxable base" toggle in Loyalty settings, ON by default (sws_loyalty_fee_reduces_tax_base filter available). Tax-exclusive stores and gift cards are completely unchanged. Note for merchants mid-tax-period: reported tax on loyalty orders changes from this release — disable the toggle if you need continuity until your next period.

9.12.0

  • New: pickup/delivery mapping can now target individual shipping zone rates (e.g. only your local zone's "Local Delivery" rate) instead of whole method types — zone rates are listed by name in the settings, and existing whole-method mappings keep working unchanged.
  • New: delivery date selector for orders mapped to Square Delivery — set a lead time (days) and the weekdays you deliver, customers pick a date at checkout (block and classic), and the Square order is scheduled for that date.
  • Fixed: importing a Square pickup order could fail entirely after the pickup mapping had been edited in the settings UI; pickup orders now import reliably and carry the configured pickup method.
  • Fixed: the plugin's bundled dependencies are now built against its PHP 8.0 minimum, so it installs and activates on PHP 8.0 hosts again.

9.11.2

  • Fixed: editing a variation's stock or price logged "Catalog upsert failed for object ?: [EXPECTED_OBJECT]" in the sync log — the variation was pushed to Square as a malformed catalog object and the update never landed. Variation edits now sync through their parent product, and products linked directly to a Square variation upsert correctly (previously their price/SKU changes were silently never applied).
  • Fixed: the Stock Checker scan could stop after the first 25 products and sit on "running" forever when a batch outlived the server's time limit (e.g. during Square rate-limit retries). Batches now fit themselves to the host's time budget, a died batch resumes automatically within 10 minutes, and a batch that keeps dying fails the scan visibly instead of hanging. Cancelling a scan now also properly removes its queued background actions.

9.11.1

  • Changed: a Square outage can no longer hold up checkout. Square calls made while a customer is paying now stop retrying after a few seconds instead of working through a retry sequence lasting over a minute — the payment itself never retried, so the wait only delayed the same outcome. Follows a customer question about 9.11.0 putting Square order creation on the checkout path; checkout has always needed Square to take a card payment, and a failure at that point has never stopped the sale.
  • New: an order whose Square order could not be created now shows as "Failed" in the Square column of the WooCommerce orders list, with the reason on hover, instead of a bare "Not synced". Previously the only record was an order note and the server error log.
  • Changed: the Square location list is reused from cache during checkout instead of being fetched for every card order, removing a request from the payment path on stores using Split Orders by Product Locations.

9.11.0

  • Fixed: with Split Orders by Product Locations enabled, every order paid through the SquareSync gateway was recorded twice in Square — the customer's card payment stood alone as an unitemised "Custom Amount" sale with £0.00 tax while the split orders were counted again as full-value EXTERNAL-tendered sales, overstating Square gross sales by the entire order value. The card was being charged before any Square order existed to attach it to; the order is now created at checkout first and the payment attaches to it, so a detached payment can no longer exist. Affected reporting only — customers were always charged the correct amount once.
  • Changed: split orders redesigned so Square counts exactly one sale however many locations fulfil the order. One order at the default Square location carries the whole basket, the payment, VAT and shipping; each other location receives a zero-value fulfillment order holding its real catalogue items and quantities — it moves that location's stock and gives staff a normal order ticket, carries no payment record of any kind, and adds nothing to any sales report. Lines fulfilled by another location are labelled "(fulfilled by …)" on the paying order so staff know which items are not theirs to pick. Note: all revenue attributes to the default location in per-location reports; totals, VAT and item quantities remain correct overall.
  • Fixed: orders whose items were all available at a single location were needlessly routed down the split-order path (and duplicated in Square, as above). They now take the ordinary single-order path untouched.
  • Fixed: shipping, fees and coupon discounts never reached split orders in Square — shipping VAT went unrecorded and order totals were wrong by the shipping or discount amount. The paying order is now built by the same code as a normal order, so all of them are included; discount-code redemptions, previously skipped entirely in split mode, also work.
  • Fixed: orders paid by other gateways (e.g. PayPal) that carried a coupon were under-reported in Square by the coupon amount — the payload double-counted the discount and, unlike the SquareSync gateway path, the total was never reconciled before the EXTERNAL payment was recorded. All order-sync paths now reconcile the Square total to the WooCommerce total before tendering.

9.10.9

  • Fixed: a Square order that arrives as an open tab (imported as "pending") could lose its stock deduction altogether. Such an order reduces nothing when it is imported, but it was still being marked as already stock-reduced — so if it was later paid or completed in WooCommerce rather than in Square, WooCommerce skipped the deduction and Square never heard about the sale either, leaving both sides one too high. The order is now only marked when the import genuinely reduces stock.
  • Fixed: simple products linked to Square without a stored variation reference had their stock reduced twice for a Square sale — once by Square's inventory sync and again by the imported order. These products are matched by Square's inventory sync through the parent item, but the duplicate-deduction protection added in 9.10.8 did not recognise that form of link, so the double reduction continued for them. Affects older or manually linked products; variations and newly imported products were already covered.
  • Fixed: "low in stock" and "out of stock" notifications now fire for stock changes that come from Square, including in-store sales. WooCommerce only raises them for reductions it performs itself, so once Square's inventory sync became the source of the deduction these emails stopped arriving. Stock changes made directly in Square (a manual adjustment or a stock take) now trigger them too, which was never the case before.
  • Fixed: on stores using product bundles or "sell in multiples" extensions, the quantity recorded against an imported Square order now matches what WooCommerce itself would record, so cancelling or refunding such an order restores the correct number of units.
  • Note: WooCommerce's own stock deduction is skipped only for items Square's inventory sync actually covers — products not linked to Square, set to ignore Square stock updates, or not managing stock still deduct exactly as before. An item linked to a Square object that Square is not tracking inventory for counts as covered, so it will not deduct in WooCommerce; turn stock tracking on for it in Square, or untick "Manage stock" for it in WooCommerce.

9.10.8

  • New: exclude individual products from your synced Square discounts, straight from the product edit screen — an "Exclude from Square discounts" tick box on the General tab, with the option to exclude from particular discounts only. Excluded products keep their full price everywhere and whole-basket percentage discounts are worked out from the rest of the cart. On a variable product the parent setting covers every variation, and each variation row carries the same fields for excluding just some variations. The sws_product_matches_discount filter still works and takes precedence.
  • New: express checkout orders are checked against what the buyer approved in the wallet sheet — if their real address makes the chosen shipping method unavailable or raises the total, the order is refused with a message instead of being placed at a different price.
  • New: "Prefer Delivery Over Pickup" setting (WooCommerce → Settings → Payments → Square) so stores offering click & collect can default to delivery without reordering their shipping zone.
  • New: developer filters sws_wallet_default_shipping_option, sws_wallet_pickup_method_ids, sws_express_enforce_approved_total and sws_express_approved_total_tolerance; express refusals are logged under squarewoosync-express in WooCommerce › Status › Logs.
  • Removed: the "Sync from Available stock" setting (Settings → Products). Square's API does not expose the "Available to sell" / committed quantities shown in the Square Dashboard — the inventory state the setting relied on is never populated over the API — so the option could not do what it described. Stock now always syncs from Square's In Stock count, which was already the default; sites that had the tick box on simply continue with In Stock syncing and no action is needed.
  • Fixed: Square POS sales are no longer echoed back to Square as stale "re-counted" stock adjustments — a race that could permanently inflate stock on both sides when two sales landed close together, and that filled Square's stock history with noisy per-sale re-count rows. One-way Woo-to-Square stores are unaffected.
  • Fixed: a genuine Square-side stock change arriving within two minutes of a WooCommerce stock push is no longer mistaken for the push's own echo and silently discarded; the guard now records exactly what was pushed and only skips a true echo. Inventory pushes are also now timestamped in true UTC, so on servers ahead of UTC they can no longer supersede genuine sales that happened after them.
  • Fixed: a running product import saved its progress by writing back a stale copy of your whole settings list taken minutes earlier, quietly reverting any setting you changed while the import was running.
  • Fixed: stores with several Square locations could miss stock updates when a bulk change touched many products at once, because only the first page of Square's response was read. All pages are now read.
  • Fixed: stock pushes to Square could be silently skipped for a product, or send an empty quantity that made Square reject the whole batch, because the push list was built from Square's counts without filtering by stock state.
  • Fixed: a Square sale imported as a WooCommerce order no longer reduces your WooCommerce stock twice, the location check used when splitting orders no longer mistakes reserved items for available stock, and turning off "Restore stock when a Square order is cancelled" is now reliably honoured.
  • Fixed: pages with express checkout buttons silently switched shoppers to the cheapest shipping method (almost always free click & collect), overwriting their choice on every recalculation. The default now follows your shipping zone's method order like standard WooCommerce, and a shopper's own selection is never overridden.
  • Fixed: Apple Pay now shows its shipping method selector — shipping options are sent in the exact shape the Square SDK expects on the classic checkout, Blocks checkout and express buttons alike, wallet sheets include indicative delivery options before the buyer has shared an address, and a temporarily failed recalculation no longer removes the selector permanently.

9.10.7

  • Fixed: Square customer matching could overwrite a user's WordPress role even with Square to Woo role syncing disabled. Matching a Square customer to an existing user (by email or phone, via webhook or auto-matching) reset non-admin users to the plain "customer" role, stripping custom roles such as wholesale. Roles are now only touched when Square to Woo role syncing is enabled, and even then a user's existing roles are left alone unless one of your configured role mappings actually matches the customer's Square groups.
  • Fixed: duplicating a product in WooCommerce produced a copy that was still wired to the original's Square item, because WooCommerce copies every custom field including the Square link. Duplicates are now detached from Square automatically. Until this release, a duplicate could cause real damage: moving it to the trash deleted the ORIGINAL product from your Square catalogue (when "Automatically delete Square products" was on), and saving the duplicate pushed its name, price and stock over the original's Square item (when real-time Woo to Square syncing was on). The scheduler could also draft or publish the copy while reconciling the original against your category filter. If you have duplicated products in the past, use Products › bulk action "Remove Square product IDs" on the copies to clean them up.
  • Fixed: with "Automatically create Square products" enabled, publishing a duplicated product did nothing instead of creating a new Square item. Two separate causes: the copy carried the original's Square ID so the plugin treated it as already synced, and WooCommerce stamps duplicates with the date they were cloned, so publishing one on any later day failed the plugin's "newly published" check. Duplicates are now flagged when created and are exported as brand-new Square items whenever they are first published — same day or months later.
  • Fixed: unlinking a product from Square left part of the link behind. The "Remove Square product IDs" bulk action and the unlink button on the product edit screen both cleared only some of the stored Square data, and cleared less from variations than from the parent product — leaving stale location, per-location stock and category-filter data that could affect later syncs. Every unlink path now clears the same complete set from the product and all of its variations.
  • Fixed: duplicates created with Yoast's "Duplicate Post" plugin are now detached from Square too. That plugin copies posts directly rather than going through WooCommerce, so it was unaffected by the fixes above.
  • Improved: a failed export to Square now also clears the temporary reference it wrote for that attempt. A leftover reference could be matched against the wrong product on a later export, causing a newly created Square item to be linked to the wrong WooCommerce product.
  • Fixed: automatic discount syncing now honours the "excluded items" configured on a Square discount rule. Exclusions were previously ignored on the WooCommerce side, so a discount set up in Square as "10% off everything except X" still discounted X in your online store while the register correctly skipped it. Excluded products and categories are no longer discounted, and for storewide percentage discounts the discount is calculated from the non-excluded part of the cart only. Note: existing stores need to refresh the discount list (Discounts page) once after updating for exclusions to be picked up.
  • New: developer filters to control automatic Square discounts in code — sws_apply_square_discount skips a discount entirely, and sws_product_matches_discount excludes (or force-includes) individual products or categories from a specific discount.
  • Fixed: with Woo to Square status syncing enabled, every imported Square POS sale logged error notes like "Failed to fully update Square order ... Array not expected ... in_store_details.recipient". A status change that itself came from Square (a POS sale arriving as completed) was being pushed straight back to Square, where the order is already completed and cannot be updated — and the update re-sent Square's own fulfillment data in a form Square rejects. Square-originated status changes are no longer echoed back at all, and a genuine completion made in WooCommerce now sends Square only the minimal fulfillment update it expects. The same echo protection now covers cancellations and refunds: a refund made in Square no longer risks being pushed back to Square as a duplicate, unlinked refund record.
  • Fixed: the "Send admin/customer order notification emails" settings (Orders → Import) only silenced emails at the moment the order was created. The customer "order completed" email is sent later, when Square marks the sale completed via webhook, so stores with these toggles off still emailed every in-store customer. The toggles now apply to Square-imported orders across the whole order lifecycle (confirmation, completed, cancelled, refunded, failed); orders placed in WooCommerce itself are never affected, and review/loyalty plugins that watch order statuses (rather than WooCommerce emails) keep working.

9.10.6

  • Fixed: importing with the "Title" datapoint switched off created products and then immediately deleted them, logging "Deleted invalid product #123: Product has generic title "Product"". WooCommerce names any product saved before a title is assigned "Product", and the import only assigned the Square name when Title was ticked — so the cleanup step saw its own placeholder and removed the product. New products are now named from Square before they are first saved, regardless of whether Title syncing is enabled (that setting controls whether an existing WooCommerce title is overwritten, not whether a new product gets a name). This affected manual imports, scheduled syncs and catalog webhooks alike.
  • Fixed: the import cleanup step no longer force-deletes a product that already existed in WooCommerce. If an existing product fails validation, the import now reports it and leaves the product untouched, and a product left with WooCommerce's "Product" placeholder is renamed from the Square item instead of being deleted.
  • Fixed: products could fail to sync to Square with "Duplicate image id ... found on ITEM", which blocks every later update to that product. When a product's featured image also appeared in its gallery, or when two images in the media library had both been imported from the same Square image, the same Square image was sent twice on one item and Square rejected the whole thing. Image lists are now de-duplicated before syncing, keeping the first position so your primary image doesn't change.
  • Fixed: once a Square item had picked up a duplicate image reference it failed on every sync from then on, with nothing the store owner could change to stop it. Updating an item means sending back the data we read from Square, so an existing duplicate was faithfully re-sent and rejected again each run. Image and category references are now cleaned on every outgoing catalogue write — real-time syncs, scheduled syncs and bulk updates alike — so these errors clear themselves on the next sync. Empty custom-attribute data is stripped from bulk writes too; that was already handled for single-product syncs in 9.10.2.
  • Improved: hardening against Square's "duplicate ... found for attribute category_id" and "duplicate ... additional_category" rejections. Repeated category references are now removed from every product update before it is sent, and the deprecated single-category field is no longer passed back to Square alongside the current category list. If Square rejects an item for a repeated category anyway, the sync retries once with the reporting category left out of the additional categories so the product still syncs, and records that in the Sync Feed. To be clear about what this is: we have not been able to reproduce this particular rejection against Square's API, so unlike the image fix above it is preventative rather than a confirmed cure. If you are seeing these errors, please contact support with an affected product — we would like to look at the underlying Square item data.
  • New: "Repair Broken Square References" tool (Tools). Scans your entire Square catalogue for items whose image or category references are inconsistent — the same image or category listed twice, references to images or categories that have since been deleted from Square, and the deprecated category_id field — and lists every affected product with the problems found. The scan is read-only and nothing changes until you approve it; the repair then removes only the duplicate and dangling references, leaving names, prices, stock, variations and all valid images and categories untouched. Useful both for clearing a backlog of "Duplicate image id" or "Expected an object of type ITEM_IMAGE" errors and as a diagnostic: if products are failing to sync with a reference error, run the scan and send the results to support.
  • Improved: images uploaded to Square are no longer sent against a hardcoded, older Square API version than the rest of the plugin. Image uploads were pinned to a fixed API version while every other request used the version configured for your Square application, so uploads and the product updates referencing them could run on different versions. Both now follow your application's configured version.

9.10.5

  • Fixed: cancelling or refunding an order in Square could leave WooCommerce stock one too high. The returned item was being added back to stock twice — once by WooCommerce's own restock and once by Square's inventory sync echoing the change back. On a cancel or refund that originates in Square, WooCommerce now follows Square's inventory instead of restocking a second time, so the count stays correct in both directions. A new "Restore stock on Square cancel/refund" toggle under Settings → Orders → Status Sync lets you turn the restore off entirely if you would rather cancelled or refunded stock stay sold-through in WooCommerce.
  • Fixed: the inventory table now records each product's WooCommerce link status as it syncs, instead of showing everything as "not linked" until the background matching job caught up. A sync rebuilds each row from Square, which previously wiped the link flag, so straight after a sync (and especially after a forced refresh, which clears the table first) linked products briefly appeared unlinked — throwing off the "not linked" filter and the Delete Unlinked count. The link status is now computed from the product's actual WooCommerce link the moment the row is written.
  • Improved: clarified the Local Delivery Mapping settings to prevent orders going missing in Square. Square "Delivery" (local courier) and "Shipment" (postal/carrier) are different fulfillment types, and mapping a shipping method to Delivery when your Square account isn't set up for delivery causes the order to be accepted but never shown in the Square Dashboard. The setting now explains this and makes clear that stores which ship products should leave it unmapped, which sends those orders to Square as Shipments.
  • Improved: the "Redeem a gift card" panel in the block checkout now starts collapsed, so it no longer expands the code-entry form by default. Customers click to expand it when they want to redeem a card.

9.10.4

  • Fixed: "Delete Unlinked Square Products" could delete products from your Square catalogue that were actually linked to WooCommerce. The tool decided what to delete from a cached link flag in the inventory table, and that flag is cleared every time the inventory is refreshed and only rebuilt afterwards — so if a sync was cancelled, failed, or was still running, genuinely linked products were marked as unlinked. Products linked with the SKU matcher or bulk matcher were never flagged at all. Every product is now re-checked against its live WooCommerce link immediately before deletion, so a linked product is never deleted even if the cached data is out of date, and items linked through a variation are protected too. The tool now warns you when it detects stale link data, the count it shows matches exactly what will be deleted, and it refuses to run if that number changed after you loaded the page.
  • Fixed: cancelling an inventory sync left the matching job's cached link data behind, so a later match could resume against an out-of-date snapshot and mark linked products as unlinked. Cancelling now clears that state.

9.10.3

  • Fixed: products imported from Square would fail to sync back with "Error occurred while syncing", and their stock would not stay in sync. Every image on a freshly imported product was being re-uploaded to Square on its first sync — even though those images had just come from Square — which wasted API quota, created duplicate images in your Square catalogue, and on variable products could run the request past the host's time limit and kill the sync outright. The plugin now recognises images it already imported and reuses them. Products linked before this release were unaffected because their images had already been uploaded once.
  • Fixed: variation images were uploaded to Square on every sync of a variable product regardless of whether "Images" was ticked. They are now only uploaded when images are actually being synced, or when the variation is new to Square.
  • Fixed: Settings → Advanced → Debug Information always showed "Plugin Version: Unknown", "Connected: No" and "Location ID: Not set" regardless of the real connection state. All four fields now report actual values.
  • Fixed: the "Clear All Caches" button failed with "No route was found matching the URL and request method" — the endpoint it called was never registered. Clearing caches now works, and deliberately leaves in-flight sync locks alone so it can't start a duplicate worker.
  • Improved: removed verbose per-variation debug lines that the inventory sync wrote to the server error log on every run.

9.10.2

  • Fixed: required modifier sets are now reliably enforced on variable products and on sites running other add-to-cart plugins. The server-side check now runs at the highest priority so a required selection can't be skipped even when another plugin (e.g. a file uploader) also validates add-to-cart, and the Add to Cart button now correctly stays disabled on variable products until every required modifier set is chosen.
  • Fixed: the modifier validation script failed to load on some themes and page builders (where the global product isn't available when scripts are enqueued), so required/max-selection rules weren't enforced in the browser. It now loads from the queried product as a fallback.
  • Fixed: background queue jobs that hit the PHP execution timeout are now failed immediately instead of being retried. A timed-out job was previously put back on the queue and re-run up to three times — each attempt hitting the same timeout — which could back up the whole queue and stall other syncs. Deliberate retries on transient errors (e.g. temporary Square API errors during imports) are unaffected.
  • Improved: real-time and bulk Woo → Square product sync is faster and no longer times out on large batches. Each product previously made several redundant Square API calls — re-fetching catalog-wide custom-attribute definitions and item options for every single product, and fetching a simple product's Square item twice — so a batch of edits could exceed the PHP execution limit and be killed mid-run, dropping the remaining products without syncing them. Those lookups are now cached and de-duplicated, and each sync job works to a time budget: when it runs low on time it automatically requeues whatever's left as a follow-up batch instead of running until it's killed.
  • Fixed: products assigned to more than one category (commonly a parent and its child) could fail to sync to Square with a "duplicate additional_category" error, which blocked those product updates. Duplicate category references are now removed before syncing — Square supports multiple categories per item as expected.
  • Fixed: some product updates were rejected by Square with "custom attribute key not found" or "expected an object value" errors, caused by stale or empty metafield data being sent during stock and price syncs. Custom attributes are now only sent when metafield sync is enabled, and empty attribute maps are no longer sent.

9.10.1

  • New: modifier display options. Single-choice modifier sets can now render as a dropdown instead of radio buttons — set the store-wide default under Settings → Modifiers → Storefront Display, or override per set on each product's Modifiers tab. The "Choose Modifiers" heading above the sets is now editable and can be hidden entirely (or filtered in code via sws_modifiers_heading).
  • New: required modifier sets. Sets marked required in Square (minimum selections of 1 or more) now automatically require a choice before Add to Cart — the button stays disabled until every required set has a selection, with server-side validation covering AJAX and express-checkout flows, and shop-page buttons linking to the product page instead of adding straight to cart. Auto-detection can be switched off globally, and each set can be forced Required or Optional per product.
  • Fixed: modifier sets are no longer wiped by Quick Edit or programmatic product saves, and per-set admin settings (display style, required) now survive Square re-syncs.

9.10.0

  • New: Coupons / Discount Codes sync (Beta). Two-way coupon code syncing built on Square's Discount Codes API: eligible WooCommerce coupons become real Square discount codes redeemable at Square POS and Square Online, and codes created in Square import as WooCommerce coupons (in real time via webhooks, plus a one-time backfill for existing codes). Usage limits are shared across channels — website redemptions are recorded in Square and in-store redemptions count against the WooCommerce usage limit, so a single-use code can't be redeemed twice across channels. Every synced code gets a POS-scannable QR image you can download for print or email campaigns, and an optional checkout verification blocks codes already fully redeemed elsewhere. Coupons the Square API can't represent faithfully (minimum spends, product exclusions, per-product fixed discounts and similar) are held back with a clear reason instead of syncing as a more generous code, with a per-coupon "sync anyway" override. Everything lives on the new Settings → Coupons page. Off by default; requires a Square account enrolled in Square's Discount Codes beta (the plugin detects availability automatically). Note: Square's beta API has no Dashboard reporting, so synced codes won't appear in the Square Dashboard even though they're live — manage them from the Coupons page. Read the documentation.
  • Improved: when reconciling a pushed order's total with Square, the rounding adjustment is now verified against Square's recalculated total and corrected until they match exactly, instead of applied once blindly — on tax-exclusive stores a discount adjustment also shrank the tax base, which could under-charge by the tax on the adjustment.
  • New: Ready for Pickup order status and email. When a pickup order's Square fulfillment is marked Ready for Pickup (fulfillment state Prepared), the linked WooCommerce order now moves to a new "Ready for Pickup" status and the customer receives a dedicated notification email. Previously nothing happened until the order was marked Picked Up, at which point the completed email fired. Marking an order Picked Up still completes it and sends the completed email exactly as before. Enable the feature under Settings → Orders → Status Sync (it requires Square → WooCommerce status sync to be on). Only pickup orders are affected — shipment and delivery orders are left untouched — and the email is fully editable and can be disabled under WooCommerce → Settings → Emails.

9.9.3

  • Fixed: the "Product import status" setting now always takes precedence, so imports and real-time syncing can never publish products that should be drafts. Previously, new products were created as Published even with the setting on Draft whenever the Status data point was unticked (including real-time auto-created products), products went live before their import finished filling in data, and un-archiving an item in Square force-published its linked WooCommerce drafts. With the setting on Draft the plugin now never publishes anything: new products are created as drafts and existing drafts stay drafts — the Status data point can only re-publish drafts while the setting is Published. The import dialog and settings screens now spell out this precedence.
  • Improved: refreshing the Customers page no longer wipes and refetches the entire Square customer list. Refresh now asks Square what changed since the last sync — when nothing changed it finishes in two API calls — and picks up new, updated and deleted Square customers (deletions unlink the matching WordPress user) without relying on customer webhooks. A separate "Rebuild cache" option wipes the cached table and refetches everything, and group/segment-filtered fetches always rebuild in full.
  • Fixed: legacy rows in the customers table could hold an empty link status that displayed as "Not linked" but was invisible to the Not linked filter and skipped by the auto-matcher. These rows are backfilled on update and the column is locked down so it can't happen again.
  • Fixed: the Auto Customer Matcher's "Start matching" button gave no feedback while it ran — it now shows a matching-in-progress state and reports failures instead of always claiming success.
  • Fixed: the "What is priority?" tooltip on the customer role-mapping screen was clipped by the table container and never appeared on hover.
  • Improved: customer table quality-of-life — column sorting now actually works, the table loads with the selected page size, row selections reset when the page or filters change so bulk actions can't target the wrong customers, and the header shows when customers were last synced.
  • Improved: reflecting WordPress users into the customer list now runs in batched queries instead of loading every user and querying per user, a large speedup for stores with many accounts.

9.9.2

  • New: Express Checkout — Apple Pay, Google Pay and Afterpay/Clearpay buy-now buttons on product, cart and checkout pages for classic and Elementor sites (the Blocks checkout already had them). Buttons appear above "Proceed to checkout", at the top of the checkout billing column, and after "Add to cart"; buyers pick their address and shipping method inside the wallet sheet.
  • New: Square Express Checkout Elementor widget (layout and button styling controls) and [squaresync_express_checkout] shortcode for manual placement — manual placements automatically replace the auto-injected buttons.
  • New: gateway settings for express checkout — a master Enable Express Checkout toggle covering classic, Elementor and Blocks, plus an Express Checkout Locations selector for product/cart/checkout placement.
  • New: "Clear Square Image References" tool (Tools → Cleanup) — removes cached Square image IDs from the media library and cached image hashes from products so the next export re-uploads images. Use it when product exports fail with "Expected an object of type ITEM_IMAGE", which happens when cached image IDs point at a previous Square account or deleted Square images. No media files are touched.
  • Improved: the "Remove Square Product Metadata" cleanup tool now also clears cached Square image references, so re-linking to a different Square account no longer leaves stale image IDs that break product exports.

9.9.1

  • Improved: the automated scheduler now processes the Square catalog in small pages instead of loading the entire catalog into memory before queueing, dramatically reducing peak memory and CPU during scheduled syncs — especially on shared hosting and large catalogs.
  • Improved: database table checks no longer run on every page load; they now run once per plugin update (plus just before queueing work), eliminating unnecessary queries and the risk of mid-request table alterations.
  • Fixed: scheduled syncs now import variation-level images, matching manual imports and real-time webhook updates.
  • Fixed: when Square's API fails mid-run, an incremental scheduled sync no longer skips past the failed window — the affected changes are retried on the next run instead of being silently lost.

9.9.0

  • Developer: new squarewoosync_combine_location_stock filter to override the "Combine stock from all Square locations" setting per product — for example, pool an Events category across every location (a POS signup at any location reduces WooCommerce stock, and website sales push back so the combined total stays in sync) while physical products keep primary-location-only stock, or the reverse. Applies consistently across imports, real-time webhooks, order and refund stock pushes, scheduled syncs and the Stock Checker; variations always follow their parent product, brand-new imports use the global setting on first creation, and the filter is ignored while Split Orders is enabled. Full reference with argument details and ready-to-use snippets at squaresyncforwoo.com/docs/filters-reference.
  • Fixed: a real-time Square stock update for one variation no longer re-sends the whole product back to Square. WooCommerce's deferred parent sync fired a product update for the variation's parent at the end of the request, which re-entered the WooCommerce → Square sync path as if a user had edited the product — a redundant echo of data Square had just sent, and a potential update loop between two stores connected to the same Square account.
  • Fixed: multiple stores connected to the same Square account no longer overwrite each other's webhook settings. Pausing or resuming webhook delivery, changing forwarded event types, and disconnecting Square now apply only to the store making the change — previously a second store could silently stop real-time Square updates (POS sales, stock changes) from reaching the first, including automatically on plugin update when the second store had Square → WooCommerce syncing switched off.

9.8.7

  • Fixed: the Bulk Match tool's SKU matching was calling a Square endpoint that doesn't exist, so every product came back as "SKU not found in Square" and was left for manual review — even when an item with the exact SKU existed in Square. SKU lookups now use the correct Square catalog search endpoint and products with a unique SKU match auto-link as intended. Re-run the tool from Tools → Bulk Match to link products misreported by earlier runs.

9.8.6

  • New: configurable queue concurrency. The background queue can now run up to 5 workers in parallel instead of processing jobs strictly one at a time, draining large backlogs (bulk imports, webhook bursts) far faster. Set "Parallel Workers" under Settings → Advanced → Troubleshooting; the default remains 1 worker. Jobs are claimed atomically so the same job is never processed twice, and on hosts that block loopback requests the queue safely continues at the default speed.
  • New: global stock buffer. Keep a safety margin between Square's stock and what WooCommerce sells — WooCommerce stock is set to Square stock minus the buffer (e.g. Square has 5, buffer of 1, WooCommerce shows 4), so in-store sales can't oversell your website. Works with simple products and variations; stock sent back to Square (orders, refunds, manual exports) automatically adds the buffer back so Square always keeps the real count. Configure under Settings → Products → Import Settings; individual products and variations can opt out via an "Ignore stock buffer" checkbox on the product edit screen, where the real Square stock per location remains visible.
  • Improved: redesigned real-time sync settings. The "Source of Truth" picker is replaced with two plain questions — keep stock in sync (on by default, with advanced control over the Square → WooCommerce and WooCommerce → Square update flows separately) and which platform you edit product details on. A new "What will happen" summary spells out exactly what syncs, including that synced orders reduce stock on both platforms regardless of these settings. Existing configurations carry over automatically — no reconfiguration needed. The onboarding wizard uses the same layout.
  • Improved: webhooks now take priority over scheduled imports in the background queue. Real-time updates from Square (POS sales, stock and product changes) no longer wait behind a large scheduled-import backlog — scheduled import batches run only when nothing more urgent is queued, on both the database and Redis queue backends.
  • Fixed: webhook delivery now follows what actually listens to Square instead of the old mode label, so setting WooCommerce as the product-data source no longer silently stops Square POS sales from updating WooCommerce stock.
  • Fixed: dragging the scheduled-updates batch size slider no longer fires a save and success alert for every step it crosses — the setting now saves once, shortly after you stop moving the slider.
  • Fixed: the queue page's expanded job details no longer show a generic "Raw job data available" stub. Webhook jobs display their event type, received time and the full Square payload, scheduled import batches show a proper summary (products, batch progress, import options), and any other job type falls back to its real job data.

9.8.5

  • Developer: new hooks to customise Square → WooCommerce product imports. The squarewoosync_wc_product_data filter modifies any mapped product field (title, price, stock, categories, description, variations, images) before the WooCommerce product is created or updated, across manual imports, cron syncs and webhooks. The squarewoosync_product_categories filter adjusts, adds or removes categories before assignment, and the squarewoosync_product_categories_assigned action fires after categories are set. Full reference with argument details in the Filters Reference and Actions Reference docs.

9.8.4

  • Fixed variable products losing their variation values — Size/Colour dropping to "Any", so customers could order one variation and be charged for another. A brief Square connection problem during a sync could blank out the values each variation was assigned. Syncs now keep the existing values whenever Square's data can't be fully read, and plugin updates no longer clear the cached Square catalog (which triggered the mass re-sync that made this most likely right after updating). Affected products repair themselves automatically on the next sync with attributes enabled.
  • Renaming or removing an option value in Square now cleans up after itself: the old choice no longer lingers on the product page as an unbuyable selection. Only attributes Square manages are ever touched — attributes and variations added manually in WooCommerce are always left alone, and no cleanup happens on any sync where Square's data couldn't be fully read.

9.8.3

  • New: exclude Square-imported orders (in-person POS sales) from WooCommerce Analytics so the Revenue, Orders, Products and related reports reflect your website sales only. Configure it under WooCommerce → Analytics → Settings ("Square orders"), with an optional second setting to keep Square orders that ship or deliver counted as online sales. Query-time filtering — fully reversible, no analytics data is modified. The first time you enable it, previously imported orders are classified in the background so historical reports filter correctly too.
  • Orders List Filter: new "Count Square shipping orders as website orders" option under Settings → Orders → Import. With it on, the WooCommerce → Orders screen's "Website orders only" view includes Square orders that shipped or delivered, and "Square imports only" shows just your in-person POS and pickup sales.
  • Imported orders now record their Square fulfillment type (shipment, delivery, pickup or POS) for the features above.

9.8.2

  • Cleaner Square reporting: orders sent to Square now share one constant order source (default "WooCommerce") instead of a unique source per order, so Square Reports → filter by source shows a single grouped entry rather than hundreds of individual orders. Existing Square orders keep their old label; the change applies to orders synced from now on.
  • New "Square Reporting Labels" card under Settings → Orders → Export: configure the order source, POS ticket name, and reference ID sent to Square, with {order_number}, {order_id} and {site_title} placeholders.

9.8.1

  • Fixed Square Transaction History failing with "Unable to load transactions" on both the My Account Transactions tab and the admin user-profile view. The Square orders search was sent without the required location IDs; transactions are now searched across all your Square locations.

9.8.0

  • Added an "Order source" filter to the WooCommerce → Orders admin screen so you can view Website orders, Square-imported orders, or both. Orders imported from Square are told apart from your own website sales (including sales paid via the Square gateway) using the dedicated import flag rather than the shared Square order ID. Works on both High-Performance Order Storage and the classic orders screen, and the default view is configurable under Settings → Orders → Import.
  • Added an "Ignore stock updates from Square" option on individual variations and simple products. When enabled, Square no longer overwrites that item's stock quantity or in/out-of-stock status via real-time webhooks, scheduled or manual imports, or the Stock Checker — so you can manage that item's stock manually in WooCommerce. Exporting your WooCommerce stock to Square is unaffected.
  • Clearer discount settings. The main toggle is now "Sync Square discounts" (previously the misleading "Real-time discount syncing") — it simply turns Square automatic discounts on or off for your website. Added a new "Auto-enable new discounts" toggle: leave it on to keep applying newly-created Square discounts automatically (the existing behaviour), or turn it off so new discounts arrive switched off until you enable each one yourself.
  • Fixed the Auto Customer Matching toggles (Square to Woo and Woo to Square) under Customer settings not responding when clicked. On stores that hadn't already saved this setting, clicking a toggle threw an error and nothing happened; both toggles now switch on and off correctly.

9.7.2

  • Stock Checker: scheduled scans can now auto-fix what they find. Enable "Auto-fix issues after each scheduled scan" and pick a source of truth — Square (pulls Square's stock into Woo, also enabling stock management on products that weren't tracking it) or WooCommerce (pushes Woo's stock to your primary Square location). The tool warns if your product-sync automation is configured with the opposite source of truth, recovers automatically when a background job stalls, and fetches Square inventory in batches instead of one call per product.
  • Fixed products imported from Square getting stock management switched OFF even though a Square location holds stock — this happened whenever Square configures inventory tracking per-location (or the product is absent at the primary location), and every hourly sync re-applied it.
  • Fixed the biggest source of stock mismatches with "Combine stock from all locations" enabled: Square catalog edits (name/price/image webhooks) were wiping the stored per-location stock breakdown, collapsing combined totals to a single location's count on the next stock update.
  • Pushing stock to Square (orders, refunds, exports, Stock Checker) now writes the primary location's share of the combined total instead of the whole figure, which was double-counting every other location's stock and inflating Square on every sale or refund — fixed consistently across all four push paths, including card-gateway refunds. Also fixed refunds of variable products never restocking Square at all.
  • Inventory webhooks that arrive before a product finishes importing are now retried with freshly fetched counts instead of silently dropped, and a variation's stock webhook no longer overwrites its variable parent's stock.
  • Failed Square inventory fetches are now treated as "unknown" instead of zero everywhere: no more phantom Stock Checker mismatches after an API hiccup, no stock silently zeroed, and inventory responses over the API page limit are paginated instead of truncated. The Stock Checker also now measures Square stock exactly like the sync writes it (absent locations excluded), and manual re-syncs refresh live inventory counts instead of reusing stale cached ones.
  • Stock Checker no longer flags products as "Stock not managed in Woo" when Square isn't tracking their inventory either. It now reads Square's actual inventory-tracking setting (instead of assuming any leftover stock record means tracking is on), so a product neither side tracks correctly shows as a match rather than an error.

9.7.1

  • Fixed an infinite update loop in real-time customer syncing when both sync directions (and role mapping) were enabled: one WooCommerce save pushed to Square twice, each push triggered several Square webhooks, and the old single-use loop flag let the extras bounce back and forth indefinitely. Sync now tracks each direction independently, skips webhook echoes of its own updates, and stops as soon as both sides hold the same data — the feature works exactly as before, without the ping-pong.
  • Role/group syncing now only sends Square the group memberships that actually changed (instead of re-sending every mapped group on every update), cutting redundant API calls and webhook noise.

9.7.0

  • Complete admin redesign: new "Clarity" design system across every screen — refreshed navigation with a command palette (Cmd/Ctrl+K), dark mode toggle, dashboard KPI tiles, and modernized tables, settings, tools and onboarding.
  • Major admin performance improvements: pages now load on demand (initial bundle is less than half the size), background tabs pause polling, and thousands of lines of legacy code were removed.
  • Fixed customer export creating duplicate Square customers. Exports now link to an existing Square customer by email instead of creating a new one, save the link before optional steps so it can't be lost, and mark the customer as linked in the Customers table. Stale role-to-group mappings (groups deleted in Square) are skipped instead of failing the export.
  • Fixed the customers import log re-appearing after being dismissed — it now stays closed until the next import finishes.
  • Loyalty checkout (blocks) now shows how many points a customer will earn even before their loyalty account exists — accounts are created automatically after checkout (billing phone required). Also fixed 0-point balances showing a fetch error.
  • Fixed the dashboard "In queue" tile always reading 0 (it now reads the live queue backend), fixed toasts never auto-dismissing, and fixed "Send account creation emails" doing the opposite of its setting during customer imports.
  • Fixed Square POS order syncing never matching existing WordPress users (wrong meta key lookup).

9.6.1

  • Fixed orders paid with PayPal (via the official WooCommerce PayPal Payments plugin) not syncing to Square when the Square gateway is enabled. PayPal is an off-site gateway: the order is created as "pending payment" at checkout and only confirmed later when PayPal calls back, and the sync was keying off a payment status that never actually occurs — so the order was skipped both at checkout (still unpaid) and again when payment landed. PayPal orders now sync correctly once payment completes. As part of this, order sync now only ever runs when an order is genuinely paid (Processing/Completed) — an authorized-but-not-yet-captured PayPal payment, or any order still on hold, no longer creates a paid order in Square before the money is actually collected.
  • Added a "Square" column to the WooCommerce Orders admin list (works with both HPOS and legacy order storage), matching the Square column already on the Products list. It shows each order's sync state at a glance — Synced (with the Square order ID linking straight to the order in your Square Dashboard), Failed (hover to see the reason, e.g. a missing catalog item), Queued, or Not synced. Failed order syncs are now recorded on the order so they surface here instead of only in the order notes.
  • Added a bulk fix for "Stock not managed in Woo" rows in the Stock Checker tool. These rows (products linked to Square that aren't tracking stock in WooCommerce) previously had no fix button at all. You can now fix them individually with "Enable & pull from Square", or fix them all at once with a new "Fix all unmanaged" button — both turn on Woo stock management and pull Square's current counts in. Also fixed a counting bug where resolving one of these rows decremented the mismatch tally instead of the error tally.

9.6.0

  • Added a new Webhooks dashboard (top-level menu) that shows your live Square webhook delivery status in plain English — what's working, what's not, and why. When your site stops receiving Square updates it is almost always your own server configuration blocking our requests (a security plugin, firewall, WAF, Cloudflare, mod_security, or SSL/maintenance issue), so the dashboard now explains exactly what's happening and walks you through fixing it yourself — including whitelisting our webhook IP address (139.84.200.202). You can unpause and unblock delivery, resend held updates, see recent delivery activity and success rates, and copy a ready-made diagnostics summary for support — all without opening a ticket.
  • Fixed the rate-limit status panel under Webhooks → Settings showing "Paused" even when rate limiting was disabled (it read a field the proxy no longer returns, so it always showed paused). It now reports "Active" correctly, and a background cleanup on the delivery proxy clears orphaned "pending" webhook rows that were inflating the pending count and keeping the status stuck.
  • Fixed the "Remove Square Product Metadata" cleanup tool (Tools → Cleanup Metadata) leaving Square IDs behind on product variations. It only cleared metadata from parent products, so square_product_id and square_variation_id remained on every variation. It now removes those keys (and square_locations) from both products and variations, and reports how many entries were cleared.
  • Fixed the Bulk Match Products tool not surfacing title suggestions for products that have a SKU. Title-based matches previously only appeared for products with no SKU at all, so a product whose SKU wasn't found in Square was written off as "no match" even when its name matched a Square item exactly. The tool now falls back to a title match for those products and lists them under "Needs review" for one-click linking, and exact name matches are always shown first.

9.5.16

  • Fixed the Loyalty "free gift" reward deducting more than the gift's value when the customer already had eligible items (e.g. wax melts) in their cart. The reward is 100% off a single chosen item, but the discount was calculated against every matching item in the cart — so a £4 free gift became an £8+ discount when two wax melts were present. The free gift now always discounts exactly one unit of the item the customer selected, whatever else is in the cart. Applies to both classic and block-based checkout. Removing the reward now also removes only the single gift unit that was added, instead of stripping out matching items the customer intended to buy.
  • Fixed the importer adding an unwanted "Option" attribute to single-variation products. When a Square item had no option sets, the plugin fell back to using the variation's name as an attribute value — but Square names a single/default variation "Regular" (or merchants name it after the product), so plain products ended up with bogus "Option: Regular" or Option: <product name> attributes. The fallback attribute is now only applied to products with 2+ variations that need distinguishing; single-variation items import cleanly as simple products with no attributes.

9.5.15

  • Fixed the webhook "create products" path ignoring the "Only import products from selected categories" filter — products outside the selected categories were still being created in WooCommerce. Skipped products (category and location filters) are now removed before the WooCommerce import, so they are no longer created or updated. Note: the scheduler has its own separate category-filter toggle in the Cron Schedule settings — enable it there too if you use the automated scheduler.
  • Fixed Google Pay showing an inflated total that didn't match Apple Pay or the amount actually charged. The initial payment request read its total from whatever shipping method WooCommerce happened to have chosen in the session, which for a fresh multi-rate delivery (e.g. international) defaults to the most expensive rate — while the option shown as selected in the wallet sheet could be a cheaper one, so the displayed total didn't add up. Apple Pay recalculated after an address was entered and corrected itself, but Google Pay (which doesn't fire that recalc) stayed on the wrong figure. The initial request now pins the total to the same shipping method it marks as selected (the cart's existing choice when still available, otherwise the cheapest), so both wallets show a consistent, correct total. Display-only fix — the charged amount was always correct.
  • Fixed orders paid with a non-Square gateway (e.g. PayPal) not syncing to Square when the Square payment gateway was enabled. The sync check relied on WooCommerce's list of available payment gateways, which depends on the checkout cart/session context and can be filtered by other plugins. In status-change contexts where that context is absent — the PayPal redirect return, admin-created orders, and cron/webhook runs — the enabled Square gateway dropped out of that list, so orders were incorrectly skipped with "order sync not enabled in settings". The plugin now reads the gateway's own enabled setting, so with the Square gateway enabled every order syncs to Square regardless of payment method.

9.5.14

  • Fixed Apple Pay showing an inflated total that didn't match Google Pay or the amount actually charged. When the Apple Pay sheet recalculated after a delivery address was entered, it could select a paid shipping method even when the cart qualified for free shipping, adding the shipping cost and its tax to the displayed total. The wallet now keeps the cart's existing shipping choice when it's still available, and otherwise picks the cheapest option so free shipping is preserved. Display-only fix — the charged amount was always correct.
  • Added an option to remove products from your storefront when their category is removed in Square. Previously, with "Only import products from selected categories" enabled, un-assigning the category in Square stopped future updates but left the already-imported product published in WooCommerce. With the new "Hide products when their category is removed in Square" toggle enabled (shown under Auto-Create WooCommerce Products and the Automatic Update Scheduler), the linked WooCommerce product is set to draft when it loses its selected category, and automatically restored to published if the category is re-added. Applies to both real-time (webhook) and scheduled syncs. Off by default; products the plugin didn't hide (manual drafts and Square-archived items) are never touched.

9.5.13

  • Added an option to stop Square automatic discounts from stacking on top of WooCommerce coupons. When enabled (Settings → Discounts → "Don't apply automatic discounts when a coupon is used"), applying any coupon at checkout skips the Square automatic discount so the two no longer combine. Off by default, so existing stores are unaffected. Developers can override it with the sws_skip_discount_with_coupon filter.

9.5.12

  • Added a developer filter, squarewoosync_should_sync_customer_to_square, to exclude specific users from being synced as customers to Square. Return false from the filter to skip a user — for example to keep administrators or staff accounts out of Square. The gate covers the real-time auto-sync (on registration and profile/customer updates) and the bulk customer import; excluded users are reported as neither synced nor failed. Checkout is unaffected: the payment flow still creates a Square customer when an excluded user actually pays, so saved cards keep working.

9.5.11

  • Added per-location stock tracking. When "Combine stock from all Square locations" is enabled, the plugin now records each product's stock at every Square location (not just the combined total) and shows a read-only "Square stock by location" breakdown in the WooCommerce product editor — in the Inventory tab for simple products and under each variation for variable products. Every location the product is sold at is listed, including those with zero stock, and the breakdown stays current through imports, the scheduled sync, real-time webhooks and WooCommerce orders.
  • Order splitting now divides a single product's quantity across locations instead of sending the whole line to one location. When the quantity ordered exceeds the primary location's stock, the remainder is drawn from the next location(s) that have stock — e.g. an order of 10 with 9 at Location A and 20 at Location B now reduces A to 0 and B to 19 instead of driving A to -1. If the combined stock across all locations still cannot cover the order, the shortfall is taken from the primary location.
  • Order splitting now works with every payment gateway, not just the built-in Square payment gateway. Cash on Delivery, BACS/bank transfer, cheque and other gateways now split orders across locations the same way. Local-pickup orders continue to skip splitting.
  • Fixed non-Square-gateway orders not syncing to Square at checkout when an order-sync stage (e.g. "Processing") is configured. Cash-on-Delivery and similar orders are now created in Square automatically when they reach the configured stage, instead of requiring you to manually change the order status.
  • Fixed combined stock occasionally under-counting after a real-time inventory webhook. When Square sent an update for a single location, the combined total was being recalculated from just that location; the plugin now merges the change into the stored per-location stock and recomputes the true total across all locations.
  • Added overlap protection to the Automatic Update Scheduler. On very large catalogs a scheduled run can take longer than the sync interval (e.g. an hourly schedule); if the previous run is still processing its queued batches, the next cycle is now skipped instead of stacking another run on top and worsening the backlog. Progress is tracked by a heartbeat from the run's batch jobs, so the scheduler recovers automatically if a run stops unexpectedly.

9.5.10

  • Fixed Afterpay/Clearpay rejecting checkout with "Amount on the request does not match the checkout amount". The buyer-verification charge amount now uses the live, tax-inclusive payment-request total instead of a stale value, so it matches the amount the Afterpay/Clearpay checkout was created with.
  • Fixed Afterpay/Clearpay payment request double-counting shipping tax (e.g. a £33.60 order being sent to Afterpay as £35.60). Tax and shipping are no longer added both as line items and again in the shipping option; the request now follows Square's model (line items + a single tax line + the selected shipping option) and reconciles exactly to the WooCommerce total. Works for tax-exclusive, tax-inclusive, no-tax and shipping-tax configurations.
  • Fixed the shipping option total being inflated by the shipping tax due to reading the wrong WooCommerce totals key, which is what caused the amount mismatch above.
  • Fixed a malformed key being added to the payment request when the request builder was called with a positional amount argument.
  • Fixed block checkout rejecting orders with "we do not allow orders from the provided country ()" for Afterpay/Clearpay. Wallet contact fields returned as empty strings now correctly fall back to the entered checkout address instead of submitting blank values.
  • Block checkout no longer overwrites or clears the customer's already-entered billing/shipping address when paying with Afterpay/Clearpay.

9.5.9

  • Added a "Delete Unlinked Square Products" tool (Tools page) that deletes Square products which have not been linked/imported into WooCommerce, based on the inventory table data. The tool shows how many products will be removed and strongly prompts you to refresh your inventory data first so up-to-date link status is used (avoiding deletion of products that were imported since the last sync). Linked products are never touched.
  • Added a "Remove Square product IDs" bulk action to the WordPress/WooCommerce Products list table. It unlinks the selected products (and their variations) from Square by removing the Square sync meta locally, without deleting anything from Square.
  • Fixed the WooCommerce matching step timing out and never completing on very large catalogs (18,000+ products). The WooCommerce link maps are now built with two indexed queries instead of hundreds of per-chunk lookups, the inventory table is processed in keyset-paginated batches, and when a run nears the PHP time limit it saves progress and automatically queues a continuation job. Matching now resumes from where it left off instead of restarting from the beginning each time, so it completes reliably without any PHP time-limit or memory-limit changes.

9.5.8

  • Fixed shipping VAT/tax being handed to Square as an untaxed shipping charge, leaving the tax to be absorbed as a "Rounding Adjustment". The shipping tax rate is now attached directly to the Square shipping charge, so shipping VAT is recorded in Square's tax total (correct VAT accounting) and Square's order total matches WooCommerce to the penny. Tax-inclusive stores send the tax-inclusive shipping amount so Square extracts the VAT correctly.
  • Fixed Afterpay/Clearpay wiping the customer's address on the classic (legacy) checkout. Address fields are now only populated when the wallet actually returns a value and are never blanked, so an entered billing/delivery address is preserved through checkout.
  • Removed unused block-checkout Afterpay code that contained leftover debug pop-ups.

9.5.7

  • Fixed a critical bug where the "Match Customers" tool (with "Set roles" enabled) could strip the administrator role from a WordPress admin whose email matched a Square customer mapped to a role. Role mapping now routes through the admin-safe path used everywhere else — administrators are never demoted, mapped roles are only added.

9.5.6

  • Backfill Image Metadata tool: titles now replace Square's auto-generated "original.jpeg" / "original.png" defaults (previously they were treated as "already set" and skipped). Only the attachment title is updated — image URLs and filenames are unchanged.
  • New Resume button on the Backfill Image Metadata tool re-kicks a stalled run, or picks up a previously cancelled/failed run from where it stopped without restarting from zero.
  • Hardened the backfill job: smaller batches, raised PHP memory/time limits per batch, and per-attachment error isolation so one bad image can't break the whole batch chain.

9.5.5

  • Variation option values imported from Square now keep their original casing (e.g. XS, Small, 2XL) instead of being forced to lowercase. Existing stores keep matching against their current lowercase terms — no duplicates are created — and you can manually rename terms in Products → Attributes to update the displayed casing.
  • Fixed the Automatic Update Scheduler silently skipping images and categories on scheduled runs. With "Auto-create products" enabled, the scheduler was queueing products without ever fetching image URLs or resolving category names from Square, so even with the Images/Categories checkboxes ticked nothing came through. Both checkboxes are now honoured on every scheduled run, variation-level images are included, and the scheduler logs a warning (instead of dropping categories) if Square's category catalog can't be fetched.

9.5.4

  • Fixed guest checkouts failing to create a Square order with an "Invalid Square customer ID" note. A linked Square customer is now optional — if one can't be created for the buyer, the order is still created in Square as a guest order (the payment was never affected). Billing emails with a misplaced dot (e.g. [email protected]) are also normalised so Square accepts them.
  • Fixed pickup date/time being saved to and displayed on shipment orders. Pickup details are now only attached to orders that actually use a pickup shipping method, so previewing pickup at checkout no longer leaks pickup info onto delivery/shipment orders.

9.5.3

  • Fixed the inventory "Ecom Only" filter: it now keys off Square's actual eCommerce availability (the ecom_visibility field exposed with the Square Retail subscription) instead of whether an item is present at all locations. Previously, items available for eCommerce could be hidden — or non-eCommerce items shown — based purely on their location assignment, so two products with identical eCommerce settings could behave differently. After updating, run an inventory re-sync so the new availability data is cached.

9.5.2

  • New image import options (Settings → Products → Import): automatically set imported product images' alt text and title to the product name, with an optional setting to also name the downloaded file after the product (e.g. Green_TShirt.jpg). Great for accessibility and SEO on large catalogs. All options are off by default.
  • New "Backfill Image Metadata" tool: retroactively fill in alt text and titles on images of products you've already imported. Runs in the background in batches and only fills images that are currently empty, so any values you set by hand are preserved.
  • The Square ID shown under "Linked" in the Square column on the WooCommerce Products list is now a clickable link that opens the item directly in the Square Dashboard (uses the correct live/sandbox dashboard host).
  • Checkout pickup scheduler: days with no remaining collection times (e.g. today once the store has closed or the preparation-time cutoff has passed) are now hidden from the date dropdown so customers can only pick a genuinely available day, and the first available date and time are pre-selected by default.
  • New webhook health widget on the dashboard: shows whether the last webhook was delivered and, when delivery is broken, the actual last failed error message (instead of the unhelpful "dropped" status).
  • Added a "Reset circuit & resend" action that first verifies your site is reachable, then re-enables a disabled webhook circuit and replays the blocked/failed webhooks.
  • Optional email alerts (Settings → Webhooks) notify you when your webhook circuit becomes disabled, on a configurable check interval (every 15 minutes, hourly, or twice daily).
  • Pause webhook delivery: temporarily stop Square updates from being forwarded to your site (and resume later) from the new Settings → Webhooks page, without touching your Square subscription.
  • Choose which Square events sync: enable or disable individual event types (catalog, inventory, orders, customers, refunds) from Settings → Webhooks.
  • All webhook controls now live on a single Settings → Webhooks page (rate-limiting settings moved here from Advanced).
  • Hardened customer sync: Square group → WordPress role mapping now applies reliably on every real-time create/match path and never demotes administrators, role-only changes sync back to Square, and the bulk import is faster and more resilient (no duplicate Square customers, no progress-option bloat).

9.5.1

  • Fixed checkout failing when an item in the cart was still linked to a Square catalog object that had since been deleted in Square. Square rejected the entire order with "[NOT_FOUND] Item variation with catalog object id ... not found", so payment never completed and customers abandoned checkout. The plugin now detects this, drops the stale Square link for the affected item(s) and completes the order with them as ad-hoc items (their name, price and quantity are preserved, so the total is unchanged), then adds an order note listing which products need re-syncing with Square. This recovery applies to every order-creation path (standard checkout, split orders, and order sync).
  • New "Refund Handling" settings (Orders → Status Sync): toggle off automatic Square refunds when a WooCommerce order is cancelled/refunded so you can refund manually, and an option to withhold Square's processing fee from auto-refunds.
  • When excluding fees, the actual Square processing fee is used once the payment settles; before settlement it falls back to a configurable estimate (default 2.6% + fixed per-transaction amount). Order notes record the amount refunded and any fee withheld.

9.5.0

  • Added role-based (customer group) discounts. Square automatic discounts that are restricted to a customer group (the pricing rule's customer_group_ids_any) now apply only to shoppers whose WordPress role is mapped to that Square group, instead of applying to everyone. Eligibility is resolved locally from the logged-in user's roles using the existing Square group ↔ WordPress role mapping (Customers → role mapping), so there's no extra Square API call at checkout. The restriction is honoured both at the cart/checkout and in storefront pricing — catalog and product pages, variation prices, and the "on sale" badge all reflect whether the current shopper qualifies.
  • Variation price caching is now segmented per customer-group set, so a role-restricted price can never leak between shoppers (guests and unmapped roles share one bucket; each mapped group set gets its own). Note: this is a behaviour change — a group-restricted Square discount with no matching role mapping previously applied to everyone and now applies to no one until you map the Square group to a WordPress role (or remove the group restriction in Square).

9.4.3

  • Added an opt-in "Only sync products changed since the last run (incremental)" mode to the Automatic Update Scheduler. Instead of scanning your entire catalogue every run, it asks Square only for items whose details changed (Catalog begin_time) or whose stock moved (Inventory updated_after), and for Woo → Square only pushes products edited since the previous run — a large reduction in API calls and run time on big catalogues. The existing full-scan behaviour is unchanged and remains the default; the first incremental run does one full baseline pass to establish its watermark, which only advances after a successful run. Incremental mode is mutually exclusive with automatic product creation and deletion (an incremental feed cannot detect created or deleted products), so the UI disables those options while it is on and vice versa.
  • Duplicate Link Scan now bulk-fixes duplicates: in each group of products sharing a Square Product ID it keeps the one with the most data (images, variations, sales, reviews, pricing, SKU, description, categories) and removes the rest — ties are broken at random.
  • The scan preview shows a Keep/Remove badge and a data summary per product, and you choose whether removed duplicates are moved to Trash (recoverable, default) or permanently deleted.
  • Stock Checker now fully respects the "Combine stock from all locations" setting. The scan and Pull already summed every location; Push now re-reads Square after writing so a row is only marked resolved when the combined total actually matches Woo — previously a push (which can only update your primary location) falsely flipped rows to "match" while other locations still held stock. When the setting is on, the results table labels the column "Square (all locations)" and explains the push/pull behaviour.
  • Fixed product export (including the Missing Square Products re-export) creating duplicate Square categories instead of reusing existing ones. The category lookup only read the first page of Square's category list, so on stores with many categories any category beyond the first page was never matched and got recreated; it now pages through the full list. It also no longer re-fetches the list on every category, which previously let Square's eventual consistency recreate a just-created parent category, and it now ignores Square menu categories when matching.
  • Added a "Fix Duplicate Square Categories" tool on the Tools page to clean up duplicates created by the bug above. It scans every Square category, groups likely duplicates, and shows a read-only dry-run with each category's name, Square ID, version, last-updated date and product count so you can confirm before acting. On approval it keeps the oldest category in each group, re-assigns every product (item categories, reporting category and legacy category field) and any child category onto it, then deletes the newer duplicates — if a re-assignment fails the deletions are skipped so nothing is orphaned. A "Match by full category path (hierarchy-aware)" toggle (on by default) only treats categories sharing the same full parent → child path as duplicates; turning it off matches on name alone for stores where duplicates were created at different levels of the tree.

9.4.2

  • Added a "Missing Square Products" tool on the Tools page that scans your catalog for Woo products or variations linked to a Square Product ID that no longer resolves in Square — the usual cause is a Square item being deleted out from under WooCommerce after the original export. The scan is paged through Square's batch-retrieve API and ignores draft, trash and private products so they don't show up as false orphans. Each result is shown as a parent card with indented variation rows and a tag highlighting whether the parent itself is missing or just one or more variations.
  • Each card has a re-export action that picks the right Square path automatically. If the parent item still exists in Square, the tool fetches the current Square versions for the parent and surviving variations and issues a single partial update — Square's update contract auto-removes any variations not in the payload, so Woo stays authoritative — and retries once on a version mismatch with freshly fetched versions. If the parent itself is gone from Square, the tool best-effort deletes any leftover Square objects we still have IDs for, clears the local Square link meta, and runs a fresh export from scratch. Either way the card reports back exactly what happened ("Updated existing item — N updated · M created · K removed" or "Re-created in Square").
  • Variations that don't manage stock or have a null stock count are normalised before export (manage_stock forced on, default count seeded), since that's the most common cause of export validation failures on previously-imported items.
  • Added a "Preserve Square-only variations" toggle (on by default) on the Missing Square Products tool. The previous re-export was Woo-authoritative — any variation that existed in Square but wasn't linked to a Woo variation got silently deleted by Square's UPDATE contract. With the toggle on, the tool first mirrors those Square-only variations back into Woo (reusing the standard Square→Woo import path so attributes, SKU, price and stock are seeded correctly), then re-exports — so no Square variation is lost. The per-card status now reports "Preserved N from Square" alongside the existing updated/created/removed counts.
  • Fixed Square export failing with "[EXPECTED_BOOLEAN] Expected a boolean value (track_inventory)" on variations that inherit stock management from their parent product. WooCommerce's managing_stock() returns the string "parent" (not a boolean) in that case, and it was being sent straight to Square. The export now sends a real boolean on both the Missing Square Products re-export and the regular product sync, and the "set manage stock" normalisation now forces an explicit per-variation manage_stock flag instead of treating an inherited value as already-managed.
  • Shrunk the production zip by ~340 KB (≈17%) by replacing the bundled nesbot/carbon dependency — pulled in transitively by wp-queue purely as a DateTime wrapper — with a minimal in-plugin shim that extends DateTimeImmutable. Carbon's Symfony Translation transitive tree (symfony/translation, translation-contracts, deprecation-contracts, psr/clock, carbonphp/carbon-doctrine-types) is no longer shipped. No runtime behaviour change.

9.4.1

  • Fixed Square-synced products showing the wrong primary image after a merchant reorders images in Square. Root cause was that the local wp_square_inventory.product_data column is a MySQL JSON type, which silently normalises object keys into lexicographic order on write — so the images map we stored as {ZHMN, RQKB, 4UTI} came back as {4UTI, RQKB, ZHMN} on read, and the importer always picked the alphabetically-lowest image ID as the featured image regardless of the merchant's actual Square order. Additionally, the image-change hash was sorted by image ID before hashing (so reorders produced identical hashes), and manual resyncs read stale wp_square_inventory data instead of re-fetching from Square. Fixed by (a) re-anchoring the images map order from image_ids (a JSON array, which preserves order) every time the cache is read, (b) making the hash order-sensitive, and (c) having manual resyncs refresh the catalog cache for the affected products from Square before reading it.
  • Added a "Reset Image Hashes" button on Tools → SquareSync for Woo (the legacy admin tools page) that clears every stored _square_images_hash. Use this once after upgrading so the next Square→Woo sync re-evaluates the featured image and gallery order on every existing product. No image files are re-downloaded — attachments resolve via the existing media library.
  • Hardened image-import deduplication so a re-sync cannot create duplicate media-library entries. Existing attachments are now matched by their bare Square image ID, with fallbacks to the legacy URL-bound key and to a filename match (image files are saved as {square_image_id}_{timestamp}.{ext}). This makes attachment lookups URL-agnostic, so a re-sync after Square rotates an image URL still reuses the existing attachment instead of downloading a second copy.
  • Fixed the Remove Gift Card button still missing on Blocks checkout after a successful apply. Two issues: (1) the apply-success handler stopped optimistically marking the panel as applied and instead waited for the next cartData refresh, which on cached pages or slow store roundtrips never delivered the fee — leaving the customer stuck with no Remove button; (2) the "fee disappeared" auto-clear branch was firing during the brief window after mount when cartData hadn't loaded yet, wiping the server-rendered applied state. The success path now flips the UI immediately, and the auto-clear waits for cartData to clearly contain items before firing.

9.4.0

  • Added a dashboard "Stock sync" alert that surfaces whether Square and WooCommerce stock are currently in sync (green), how many products have a mismatch (amber), or that no scan has been run yet. Links straight into the Stock Checker.
  • Added a scheduled-scan option to the Stock Checker so the comparison can run automatically (hourly, twice daily, daily, or weekly) via Action Scheduler. Scheduled runs only scan — they never change stock on their own.
  • Added bulk "Push all to Square" and "Pull all from Square" actions that reconcile every current mismatch in one direction. Runs in the background in batches and the report updates in place.
  • When the existing scheduled product sync is enabled and includes stock, the Stock Checker now shows a banner explaining which direction will reconcile the listed mismatches on the next run.
  • Fixed the 9.3.5 phantom-VAT suppression actually never running. The negative-fee tax filter looked at the wrong fee property (the WooCommerce-internal struct rather than the underlying fee object), so a £20 gift card or loyalty reward on a fully standard-rated tax-inclusive cart still discounted £24. The filter now correctly matches and a £20 reward discounts £20.
  • Fixed gift card and loyalty discounts capping at the ex-tax subtotal on tax-inclusive carts. Both the plugin's own cap and WooCommerce's internal negative-fee clamp use items_total (NET in tax-inclusive stores), so a £20 reward on a £19.60 inclusive basket was leaving the VAT portion for the customer. The cart, checkout, thank-you page, admin order screen and customer email now all show the full discount amount.
  • Fixed split-payment checkout failing with VALUE_TOO_LOW when a gift card covered most of an order. The gateway was double-subtracting the gift card amount when reconciling Woo's order total against Square's net amount due, so the residual card authorisation went out to Square as amount=0. A £20 gift card on a £21.87 cart now correctly charges £1.87 to the customer's card.
  • Fixed gift cards that fully cover items+tax+shipping producing a misleading "Gift Card does not fully cover the order" error. The gateway now skips the card-portion payment when there's no residual, attaches only the gift card payment to the Square order, and the customer completes checkout with no card input required.
  • Fixed gift card discount being applied against shipping cost. The cap is now items-only (subtotal + tax) so the customer always pays shipping from their card and the gift card balance debits only the items portion.
  • Fixed the saved order's Gift Card line showing an inflated total on the thank-you page, admin order screen and customer email. WooCommerce reapplies a "negative-fee tax distribution" to fee items at order-creation that bypasses the fee's tax_status, so the displayed amount could exceed the actual discount. The plugin now zeros that distribution after WC computes it.
  • Fixed the "Remove Gift Card" button still disappearing after navigating away from checkout and returning. The 9.3.5 fix only covered front-end requests; the Store API (REST) cart endpoint was still being skipped by the fee handler, so the Blocks checkout couldn't see the gift card fee in cart data on re-entry and silently cleared its applied state.
  • Fixed entering an invalid or zero-balance gift card code disabling the Place Order button. The failure path now returns a transient error to the Blocks checkout (showing the message inline in the gift card panel) instead of adding a persistent cart-error notice that blocked submission.
  • Fixed the pickup date/time selector on Blocks checkout showing yesterday's date and pickup times in 24-hour format. The "today" baseline now reads the WordPress site timezone explicitly (via the server's date/time components) so it no longer drifts when the customer's browser is in a different timezone, and the date display no longer parses the YYYY-MM-DD value as UTC and shifts back a day. Pickup times now render as "h:mm AM/PM" instead of 24-hour, matching the rest of the order display.
  • Fixed a fatal DivisionByZeroError at checkout when a gift card or loyalty reward covered enough of the items that the saved order's total ended up equal to its tax amount (e.g. £20 reward on £21.87 cart, £60 gift card on £60.13 cart). The crash came from a leftover "tax factor" calculation in the gateway that wasn't actually used downstream — it's now removed. Checkout no longer 500s on these carts.
  • Fixed the SAVED order's gift card / loyalty fee being clamped to the items ex-tax subtotal, even after the cart-side display showed the correct full discount. WooCommerce's order-side calculate_totals re-runs the same negative-fee clamp the cart does, undoing the cart-side restore. The plugin now restores the fee on the order in the same way it restores the cart, so the saved order's total matches what the customer was actually charged and what the gateway sent to Square — preventing both the over-charge that fix #1 above would otherwise have produced and the surface-level "Total looks wrong" reports on the thank-you / admin order screen.
  • Fixed "headers already sent by SquareController.php:494" warnings on Square webhook acknowledgements. The webhook handler ships the 200 response early via fastcgi_finish_request on PHP-FPM hosts so the queue work doesn't block the proxy timeout, but it then fell through to a WP_REST_Response that the REST framework tried to emit a second time. The handler now exits after the FPM-side acknowledgement; non-FPM hosts continue to return through the framework as before.

9.3.6

  • Added a "Choose your free gift" picker modal for loyalty rewards that grant a 100%-off catalog-restricted item. When the customer applies a free-gift reward at checkout, they now see all eligible in-stock products and variations (each variation is a separate selectable option) instead of the plugin auto-picking the first available item. Works on both WooCommerce Blocks and legacy checkout. Removing the reward also removes the chosen gift from the cart.

9.3.5

  • Fixed pickup date/time selector not appearing on WooCommerce Blocks checkout when the active pickup shipping method is WC's built-in "Local pickup" (method_id pickup_location) instead of the legacy local_pickup zone method. The plugin now treats the two as aliases everywhere it checks pickup methods (date/time selector, fulfillment-type detection, payment-gateway pickup branch).
  • Fixed pickup date/time selector and gift card field not appearing on checkout pages built with Elementor (or any custom page that embeds the WC Blocks checkout but isn't set as the WooCommerce checkout page). The asset enqueue now also covers pages containing the woocommerce/checkout or woocommerce/cart block and Elementor-built pages whose widget data references a checkout/cart widget.
  • Fixed gift card redemption over-discounting tax-inclusive carts (e.g. UK VAT). A £100 gift card was discounting £120 because WooCommerce re-taxes negative fees even when marked non-taxable. The plugin now suppresses the phantom fee tax via the woocommerce_cart_totals_get_fees_from_cart_taxes filter, so the gift card discounts exactly its face value regardless of cart tax rates. No more code-snippet workarounds required.
  • Fixed loyalty rewards under-discounting on tax-inclusive carts. A £4 reward was applying £3.34 of discount because an earlier pre-divide-by-tax-rate workaround assumed a single store-wide 20% rate and over-corrected — most visibly on zero-rated items and mixed-rate carts. The pre-divide has been removed; the existing tax-strip filter alone now produces the correct customer-facing discount.
  • Fixed the "Remove Gift Card" button disappearing when a customer applies a gift card, navigates away from checkout, and returns. The Blocks gift-card panel was clearing its applied-state on first render before the Store API had populated cart data, so the UI thought no gift card was applied even though it still was server-side.

9.3.4

  • Added "Sync from Available stock" toggle (Settings → Products) that mirrors the default WooCommerce Square plugin: when enabled, WooCommerce stock reflects Square's Available quantity (In Stock minus Reserved For Sale) instead of the raw In Stock total. Stock pushed back to Square (manual sync, order fulfilment, refunds, webhooks) is automatically compensated for current reserved inventory so the Available value is preserved across the roundtrip. Off by default — existing installs are unchanged.
  • Added a Stock Checker tool (Tools → Stock Checker) that scans every linked Woo↔Square product and variation, surfaces mismatches alongside Woo/Square stock + delta, and lets you resolve each row in one click — push Woo's value to Square or pull Square's value into Woo. Includes filter, search and CSV export. Runs in the background via Action Scheduler.

9.3.3

  • Fixed Square webhook endpoint (/wp-json/sws/v1/square-inventory/update) timing out from the proxy. The handler now ships the 200 acknowledgement immediately on PHP-FPM hosts via fastcgi_finish_request(), so queue-push and rate-limit work no longer block the proxy's 15s timeout. No behaviour change on non-FPM hosts.

9.3.2

  • Fixed loyalty redemption applying item-restricted percentage rewards (e.g. a 100%-off free-item reward) to the entire cart instead of just the eligible item. Square deprecated the legacy definition.catalog_object_ids field, so the plugin now reads the product restriction from the pricing rule's PRODUCT_SET. Added a safety guard that refuses any 100% cart-wide percentage discount, so a misconfigured reward can no longer zero out an order.

9.3.1

  • Added a first-run setup wizard (Welcome → Environment → Connect Square → Location → Discovery → Product sync → Customers → Payments → Done) with auto-redirect for new installs, a dismissable dashboard banner, and a "Setup Wizard" entry in Tools to re-run it. Existing configured installs are auto-detected and skipped.
  • Added WP-Cron Tester to the Tools page that schedules a one-off ping and verifies WordPress cron is firing — required for scheduled syncs and background jobs.

9.3.0

  • Added a new "Tools" page in the SquareSync for Woo navigation: a card-based landing with one card per tool (Bulk Match, Cleanup Metadata, Remove Saved Cards, Duplicate Link Scan, API Tester, Token Refresh Test, Debug Log, Misc Settings). Each card opens its own subpage. The legacy WordPress Tools › SquareSync for Woo page now points users to the new location.
  • Added Bulk Match Products tool: auto-links unlinked Woo products to existing Square items by exact SKU. Each Square item can only be linked once. Reports matches, conflicts (Square already linked elsewhere, multiple Square candidates), no-SKU-match, and no-SKU products with title-based suggestions you can link from the report.
  • Added Debug Log viewer in-app: read recent log entries in-browser, filter by category, copy for support, or clear the log — no more FTP.
  • Added "Square" column on the WooCommerce Products list with a colored status indicator (linked / partial / not linked) and a Square link-state filter dropdown.
  • Added a CTA above the Products table in the plugin's Products page that links straight to the Bulk Match tool.

9.2.9

  • Added "Find Square Matches" dialog when exporting a product, so existing Square items can be linked to the Woo product instead of creating a duplicate. Searches Square by title and SKU(s), flags items already linked to another Woo product, and links variations by SKU with index fallback.
  • "Remove All Customer Saved Cards" now runs in the background in batches via Action Scheduler with live progress tracking on the Tools page (and a Cancel button). Fixes timeouts/crashes on stores with thousands of customers.

9.2.8

  • Added "Remove All Customer Saved Cards" tool to the WordPress Tools › SquareSync for Woo page for bulk-disabling stored Square cards across all linked customers.

9.2.7

  • Discount settings now show a clear reason when a discount is auto-disabled (PIN required, no pricing rules, unsupported type, expired, or not yet active) instead of the opaque "server flag" label.

9.2.6

  • Enhanced "View Square Product" on the product edit page to show live stock levels per variation from the configured Square location.
  • Fixed Orderable location mapping using session data instead of order meta, causing orders to sync to wrong Square location.

9.2.5

  • Fixed inventory sync stalling on servers with short PHP timeouts by optimizing API batch sizes and timeout handling.
  • Inventory count API calls now use location filtering for ~10x faster retrieval on single-location stores.

9.2.4

  • Improved tax class mapping using Square's tax_ids for accurate VAT rate detection (e.g., 20% standard vs 0% zero-rate).
  • Added squarewoosync_product_tax_class developer filter to customize tax class mapping during import.

9.2.3

  • Added squarewoosync_product_name filter to customize product names during Square → WooCommerce sync.
  • Fixed simple products appearing as variable products in Square by using "Regular" as the default variation name during export.
  • Fixed fatal error when activating Pro while the free version is installed. Pro now automatically deactivates the free version before loading.

9.2.2

  • Fixed queue system class loading error on cron-triggered runs.

9.2.1

  • Fixed queue jobs still getting stuck during timeouts — eliminated duplicate competing workers, fixed broken retry logic for transient API errors, and added stale lock detection.

9.2.0

  • Saved cards now sourced directly from Square instead of WooCommerce. Cards can be added, viewed, and deleted from My Account and selected at checkout (classic and blocks).

9.1.5

  • Fixed variation attributes being removed during Square → WooCommerce sync when the WooCommerce attribute slug differs from the Square option name (e.g., attribute label "Handlebar Clamp" with custom slug "clamp").

9.1.4

  • Fixed gift card unable to be removed on blocks checkout after a payment failure — component now syncs with cart state when the gift card fee disappears.
  • Fixed Remove Gift Card button becoming permanently disabled if removal encountered an error.
  • Gift card panel now immediately reflects applied state after successful apply.

9.1.3

  • Fixed Square order creation failing when coupon codes contain spaces — discount UIDs are now sanitized to meet Square's alphanumeric-only requirement. This was preventing gift card payments from processing.

9.1.2

  • Fixed "INVALID_VALUE: Object of type ITEM_VARIATION missing item_variation_data" error when syncing variable products to Square — variations without valid data are now filtered from the upsert payload instead of being sent to Square and rejected.

9.1.1

  • Fixed queue jobs getting stuck and blocking all processing when a single job fails — stuck jobs are now automatically detected and removed.
  • Optimized single product sync to Square for large variable products — eliminated duplicate image uploads, added image caching, and reduced redundant API calls and database queries. Products with 40+ variations should now sync significantly faster.

9.1.0

  • Fixed outbound price sync overwriting base price when a location-specific price override exists in Square — prices now update the correct location override instead.
  • Fixed stock sync destructively replacing location_overrides, which wiped out existing pricing overrides for multi-location setups.
  • Fixed products at secondary Square locations not getting stock management enabled — track_inventory, sold_out, and stock quantity now correctly fall back to the product's actual location when it isn't present at the primary location.

9.0.21

  • Fixed Square catalog discounts not applying to variable product variations — ITEM-level discounts now correctly match against parent product IDs.
  • Fixed discounted prices not displaying on single product pages and shop listings for variable products — sale-format price HTML now renders for variable product price ranges.
  • Added "Sale!" badge support for products with active Square catalog discounts.
  • Fixed stale variation price caches preventing discount display — price hash now includes active discount IDs for proper cache invalidation.

9.0.20

  • Fixed gift card payments not being applied to Square orders when the gift card covers 100% of the order total.
  • Fixed double-tip bug in split gift card + card payment scenarios.
  • Fixed text-type Square modifiers not appearing in the External Modifier Mapping UI — text modifiers are now visible and mappable to WooCommerce order meta keys.

9.0.19

  • Added duplicate Square link detection — a warning now appears on the product edit page when multiple products share the same Square Product ID, helping prevent silent sync conflicts.

9.0.18

  • Added bidirectional stock sync — stock changes now sync both ways between Square and WooCommerce simultaneously, with transient-based loop prevention to avoid redundant round-trips.

9.0.17

  • Fixed category import breaking hierarchy when parent categories couldn't be resolved — existing WooCommerce categories are no longer re-parented to top-level.
  • Fixed missing intermediate categories (e.g. "Pantry" between "Food & Drink" and "Breads & Wraps") — the import now pre-fetches the full Square category catalog and enriches products with ancestor categories.
  • Added "Preserve WooCommerce Category Hierarchy" setting to ignore Square's category hierarchy during imports, only assigning/creating categories without changing parent-child relationships.
  • Added "Sync Categories from Square" button to update WooCommerce category hierarchy from Square without running a full product import.

9.0.16

  • Fixed category import creating duplicate categories with -2 slugs and unassigning products from original categories — now detects existing categories by name, reuses them, and corrects their hierarchy instead of creating duplicates.
  • Existing duplicate categories are automatically merged back into originals on next import, preserving SEO slugs and product assignments.

9.0.15

  • Fixed real-time Woo → Square stock sync being silently blocked for up to 30 minutes after any import or scheduled sync completes.
  • Fixed real-time Woo → Square stock sync silently dropping updates — the batch transient expired before WordPress cron could read it, so single-product stock changes from orders never reached Square.

9.0.14

  • Removed insecure SSL verification fallback from plugin updater and license requests — requests now fail cleanly instead of retrying without certificate verification.
  • Fixed plugin update check slowing down unrelated admin pages — fresh API calls now only run on the plugins and updates pages.
  • Reduced license API request timeout from 60s to 15s.
  • Fixed category hierarchy not being preserved for 3+ level deep categories when importing from Square — subcategories were all flattened under the root category instead of their actual parent.
  • Fixed real-time Woo → Square stock sync being silently blocked for up to 30 minutes after any import or scheduled sync completes.

9.0.13

  • Fixed scheduled sync timing out on large catalogs — replaced per-page processing with bulk fetching for both Square → Woo and Woo → Square directions.

9.0.12

  • Fixed loyalty points not being awarded for merged Square customers - now correctly finds the existing loyalty account instead of failing to create a duplicate.

9.0.11

  • Fixed product import failing for products with duplicate or invalid UPC/GTIN codes - variations now import successfully with GTIN stored as meta fallback.
  • Fixed single bad variation aborting entire product import - each variation is now processed independently so one failure doesn't block the rest.
  • Fixed misleading "Deleted invalid product #1" error when product creation returned a failure result.
  • Fixed missing transaction ID on WooCommerce orders - refund input is now enabled for gateway payments, REST API synced orders, and Square imported orders.

9.0.10

  • Added Square Link Status metabox on product edit page - view linked Square product details, variation info, and remove linkage directly from the editor.
  • Improved Square order import logging - duplicate orders, invoice orders, and API failures now log clearly instead of silent failures.
  • Fixed duplicate order check to support HPOS (High-Performance Order Storage) - now correctly queries wc_orders_meta table when HPOS is enabled.
  • Fixed order import progress bar persisting after dismissal - Close button now clears server-side progress so it doesn't reappear on tab switch.
  • Fixed order import progress bar overflowing its container when processed count exceeds queued total.
  • Added auto-polling for order import progress - progress bar now updates automatically every 5 seconds during an active import instead of requiring manual refresh.

9.0.9

  • Improved Square order import logging - duplicate orders, invoice orders, and API failures now log clearly instead of silent failures.
  • Fixed duplicate order check to support HPOS (High-Performance Order Storage) - now correctly queries wc_orders_meta table when HPOS is enabled.

9.0.8

  • Fixed order sync for redirect-based payment gateways (PayPal, Klarna, Afterpay, etc.) - orders now sync to Square when payment is confirmed after redirect.
  • Fixed loyalty discount incorrectly applying VAT - workaround for WooCommerce bug where negative fees are taxed even when marked as non-taxable.
  • Fixed refund webhook order lookup failing with HPOS enabled - now correctly searches wp_wc_orders_meta table for payment ID matching.

9.0.7

  • Support multi-domain licences
  • Show activated domains in licence panel.
  • Fixed loyalty points failing when Square customer ID has been merged - now automatically searches for the updated customer ID by phone/email and retries loyalty account creation.
  • Added opt-in decimal stock quantity support for products sold by weight/length (e.g., 1.5, 10.75). Enable in Settings > Products > Import Settings. Requires a WooCommerce decimal quantities plugin.
  • Better logging for skipped images during sync/export

9.0.6

  • Added refund sync from WooCommerce to Square - refunds now create unlinked refund records in Square for non-Square gateway orders (PayPal, Stripe, etc.).
  • Added partial refund support - each WooCommerce refund creates a corresponding Square refund record.
  • Added order cancellation sync - attempts to cancel Square order when WooCommerce order is refunded/cancelled (only succeeds for orders without payments).
  • Fixed discount expiration incorrectly showing as expired due to timezone parsing issue in admin UI.

9.0.5

  • Added Square transaction history tab in WooCommerce My Account - customers can view their Square orders on the frontend. Admins can also view any user's transactions on WordPress profile pages (enable in Customers settings, flush permalinks after enabling).
  • Added squarewoosync_sync_product_to_square action hook for programmatically triggering product sync to Square.
  • Added squarewoosync_webhook_product_action filter for controlling WooCommerce product status (trash/untrash/sync) based on Square webhook updates.
  • Fixed image removal not syncing to Square - removing images from WooCommerce products/variations now properly unassigns images in Square.
  • Fixed loyalty points failing for orders with empty Square customer ID - now validates customer ID before attempting loyalty operations.
  • Fixed Square customer creation not including phone number and returning error array instead of null on failure.

9.0.4

  • Fixed order status sync overriding terminal WooCommerce statuses - refunded, cancelled, and failed orders are now protected from being changed back to completed by Square webhooks.
  • Fixed floating point precision issue causing incorrect 1-cent rounding adjustments on orders with tax-inclusive pricing.

9.0.3

  • Added automatic refund sync from Square to WooCommerce - completed refunds from Square POS or Dashboard now create WooCommerce refunds with automatic inventory restocking.

9.0.2

  • Added automatic refund sync from Square to WooCommerce - refunds created in Square POS or Dashboard now sync to WooCommerce with inventory restocking.

9.0.1

  • Added configurable product matching behavior for Square order imports - choose to import all orders, skip orders with unmatched products, or import orders but exclude unmatched line items.
  • Improved error messages for variable product export failures - now shows actual Square API errors instead of generic messages.

9.0.0

  • Added Loyalty Dashboard with program overview, accounts management, and activity log.
  • Search loyalty accounts by name, email, or phone number.

8.10.0

  • Added support for Square product variations without item options - uses configurable fallback attribute (default: "Type") with variation names as values.
  • New setting in Advanced Settings to customize the fallback attribute name.

8.9.10

  • Added "Collect Shipping in Digital Wallets" setting to disable shipping collection from Apple Pay/Google Pay.
  • When disabled, wallet buttons only appear on checkout page and use WooCommerce shipping form instead.

8.9.9

  • Fixed checkout timeout when TaxJar plugin is active by reducing calculate_totals() calls during shipping method calculation.
  • Optimized debug logging to only run when WP_DEBUG is enabled, preventing file I/O blocking in production.
  • Fixed Loyalty Discount Applicator for Blocks Checkout

8.9.8

  • Fixed customer import failing for Square customers without email addresses (phone-only customers).
  • Added database indexes and batch upsert for significantly faster customer fetch/import operations.
  • Improved backward compatibility: automatic cleanup of duplicate customer records during migration.
  • Fixed customer table corruption handling: auto-recovers from missing tablespace errors.

8.9.7

  • Added Cash App Pay as a standalone payment gateway for WooCommerce Blocks and Classic checkout.

8.9.6

  • Update webhook proxy endpoint.

8.9.5

  • Fixed single product export failing with duplicate image IDs
  • Fixed product meta not saving to correct product when exporting duplicated products

8.9.4

  • Fixed license validation incorrectly treating null activatedDomain as deactivated

8.9.3

  • Preserve pre-filled billing/shipping address when using digital wallet

8.9.2

  • Fixed license key persistence - keys now saved across sessions and not deleted on validation errors
  • Increased license API timeout from 30s to 60s and improved network error handling

8.9.1

  • Fixed license being removed during plugin updates due to domain comparison mismatch
  • Fixed update detection not recognizing new versions when API returns version without explicit flag

8.9.0

  • Fixed Apple Pay/Google Pay shipping method changes not updating totals in legacy checkout
  • Added proper event listeners for shipping address and option changes in digital wallets

8.8.21

  • Fixed loyalty reward redemption in legacy checkout not applying discount fee
  • Added pricing rule validation for loyalty rewards (minimum spend, date validity, customer groups)

8.8.20

  • Fixed Apple Pay/Google Pay checkout failing silently by adding buyer verification (SCA compliance)
  • Fixed billing fallback to use WooCommerce billing fields when wallet doesn't provide billing data

8.8.19

  • Fixed attribute value "0" being treated as empty during import/export (causing "Any Size" display and validation errors)

8.8.18

  • Fixed payment processing for zero-decimal currencies (JPY, KRW, etc.) using incorrect multiplier

8.8.17

  • Added option to import both regular categories and reporting category together
  • Added category fallback setting - imports from opposite category type when selected type is empty

8.8.15

  • Fixed cron auto-create not setting variation attributes correctly (causing "any size" display issues)
  • Added self-healing to remove duplicate variations created by previous cron runs

8.8.14

  • Added phone number matching as fallback for customer syncing - Square loyalty accounts without email can now be matched by phone
  • Added support for Square Multi-Select attribute import as a comma seperated list.

8.8.13

  • Fixed fatal error when syncing Square products with missing category names
  • Fixed negative WooCommerce fees now sync as discounts in Square instead of negative service charges
  • When checking out using digital wallet, only replace billing information if required fields are not set

8.8.12

  • Increased Square API timeout to 30 seconds to prevent timeouts when exporting products with images

8.8.11

  • Fixed order discounts not syncing to Square - manual orders now correctly use discounted prices

8.8.10

  • Custom checkout compatibility for payment nonces

8.8.9

  • Add data import filter for status
  • Prevent MENU_CATEGORY from showing in category filters.

8.8.8

  • Added native support for variation-level custom field mapping (Square to WooCommerce bidirectional sync)

8.8.7

  • Fixed tips from Orderable being sent to Square as service charges instead of tip_money field for proper tip reporting

8.8.6

  • Fixed Square order imports incorrectly mapping variations to parent products

8.8.5

  • Fixed inventory tracking not respecting Square location overrides during product import

8.8.4

  • Reset Square nonce and card instance after failed payments (Blocks and legacy checkout) to prevent "nonce already used" errors on retry

8.8.3

  • Align Square tax with Woo "Display tax totals"; fix simple-product tax save

8.8.2

  • Fixed Square payment gateway (credit card and digital wallets) on pay-for-order pages

8.8.1

  • Fixed automated scheduler batching - Square to Woo and Woo to Square syncs now queue separate jobs per batch
  • Created CronImportJob class for automated imports that bypass UI dependencies
  • Fixed automated scheduler creating 100+ individual jobs instead of batching products
  • Implemented real-time sync batching with 30-60s collection window to prevent queue buildup
  • Added sws_import_running transient lock to prevent reverse syncs during Square to Woo imports
  • Fixed false "permanently failed" error messages for successfully completed import chunks
  • Added CronImportJob to allowed jobs list for wp-queue processing
  • Improved overlap prevention with three-layer defense (per-product, import, and cron locks)

8.8.0

  • Fixed image order preservation - first image in Square's image_ids array now correctly becomes WooCommerce featured image
  • Added support for importing variation-specific images that aren't in product-level image_ids
  • Fixed variation images not being downloaded to media library
  • Updated import_product_images to download all unique images (product + variation-specific)
  • Variation images now properly downloaded and assigned to WooCommerce variations
  • Improved fetch_square_image_urls to preserve order of input image_ids array
  • Fixed array_unique usage in WebhookProcessJob to maintain image order
  • Fixed duplicate order sync attempts when using Square payment gateway
  • Added early exit when Square payment gateway creates orders - prevents duplicate background jobs
  • Improved status change hook guards to skip all checkout-created orders (checkout, store-api, checkout-block, wc-api)
  • Added persistent queue flag (_square_sync_queued) to prevent race conditions
  • Implemented atomic lock mechanism in OrderSyncJob to prevent parallel duplicate processing
  • Eliminates "Skipping Order - already synced to Square" duplicate messages in logs
  • Fixed $0 orders not syncing to Square - now allows 'pending' status for $0 orders (COD, coupons, etc.)
  • Fixed order sync logic: when Square gateway is enabled, all orders sync regardless of orders.enabled setting
  • Fixed orders with non-Square payment methods (COD, BACS, etc.) being skipped when Square gateway is enabled
  • Improved product sync log messages to show what fields are being synced (e.g., "stock only" vs "full product")

8.7.57

  • Fixed tax UID reference mismatch between order-level taxes and line item applied_taxes
  • Line items now correctly reference all tax UIDs defined at order level
  • Resolves "There is no tax on this order with uid" errors when syncing to Square

8.7.56

  • Fixed duplicate tax UID error when orders have multiple tax rates (GST+PST, Federal+State, etc.)
  • Added WooCommerce order notes for Square order creation failures during checkout
  • Added order notes for Square API errors in split order processing
  • Added order notes for Square sync failures in manual order sync
  • Enhanced Square API error extraction to capture all error details (code, detail, field)
  • Improved error visibility - store admins can now see complete Square error messages directly in WooCommerce order interface

8.7.55

  • Fix order creation conditional when not using gateway

8.7.5

  • Added 9 new developer hooks for webhook order imports (Square to WooCommerce)
  • New filter: squarewoosync_webhook_order_import_enabled - Control which webhook orders to import
  • New filter: squarewoosync_square_order_data - Primary hook for modifying complete order data before import
  • New filter: squarewoosync_order_customer_id - Override customer assignment logic
  • New filter: squarewoosync_order_line_items - Modify line items before processing
  • New filter: squarewoosync_order_taxes - Modify tax data before applying to order
  • New filter: squarewoosync_order_discounts - Modify discount data before applying
  • New filter: squarewoosync_order_status_mapping - Customize status mapping logic
  • New action: squarewoosync_before_order_import - Run logic before order import starts
  • New filter: squarewoosync_before_process_square_order - Modify raw API data after fetch

8.7.4

  • Added bidirectional GTIN/UPC sync - products now export GTIN/UPC from WooCommerce to Square
  • GTIN/UPC now syncs in both directions: Square to WooCommerce (existing) and WooCommerce to Square (new)
  • Supports both WooCommerce native GTIN field (_global_unique_id) and Product GTIN plugin (_wpm_gtin_code)
  • GTIN/UPC automatically syncs during product export, manual sync, and real-time updates

8.7.3

  • Fixed frontend polling to continue through matching phase, ensuring accurate progress display
  • Frontend now recognizes 'matching' state and polls until completion

8.7.2

  • Fixed Afterpay checkout for WooCommerce Blocks - country and state fields now populate correctly
  • Fixed Afterpay modal closing when changing shipping methods during checkout

8.7.1

  • Fixed inventory sync to always match products with WooCommerce, preventing import status issues
  • Separated inventory matching into dedicated job for reliable completion
  • Fixed PHP 8.2 deprecation warning in SquareInventory

8.7.0

  • Added new filter hook: squarewoosync_skip_square_product_import to prevent specific Square products from being imported
  • Filter works for both manual/bulk imports and real-time webhook updates
  • Developers can now skip products by custom attributes, SKU, name, category, visibility, or any Square product data
  • Added comprehensive documentation for the new filter hook in hooks-reference.html
  • Skipped products are properly logged with status and reason

8.6.9

  • Update licence key endpoint

8.6.8

  • Fix order cancellation on failed payments

8.6.7

  • Added location-based filtering for automatic product imports (webhook and scheduler)
  • Added category-based filtering for automatic product imports (webhook and scheduler)
  • New setting: "Only import products from configured location" for webhook auto-creation
  • New setting: "Only import products from selected categories" for webhook auto-creation
  • New setting: "Only import products from configured location" for scheduled imports
  • New setting: "Only import products from selected categories" for scheduled imports
  • Filters check both categories array and reporting_category fields
  • Comprehensive logging for filtered products with detailed skip reasons

8.6.6

  • Fixed orphaned Square orders being created when Apple Pay and other payment methods fail
  • Added automatic Square order cancellation when payment authorization fails
  • Added real-time modifier syncing via webhooks when catalog products are updated in Square

8.6.5

  • Fixed inventory sync fatal error caused by getmypid() function not being available on all servers
  • Replaced getmypid() with uniqid() for better server compatibility and reliability

8.6.4

  • Fixed inventory sync infinite loop issue where cursor pagination could get stuck

8.6.3

  • Sync hidden modifiers but have toggle to hide/show

8.6.2

  • Fixed UPC/GTIN field not syncing from Square to WooCommerce during product imports
  • Major Performance Improvement: Optimized image importing with 2-4x faster processing
  • Added intelligent image change detection - skips re-import when images haven't changed (70-85% faster re-imports)
  • Implemented transient caching for attachment lookups (30-40% faster database operations)
  • Added deferred thumbnail generation via Action Scheduler (50-70% faster perceived import time)
  • Replaced WP_Query with optimized direct database queries for image lookups (20-30% faster)
  • Added 15-second configurable timeouts for image downloads to prevent hung imports
  • Implemented batch image processing with improved error handling and logging
  • Added comprehensive thumbnail generation status monitoring and verification tools
  • Images now process in background, keeping product imports fast and responsive

8.6.1

  • Added automatic plan upgrade notification to external API on plugin activation
  • Plugin now registers as 'pro' with proxy.squaresyncforwoo.com when Square is already connected

8.6.0

  • Added "Split Orders by Product Available Locations" feature for intelligent multi-location order routing
  • Orders are now automatically split across Square locations based on product inventory availability
  • Payment is taken first, then order splitting happens in background to prevent checkout delays
  • Smart location assignment prioritizes default location, falls back to alternatives based on stock levels
  • Real-time inventory checking across all locations ensures optimal order placement
  • Automatically disabled for local pickup orders to maintain location-specific pickup requirements
  • Support for Square's present_at_all_locations and absent_at_location_ids logic
  • Orders are automatically marked as paid in Square for complete transaction visibility
  • New toggle in Order Settings to enable/disable automatic order splitting
  • Added automatic product creation toggle to scheduled updates (cron)
  • Scheduled updates can now create WooCommerce products from Square products that don't exist yet
  • Product auto-creation only available when Square is the source of truth
  • New checkbox in Inventory Settings under Automatic Update Scheduler section
  • Respects batch size settings to prevent server overload
  • Includes clear warnings about potential impact with large catalogs
  • Optimized wp-queue processing interval from 15 seconds to 1 minute for improved performance

8.5.3

  • Added optional "Require Pickup Date/Time" setting for local pickup orders with full validation
  • Fixed Square Auth dialog to redirect to settings page with streamlined connection flow
  • Fixed product import batch size not respecting user-selected value with automatic persistence
  • Fixed race condition causing import completion to show before final batch results were saved
  • Enhanced import progress tracking with atomic updates and comprehensive debug logging

8.5.2

  • Added merchant-specific rate limiting API integration for webhook processing control
  • Performance settings now sync to proxy.squaresyncforwoo.com with Save Settings button
  • Added rate limit status display showing webhook processing state and pending counts
  • Implemented automatic webhook forwarding toggle based on source of truth settings
  • When WooCommerce is source of truth, webhook forwarding is automatically disabled
  • When Square is source of truth, webhook forwarding is automatically enabled
  • Plugin updates now sync webhook forwarding state with current configuration
  • Added REST endpoints for rate limit management and forwarding toggle
  • Enhanced Performance settings with real-time API status monitoring

8.5.1

  • Fixed inventory table search functionality - now uses proper JSON extraction for accurate searching
  • Search now works correctly for product names, descriptions, SKUs, and variation names
  • Improved category filter to use JSON_SEARCH for proper array searching
  • Enhanced location filter with JSON_SEARCH for better array handling
  • Fixed archive filter to properly handle 'hide', 'show', and 'archived_only' values
  • Updated ecom visibility filter to recognize 'ecom' value and use proper JSON functions
  • Improved sorting to use JSON_UNQUOTE and CAST for proper type handling
  • Added validation for invalid variable products (products with variations missing option sets)
  • Invalid variable products now display with warning icon and tooltip in inventory table
  • Added detailed debug logging for inventory queries to aid troubleshooting

8.5.0

  • Added unified Automatic Sync Settings interface with single toggle and source of truth selector
  • Replaced separate Square to Woo and Woo to Square settings with streamlined component
  • Added configurable data point selection (Stock, Title, SKU, Price, Description, Images, Category, Metafields)
  • Implemented async job queuing for WooCommerce to Square product updates to prevent blocking
  • Added metafields conditional sync support - only syncs when enabled in settings
  • Fixed duplicate job queuing with 10-second deduplication transient
  • Improved sync performance by moving from inline execution to background wp-queue jobs
  • Enhanced settings to respect user-configured data points for all sync operations

8.4.3

  • Bug Fix

8.4.2

  • Added support for Square's max_selected_modifiers feature
  • Modifier sets can now enforce maximum selection limits (e.g., "Select up to 2 extras")
  • Real-time frontend validation with visual feedback and selection counter
  • Server-side validation prevents cart addition when limits are exceeded
  • Admin UI shows/hides max selections field based on single/multiple choice setting
  • Dynamic checkbox disabling when maximum selections reached
  • Clear error messages guide customers when selection limits exceeded
  • Performance optimized - validation script only loads when needed
  • Syncs max_selected_modifiers from Square to WooCommerce automatically
  • Disabled modifier lists (enabled: false) are now skipped during sync
  • Hidden modifier lists (hidden_from_customer: true) are now skipped during sync
  • Individual modifiers marked as hidden_online are now excluded from sync

8.4.1

  • Fixed simple product sync

8.4.0

  • Added pickup date/time selector for WooCommerce Blocks checkout
  • Customers can now select their preferred pickup date and time when choosing pickup shipping
  • Pickup times sync to Square as SCHEDULED fulfillments with accurate timezone handling
  • Added enable/disable toggle in Order Settings (disabled by default)
  • Pickup date/time displayed on thank you page and admin order view
  • Supports any WordPress timezone configuration (UTC, named timezones, UTC offsets)
  • Fully integrated with WooCommerce Blocks Store API and legacy checkout

8.3.2

  • Fixed variable product variations showing as "sold out" in Square after syncing from WooCommerce
  • Added track_inventory flag update during variation sync to ensure stock tracking is properly enabled
  • Enhanced inventory sync logging with detailed per-variation tracking and error reporting
  • Improved stock management field synchronization (sellable, stockable, track_inventory)

8.3.1

  • Fixed $0 orders not syncing to Square when using the Square payment gateway
  • Orders with $0 total (fully covered by coupons, gift cards, or loyalty rewards) now properly sync to Square

8.3.0

  • Added full support for catalog-based loyalty rewards (product-specific, category-based, and product sets)
  • Added support for free item loyalty rewards (100% discount rewards)
  • Free items are now automatically added to cart when reward is applied
  • Free items are automatically removed from cart when reward is removed
  • Enhanced category-based rewards to match by WooCommerce category names
  • Improved variation support for loyalty rewards (checks both variation and parent product IDs)
  • Fixed "Currency mismatch" errors for free item rewards with missing max_discount fields
  • Added better error handling with user-friendly messages for reward application
  • Updated admin UI to remove "Disabled" overlay for catalog-based rewards
  • Added visual badges to indicate catalog-specific and free item rewards
  • Improved reward eligibility validation for both legacy and blocks checkout
  • Fixed loyalty reward display to show all eligible rewards including catalog-based ones

8.2.0

  • Added WooCommerce Local Pickup location mapping to Square locations
  • Orders with selected pickup locations now automatically route to the correct Square location
  • Added pickup location configuration UI in Orders settings
  • Enhanced order synchronization to detect and use customer-selected pickup locations
  • Improved location resolution for multi-location Square accounts
  • Fixed pending job status display to show loading animation

8.1.0

  • Added "Combine stock from all Square locations" setting for multi-location inventory management
  • When enabled, WooCommerce stock shows the total quantity from all Square locations
  • Updated product import, webhook processing, and scheduled sync to support combined stock
  • Improved inventory sync to fetch products from all locations (not just primary)
  • Hidden "Enable real-time stock updates to/from all locations" toggle (setting preserved for compatibility)
  • Multi-location stock combining works across all sync methods: manual import, webhooks, and cron

8.0.5

  • Optimized Square payment scripts for faster and more consistent loading
  • Fixed race conditions in Square SDK initialization
  • Fixed Google Pay initialization to use correct paymentRequest object
  • Fixed credit card field disappearing when applying coupons during checkout
  • Improved wallet instance caching to prevent unnecessary re-initialization
  • Fixed empty digital wallet containers showing in blocks checkout
  • Added proper visibility controls for wallet containers when wallets fail to initialize
  • Removed debug logs for cleaner console output
  • Improved error handling and attachment logic for digital wallets in blocks checkout

8.0.4

  • Fixed custom attribute mapping sync from WooCommerce to Square
  • Added proper Square API structure for custom attributes with key, type, and definition ID
  • Fixed false success messages when Square API returns errors
  • Improved error handling to show specific Square API error messages
  • Custom attributes now properly sync at both ITEM and ITEM_VARIATION levels

8.0.3

  • Fixed order syncing to Square when using non-Square payment gateways (hook-based sync)
  • Fixed wp-queue job execution by adding missing job classes to allowed list
  • Improved separation between gateway-based and hook-based order syncing

8.0.2

  • Minor bug fixes and improvements

8.0.1

  • Fix customer loyalty account page error.

8.0.0

  • Custom Queue system with Redis support
  • Improved Product Syncing with Queue System
  • Improved Order Import with Queue System
  • Improved Customer Import with Queue System
  • Fix loyalty point display
  • Allow mapping multiple shipping methods to delivery and pickup Square methods.

7.6.17

  • Fixed HTML rendering issue in gift card emails where balance was showing raw HTML tags instead of formatted currency
  • Updated plain text gift card email template to properly strip HTML tags from balance amount

7.6.16

  • Fixed loyalty points display updating for both WooCommerce hooks and shortcodes when product variations change
  • Removed console logging from loyalty product points JavaScript
  • Improved JavaScript to handle both LoyaltyDisplay elements and shortcode elements independently

7.6.15

  • Enhanced loyalty points calculation to account for sale prices and Square catalog discounts
  • Added comprehensive loyalty messaging customization system with live preview
  • Created dedicated Loyalty Messaging settings page as submenu under Loyalty settings
  • Fixed loyalty points display for variable products showing correct points based on minimum variation price
  • Improved AJAX handlers for dynamic loyalty points updates when product variations change
  • Added customizable loyalty program name field for branding
  • Fixed variation-specific loyalty points to properly respect Square discounts in real-time
  • Implemented proper discount price calculation using reflection to access DiscountApplicator methods

7.6.14

  • Fix product export/sync to Square disregarding image options
  • Less aggressive square order import status polling

7.6.13

  • Fix payment token conflict between wallet/express checkout and credit card checkout
  • Improve payment handler registration to only activate when wallet buttons are clicked
  • Resolve "Payment token is missing" error for credit card transactions

7.6.12

  • Fix loyalty rewards shortcode plural/singular point terminology
  • Add clarifying text to distinguish earned rewards from required points
  • Improve reward display clarity with "Redeemable" label and "Reward:" prefix
  • Add complete gift card "Send as Gift" functionality with recipient fields
  • Implement gift card email scheduling for future delivery dates
  • Add recipient name, email, and personal message fields to gift card products
  • Improve gift card email formatting with proper amount display
  • Add styling for gift card form fields on product pages

7.6.11

  • Fix category syncing when they shouldnt be

7.6.10

  • Payment token reference bug

7.6.9

  • Fix duplicate custom attributes error when exporting products to Square
  • Ensure custom attributes are only added at ITEM level, not variation level
  • Add duplicate prevention logic for custom attribute mappings

7.6.8

  • Digital wallet pre-fill billing information before checkout

7.6.7

  • Gateway js script loading issue fix

7.6.6

  • Add image export to automated scheduler
  • Add bulk sync (all pages) from woo to square in bulk actions
  • Fix potential duplicate category export issue.

7.6.5

  • Add loyalty program shortcodes for customizable display
  • Fix encoding differences between translated values for non-english sites

7.6.4

  • Fix few issues relating to non-english Square stores and zero decimal currencies

7.6.3

  • Calculate line items via sub-total over total for accurate tax reporting.

7.6.2

  • Refresh Token Tester
  • Auto re-fetch token in unauthorized api requests
  • Add customer info to Square Orders Tab

7.6.1

  • Fix import issue on non-english sites.

7.6.0

  • Process Square Refunds within WooCommerce

7.5.1

  • Add email sending options to Auto Import Square orders

7.5.0

  • New feature: View and Import Square orders
  • Bug Fix: Fix attribute term creation for "0" values

7.4.6

  • Fix product export without custom attributes

7.4.5

  • New developer hook, squarewoosync_product_created

7.4.4

  • Set Square Reporting Category on export/sync

7.4.3

  • Support Square Custom Metafields as Woo Attributes

7.4.2

  • Fix variation location overrides on stock counts

7.4.1

  • Change auth url

7.4.0

  • New feature - Metafield mapping

7.3.3

  • Stop discount syncing if global setting disabled

7.3.2

  • Fix hidden categories in settings

7.3.1

  • Fix conflict between orderable and new discounts

7.3.0

  • New feature: Real-time discount syncing

7.2.10

  • Fix gift card variable pricing display

7.2.9

  • Loyalty program settings bug not showing plan

7.2.8

  • Fix auth plan

7.2.7

  • Payment rounding adjustments
  • Max 100 inventory updates at once
  • Add woocommerce order notes to order export

7.2.6

  • Added fallback for the Application ID when users have not yet migrated to OAuth authentication.

7.2.5

  • Refined order-rounding logic for greater pricing accuracy.

7.2.4

  • Fixed OAuth redirect URL.
  • Removed redundant order line-item notes sent to Square.

7.2.3

  • Implemented handling for the order.updated Square webhook.

7.2.2

  • Resolved issue preventing successful gift-card redemption during checkout.

7.2.1

  • Corrected location retrieval for the Orderable integration under OAuth.

7.2.0

  • Migrated authentication flow to OAuth for simplified setup and token management.
  • Deprecated legacy Application ID/Secret settings.

7.1.10

  • Ensured all gallery and variation images are included during the initial product export.
  • Fixed import-completion banner that displayed on each page reload.

7.1.9

  • Removed 100-option export limit for variation options.

7.1.8

  • Strengthened validation and error handling during product syncs to Square.

7.1.7

  • Added developer filter to skip individual variation exports or syncs.

7.0.7

  • Eliminated duplicate filter triggers during product sync.

7.0.6

  • Prioritized customer matching via loyalty account identifiers.
  • Added debounce to customer-search inputs.

7.0.5

  • Fixed Square location-override setting not applying during order sync.

7.0.4

  • Added toggle to enable/disable modifier syncing.
  • Corrected attribute-name mapping during export.
  • Fixed variation-image assignment logic.

7.0.3

  • Export process now uses human-readable variation names rather than slugs.

7.0.2

  • Resolved duplicated credit-card fields on initial load.
  • Corrected customer phone-number formatting.
  • Removed miscellaneous non-critical warnings.

7.0.1

  • Fixed WooCommerce order-sync error when Square metadata was missing.

7.0.0

  • *Major Release- - added full support for Square Modifier syncing, including pricing and stock options.

6.16.2

  • Improved legacy checkout reliability when loading Square payment elements.

6.16.1

  • Fixed card-block rendering issue.

6.16.0

  • Added Square category-identifier option to product settings.
  • Introduced additional duplicate-card checks and prevention.
  • Added developer filters:
    • squarewoosync_order_location_id - adjust order/payment location IDs.
    • squarewoosync_prepare_order_data - modify payload sent to Square.

6.15.1

  • Removed composer dependency that enforced PHP 8.0+.
  • Added fallback to remove Square metadata if a product export fails.

6.15.0

  • Added Afterpay/Clearpay support.
  • Enhanced digital-wallet (Apple Pay / Google Pay) integration.

6.14.10

  • Added developer filters:
    • squarewoosync_square_customer_payload
    • squarewoosync_create_square_customer_payload

6.14.9

  • Fixed gift-card creation edge-case.

6.14.8

  • Added tax-inclusive gift-card options.
  • Enabled "sold individually" flag for gift-card products.
  • Fixed product-search pagination logic.

6.14.7

  • Fixed Apple Pay checkout for virtual products.

6.14.6

  • Added granular sync/export options on single-product pages.
  • Cleaned up various PHP warnings.

6.14.5

  • Fixed loyalty-redeem session reset.
  • Resolved stock-tracking issue when syncing from all locations.

6.14.4

  • Scheduled tasks now create new WooCommerce variations when detected.

6.14.3

  • Fixed inventory search indexing.

6.14.2

  • Added fail-safe when Square product retrieval times out.

6.14.1

  • Included newly added variations in Woo to Square sync.
  • Correctly resets "loading" state in inventory table.

6.14.0

  • Added SKU-priority product-matching option.

6.13.2

  • Fixed product-import edge-cases.

6.13.1

  • Switched Orders page to server-side pagination.
  • Cleared cron warnings and minor PHP notices.

6.13.0

  • Overhauled Customers page with server-side pagination.
  • Added customer import via Action Scheduler with logging and statuses.

6.12.1

  • Added developer hooks:
    • squarewoosync_square_order_created
    • squarewoosync_square_order_import
  • Skipped invalid variable products during bulk import.

6.12.0

  • Added bulk export to Square across all product views.
  • Added WP All Import compatibility.

6.11.2

  • Prevented duplicate stock sync when Square auto-adjusts inventory.

6.11.1

  • Re-enabled automatic customer matcher.
  • Synced variation images and categories from Woo to Square.

6.11.0

  • Added pre-export validation checks.
  • Improved bulk-export error handling.

6.10.4

  • Moved inventory syncing from WP-Cron to WooCommerce Scheduler actions.

6.10.3

  • Fixed price typecasting bug in product export.

6.10.2

  • Resolved Jetpack compatibility conflict.

6.10.1

  • Stopped pending orders from syncing to Square.

6.10.0

  • Added category and image exports for Woo to Square sync.

6.9.2

  • Assigned variation images to Square variations on export.

6.9.1

  • Fixed gift-card pricing and stock export bugs.

6.9.0

  • Introduced sellable gift-card product type.

6.8.0

  • Overhauled Products page:
    • Server-side pagination.
    • Background imports.
    • Enhanced error handling.

6.7.2

  • Hot-fix for checkout edge-case causing failures.

6.7.1

  • Fixed duplicate global attributes issue.

6.7.0

  • Added Square Gift Card payment option.

6.6.5

  • Ensured manual order sync includes transaction data when Square gateway enabled.

6.6.4

  • Added inventory-status filter to Products table.

6.6.3

  • Fixed toggle states for archived products, eCom availability, and pending-review statuses.
  • Ensured images attach correctly during auto-creation.
  • Added rate-limiting performance options.

6.6.2

  • Prevented creation of unintended "random" products.

6.6.0

  • Added subscription-product support.

6.5.4

  • Correctly links simple products in Square orders.

6.5.3

  • Stored variation IDs in Square orders.
  • Added validation checker for imported products.

6.5.2

  • Assigned variation images on import.

6.5.1

  • Fixed image-import regression.

6.5.0

  • New feature: auto-complete Square orders from WooCommerce.

6.4.13

  • Stored Square location IDs in product and order metadata.

6.4.12

  • Added support for Square delivery mapping.

6.4.11

  • Integrated Orderable pickup-time mapping.

6.4.10

  • Added support for zero-decimal currencies in import and sync operations.

6.4.9

  • Auto-creates new variations when "automatic creation" is enabled.

6.4.8

  • Increased category-import limit (100+).

6.4.7

  • Added "track inventory" toggle recognition.
  • Alphabetized category dropdown.

6.4.6

  • Fixed variation import anomaly.

6.4.5

  • Resolved order-sync block when loyalty points reduce totals to zero.
  • Added stock-status sync feature.

6.4.4

  • Patched legacy-checkout Square loading bug.

6.4.3

  • Disabled Square "pickup window duration," preventing unwanted auto-cancellations.

6.4.2

  • Fixed Square modifiers export bug.
  • Added additional filtering to Products table.

6.4.1

  • Enabled real-time inventory sync across all Square locations.

6.4.0

  • Added real-time Square to Woo order imports.

6.3.6

  • Created Square orders for alternate payment gateways.

6.3.5

  • Fixed automatcher for product variations.

6.3.4

  • Preserved variation attributes when attribute creation is disabled.

6.3.3

  • Corrected image assignment mismatch during product import.

6.3.2

  • Added option to disable attribute creation.
  • Moved Square webhook handling to WooCommerce actions.

6.3.1

  • Fixed customer-role sync from Woo to Square.

6.3.0

  • Added real-time order-status sync Square to WooCommerce.

6.2.3

  • Added option to set default import status.
  • Enabled sub-row search in Products table.

6.2.2

  • Fixed image mismatch during import.
  • Added categories to automated scheduler.

6.2.1

  • Refined order-rounding logic.

6.2.0

  • Fixed missing loyalty account handling.
  • Added saved-credit-card support.

6.1.1

  • Optimized order-creation performance.

6.1.0

  • Added Square modifier mapping and bulk "Sync to Square" actions.
  • Displayed contextual UI warnings.

6.0.9

  • Ensured tax-jar compatibility for Square orders.

6.0.0

  • Released integrated Loyalty Program.
  • Added local-pickup settings on order page.

5.1.3

  • Skipped webhook states that would push zero stock updates.

5.1.2

  • Added stock adjustment to bulk-export actions.

5.1.1

  • Improved logging and execution flow for bulk exports.

5.1.0

  • Export to Square now includes images.

5.0.5

  • Adjusted stock updates to affect only "IN-STOCK" webhook states.

5.0.4

  • Enhanced stock-update logging and added numeric validation.

5.0.3

  • Corrected real-time stock update calculation.

5.0.2

  • Redirected Payments UI to WooCommerce settings.

5.0.1

  • Resolved duplicate Google Pay instances.

5.0.0

  • Added support for credit-card, Google Pay, and Apple Pay payments.

4.4.4

  • Allowed Automatic Scheduler to handle separated variable products.

4.4.3

  • Extended automatcher to separated variable products.

4.4.1

  • Temporarily disabled bulk export in settings; remains in bulk actions.

4.4.0

  • Added "Export to Square" to Product bulk-action menu.

4.3.4

  • Synced categories during automatic product creation.
  • Fixed category sync during real-time updates.

4.3.3

  • Fixed invalid SKU error on Products table.

4.3.1

  • Fixed product-import error for malformed data.

4.3.0

  • Introduced automatic product creation (Square to Woo).

4.2.2

  • Corrected sub-row visibility in product filters.

4.2.1

  • Added "Only show products from selected location" toggle.

4.1.1

  • Resolved conflicts with third-party plugins.

4.1.0

  • Backgrounded inventory updates during manual order adjustments.

4.0.3

  • Prevented multiple customer-match triggers on user update.

4.0.2

  • Enforced numeric price data in Automatic Scheduler.

4.0.1

  • Released advanced customer syncing with role mapping, Action Scheduler queue, and optimized UI.

3.9.7

  • Added support for single-attribute product exports.

3.9.6

  • Fixed sync-to-Square product mismatch.

3.9.5

  • Handled archived/deleted Square products.
  • Reduced scheduler log verbosity to errors only.

3.9.4

  • Forced inventory resync on Woo order-status change.

3.9.2

  • Fixed variation import edge-case.

3.9.1

  • Minor stability fixes.

3.9.0

  • Significantly improved product-import performance.

3.8.2

  • Added translation support.

3.8.1

  • Defaulted single variations when only one exists.

3.8.0

  • Added dynamic variation-sync selector.

3.7.5

  • Fixed inventory update when variation has no SKU.

3.7.3

  • Corrected location-ID handling when switching tokens.

3.7.2

  • Patched multiple stock-state mismatch.

3.7.1

  • Fixed tax-inclusion calculations.

3.7.0

  • Added automatic product deletion feature.

3.6.0

  • Added option to exclude already-linked products from export.

3.5.16

  • Fixed local attribute export mapping.

3.5.13

  • Fixed attribute-name case sensitivity.
  • Switched to slugs for attribute export.

3.5.12

  • Added inventory-update on single-product export.

3.5.11

  • Improved Square inventory retrieval speed.

3.5.9

  • Export now uses attribute display names.

3.5.8

  • Utilized options/option-values for Square export.

3.5.7

  • Moved inventory fetches to WP-Cron for very large catalogs.

3.5.6

  • Bypassed Square Inventory API limit during exports.

3.5.5

  • Optimized product-export payload structure.

3.5.3

  • Fixed order sync anomalies.

3.4.2

  • Added optional transaction syncing.
  • Introduced auto product creation Woo to Square and new dashboard layout.

3.3.3

  • Fixed export-result state on single product export.

3.3.1

  • Corrected export-status updater.

3.3.0

  • Added single product "Export to Square" action.

3.2.9

  • Added automatic product-matcher utility.

3.2.8

  • Injected location-ID into Square transaction exports.

3.2.7

  • Improved scheduler performance under heavy load.

3.2.6

  • Optimized real-time inventory update queries.

3.2.4

  • Added Woo to Square export UI.

3.2.3

  • Enabled Woo to Square bulk export.

3.2.2

  • Displayed next runtime for scheduler on dashboard.

3.1.1

  • Fixed variation update error in auto order-sync.

3.1.0

  • Enabled automatic order sync.

3.0.0

  • *Major Release- - introduced Automatic Update Scheduler.

2.2.1

  • Fixed stock sync for Square webhook changes.

2.1.0

  • Enhanced stock-sync logic.
  • Added hierarchical log structure.

2.0.2

  • Removed phone numbers from orders to comply with Square formatting.

2.0.1

  • Hot-fix for null order values.

2.0.0

  • *Major Release- - added order and transaction syncing.

1.5.7

  • Added Square ID column to inventory table.

1.5.6

  • Improved efficiency of inventory-table imports.

1.5.5

  • Removed unnecessary logs.

1.5.4

  • Fixed admin CSS conflicts.

1.5.1

  • Added navigation bar.
  • Fixed license-key validation bug.

1.5.0

  • Added editable Square product IDs to manually link variations.

1.4.0

  • Added Square location selector for inventory counts.

1.3.2

  • Switched default API environment to production.

1.3.1

  • Bundled missing vendor libraries.

1.3.0

  • Initial public release.