Release 114

Highlights

  • More Flexible Pricing: Configure more complex pricing structures natively in Limio, including multi-offer subscriptions, multiple prices on one offer, per-unit usage pricing, and offer price overrides via admin APIs.

  • Stronger Omnichannel Commerce: Richer Salesforce integration with a new Data Capture Form, configurable field mapping, dedicated API routes, and enhanced platform events. Zuora sync is also smarter, now preserving your manual configuration and increased validation.

  • Platform Reliability & Developer Experience: Improved checkout architecture, better form validation consistency, and new API capabilities.

⚠️ Breaking Changes

Please note there are breaking changes in this release.

  • Subscription data model update: Affects all customers using custom components or integrations that read subscription data directly. Migrate to new SDK accessor functions.

  • Loqate short form functionality removed: Affects customers using the setting "Show short address form in checkout when Loqate is available?"

  • Dedicated Salesforce API routes: If you are using Limio for Salesforce, you must upgrade to version 13.62 at the same time as this Limio Commerce release.

  • Purchase links with basket ID replaced: Affects any integration using /checkout?basket=<BASKET_ID> links, including LFS-generated purchase links. Use the new recoveryLink or assistedCheckoutLink returned by the initiate checkout API instead.

See entries below for more information on these breaking changes.


New Features and Improvements

Multi-Offer Subscriptions

End customers can now purchase multiple offers in a single transaction and have them create one unified subscription. This is ideal for B2B companies that manage all customer products under a single subscription record. Add multiple offers to the basket during acquisition in Limio shops, via purchase links, or through Limio for Salesforce Quotes, and they will be consolidated into a single subscription in Zuora. Offers within a multi-offer basket can have different billing frequencies (for example, one monthly and one annual) as long as they share the same initial term.

Price Editor v2: Multiple Prices Per Offer

The Price Editor v2 now supports configuring multiple initial prices on a single offer. This enables bundled product pricing, for example a hardware fee alongside a software subscription, within one offer configuration. You can select the same product multiple times with different rate plans, and mix pricing models including one-off flat fees alongside per-unit usage charges.

Per-Unit Usage Pricing

You can now configure and sell offers with usage-based pricing natively in Limio. In the Price Editor, set the currency, price per unit, billing frequency, and term type for offers and add-ons. Usage pricing configured in Limio carries through correctly to Zuora during order processing and is preserved when generating purchase links from LFS. This removes the need for external pricing configuration, letting your commercial team manage usage pricing in the same place as all other pricing.

Data Capture Form Component

A new Data Capture Form component lets you collect additional customer information after an order is placed and send it to Salesforce. Place the form on any post-order or confirmation page, configure it with custom field labels, validation rules, and a success message. On submission, form data is sent to Salesforce as a platform event via the SFv3 plugin. This is useful for collecting onboarding details, preferences, or compliance data within the Limio experience.

Read more here: Data Capture Form Componentarrow-up-right

Preserve Attributes During Zuora Product Sync

When you run a Zuora Product Sync, Limio now preserves any attributes you have manually configured in the Limio Catalog, such as customer-friendly display names, instead of overwriting them with Zuora defaults. New products imported during sync still receive default values. Previously, syncing would reset your display names to raw Zuora SKU names, requiring manual re-entry.

Read more here: Sync Between Limio and Zuora Catalogsarrow-up-right

OAuth Query Parameter Forwarding

You can now configure which URL query parameters are forwarded to your identity provider during the OAuth authorisation flow. In Auth Settings, specify parameters using a placeholder syntax (for example, ?org_id={{org_id}}), and matching values from the page URL are automatically passed to the identity provider's login page. This is essential for organisations where users belong to multiple entities and need to be authenticated into the correct context.

Query Pages by Offer Label

The getPages API now supports retrieving pages by offer label using a new referencedLabel query parameter. This makes it easier to programmatically look up which pages are associated with a given offer, useful for dynamic navigation, offer-specific landing pages, or integration logic.

Read more here: Get Pages APIarrow-up-right

The logo link in the HEADER-WITH-FLOATING-CART component is now configurable via a component prop. Previously it always navigated to "/". You can now set it to any URL.

Read more here: Header with Floating Cartarrow-up-right

Configurable minimum payment amount for invoice pay modal

