=== bLoyal: Loyalty & Promotions by bLoyal ===
Contributors: bLoyal
Tags: Omni-channel Loyalty, Subscriptions & Engagement, CAA & AAA, Loyalty promotions, Loyalty Points
Requires at least: 5.6
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 3.1.611.98
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html



bLoyal provides real-time customer loyalty and omni-channel order processing to your WooCommerce web store.



== Description ==



### Introduction ###



bLoyal enables WooCommerce users to grow their loyal customer base and engage with their customers across all devices and sales channels.



The bLoyal App enables you to have a single customer master record across your WooCommerce store and physical store(s) and run a consistent loyalty program, promotions, and engagement across all your sales channels. bLoyal also enables you to sell and accept gift/egift cards and customer loyalty tender in WooCommerce and in your physical store.

For more information, please go to [bLoyal.com]( https://bloyal.com )



### Major features in bLoyal include: ### 



* Powerful promotions and loyalty programs

* Single Master Customer Record.

* Automated Subscriptions.

* Referral Programs

* Real-Time Lifecycle Engagement.

* Click-and-Collect- Sell online and pick up in store.



[REQUEST A DEMO]( https://bloyal.com/request-demo/ )



For complete list of features and details, please visit [More Information]( https://bloyal.com/woocommerce-integration/ )



To learn how to install the plugin, navigate to the Installation tab. For detailed guidance on the installation and setup of the plugin, refer to the [plugin documentation](https://mysupport.bloyal.com/hc/en-us/articles/360022898114-bLoyal-Plugin-for-WooCommerce-Update-Setup-Guide/).



[youtube https://www.youtube.com/watch?v=cV4qY7I-6cU]



[Terms and Conditions](https://mysupport.bloyal.com/hc/en-us/article_attachments/360047099174/bLoyal-SubscriptionAgreement.pdf)



PS: Once integrated, you’ll have access to an unrivaled set of loyalty program management tools that will help achieve your business goals;



== External services ==

This plugin integrates your store with bLoyal, the loyalty and promotions platform. A bLoyal account
is required: bLoyal performs the loyalty and promotion calculations that the plugin reflects back into
WooCommerce, so the plugin cannot operate without contacting it.

**Service discovery.** The plugin requests
`https://domain.bloyal.com/api/v4/serviceurls/<your-login-domain>` to learn which bLoyal servers your
account uses. It sends your bLoyal Login Domain. The per-account hosts returned are stored in your
WordPress options and used for every call below.

**Loyalty, promotions and order processing.** To the hosts returned by discovery, the plugin sends
cart and order data so bLoyal can calculate discounts and record the sale: line items with SKU,
quantity and price, shipping method and totals, coupon and gift-card codes the shopper enters, and the
order identifier. When the shopper is identified it also sends their first and last name, email
address, phone number, company name, billing and shipping address, and date of birth where your store
collects it. These calls occur when the cart is calculated, during checkout validation, and when an
order is placed or refunded.

**Web Snippets.** Every storefront page loads
`https://snippets.bloyal.io/bLoyalSnippetLoader.js`, and that script then requests
`https://domain.bloyal.io/api/v4/serviceurls/<your-login-domain>` from the visitor's browser. This
happens on every page view, for every visitor, whether or not the plugin has been configured with a
bLoyal access key.

**Device provisioning.** When an administrator activates a device or a snippets URL in the plugin
settings, wp-admin calls `https://domain.bloyal.io/api/v4/ServiceProvisioning/Sessions/...`, sending
the provisioning code entered on that screen.

**Diagnostic logging.** When logging is enabled in the plugin settings, the plugin uploads its log
file to the logging host returned by discovery. Those log entries contain the request and response
bodies of the calls above, including the personal data listed there.

**Payment services.** Stored-payment and tender operations use the payment host returned by discovery,
falling back to `https://ws.bloyal.com` when no host has been stored.

The plugin's own code contacts only the bLoyal endpoints listed above. bLoyal's privacy policy:
https://bloyal.com/privacy-policy/

== Installation ==



= Minimum Requirements =



* PHP 7.4 or higher is required

* WordPress 5.6 or higher is recommended



= Prerequisites =



[REQUEST A DEMO]( https://bloyal.com/request-demo/ )



= Steps to install the plugin =



Step 1: Log in to your WordPress dashboard. 

Step 2: Upload the plugin folder to the /wp-content/plugins/ directory, or install the plugin directly from the WordPress Plugin Directory. 

Step 3: Activate the plugin through the 'Plugins' menu in WordPress. 

Step 4: Go to the 'bLoyal' menu and configure the plugin as per your requirements.



== Frequently Asked Questions ==



= What does the Plugin do? =



The bLoyal WooCommerce plugin syncs your ecommerce and other POS systems data with bLoyal, so you can engage your customers with targeted email marketing, automation, and promotions. With the combined power of WooCommerce and bLoyal, this plugin gives you all the tools you need to grow your online store and delight your contacts and customers. 



= Who should use the bLoyal WooCommerce plugin? =



This extension is perfect for Magento store owners who want to be able to track their customers and to engage with them by segmented and automated email and text campaigns, targeted promotions and loyalty programs to increase their customer lifetime value. 



= What types of loyalty programs does the plugin support? =



The plugin is very configurable so that you can points, frequent buyer, cashback, and many other loyalty programs.



= Are coding skills needed to use the bLoyal WooCommerce plugin? =



Not at all! The bLoyal WooCommerce plugin is easy to download and starts working with your WordPress site right away. 



= My question is not listed =



Visit bloyal.com or send us an email to info@bloyal.com and someone from our team will contact you shortly to answer all your questions. 



== Screenshots ==



1. Powerful Promotions

2. Create your own Loyalty Program in three easy steps

3. Automated Life Cycle Engagement

4. Single Master Customer Record

5. Subscriptions & Club Management



== Changelog ==

= 3.1.611.98 =

*Release Date - 08 Sep 2026*

Fix CON-207: the plugin no longer creates a duplicate tax-rate record every time a cart is calculated. When bLoyal returned a cart line with no tax details, the plugin added a new zero-rate record to WooCommerce's tax-rate table without checking whether an identical one already existed. On a busy store these accumulated into the hundreds of thousands, and because WooCommerce loads every record in a tax class in order to price a line, the cart and checkout eventually failed with a server error once that data outgrew the site's memory limit. The plugin now reuses the existing zero-rate record, so at most one is ever created.

Note for merchants: a store that has already accumulated these records will not recover from this update alone - the existing rows still have to be removed, keeping one. Contact bLoyal support if your cart or checkout is failing.

= 3.1.611.97 =

*Release Date - 07 Sep 2026*

Fix CON-202: the plugin no longer takes the site down when WooCommerce is inactive. If WooCommerce was deactivated, updated badly, or missing on a copied site while bLoyal stayed active, the plugin kept calling WooCommerce functions that no longer existed. Every storefront page returned a server error, and so did the bLoyal settings screen - the very page an administrator would open to work out what was wrong. Both now load.

Error handling no longer fails on its own. Eleven error handlers called a logging method their class did not have, and the shared logging method itself depended on WooCommerce, so a handled error turned into a fatal one. The clearest case was the order-received page: when a completed order could not be submitted to bLoyal, the shopper saw an error page after paying and the failure was never recorded. The page now loads and the failure is written to the bLoyal log.

Note for support: these particular diagnostics are written to the bLoyal log file, so bLoyal logging must be enabled in the plugin settings to see them.

The log writer is more careful with the log itself. It stops cleanly when the log file cannot be opened and records why, instead of failing the whole request; it no longer deletes the existing log when it fails to copy it; and a logging failure can no longer trigger itself repeatedly.

No change to cart, checkout, tender or order-submission behaviour when WooCommerce is active.

= 3.1.611.96 =

*Release Date - 03 Sep 2026*

Internal compliance work for the WordPress.org plugin directory. Twelve plugin files that could previously be requested directly in a browser now exit unless WordPress loaded them.

The readme header block is valid again, so the Stable tag and License lines parse correctly.

The listing now declares the bLoyal services the plugin contacts and what is sent to them, the tag list and short description fit the directory limits, and the long-obsolete upgrade notices have been removed.

No cart, checkout, or bLoyal request path changes.

= 3.1.611.95 =

*Release Date - 27 Aug 2026*

Fix CON-179: Orders paid in full with a gift card or with loyalty dollars are no longer marked as paid when the money has only been authorized. On stores that use the bLoyal Order Engine these tenders place a hold rather than taking the funds, and bLoyal Director captures them later - but WooCommerce was moving the order straight to Processing and recording "Payment complete". Such an order now stays On hold until the capture happens, with the authorization's transaction code recorded on an order note.

Stores that do not use the Order Engine are unaffected: the tender still redeems immediately and the order still goes to Processing as before.

The approval code returned by the authorization is now also sent to bLoyal when the order is committed. It was previously discarded, so these orders reached bLoyal with an empty authorization code even though one had been issued.

This affects only orders paid entirely by one of these two tenders, which requires "Apply Full Balance" to be enabled for that tender. Split-tender orders, where a gift card or loyalty dollars cover part of the total, were already correct and are unchanged.

= 3.1.611.94 =

*Release Date - 27 Aug 2026*

Fix CON-187: The plugin no longer asks bLoyal for a customer's saved shipping addresses when it has no customer to ask about. On a guest visit the address book requested the address list with an empty customer identifier, which bLoyal cannot answer, so it recorded an error on every such visit. The request is now skipped when there is no customer, and when there is one it carries only the identifier that has a value, correctly encoded.

Nothing changes for a shopper. The saved-address list behaves exactly as before for signed-in customers, and the address book still shows its placeholder when there is nothing to list. Two PHP warnings on those same paths are also gone: one on the checkout page, and one on the saved-address response, where a warning printed ahead of the JSON could corrupt it.

= 3.1.611.93 =

*Release Date - 25 Aug 2026*

Fix CON-193: The shipping carrier and service mapping on the bLoyal Order Processing settings page now saves, and is now actually used. Two independent problems were at work. Saving the page wrote an empty value over the whole mapping, so the selections were gone on the next page load. And the code that looks up the mapping when a shipping method is chosen had been commented out since December 2022, so even a correctly stored mapping was never read and the carrier and service codes sent to bLoyal stayed empty. Both are fixed.

This only affects WooCommerce's own shipping methods - Flat rate, Free shipping and Local pickup. Shipping rates that come from bLoyal carry their own carrier and service codes and were never affected by this.

The settings page also reported a successful save even when nothing had been saved, which is a large part of why this went unnoticed for so long. It now shows an error when the save fails.

Note for merchants: any store that saved this page on an earlier version already has an empty mapping, and this release cannot recover it. Re-enter the carrier and service for each shipping method once after updating.

= 3.1.611.92 =

*Release Date - 25 Aug 2026*

Fix CON-180: The gift message on the checkout page is now capped at 1000 characters, the limit bLoyal enforces on the GiftComment field. A longer message was accepted into the cart and then rejected by bLoyal when the order was submitted, so the order was placed and the customer charged while the sale never reached bLoyal Director. The message is now limited in the browser and re-checked on the server, and the customer is asked to shorten it before the order is placed.

Orders that already failed this way are not lost. The gift message is stored on the WooCommerce order and shown on the order screen, and the admin "Submit Order to bLoyal" button submits the order to Director. Note that the resubmit path does not carry the gift message across, so copy it over by hand if Director needs it.

Also silenced a PHP warning in the ApproveCart response handler. When bLoyal rejects a cart it returns an error without the data object the handler was reading from, which raised a warning on every rejected cart. The handler now defaults to "not approved" explicitly; no behavior changes.

= 3.1.611.91 =

*Release Date - 21 Aug 2026*

Fix CON-177: Only mark a stored-payment order as paid when the funds were actually captured. With the bLoyal Order Engine enabled the gateway authorizes only - bLoyal Director Order Processing captures the funds later using the transaction code sent on CommitCart - but the gateway still called payment_complete(), which pushed the WooCommerce order to Processing (or straight to Completed for a virtual-only cart) on an authorization alone. Those orders now stay in On hold, with an order note recording the authorize transaction code, matching how an authorize-only card gateway behaves. Stores that are not using the Order Engine still capture at checkout and are unchanged. CommitCart behavior is UNCHANGED: the commit still fires on order placement regardless of order status, exactly as before.

Note for merchants using the Order Engine: those stored-payment orders now remain in On hold until bLoyal Director captures the funds, and nothing in the plugin moves them out of it. If your fulfilment process watches the Processing status, it needs to watch On hold for these orders instead. Stock is still reduced once at checkout, and the order is still submitted to bLoyal exactly as before.

The four bLoyal payment gateways no longer ship placeholder text in their Instructions setting. That field's default value was the admin help sentence describing what the field is for, and WooCommerce prints the field's contents in the customer's order email whenever the order is On hold - which the change above makes common. The default is now empty. Stores that had already saved these gateway settings still hold the old text in the database and should clear the Instructions field.

Also pass through the approval code bLoyal returns on authorize. It was being discarded, so CommitCart reported an empty AuthCode even though bLoyal had supplied one. It is now forwarded on both paths: the authorize-only path used with the Order Engine, and the capture path, where the plugin received the code in its own authorize call and then dropped it because bLoyal's capture response does not repeat it. This is a pass-through fix; there is no evidence the empty value was breaking anything.

Read the cart identifier from the order rather than the session when submitting an order to bLoyal. The session copy is cleared when WooCommerce empties the cart, which happens before the confirmation page runs the submission, so a cart recalculation in that window could leave a newly created empty cart in the session and submit that one instead, reporting no items and no shipping charge. The order's own stored identifier is written while the cart still exists and cannot be replaced by a later recalculation. The session is still used when an order has no stored identifier.

= 3.1.611.90 =

*Release Date - 21 Aug 2026*

Security: the cart-handoff route no longer signs anyone in. Opening a bLoyal cart link transfers the cart to WooCommerce as before, but the plugin no longer uses the customer identifier returned by the API to log a visitor in, and no longer creates a WordPress account from it. A visitor arriving from a cart link continues as a guest, or signs in through WooCommerce's own login. This is a deliberate change in behavior: stores that relied on shoppers arriving already signed in will notice it.

The same route now declares an explicit permission callback and validates the cart identifier it receives. It answers with a 503 status instead of a fatal error when WooCommerce has not set up a cart for the request, which is what happened on /wp-json/ style requests.

Tested up to WordPress 7.1.

= 3.1.611.88 =

*Release Date - 20 Aug 2026*

Fix CON-182: Stop a repeated Place Order submission from producing a duplicate order with no shipping charge. When a shopper submitted the checkout twice on the same visit, the second submission started a brand new bLoyal cart, because the plugin cleared the bLoyal CartUID from the session as soon as the order object was created - before payment. That new cart never went through shipping calculation, so the order that reached bLoyal Director carried $0.00 shipping even though the shopper had selected a service, and the card was authorised twice. The CartUID is no longer cleared at order creation; it is still cleared after a successful commit, and now also when the cart itself is emptied, so a genuinely new order never inherits an old CartUID. A second submission of the same cart therefore reuses the first cart and keeps the selected shipping charge.

Known limitation: a repeated submission of the same cart still creates a second WooCommerce order, because WooCommerce cannot reuse an order whose payment has already been authorized. Both orders carry the correct shipping charge, and bLoyal records a single transaction for them. Each submission authorizes the payment separately, so the shopper's card carries one authorization per order; only the one belonging to the committed cart is captured, and the other is left uncaptured and expires on the payment processor's own schedule.

= 3.1.611.87 =

*Release Date - 20 Aug 2026*

Fix privilege escalation (custom Loyalty Engine API URL + cart auto-login) and add AJAX authorization gates (CON-184): admin configuration actions require manage_options and a nonce; storefront actions require a nonce that is fetched per visitor so page caching cannot share it; cart REST remains public. Denied requests are logged. A storefront action rejected because its nonce went stale on a cached page is retried once with a fresh one, and a rejected admin action now says so on screen instead of failing quietly.

Behaviour changes to be aware of: WordPress users who can manage options, edit users, manage WooCommerce or edit posts (Contributor and above) are no longer auto-logged-in from bLoyal cart customer data, so staff accounts that also shop must sign in normally; new customers created from bLoyal cart data now get a random password instead of one derived from their bLoyal identifier; and the minimum supported PHP version is now 7.4, matching WooCommerce.

= 3.1.611.83 =

*Release Date - 4 Aug 2026*

Fix CON-171: Only report a coupon as applied when bLoyal actually redeemed it. The confirmation added in 3.1.611.82 fired whenever bLoyal acknowledged the code, including for a reward coupon the customer had never been awarded - which comes back Valid=false / Redeemed=false and produces no discount, so the shopper was told "applied successfully" while the total did not change. The applied-coupon confirmation is now gated on the Redeemed flag of the CalculateCart response that the coupon request itself triggers (the same flag the commit path uses to decide which coupons are written onto the order), and when a coupon is not redeemed bLoyal's own explanation is shown instead - for example "Customer has not been awarded this coupon." The check fails safe: an empty cart, a missing response or a response for a different cart all keep the previous success message rather than wrongly telling the shopper their coupon is invalid.

= 3.1.611.82 =

*Release Date - 4 Aug 2026*

Fix CON-171: Confirm to the shopper that a bLoyal coupon was applied. A valid bLoyal coupon reduced the totals but produced no confirmation at all, because the discount is folded into the line-item prices instead of appearing as a separate totals row - so merchants and shoppers reported coupons as "not working" when they had in fact been applied. A success notice is now shown on the apply request. Also harden the woocommerce_coupons_enabled filter callback so it returns the original value when an exception is caught; previously it returned nothing, which resolves to null and would disable coupons store-wide, hiding the coupon form on both cart and checkout.

= 3.1.611.81 =

*Release Date - 17 Jul 2026*

Fix CON-159: Repair the "Submit Order to bLoyal" manual resubmit. The Grid SalesOrders/Changes payload was rejected with HTTP 400 (invalid Status value "completed"; ExternalIds and ClubMemberships sent as objects instead of arrays; null tax Rate), and the rejection was swallowed into an empty order note. Send Status "Approved", wrap ExternalIds/ClubMemberships as arrays, send 0 for tax Rate, and surface the bLoyal error on the order note instead of a blank one.

= 3.1.611.80 =

*Release Date - 3 Jul 2026*

Fix CON-111: Preserve the device connection (access key, service URLs, device id) and the payment tender mappings on plugin uninstall. Previously, deleting the plugin (a common way to update the manually-distributed ZIP) wiped these via the uninstall hook, forcing merchants to reconnect the device and re-map every tender after reinstall. Caches and non-essential settings are still cleaned up on uninstall.

= 3.1.611.79 =

*Release Date - 2 Jul 2026*

Fix CON-106: Prevent fatal PHP error ("Class WC_Payment_Gateway not found") that could take down the entire site, including wp-login.php. Guard all four bLoyal payment gateway registrations (gift card, loyalty dollar, snippets, stored payment) with a class_exists( 'WC_Payment_Gateway' ) check before defining the gateway class, and also guard the direct instantiation of the stored-payment gateway in the payment-alert AJAX handler, so requests where WooCommerce is active but its gateway class is not yet loaded no longer crash.

= 3.1.611.78 =

*Release Date - 26 Jun 2026*

Fix CON-85: Prevent shipping discount from being skipped on retry checkout. Remove ExternallyAppliedCharge override from the CON-78 ApproveCart stamp so bLoyal-managed rates can apply their discount rules. Add order-status guard in CommitCart to skip non-processing orders. Clear bloyal_early_cart_uid at the start of each CalculateCart run to prevent stale CartUIDs from prior attempts.

= 3.1.611.77 =

*Release Date - 18 Jun 2026*

Fix CON-79: Prevent fatal PHP error on session-less frontend requests. Guard WC()->session null check in bloyal_include_scripts before calling ->get(), so bot/crawler traffic that hits routes with no WooCommerce session no longer causes a 503.

= 3.1.611.76 =

*Release Date - 17 Jun 2026*

Fix CON-78: Prevent zero shipping on retry checkout. When a prior order clears the WC cart, bLoyal CalculateCart receives Charge:0 and zeroes out the shipping rate; the fix guards the shipping rate filter and stamps the correct amount into ApproveCart before sending.

= 3.1.611.75 =

*Release Date - 05 Jun 2026*

Fix CON-73: Block stored-payment checkout when no card was selected. The bLoyal payment snippet only stores the payment method when the customer clicks "SELECT CREDIT CARD"; if skipped, the order failed silently and auto-cancelled. The order is now stopped up front with a clear message instead.

= 3.1.611.74 =

*Release Date - 15 May 2026*

Fix CON-65: Revert shipping services postmeta (Director resolves shipping from CartUID directly); persist stored payment PaymentMethodUid to user meta so authorization survives session loss.

[Plugin Release Notes]( https://mysupport.bloyal.com/hc/en-us/articles/360041454494 )

= 3.1.611.73 =

*Release Date - 14 May 2026*

Fix CON-65: Add null guards for bloyal_cart_data in stored payment method; persist bloyal_shipping_services to order postmeta at checkout so CommitCart can recover it if the WooCommerce session expires before payment is confirmed.

[Plugin Release Notes]( https://mysupport.bloyal.com/hc/en-us/articles/360041454494 )



= 3.0.590.17 =

*Release Date - 26 July 2022*



= 3.1.611.3 =

*Release Date - 03 January 2023*



= 3.1.611.10 =

*Release Date - 01 May 2023*



= 3.1.611.11 =

*Release Date - 03 May 2023*



= 3.1.611.12 =

*Release Date - 18 May 2023*



= 3.1.611.13 =

*Release Date - 02 June 2023*

Fixed bLoyal calculate and approve alerts for EGift products.



= 3.1.611.14 =

*Release Date - 12 June 2023*



= 3.1.611.15 =

*Release Date - 08 August 2023*



= 3.1.611.16 =

*Release Date - 28 August 2023*

Fixed 100% discount issue on cart page summary.

= 3.1.611.30 =

*Release Date - 22 Jan 2024*

Fixed saleprice discount issue.
Fixed Birth Date value not being populated on the customer record in admin order page.
Fixed bLoyal customer data is not showing for "new sigunp customer" on the checkout address form.
Fixed Pickup stores not showing on the cart page.
Fixed bLoyal Shipping method issue on the cart/checkout page.
Fixed bLoyal Applied tax issue mismatched on checkout page.

= 3.1.611.33 =

*Release Date - 27 Feb 2024*

Fixed First Name and Last Name value for guest customer bLoyal Connector.
Fixed Stored payment method websnippets API call multiple times.
Fixed invalid payment method issue on checkout page.
Removed checking message from Loyalty Tender Payment.

= 3.1.611.51 =

*Release Date - 14 Nov 2024*

Fixed the issue in which when the user login with the club signup web snippet page then it displays the wrong user details while it should display the current user details.
Fixed the issue in which when the user tried to log-in with the club signup page then it was redirecting to the customer dashboard page while it should be on the club signup page.
Fixed the issue which was related to " Shipping not working".
Implemented the egiftcard web snippet functionality in which we can add egiftcard product from the egiftcard web snippet page.
Fixed the issue in which the bL_sk key was not generating whenever the web snippet launched.
Implemented the functionality to add new line item to the woocommerce cart.

= 3.1.611.56 =

*Release Date - 11 Jun 2025*

Fixed an issue with stored credit cards.

= 3.1.611.60 =

*Release Date - 8 Jan 2026*

Fixed eGift card package/shipping errors when guest creates account at checkout. Implemented proactive cart_uid preservation to order metadata and fallback retrieval mechanism to ensure cart information is available even when session is lost during account creation.

= 3.1.611.61 =

*Release Date - 12 Jan 2026*

Fix cart UID persistence for WooCommerce orders. Ensures cart_uid is saved to the database even when CommitCart API call fails, preventing loss of loyalty data, shipping services, and e-gift card information.

= 3.1.611.62 =

*Release Date - 16 Jan 2026*

Enhanced cart UID persistence with multi-point fallback system. Implements early cart_uid capture before CommitCart in multiple checkout hooks (before_calculate_totals, checkout_create_order, new_order, checkout_order_processed). Adds fallback retrieval from bloyal_cart_data session when plugin is deactivated mid-checkout, ensuring cart_uid is always persisted even when CommitCart fails or plugin is disconnected. Includes comprehensive logging with masked sensitive data for security.

= 3.1.611.63 = (reverted by 3.1.611.71)

*Release Date - 21 Jan 2026*

Fixed USA ePay 'Hold for Review' orders failing to sync to bLoyal. Orders with on-hold status are now skipped during checkout and committed when status changes to processing/completed.

= 3.1.611.64 =

*Release Date - 22 Jan 2026*

Fixed club signup snippet freezing on Delivery/Shipping step. Added null checks to WebSnippetCompleteFn to prevent JavaScript errors when responseData is null or undefined.

= 3.1.611.65 =

*Release Date - 5 Feb 2026*

Centralized JavaScript versioning for cache busting by replacing all hardcoded version numbers with a single BLOYAL_VERSION constant.

= 3.1.611.66 =

*Release Date - 5 Feb 2026*

Fixed critical error when placing orders using Gift Card + Credit Card payment combination. Added validation to ensure tender payment mapping is always an array, preventing "Cannot access offset of type string on string" fatal error on the thank you page.

= 3.1.611.67 =

*Release Date - 6 Feb 2026*

Fixed gift card and loyalty dollar "Apply Balance" not updating checkout totals without a manual page refresh. Restored direct checkout update trigger after applying balance, replacing a passive event listener that only fired on payment method change.

= 3.1.611.68 =

*Release Date - 17 Feb 2026*

Fixed gift card balance display showing inconsistent decimal places (e.g. $10.0 instead of $10.00). All balance and amount values in the Check Balance and Apply Balance messages are now consistently formatted to two decimal places.

= 3.1.611.69 =

*Release Date - 2 Mar 2026*

Fix CON-23: Prevent duplicate CartUID across back-to-back orders in the same session. Clear bloyal_uid and bloyal_early_cart_uid session keys after CommitCart so each new order generates a fresh unique CartUID.

= 3.1.611.72 =

*Release Date - 17 Apr 2026*

Fix CON-49: Set shipment Type to Pickup for virtual product orders. Virtual products have no WooCommerce shipping method, causing the payload to default to Type: Shipment. bLoyal/ShipCompliant then ran compliance checks on eProduct+PickupOnly products, causing Approved (Problem - General) errors in Director.

= 3.1.611.71 = (reverts 3.1.611.63)

*Release Date - 16 Mar 2026*

Fix CON-28: Revert incorrect on-hold skip logic introduced in 3.1.611.63. CommitCart is now always called when an order is placed, regardless of WooCommerce order status. The previous fix incorrectly skipped CommitCart for all on-hold orders; clients use bLoyal Director for order processing, not WooCommerce, so the status transition fallback never fired.

= 3.1.611.70 =

*Release Date - 13 Mar 2026*

Fix CON-27: Prevent duplicate CartUID when the customer navigates away before the order-received page loads. CartUID session keys are now cleared at order creation time (after the CartUID is safely saved to order metadata), instead of only on the order-received page. This ensures session cleanup is guaranteed regardless of browser behavior or payment gateway timing.


== Support ==



[Get quick answers to your questions with support resources, documentation, and step-by-step video walk-throughs for common bLoyal’s frequently asked questions]( https://mysupport.bloyal.com/hc/en-us )
