Website v21.0.1 to v21.0.8 - 10 June 2026
On this page
New payment providers, POS print template improvements, and a large set of payment and sync bug fixes across eight patch releases from 13 May to 9 June 2026.
Breaking changes and cautions
Latitude POS: storeMid now resolved per outlet
If your store uses Latitude Pay across multiple outlets without explicitly setting pos_store_mid in your Latitude payment provider configuration, each outlet will now send its own merchantId as the storeMid value — previously, all outlets sent the same shared provider-level value. This ensures correct per-outlet settlement remittance.
Review your Latitude configuration if you have a multi-outlet setup. If each outlet requires a different storeMid, you can set it explicitly per outlet using pos_outlet_api_keys to override the default.
Enhancements
StoreConnect Pay — new payment provider
StoreConnect Pay is now available as a dedicated payment provider for stores using StoreConnect’s hosted payment gateway (powered by NMI). It supports card and ACH payments under the StoreConnect Pay brand and routes production traffic to the StoreConnect gateway. Setup and checkout templates are identical to NMI — no template changes are required.
NMI 3D Secure 2 authentication
NMI card payments now support 3DS2 (3D Secure 2) authentication. When enabled, the checkout presents an in-page challenge after card tokenization. Passing 3DS shifts liability for eligible transactions to the card issuer. Authentication data is also forwarded on saved-card renewals and subscription billing.
Westpac 3D Secure 2 payments
Westpac Online Pay (Verifone) card payments now support 3DS2 as an opt-in feature, enabled via the three_d_secure and threeds_contract_id options in your payment provider configuration. The checkout performs device fingerprinting, a 3DS lookup, and an optional in-page challenge. Coverage extends to initial purchases, additional payments, and subscription billing.
Adyen ACH refunds
Adyen ACH payments can now be refunded from the StoreConnect admin. Full refunds, partial refunds, and item-level refunds are all supported, completing refund coverage across all major payment providers.
Easyship shipment tracking
Easyship is now supported as a shipment tracking provider. Stores using Easyship receive live tracking status updates via webhooks. When multiple tracking providers are active, the one matching the shipment’s carrier is used by default.
Afterpay: line items, discounts, and dual-tab payment guard
Afterpay checkouts now send itemized product lines and discount entries to Afterpay, giving shoppers a clearer breakdown in the Afterpay payment UI. A safety guard prevents customers from being charged a stale amount when they modify their cart in another browser tab between starting and completing Afterpay payment.
PayWay error messages now visible at checkout
When a PayWay payment fails, the specific error message from the PayWay API is now displayed on the checkout form. Previously, failures were silent, leaving customers without feedback.
Barcode tag for POS PDF print templates
A new {% barcode %} Liquid tag is available in POS PDF print templates. It renders 1D and 2D barcodes directly into printed documents, supporting 14 symbologies including Code 128, QR Code, EAN-13, UPC-A, DataMatrix, and PDF417. Options for color, scale, rotation, and human-readable text are included.
Font tag for custom fonts in POS PDF print templates
A new {% font %} Liquid tag allows POS print template authors to load custom TrueType fonts by URL. Fonts are cached locally after the first use, so reprints do not require a network request. This enables custom branding or language-specific characters in printed receipts and labels.
Site Builder Contents sidebar now available
The Contents sidebar in the POS Site Builder editor is now enabled in all environments. It provides a structured view of page content blocks, making it easier to navigate and reorganize page layouts.
Manage Data: clear and resync all records
A new “Clear & resync all records” option is available under the More actions menu in POS Manage Data. This wipes all locally synced records and triggers a fresh full sync from the server — useful when resolving data drift across all tables without clearing them one at a time. The existing “Resync all existing records” option has been moved into this menu.
Manage Data: record counts
Manage Data now shows the full server-side record count alongside the local count for each object. A separate unsaved-record count per object is also shown, making it easy to see which records are pending upload before deciding to clear or resync.
Linkly token auto-refresh and Quest Reconnect button
Linkly bearer tokens now refresh automatically in the background 15 minutes before they expire, preventing the daily timeout that previously required cashiers to manually re-pair their terminal after overnight inactivity. For Quest Airpay TAP, a Reconnect button is now visible in terminal settings once the terminal is set up, providing a quick recovery path when the Quest session expires.
End-of-shift reconciliation now correctly assigns refunds
End-of-shift reconciliation now calculates expected drawer balances by summing payments against the shift in which they were taken. Previously, a refund processed in a later shift was counted against the original sale shift. Shifts now show accurate expected totals regardless of when refunds were applied.
Articles can now be served in alternative formats
Articles support alternative MIME-type rendering, matching the existing behavior for content pages. A URL like /articles/feed.xml or /articles/data.json now serves the correct content type and a layout-free body, as defined by the article’s Liquid template.
Theme resources larger than ~128KB now supported
Theme resource files that exceed Salesforce’s 131,072-character record limit can now be split into numbered parts and declared in manifest.json as an ordered array. StoreConnect assembles the parts transparently at render time.
POS sync: improved reliability for dependent records
The POS sync engine now detects when a record depends on a parent that has not yet been confirmed as synced and defers it until the parent is ready. This prevents the foreign key errors that were causing sync failures for cart-related records (carts, cart fulfillments, shipments). Bulk sync backfills also run as a background process so the forward sync channel stays responsive to new changes.
PayPal hardened against lost responses and duplicate charges
PayPal requests now include idempotency headers so a retried call after a connection failure deduplicates against the original rather than creating a new transaction. If a capture call returns no response due to a timeout, StoreConnect re-queries PayPal before marking the payment as failed — ensuring charges that completed on PayPal’s side are always recognized.
Product detail pages load significantly faster
A performance regression was causing product detail page load times to spike from under 0.2 seconds to up to 30 seconds on stores with large catalogs. The product lookup query has been rewritten to restore fast load times on product detail pages.
Checkout customer step renders much faster
On checkout pages with many form questions, the customer information step was taking 3–4 seconds to render form errors. The root cause — reloading address validation configuration on every field check — has been fixed. The step now renders in under 30 milliseconds regardless of the number of form questions.
Materialized view refreshes up to 7.8× faster
Materialized view refresh performance has been significantly improved through SQL restructuring. Product search text vector generation is now pre-computed and stored, reducing the work done during each refresh. Changes deliver approximately a 3.7× speedup for the product view and a 7.8× speedup for the product text search view.
Deprecated fields
No fields have been formally deprecated in this release.
Fixed bugs
PayPal charging customers without showing order confirmation
In rare cases a PayPal capture succeeded but the response was lost before StoreConnect received it, leaving the customer charged without seeing a confirmation. StoreConnect now re-queries PayPal when a response is lost, so completed captures are always detected and the order confirmation is shown.
Promotions and discounts causing over-refunding
When an order included a promotional discount or negative adjustment item, the proportional allocation of payment amounts across order items was inflated. This caused refunds to include the promotion amount twice — for example, a $100 product with a $10 promotion would be recorded as $100 rather than $90, resulting in an over-refund. Both web and POS checkout paths have been corrected.
Stores with path prefixes resolving to the wrong store
On multi-store setups using domain path prefixes, the tenant lookup was returning the first matching store rather than the most specific match. This could cause requests to a path-scoped store to resolve to the wrong tenant.
Custom object records returning empty JSON
Using the | json or | serialize Liquid filters on a custom object (Record) drop was returning an empty object {}. Custom object fields are now correctly serialized.
Content block links broken on path-scoped stores
Content blocks with a link_target value that did not start with a / were generating malformed URLs on stores with a path prefix — for example, /eusomepage instead of /eu/somepage.
Quest double-charge when retrying a payment
Retrying a failed Quest Airpay TAP payment could charge the customer twice. Retries now correctly check for an in-progress transaction before initiating a new one.
POS payment amount incorrectly capped at deposit total
When taking a payment on an order with a deposit, the payment amount was capped at the deposit total in some cases, preventing the full balance from being paid at once.
Delivery double charge from incomplete cart data
Orphaned shipping cart items left over from an incomplete cart state could cause the delivery fee to be charged twice on POS orders. These items are now excluded from the delivery charge calculation.
Pay By Link blocking the payment screen
An active Pay By Link was preventing the POS payment screen from loading in some configurations, blocking staff from processing any payments.
POS labels printing empty price and barcode
Product labels printed via the POS label printer were showing blank price and barcode fields in certain configurations.
Register shift not recovered correctly on POS boot
On POS startup, the register shift was not always recovered correctly, which could leave the session in an inconsistent state.
Liquid | money filter erroring on null values
Using the | money filter on a null value was throwing an error instead of returning an empty or zero-formatted string.
Price book entry currency not checked correctly in Liquid
A Liquid currency check on price book entries was not evaluating correctly, which could cause incorrect pricing to be displayed in some template configurations.
Adjustment items missing price book entry reference
Adjustment line items on POS orders were not recording their price book entry ID, which could cause issues with downstream reporting and integrations.
DataDrop camelCase field names not found
Field lookups on a DataDrop using camelCase names were case-sensitive and would fail to find fields that existed under a differently-cased key. Lookups are now case-insensitive.
Sync failures when cart records arrived before their parent contact
Cart, cart fulfillment, and shipment records could fail to sync if they arrived at the server before their associated contact record was confirmed. The sync engine now defers these records until their dependencies are in place.
Was this article helpful?
Thanks for your feedback! It helps us improve our docs.