Previously, while paying an invoice through the Invoice Table component, customers could always pay a minimum amount of 0.01. We've introduced a new configurable prop on the Invoice Table component which allows users to specify the minimum amount.

Read more here: Invoice Tablearrow-up-right

Named Authentication Provider Validation

Authenticated pages now validate that the user is logged in via the specific named authentication provider configured for that page, rather than simply checking for any valid session.

Read more here: Authentication per Pagearrow-up-right

Salesforce identity now included in hot-synced orders

When a Zuora account is synced into Limio through the Limio hot sync feature, if the Zuora account has a CRM ID, the corresponding Salesforce identity is now created in Limio at the time of sync. This ensures that duplicate Account and Contact data is not created in Salesforce if the customer makes an additional purchase later on.

Improvements to Salesforce integration

Several improvements have been made to the Limio<>Salesforce integration to provide more data and configurability.

  • Configurable field mapping: The SalesforceV3 plugin now supports fully configurable field mapping, including custom mappings per Salesforce object type (Account, Contact, and others). This means the data flowing from Limio orders into your Salesforce objects can be tailored to your organisation's setup, reducing the need for Salesforce-side automation to reshape or supplement the data. Read more here: How Limio Updates Salesforce Dataarrow-up-right

  • Enhanced Platform Events: Limio now includes additional fields in the Salesforce Platform Eventsarrow-up-right payload: orderItem[].quantity, products[].syncedFrom, productBundles[].rate_plan, and offer.price__limio[].value / offer.price__limio[].type. If your Salesforce workflows rely on platform events, you now have access to richer data without additional API calls.

  • Separate Account Creation Plugin: There is now a specific Salesforce account creation plugin, which means an order can be configured to create a Salesforce account first, then create a Zuora subscription, then publish platform events with the CRM ID. This gives you more granular control over order processing sequences.

  • Salesforce identities now include record_variant: Account and Contact identities created during order processing were missing the record_variant field, causing platform events to fail to distinguish between Account ID and Contact ID. This is now correctly set (@salesforce/account / @salesforce/contact) for new order and new gift order flows when the SalesforceV3 plugin is configured.

  • Platform events include Account and Contact ID for new customers: For new customer orders, the Salesforce platform event was published before the corresponding Account and Contact records were created in Salesforce, leaving AccountId and ContactId empty. This caused downstream Salesforce workflows — such as Opportunity creation — to fail to link to the correct customer records. The order of operations has been corrected so that Account and Contact records are created first, ensuring platform events always carry valid IDs.

If you are interested in any of these features, please reach out to [email protected].

New admin APIs with bearer token authentication

We have delivered a set of new APIs for admin usage, which can be used with bearer token authentication. This ensures that these actions don't require or create cookies, or create baskets with undefined owners, which would happen when using our existing shop APIs. These APIs can also support price overrides of existing offers configured in the Limio Catalog.

  • /api/admin/order

  • /api/admin/checkout/initiate

  • /api/admin/checkout/initiate/renew

circle-exclamation

Read more here: Limio APIsarrow-up-right

Checkout links using the ?basket=<BASKET_ID> query parameter are no longer supported. Baskets now require an authenticated context to be interacted with, so the old unauthenticated purchase link pattern is no longer fit for purpose. Please note that purchase links with specific offers or offer labels are still supported.

There are 2 new options for sending purchase links with a specific basket, depending on your use case.

  1. Abandoned baskets: If you want to send customers a link to an abandoned basket, send them the link returned in the recoveryLink field from api/checkout/abandoned and api/admin/checkout/initiate . The Recovery Link is a signed URL that can be sent to a customer to resume their checkout session.

  2. Sales-assisted checkout links: If you have salespeople using Salesforce or another tool to configure a basket, send the end customer the link returned in the assistedCheckoutLink field from api/admin/checkout/initiate. When tracking.accountId is provided, a purchase can be made on behalf of the specified account, which is helpful in B2B contexts where one person may be making a purchase on behalf of the company.

circle-exclamation

Read more about setting up abandoned basket campaigns here: Abandoned Basket Campaignsarrow-up-right, and checkout links generated by Limio for Salesforce here: Sales-assisted Checkout Linksarrow-up-right

Additional data included in Abandoned Basket API response

The Abandoned Basket API response has been extended to include the order customFields object, the customer details object, and the full tracking object. This allows gives you more information within the abandoned basket recovery workflows, which was previously unavailable in the response.

Read more about the Abandoned Basket API here: Get Abandoned Basketsarrow-up-right

Validate custom fields on order object

Misconfigured custom fields on an order (order.customFields) could cause order creation to fail in Zuora. Custom fields are now validated against the configured fields in DynamoDB before being sent to Zuora, consistent with how custom fields are handled on tracking objects and tracking tags.


Bug Fixes

Add-Ons API Parameter Support

The getAddOns APIarrow-up-right now correctly accepts all documented query parameters, including pageSize, modifiedAfter, pagination cursors, the all flag, and customAttributes.* filters.

Section component text overflow on smaller screens resolved

The Section component'sarrow-up-right text container was overflowing on smaller viewports due to a CSS conflict. Text now wraps correctly at all screen sizes.

Directory Tag Visual Distinction

Directory tags are now visually distinguished from standard item tags in the Limio UI, making it clear at a glance whether a tag is a directory or an item.

Whitespace in Journey V2 names no longer causes errors

Creating a Journey V2 with a trailing space in the name caused the journey to become inaccessible. Journey names are now trimmed automatically.

Export permissions now work correctly for all roles

Non-manager roles were unable to export page or offer data even when export permissions were enabled. The permission toggle was updating the wrong type internally. This has been corrected.

Quantity of zero no longer defaults to one

When a quantity of 0 was explicitly set, the system incorrectly fell back to 1. The fallback logic now distinguishes between "no quantity specified" and "quantity is zero."

Page export status now reflects actual publish state

Exported page data always displayed "not-published" regardless of actual state. Permissions have been updated, and exports now show the correct status.

Owner page in Limio Subscriptions tab now displays all pages

When viewing an Owner page in the Limio Subscriptions tab with over 100 owned records, the pagination cursor was not updating after each page load. Users could navigate to page 2 but clicking further caused an error. The cursor now refreshes correctly, allowing the full result set to be browsed.

Incorrect price display in Cart Items component

Offer prices configured without a decimal point (e.g. "23" instead of "23.00") were incorrectly interpreted as dates in the Cart Items component, causing "Invalid DateTime" to be displayed instead of the actual price. This has been fixed so that numeric price values are no longer passed through the date formatter, and prices now render correctly regardless of whether they include a decimal.

Invoice Table payment modal not showing card last 4 digits

Fixed an issue where the pay modal in the Invoices Table component would intermittently fail to display the last 4 digits of a customer's payment card. We now ensure the digits are always displayed correctly.

Fix for new orders incorrectly linked to reseller account

Fixed a bug affecting customers with oneToManyZuoraAccount enabled who also have reseller subscriptions. When placing a new order, the system was incorrectly using the reseller's account number as the invoice owner instead of the main customer account. This happened because the lookup logic used invoiceOwnerAccountNumber from the first active subscription it found — which, for reseller subscriptions, points to the reseller rather than the customer. The fix ensures accountNumber is used instead, which always refers to the main customer account regardless of who the invoice owner is.


Stability and Quality Improvements

Subscription Data Model Update

We have refactored how subscription data is structured in Limio. Previously, offer and pricing details such as currency, price, quantity, and products were stored directly on the subscription record as part of the order item. These properties have now been moved to dedicated subscriptionOffer and subscriptionAddOn records.

circle-exclamation

Address capture

The legacy CompactAddressForm has been removed, simplifying the address capture and enabling future integrations with additional address providers.

circle-exclamation

Salesforce API traffic has been moved to dedicated routes (/api/salesforce/), improving security with Salesforce-specific authentication and making it easier to monitor usage independently.

The previous 14-day maximum expiry restriction on checkout link generation has been removed. You can now set checkout link expiry dates further into the future to match your quote validity periods.

circle-exclamation

Read more about Enhanced Checkout Links.arrow-up-right

Other improvements

  • Form validation behaviour has been standardised across components. Checkbox fields now display validation errors correctly, and gift code error messages have been improved for clarity.

  • Pre-filling of billing details and customer details in the modular checkout has been moved to the backend.

  • Removed automatic country prefill on initial load for delivery and billing addresses; users now choose country manually.

Please remember to perform a hard refresh in your browser after upgrading your environment.

Last updated

Was this helpful?